Введение

Алгоритм вычисления наибольшего общего делителя

В математике, алгоритм Евклида — это эффективный метод вычисления наибольшего общего делителя (НОД) двух целых чисел, наибольшего числа, которое делит их оба без остатка. Он назван в честь древнегреческого математика Евклида, который впервые описал его в своих «Началах» (около 300 г. до н.э.). Это пример алгоритма — пошаговой процедуры для выполнения вычислений в соответствии с чётко определёнными правилами, и один из старейших алгоритмов, находящихся в широком использовании. Его можно использовать для приведения дробей к их простейшей форме, и он является частью многих других теоретико-числовых и криптографических вычислений. Алгоритм Евклида основан на принципе, что наибольший общий делитель двух чисел не изменяется, если большее число заменяется его разностью с меньшим числом. Например, 21 является НОД чисел 252 и 105 (так как 252 = 21 * 12 и 105 = 21 * 5), и то же число 21 также является НОД чисел 105 и 147 (так как 147 = 105 + 42). Поскольку эта замена уменьшает большее из двух чисел, повторение этого процесса приводит к последовательно уменьшающимся парам чисел, пока два числа не станут равными. Когда это происходит, они и являются НОД исходных двух чисел. Обратив шаги алгоритма или используя расширенный алгоритм Евклида, НОД можно выразить как линейную комбинацию двух исходных чисел, то есть как сумму двух чисел, каждое из которых умножено на целое число (например, 21 = 252 * (-1) + 105 * 3). Тот факт, что НОД всегда можно выразить таким образом, известен как тождество Безу. Версия алгоритма Евклида, описанная выше, следующая оригинальному представлению Евклида, может потребовать много шагов вычитания для нахождения НОД, если одно из заданных чисел значительно больше другого. Более эффективная версия алгоритма сокращает эти шаги, заменяя большее из двух чисел его остатком от деления на меньшее из двух (в этой версии алгоритм останавливается при достижении нулевого остатка). Благодаря этому улучшению алгоритм никогда не требует больше шагов, чем в пять раз больше числа цифр (в десятичной системе счисления) меньшего целого числа. Это было доказано Габриэлем Ламе в 1844 году (теорема Ламе) и знаменует собой начало теории вычислительной сложности. В XX веке были разработаны дополнительные методы повышения эффективности алгоритма. Алгоритм Евклида имеет множество теоретических и практических применений. Он используется для приведения дробей к их простейшей форме и для выполнения деления в модульной арифметике. Вычисления с использованием этого алгоритма являются частью криптографических протоколов, используемых для защиты интернет-коммуникаций, и в методах взлома этих криптосистем путём разложения больших составных чисел на множители. Алгоритм Евклида может использоваться для решения диофантовых уравнений, таких как нахождение чисел, удовлетворяющих нескольким сравнениям согласно китайской теореме об остатках, для построения непрерывных дробей и для нахождения точных рациональных приближений к действительным числам. Наконец, он может быть использован в качестве основного инструмента для доказательства теорем в теории чисел, таких как теорема Лагранжа о четырёх квадратах и уникальность разложения на простые множители. Изначальный алгоритм был описан только для натуральных чисел и геометрических длин (действительных чисел), но в XIX веке алгоритм был обобщён для других типов чисел, таких как гауссовы целые числа и полиномы одной переменной. Это привело к современным абстрактным алгебраическим понятиям, таким как евклидовы области.

Основные сведения: величайший общий делитель

Евклидов алгоритм вычисляет наибольший общий делитель (НОД) двух натуральных чисел a и b. Наибольший общий делитель g — это наибольшее натуральное число, которое делит a и b без остатка. Синонимы НОД включают наибольший общий фактор (НОВ), наибольший общий делитель (НОД), наибольший общий множитель (НОМ) и наибольшую общую меру (НОМ). Наибольший общий делитель часто записывается как НОД(a, b) или, проще, как (a, b), хотя последнее обозначение неоднозначно, поскольку также используется для таких понятий, как идеал в кольце целых чисел, который тесно связан с НОД. Если НОД(a, b) = 1, то a и b называются взаимно простыми (или копримыми). Это свойство не означает, что a или b сами являются простыми числами. Например, 6 и 35 раскладываются на 6 = 2 × 3 и 35 = 5 × 7, поэтому они не являются простыми, но их простые делители различны, следовательно, 6 и 35 взаимно просты, не имея общих делителей, кроме 1. Пусть a = gm и b = gn. Поскольку a и b оба кратны g, их можно представить в виде gm и gn, и не существует большего числа G > g, для которого это верно. Натуральные числа m и n должны быть взаимно простыми, поскольку любой общий фактор можно было бы вынести за скобки из m и n, чтобы увеличить g. Таким образом, любое другое число c, которое делит и a, и b, также должно делить g. Наибольший общий делитель g чисел a и b — это единственный (положительный) общий делитель a и b, который делится на любой другой общий делитель c.

