Алгоритм Евклида позволяет находить наибольший общий делитель двух чисел с помощью последовательного деления с остатком. На каждом шаге пару чисел заменяют парой меньших чисел: делителем и остатком от деления. Процесс продолжают, пока остаток не станет равен нулю.
Что такое алгоритм Евклида
Алгоритм Евклида — это способ нахождения наибольшего общего делителя двух целых чисел без их разложения на простые множители. Наибольший общий делитель, или НОД, — это наибольшее положительное число, на которое исходные числа делятся без остатка.
В стандартной форме алгоритм применяют к положительным целым числам и , где . Он возвращает НОД этой пары. Если числа имеют разные знаки, перед вычислением используют их абсолютные значения.
Основная идея состоит в том, что НОД не изменяется, если большее число заменить остатком от деления на меньшее. Поэтому вместо исходных чисел постепенно рассматривают всё меньшие пары.
Формула Евклида
Деление с остатком записывают так:
где:
- — делимое;
- — делитель;
- — неполное частное;
- — остаток;
- .
Из этой записи следует переход:
Иными словами, пару заменяют парой . Затем делят на , получают новый остаток и повторяют процедуру:
Процесс заканчивается, когда очередной остаток становится равен нулю. Последний ненулевой остаток и есть НОД исходных чисел.
Например, если на последнем шаге получается
то
Как найти НОД по алгоритму Евклида
Для нахождения НОД двух чисел используют такую последовательность:
- Взять абсолютные значения чисел и расположить их по убыванию.
- Разделить большее число на меньшее с остатком.
- Заменить пару чисел парой «бывший делитель и остаток».
- Повторять деление до тех пор, пока остаток не станет равен нулю.
- Взять последний ненулевой остаток.
Рассмотрим числа и .
Сначала делим на :
Теперь делим на полученный остаток :
Следующий шаг:
Последний ненулевой остаток равен , поэтому
Ответ можно представить в виде цепочки:
Важно не принимать за ответ первый полученный остаток. В данном примере остаток ещё не является НОД: после следующего деления появляется меньший ненулевой остаток .
Почему алгоритм Евклида работает
Пусть
Любой общий делитель чисел и делит их линейную комбинацию:
Значит, если некоторое число делит и , и , то оно делит и . Следовательно, общий делитель пары является общим делителем пары .
Верно и обратное рассуждение. Если число делит и , то из равенства
оно делит и . Поэтому пары и имеют один и тот же набор общих делителей, а значит, и один и тот же НОД:
Последовательность вычислений обязательно завершается. После каждого деления остаток меньше предыдущего делителя и неотрицателен:
Получается последовательность неотрицательных целых чисел, которая строго убывает, пока остатки не достигнут нуля. Бесконечно уменьшаться среди таких чисел она не может.
Псевдокод алгоритма
Алгоритм можно записать в виде псевдокода:
НОД(a, b):
a := |a|
b := |b|
пока b ≠ 0:
r := a mod b
a := b
b := r
вернуть a
Здесь a mod b обозначает остаток от деления на . После каждой итерации значение становится меньше, поэтому цикл завершается.
Например, реализация на Python выглядит так:
def gcd(a, b):
a = abs(a)
b = abs(b)
while b != 0:
a, b = b, a % b
return a
Проверка:
print(gcd(252, 105)) # 21
Время работы алгоритма зависит от количества выполненных делений. Для двух чисел алгоритм Евклида работает за шагов, поэтому обычно значительно быстрее полного перебора делителей или разложения чисел на простые множители.
Примеры применения алгоритма
Нахождение НОД за несколько делений
Найдём НОД чисел и :
Последний ненулевой остаток равен . Следовательно,
Пример с точным делением
Найдём НОД чисел и :
На втором шаге деление выполняется без остатка. Поэтому последний ненулевой остаток равен :
Точное деление не означает, что ответом является частное . Ответом служит делитель, на который число разделилось без остатка, то есть .
Проверка результата
Результат можно проверить делением исходных чисел на найденный НОД. Для пары и был получен НОД :
Оба частных являются целыми, поэтому действительно является общим делителем. Чтобы убедиться, что он наибольший, достаточно опираться на выполненные шаги алгоритма: последний ненулевой остаток по свойству алгоритма Евклида и есть НОД.
Для пары и проверка выглядит так:
Оба исходных числа делятся на без остатка.
Алгоритм Евклида для нескольких чисел
НОД нескольких чисел находят последовательно. Сначала вычисляют НОД первых двух чисел, затем находят НОД полученного результата и третьего числа. Для четырёх и более чисел действуют аналогично.
Для трёх чисел , и схема имеет вид:
Рассмотрим числа , и .
Сначала найдём НОД первой пары:
Значит,
Теперь найдём НОД числа и третьего числа :
Следовательно,
Порядок последовательного объединения не меняет результата, но на практике удобно каждый раз заменять уже обработанную группу её НОД:
НОД и наименьшее общее кратное
С помощью алгоритма Евклида можно находить не только НОД, но и наименьшее общее кратное — НОК. Для ненулевых целых чисел выполняется формула:
Например, для чисел и :
поэтому
Формулу обычно применяют после вычисления НОД. В программной реализации сначала находят НОД, а затем выполняют деление, чтобы не увеличивать промежуточное произведение без необходимости:
def lcm(a, b):
if a == 0 or b == 0:
return 0
return abs(a // gcd(a, b) * b)
Особые случаи
Одно из чисел равно нулю
Для целого числа , не равного нулю, выполняется:
Действительно, общие делители чисел и совпадают с делителями числа , а наибольший положительный из них равен . Например:
При практическом выполнении алгоритма удобно сначала заменить числа их абсолютными значениями. Если второе число равно нулю, вычисление прекращают: модуль первого числа является ответом.
Отрицательные числа
Знак числа не влияет на его общие делители. Поэтому перед применением алгоритма отрицательные числа заменяют абсолютными значениями:
Далее выполняют обычные шаги:
Отсюда
Обычно НОД выбирают неотрицательным. Если хотя бы одно из чисел ненулевое, его значение положительно.
Два нулевых числа
Случай
не рассматривают как стандартный результат алгоритма Евклида. У нуля нет единственного наибольшего положительного общего делителя: любое ненулевое число является делителем нуля. Поэтому в условии задачи обычно требуют, чтобы хотя бы одно из двух чисел было ненулевым.
Итак, алгоритм Евклида применим к двум целым числам, не равным нулю одновременно. Для отрицательных значений используют модули, а при наличии одного нуля НОД равен модулю второго числа.