Люди играют немного быстро и свободно с нотацией Big-O. В случае с GCD они обычно делают это двумя способами:
1) Вы правы, алгоритмическая сложность и, следовательно, нотация big-O, должны быть указаны в терминах размера в битах ввода, а не в значениях ввода. Вот как определяются P, NP и так далее. Предполагая двоичный ввод и произвольно большие числа (например, представление BigNum), а N - количество бит ввода, ваш GCD требует не более 2 ^ N вычитаний, каждое из которых требует времени O (N) для прохождения над каждой цифрой числа вычитаются. Так что это O (N * 2 ^ N). Конечно, GCD можно сделать намного быстрее, если вы используете деление, а не вычитание: O (N ^ 2).
Итак, когда мы говорим, что проверка простоты была доказана в 2002 году за полиномиальное время , это техническое определение сложности, и мы имеем в виду полином по количеству цифр (что является сложной частью). ), а не многочлен от самого входного числа (что тривиально легко сделать в «сублинейное время» с использованием пробного деления).
Но на практике для алгоритмов, которые принимают фиксированное количество целочисленных входных данных, удобнее говорить о сложности, как если бы N было самим вводом, а не размером ввода. Это не вредно, если вы ясно понимаете, что имеете в виду в случаях, которые могут быть неоднозначными.
2) На практике целочисленные входные данные часто имеют фиксированный размер, 32-разрядный или любой другой, и такие операции с ними, как сложение, умножение и деление, выполняются за O (1) времени. Мы используем эти факты выборочно в нашем анализе заказа. Технически, если ваша программа GCD принимает входные данные только до (2 ^ 32-1), то это O (1). Он имеет фиксированную верхнюю границу времени работы. Конец анализа.
Хотя с технической точки зрения это не очень полезный анализ. Практически все, что вы делаете на реальном компьютере, - это O (1) на том же основании, что размер проблемы ограничен аппаратными средствами.
Обычно удобнее принять, что сложение равно O (1), потому что числа имеют фиксированный размер, но не обращайте внимания на то, что GCD также равно O (1), делая вид, что его поведение в диапазоне [1, 2 ^ 32) расширяется до бесконечности, и проанализировать его на этой основе. Затем с N макс. Двумя входами получается O (N): O (N) вычитаний, каждый из которых занимает постоянное время.
Опять же, это не является двусмысленным, когда вы знаете, что такое круг ведения, но остерегайтесь неверного сравнения первого анализа, который я дал, алгоритма Евклида с делением O (N ^ 2), с этим анализом алгоритма с вычитанием O (N). N не одинаков в каждом, и вычитание не быстрее; -)