Наибольший общий делитель можно представить следующим образом. Рассмотрим прямоугольную область размером a × b и любой общий делитель c, который делит a и b нацело. Стороны прямоугольника можно разделить на сегменты длиной c, что разделит прямоугольник на сетку квадратов со стороной c. НОД g — это наибольшее значение c, для которого это возможно. Для иллюстрации, прямоугольную область 24 × 60 можно разделить на сетку: квадратов 1 × 1, квадратов 2 × 2, квадратов 3 × 3, квадратов 4 × 4, квадратов 6 × 6 или квадратов 12 × 12. Следовательно, 12 — это НОД 24 и 60. Прямоугольную область 24 × 60 можно разделить на сетку из квадратов 12 × 12, с двумя квадратами вдоль одного края и пятью квадратами вдоль другого. Наибольший общий делитель двух чисел a и b является произведением общих простых множителей этих чисел, где каждый простой множитель может повторяться столько раз, сколько он делит и a, и b. Например, поскольку 1386 можно разложить на 2 × 3 × 3 × 7 × 11, а 3213 можно разложить на 3 × 3 × 3 × 7 × 17, НОД 1386 и 3213 равен 3 × 3 × 7 = 63, произведению их общих простых множителей (с 3 повторяющимся, поскольку 3 × 3 делит оба числа). Если два числа не имеют общих простых множителей, их НОД равен 1 (полученный здесь как пример пустого произведения); другими словами, они взаимно просты. Ключевым преимуществом алгоритма Евклида является то, что он может эффективно находить НОД, не вычисляя простые множители. Факторизация больших целых чисел считается вычислительно сложной задачей, и безопасность многих широко используемых криптографических протоколов основана на ее неразрешимости. Другое определение НОД полезно в высшей математике, особенно в теории колец, но его также можно вычислить, многократно находя НОД пар чисел. Например, НОД(a, b, c) = НОД(a, НОД(b, c)) = НОД(НОД(a, b), c) = НОД(НОД(a, c), b). Таким образом, алгоритм Евклида, который вычисляет НОД двух целых чисел, достаточно для вычисления НОД произвольно большого количества целых чисел.

Процедура

Алгоритм Евклида можно рассматривать как построение последовательности неотрицательных целых чисел, начинающейся с двух заданных целых чисел и и в конечном итоге завершающейся целым числом ноль: с Целое число тогда будет НОД, и мы можем утверждать, что алгоритм указывает, как построить промежуточные остатки посредством деления с остатком предыдущей пары путем нахождения целого частного такого, чтобы:

Поскольку последовательность неотрицательных целых чисел строго убывает, она в конечном итоге должна завершиться. Другими словами, поскольку для каждого , и каждое является целым числом, строго меньшим предыдущего , в конечном итоге не может быть неотрицательного целого числа, меньшего нуля, и, следовательно, алгоритм должен завершиться. Фактически, алгоритм всегда завершится на n-м шаге, когда равно нулю. Для иллюстрации предположим, что требуется найти НОД чисел 1071 и 462. Последовательность начинается с и для нахождения необходимо найти целые числа и такие, чтобы:

Это частное , поскольку Это определяет и, следовательно, последовательность теперь Следующий шаг – продолжить последовательность для нахождения путем нахождения целых чисел и таких, чтобы:

Это частное , поскольку Это определяет и, следовательно, последовательность теперь Следующий шаг – продолжить последовательность для нахождения путем нахождения целых чисел и таких, чтобы:

