В математике наибольший общий делитель ( НОД ), также известный как наибольший общий множитель (НОД) , двух или более целых чисел , которые не все равны нулю, — это наибольшее положительное целое число, которое делит каждое из целых чисел. Для двух целых чисел x , y наибольший общий делитель x и y обозначается . Например, НОД 8 и 12 равен 4, то есть НОД(8, 12) = 4. [ 1] [2]
В названии «наибольший общий делитель» прилагательное «наибольший» может быть заменено на «наивысший», а слово «делитель» может быть заменено на «множитель», так что другие названия будут включать наибольший общий множитель и т. д. [3] [4] [5] [6] Исторически другие названия для того же понятия включали наибольшую общую меру . [7]
Это понятие можно распространить на многочлены (см. Наибольший общий делитель многочлена ) и другие коммутативные кольца (см. § В коммутативных кольцах ниже).
Наибольший общий делитель (НОД) целых чисел a и b , по крайней мере одно из которых не равно нулю, — это наибольшее положительное целое число d, такое что d является делителем как a, так и b ; то есть существуют целые числа e и f, такие что a = de и b = df , и d — наибольшее такое целое число. НОД чисел a и b обычно обозначается как gcd( a , b ) . [8]
Когда один из a и b равен нулю, НОД является абсолютным значением ненулевого целого числа: НОД( a , 0) = НОД(0, a ) = | a | . Этот случай важен как завершающий шаг алгоритма Евклида.
Приведенное выше определение не подходит для определения gcd(0, 0) , поскольку не существует наибольшего целого числа n такого, что 0 × n = 0. Однако ноль является своим собственным наибольшим делителем, если наибольшее понимается в контексте отношения делимости, поэтому gcd(0, 0) обычно определяется как 0. Это сохраняет обычные тождества для GCD, и в частности тождество Безу , а именно, что gcd( a , b ) порождает тот же идеал , что и { a , b } . [9] [10] [11] Это соглашение соблюдается во многих системах компьютерной алгебры . [12] Тем не менее, некоторые авторы оставляют gcd(0, 0) неопределенным. [13]
НОД чисел a и b — это их наибольший положительный общий делитель в предпорядковом отношении делимости . Это означает, что общие делители чисел a и b — это в точности делители их НОД. Это обычно доказывается с помощью леммы Евклида , фундаментальной теоремы арифметики или алгоритма Евклида . Именно это значение «наибольшего» используется для обобщений понятия НОД.
Число 54 можно выразить как произведение двух целых чисел несколькими способами:
Таким образом, полный список делителей числа 54 — 1, 2, 3, 6, 9, 18, 27, 54. Аналогично, делителями числа 24 являются 1, 2, 3, 4, 6, 8, 12, 24. Числа, которые есть в этих двух списках общими, являются общими делителями чисел 54 и 24, то есть,
Из них наибольшее число — 6, поэтому оно является наибольшим общим делителем :
Вычисление всех делителей двух чисел таким способом обычно неэффективно, особенно для больших чисел, имеющих много делителей. Гораздо более эффективные методы описаны в § Вычисление .
Два числа называются взаимно простыми, или взаимно простыми , если их наибольший общий делитель равен 1. [14] Например, 9 и 28 являются взаимно простыми.
Например, прямоугольную область 24 на 60 можно разделить на сетку из: квадратов 1 на 1, квадратов 2 на 2, квадратов 3 на 3, квадратов 4 на 4, квадратов 6 на 6 или квадратов 12 на 12. Таким образом, 12 является наибольшим общим делителем 24 и 60. Прямоугольную область 24 на 60 можно разделить на сетку из квадратов 12 на 12, с двумя квадратами вдоль одного края ( 24/12 = 2 ) и пятью квадратами вдоль другого ( 60/12 = 5 ).
Наибольший общий делитель полезен для сокращения дробей до наименьших членов . [15] Например, gcd(42, 56) = 14 , поэтому,
Наименьшее общее кратное двух целых чисел, которые оба не равны нулю, можно вычислить из их наибольшего общего делителя, используя соотношение
Наибольшие общие делители можно вычислить, определив разложения на простые множители двух чисел и сравнив множители. Например, чтобы вычислить gcd(48, 180) , мы находим разложения на простые множители 48 = 2 4 · 3 1 и 180 = 2 2 · 3 2 · 5 1 ; тогда GCD равен 2 min(4,2) · 3 min(1,2) · 5 min(0,1) = 2 2 · 3 1 · 5 0 = 12 Соответствующий LCM равен 2 max(4,2) · 3 max(1,2) · 5 max(0,1) = 2 4 · 3 2 · 5 1 = 720.
На практике этот метод применим только для небольших чисел, поскольку вычисление разложения на простые множители занимает слишком много времени.
Метод, предложенный Евклидом для вычисления наибольших общих делителей, основан на том факте, что для двух положительных целых чисел a и b, таких что a > b , общие делители a и b совпадают с общими делителями a – b и b .
Итак, метод Евклида для вычисления наибольшего общего делителя двух положительных целых чисел состоит в замене большего числа разностью чисел и повторении этого до тех пор, пока два числа не станут равными: это и есть их наибольший общий делитель.
Например, чтобы вычислить gcd(48,18) , нужно выполнить следующие действия:
Итак, НОД(48, 18) = 6 .
Этот метод может быть очень медленным, если одно число намного больше другого. Поэтому, как правило, предпочтительным является следующий вариант.
Более эффективным методом является алгоритм Евклида , вариант, в котором разность двух чисел a и b заменяется остатком от евклидова деления (также называемого делением с остатком ) числа a на b .
Обозначая этот остаток как a mod b , алгоритм заменяет ( a , b ) на ( b , a mod b ) несколько раз, пока пара не станет ( d , 0) , где d — наибольший общий делитель.
Например, чтобы вычислить gcd(48,18), вычисление выглядит следующим образом:
Это снова дает gcd(48, 18) = 6 .
Двоичный алгоритм НОД — это вариант алгоритма Евклида, специально адаптированный к двоичному представлению чисел, которое используется в большинстве компьютеров .
Двоичный алгоритм НОД отличается от алгоритма Евклида по сути тем, что делит на два каждое четное число, которое встречается в ходе вычислений. Его эффективность обусловлена тем, что в двоичном представлении проверка четности заключается в проверке самой правой цифры, а деление на два заключается в удалении самой правой цифры.
Метод заключается в следующем: начиная с a и b — двух положительных целых чисел, НОД которых ищется.
Шаг 1 определяет d как наивысшую степень 2 , которая делит a и b , и, таким образом, их наибольший общий делитель. Ни один из шагов не изменяет набор нечетных общих делителей a и b . Это показывает, что когда алгоритм останавливается, результат является правильным. Алгоритм в конечном итоге останавливается, поскольку каждый шаг делит по крайней мере один из операндов по крайней мере на 2. Более того, количество делений на 2 и, таким образом, количество вычитаний не превышает общего количества цифр.
Пример: ( a , b , d ) = (48, 18, 0) → (24, 9, 1) → (12, 9, 1) → (6, 9, 1) → (3, 9, 1) → (3, 3, 1); таким образом, исходный НОД представляет собой произведение 6 чисел 2 d = 2 1 и a = b = 3 .
Двоичный алгоритм НОД особенно прост в реализации и особенно эффективен на бинарных компьютерах. Его вычислительная сложность составляет
Квадрат этой сложности возникает из-за того, что деление на 2 и вычитание занимают время, пропорциональное количеству бит входных данных.
Вычислительная сложность обычно задается в терминах длины n входных данных. Здесь эта длина равна n = log a + log b , и сложность, таким образом, равна
Алгоритм Лемера основан на наблюдении, что начальные частные, полученные алгоритмом Евклида, могут быть определены на основе только первых нескольких цифр; это полезно для чисел, которые больше, чем компьютерное слово . По сути, извлекаются начальные цифры, обычно образующие одно или два компьютерных слова, и алгоритмы Евклида применяются к этим меньшим числам, пока гарантируется, что частные будут такими же, как те, которые были бы получены с исходными числами. Частные собираются в небольшую матрицу преобразования 2 на 2 (матрицу целых чисел, состоящих из одного слова) для сокращения исходных чисел. Этот процесс повторяется до тех пор, пока числа не станут достаточно малыми, чтобы двоичный алгоритм (см. ниже) стал более эффективным.
Этот алгоритм повышает скорость, поскольку он уменьшает количество операций с очень большими числами и может использовать аппаратную арифметику для большинства операций. Фактически, большинство частных очень малы, поэтому достаточное количество шагов алгоритма Евклида можно собрать в матрице 2x2 целых чисел из одного слова. Когда алгоритм Лемера сталкивается со слишком большим частным, он должен вернуться к одной итерации алгоритма Евклида с евклидовым делением больших чисел.
Если a и b оба не равны нулю, наибольший общий делитель a и b можно вычислить, используя наименьшее общее кратное (НОК) a и b :
Однако чаще всего НОК вычисляется из НОД.
Используя функцию Тома f ,
что обобщается до рациональных чисел a и b или соизмеримых действительных чисел.
Кит Славин показал, что для нечетных a ≥ 1 :
которая является функцией, которая может быть оценена для комплексного b . [16] Вольфганг Шрамм показал, что
представляет собой целую функцию переменной b для всех положительных целых чисел a, где c d ( k ) представляет собой сумму Рамануджана . [17]
Вычислительная сложность вычисления наибольшего общего делителя широко изучалась. [18] Если использовать алгоритм Евклида и элементарные алгоритмы умножения и деления, вычисление наибольшего общего делителя двух целых чисел длиной не более n бит равно O ( n 2 ) . Это означает, что вычисление наибольшего общего делителя имеет, с точностью до постоянного множителя, ту же сложность, что и умножение.
Однако, если используется быстрый алгоритм умножения , можно модифицировать алгоритм Евклида для повышения сложности, но вычисление наибольшего общего делителя становится медленнее, чем умножение. Точнее, если умножение двух целых чисел из n бит занимает время T ( n ) , то самый быстрый известный алгоритм для наибольшего общего делителя имеет сложность O ( T ( n ) log n ) . Это означает, что самый быстрый известный алгоритм имеет сложность O ( n (log n ) 2 ) .
Предыдущие сложности справедливы для обычных моделей вычислений , в частности, для многоленточных машин Тьюринга и машин с произвольным доступом .
Вычисление наибольших общих делителей, таким образом, принадлежит классу задач, разрешимых за квазилинейное время . Тем более , соответствующая задача принятия решений принадлежит классу P задач, разрешимых за полиномиальное время. Неизвестно, принадлежит ли задача GCD классу NC , и поэтому не существует известного способа ее эффективного распараллеливания ; также не известно, является ли она P-полной , что означало бы, что вряд ли возможно эффективно распараллелить вычисление GCD. Шэллкросс и др. показали, что родственная задача (EUGCD, определение последовательности остатков, возникающих в ходе алгоритма Евклида) является NC-эквивалентной задаче целочисленного линейного программирования с двумя переменными; если одна из задач принадлежит классу NC или является P-полной , то и другая тоже. [19] Поскольку NC содержит NL , также неизвестно, существует ли алгоритм вычисления GCD, эффективный с точки зрения памяти, даже для недетерминированных машин Тьюринга.
Хотя неизвестно, относится ли эта проблема к NC , существуют параллельные алгоритмы, асимптотически более быстрые, чем алгоритм Евклида; самый быстрый известный детерминированный алгоритм принадлежит Чору и Голдрайху , который (в модели CRCW-PRAM ) может решить проблему за время O ( n /log n ) с n 1+ ε процессорами. [20] Рандомизированные алгоритмы могут решить проблему за время O ((log n ) 2 ) на процессорах [ необходимо разъяснение ] (это суперполином ). [21]
где - p -адическая оценка. (последовательность A018804 в OEIS )
В 1972 году Джеймс Э. Найманн показал, что k целых чисел, выбранных независимо и равномерно из {1, ..., n } , являются взаимно простыми с вероятностью 1/ ζ ( k ) , когда n стремится к бесконечности, где ζ относится к дзета-функции Римана . [24] (См. coprime для вывода.) Этот результат был расширен в 1987 году, чтобы показать, что вероятность того, что k случайных целых чисел имеют наибольший общий делитель d, равна d − k /ζ( k ) . [25]
Используя эту информацию, можно увидеть (неформально), что ожидаемое значение функции наибольшего общего делителя не существует, когда k = 2. В этом случае вероятность того, что НОД равен d, равна d −2 / ζ (2) , и поскольку ζ (2) = π2 / 6 , мы имеем
Это последнее суммирование является гармоническим рядом , который расходится. Однако, когда k ≥ 3 , ожидаемое значение хорошо определено, и по приведенному выше аргументу оно равно
Для k = 3 это приблизительно равно 1,3684. Для k = 4 это приблизительно равно 1,1106.
Понятие наибольшего общего делителя может быть определено в более общем виде для элементов произвольного коммутативного кольца , хотя в общем случае не требуется, чтобы один делитель существовал для каждой пары элементов. [26]
При таком определении два элемента a и b вполне могут иметь несколько наибольших общих делителей или вообще ни одного. Если R — область целостности , то любые два НОД элементов a и b должны быть ассоциированными элементами , поскольку по определению любой из них должен делить другой. Действительно, если НОД существует, любой из его ассоциированных элементов также является НОД.
Существование НОД не гарантируется в произвольных целых областях. Однако, если R — уникальная факторизационная область или любая другая область НОД , то любые два элемента имеют НОД. Если R — евклидова область , в которой евклидово деление задано алгоритмически (как в случае, например, когда R = F [ X ], где F — поле , или когда R — кольцо гауссовых целых чисел ), то наибольшие общие делители можно вычислить с помощью формы евклидова алгоритма, основанного на процедуре деления.
Ниже приведен пример области целостности с двумя элементами, не имеющими НОД:
Элементы 2 и 1 + √ −3 являются двумя максимальными общими делителями (то есть любой общий делитель, кратный 2 , связан с 2 , то же самое справедливо для 1 + √ −3 , но они не связаны, поэтому наибольшего общего делителя a и b не существует ) .
В соответствии со свойством Безу мы можем в любом коммутативном кольце рассмотреть набор элементов вида pa + qb , где p и q пробегают кольцо. Это идеал, порожденный a и b , и обозначается просто ( a , b ) . В кольце, все идеалы которого являются главными ( область главных идеалов или PID), этот идеал будет идентичен множеству кратных некоторого элемента кольца d ; тогда этот d является наибольшим общим делителем a и b . Но идеал ( a , b ) может быть полезен даже тогда, когда нет наибольшего общего делителя a и b . (Действительно, Эрнст Куммер использовал этот идеал в качестве замены для НОД в своей трактовке Великой теоремы Ферма , хотя он представлял его себе как множество кратных некоторого гипотетического или идеального элемента кольца d , откуда и термин теории колец.)