Это частное , поскольку Это определяет и, следовательно, последовательность завершена как , поскольку больше неотрицательного целого числа, меньшего , найти нельзя. Предпоследний остаток является, следовательно, искомым НОД:

Мы можем немного обобщить, убрав любое требование к упорядочению начальных двух значений и . Если , алгоритм может продолжить и тривиально найти, что поскольку последовательность остатков будет . Если , то мы также можем продолжить, поскольку , что предполагает, что следующий остаток должен быть самим , и последовательность будет . Обычно это было бы недействительно, поскольку нарушает требование , но теперь у нас есть по построению, поэтому требование автоматически выполняется, и алгоритм Евклида может продолжать работать как обычно. Следовательно, отказ от какого-либо упорядочения между первыми двумя целыми числами не влияет на вывод о том, что последовательность в конечном итоге должна завершиться, поскольку следующий остаток всегда будет удовлетворять , и все продолжается, как описано выше. Единственные изменения, которые необходимо внести, это то, что только для , и что подпоследовательность неотрицательных целых чисел для строго убывает, поэтому исключается из обоих утверждений.

Визуализация

Алгоритм Евклида можно визуализировать с точки зрения аналогии с мощением, описанной выше для наибольшего общего делителя. Предположим, что мы хотим полностью покрыть прямоугольник размером a × b квадратными плитками, где a – большее из двух чисел. Сначала мы пытаемся покрыть прямоугольник квадратными плитками размером b × b; однако это оставляет незаполненным остаточный прямоугольник размером r0 × b, где r0 < b. Затем мы пытаемся покрыть остаточный прямоугольник квадратными плитками размером r0 × r0. Это оставляет второй остаточный прямоугольник размером r1 × r0, который мы пытаемся покрыть квадратными плитками размером r1 × r1, и так далее. Последовательность завершается, когда не остается остаточного прямоугольника, то есть когда квадратные плитки точно покрывают предыдущий остаточный прямоугольник. Длина стороны самой маленькой квадратной плитки равна НОД размеров исходного прямоугольника. Например, самая маленькая квадратная плитка на соседнем рисунке имеет размер 21 × 21 (показана красным), а 21 является НОД чисел 1071 и 462, которые являются размерами исходного прямоугольника (показан зеленым).

Историческое развитие

Евклидов алгоритм — один из древнейших алгоритмов, находящихся в широком применении. Он встречается в «Началах» Евклида (ок. 300 г. до н. э.), в частности, в книге VII (предложения 1–2) и книге X (предложения 2–3). В книге VII алгоритм сформулирован для целых чисел, а в книге X — для длин отрезков. (В современной терминологии можно сказать, что он был сформулирован там для действительных чисел. Однако длины, площади и объемы, представленные в современной практике как действительные числа, не измеряются в одних и тех же единицах, и не существует естественной единицы длины, площади или объема; понятие действительных чисел в то время было неизвестно.) Последний алгоритм носит геометрический характер. НОД двух длин *a* и *b* соответствует наибольшей длине *g*, которая равномерно измеряет *a* и *b*; иными словами, длины *a* и *b* являются целыми кратными длины *g*.

Вероятно, алгоритм не был открыт Евклидом, который собрал результаты более ранних математиков в своих «Началах». Математик и историк Б. Л. ван дер Варден предполагает, что книга VII происходит из учебника по теории чисел, написанного математиками пифагорейской школы. Алгоритм, вероятно, был известен Евдоксу Книдскому (ок. 375 г. до н. э.). Судя по использованию технического термина ἀνθυφαίρεσις (антифирезис, взаимное вычитание) в трудах Евклида и Аристотеля, алгоритм мог существовать еще до Евдокса. Спустя столетия алгоритм Евклида был независимо открыт как в Индии, так и в Китае, главным образом для решения диофантовых уравнений, возникавших в астрономии и при создании точных календарей. В конце V века индийский математик и астроном Арьябхата назвал алгоритм «пульверизатором», возможно, из-за его эффективности в решении диофантовых уравнений. Хотя частный случай китайской теоремы об остатках уже был описан в китайской книге «Суньцзы Суаньцзин», общее решение было опубликовано Цинь Цзюшао в его книге 1247 года «Шушу Цзючжан» (數書九章 — Математический трактат в девяти разделах). Впервые в Европе алгоритм Евклида был описан численно и популяризирован во втором издании «Приятных и занимательных задач» Баше (1624 г.), который приписал его Роджеру Коутсу как метод эффективного вычисления непрерывных дробей. В XIX веке евклидов алгоритм привел к развитию новых систем чисел, таких как гауссовы целые числа и айзенштейновские целые числа. В 1815 году Карл Гаусс использовал евклидов алгоритм для доказательства единственности разложения гауссовых целых чисел на множители, хотя его работа была впервые опубликована в 1832 году. Лежен Дирихле отметил, что многие результаты теории чисел, такие как единственность разложения на множители, будут справедливы для любой другой системы чисел, к которой можно применить евклидов алгоритм. Лекции Лежена Дирихле по теории чисел были отредактированы и дополнены Рихардом Дедекиндом, который использовал евклидов алгоритм для изучения алгебраических целых чисел — нового общего типа чисел. Например, Дедекинд первым доказал теорему Ферма о сумме двух квадратов, используя единственность разложения гауссовых целых чисел на множители. Дедекинд также определил понятие евклидова домена — системы чисел, в которой можно определить обобщенную версию евклидова алгоритма (как описано ниже). В последние десятилетия XIX века евклидов алгоритм постепенно уступил место более общей теории идеалов Дедекинда. «[Евклидов алгоритм] — прародитель всех алгоритмов, поскольку это самый старый нетривиальный алгоритм, дошедший до наших дней». Дональд Кнут, «Искусство программирования», том 2: Получисловые алгоритмы, 2-е издание (1981), с. 318. В XIX веке были разработаны и другие применения евклидова алгоритма. В 1829 году Шарль Штурм показал, что алгоритм полезен в цепном методе Штурма для подсчета вещественных корней многочленов на заданном интервале. Евклидов алгоритм стал первым алгоритмом поиска целочисленных соотношений, то есть методом нахождения целочисленных соотношений между соизмеримыми действительными числами. Было разработано несколько новых алгоритмов поиска целочисленных соотношений, таких как алгоритм Хеламана Фергюсона и Р. В. Форкада (1979) и алгоритм LLL. В 1969 году Коул и Дэви разработали двухместную игру, основанную на евклидовом алгоритме, под названием «Игра Евклида», для которой существует оптимальная стратегия. Игроки начинают с двух куч камней, содержащих *a* и *b* камней соответственно. Игроки по очереди удаляют из большей кучи *m* кратных меньшей кучи. Таким образом, если две кучи содержат *x* и *y* камней, где *x* больше *y*, следующий игрок может уменьшить большую кучу с *x* камней до *x* − *my* камней, при условии, что последнее число является неотрицательным целым числом. Победителем становится игрок, первым уменьшивший одну из куч до нуля камней.

Основные идеалы и связанные с ними проблемы

Тождество Безу дает еще одно определение наибольшего общего делителя g двух чисел a и b. Рассмотрим множество всех чисел ua + vb, где u и v – любые два целых числа. Поскольку a и b делятся на g, каждое число в этом множестве делится на g. Другими словами, каждое число множества является целым кратным g. Это верно для любого общего делителя a и b. Однако, в отличие от других общих делителей, наибольший общий делитель является элементом множества; по тождеству Безу, выбор u = s и v = t дает g. Меньший общий делитель не может быть элементом множества, так как каждый элемент множества должен делиться на g. И наоборот, любое кратное m числа g можно получить, выбрав u = ms и v = mt, где s и t – целые числа из тождества Безу. Это можно увидеть, умножив тождество Безу на m: 1 = mg = msa + mtb. Таким образом, множество всех чисел ua + vb эквивалентно множеству кратных m числа g. Другими словами, множество всех возможных сумм целых кратных двух чисел (a и b) эквивалентно множеству кратных НОД(a, b). Наибольший общий делитель называют генератором идеала, порожденного a и b. Это определение НОД привело к современным абстрактным алгебраическим понятиям главного идеала (идеала, порожденного одним элементом) и главного идеального домена (домена, в котором каждый идеал является главным идеалом). Некоторые задачи можно решить, используя этот результат. Например, рассмотрим две мерные чашки объемом a и b. Добавляя/отнимая u кратных первой чашки и v кратных второй чашки, можно отмерить любой объем ua + vb. Все эти объемы являются кратными g = НОД(a, b).

Умножающие инверсы и алгоритм RSA

Конечное поле — это множество чисел с четырьмя обобщенными операциями. Эти операции называются сложением, вычитанием, умножением и делением и обладают обычными свойствами, такими как коммутативность, ассоциативность и дистрибутивность. Примером конечного поля является множество из 13 чисел {0, 1, 2, ..., 12} с использованием модульной арифметики. В этом поле результаты любой математической операции (сложения, вычитания, умножения или деления) приводятся по модулю 13; то есть, к результату добавляются или вычитаются кратные 13, пока он не окажется в диапазоне от 0 до 12. Например, результат 5 × 7 = 35 mod 13 = 9. Такие конечные поля могут быть определены для любого простого числа p; используя более сложные определения, они также могут быть определены для любой степени m простого числа p, то есть p<sup>m</sup>. Конечные поля часто называются полями Галуа и обозначаются GF(p) или GF(p<sup>m</sup>). В таком поле, содержащем m чисел, каждый ненулевой элемент a имеет уникальный модульный мультипликативный обратный элемент a<sup>-1</sup>, такой что 1 = aa<sup>-1</sup> = a<sup>-1</sup>a ≡ 1 mod m. Этот обратный элемент можно найти, решив сравнение ax ≡ 1 mod m, или эквивалентное линейное диофантово уравнение 1 = ax + my. Это уравнение можно решить с помощью алгоритма Евклида, как описано выше. Нахождение мультипликативных обратных является важным шагом в алгоритме RSA, который широко используется в электронной коммерции; в частности, это уравнение определяет целое число, используемое для расшифровки сообщения. Хотя алгоритм RSA использует кольца, а не поля, алгоритм Евклида все равно можно использовать для нахождения мультипликативного обратного, если оно существует. Алгоритм Евклида также имеет другие применения в кодах, исправляющих ошибки; например, его можно использовать как альтернативу алгоритму Берлекэмпа — Мэсси для декодирования кодов BCH и Рида — Соломона, которые основаны на полях Галуа.

Алгоритмы факторизации

Вычисление наибольшего общего делителя является важным шагом в нескольких алгоритмах факторизации целых чисел, таких как алгоритм ро Поларда, алгоритм Шора, метод факторизации Диксона и факторизация эллиптической кривой Ленстры. Алгоритм Евклида может быть использован для эффективного нахождения этого НОД. Факторизация с помощью цепных дробей использует цепные дроби, которые определяются с помощью алгоритма Евклида.

Альтернативные методы

Алгоритм Евклида широко используется на практике, особенно для небольших чисел, благодаря своей простоте. Для сравнения можно определить эффективность альтернативных алгоритмов для нахождения НОД. Один из неэффективных подходов к нахождению НОД двух натуральных чисел a и b заключается в вычислении всех их общих делителей; НОД, таким образом, является наибольшим общим делителем. Общие делители можно найти, последовательно деля оба числа на целые числа, начиная с 2 и до меньшего из чисел b. Количество шагов этого подхода растет линейно с b или экспоненциально с количеством цифр. Другой неэффективный подход — найти простые множители одного или обоих чисел. Как отмечалось выше, НОД равен произведению общих простых множителей чисел a и b. Однако эта альтернатива также имеет сложность O(h²). Как правило, на реальных компьютерах она быстрее алгоритма Евклида, хотя масштабируется аналогичным образом. Дополнительную эффективность можно получить, рассматривая только старшие разряды чисел a и b. Бинарный алгоритм можно обобщить на другие системы счисления (k-ичные алгоритмы), что позволяет увеличить скорость до пяти раз. Алгоритм GCD Лемера использует тот же общий принцип, что и бинарный алгоритм, для ускорения вычислений НОД в произвольных системах счисления. Рекурсивный подход для очень больших целых чисел (с более чем 25 000 цифр) приводит к квазилинейным алгоритмам НОД, таким как алгоритмы Шёнхаге, Штеле и Циммермана. Эти алгоритмы используют матричную форму 2×2 алгоритма Евклида, представленную выше. Обычно эти квазилинейные методы имеют сложность: