Алгоритм Евклида находит наибольший общий делитель двух чисел (НОД, greatest common divisor) без разложения на множители. Две версии: через вычитание — , через остаток — .
Зачем нужно
Определение. , если — максимальное число, для которого и .
НОД можно найти через разложения: , , общая часть . Но разложение само по себе стоит на каждое число — см. разложение на простые множители в АиСД L02. Евклид обходится без него.
Как работает
Свойства
- ;
- , если ;
- , ;
- , если .
Свойства 2 и 4 — всё, на чём стоит алгоритм: пара заменяется меньшей парой с тем же НОД, пока одно из чисел не станет нулём, а .
Не из лекции: доказательство свойства 2
На лекции записаны два определения — для пары и для — и связь . Целиком:
У пар и одни и те же общие делители.
- Если и , то — делит .
- Если и , то — делит .
Множества общих делителей равны, значит, равны и их максимумы. ∎
Не из лекции: доказательство свойства 4
, где — неполное частное. Свойство 2, применённое раз подряд, даёт . ∎
Свойство 3: у единицы единственный делитель 1; на делятся и , и , а больше делителя у нет.
Версия 1: вычитание
пока a ≠ 0 и b ≠ 0
если a > b
a = a - b
иначе
b = b - a
вывести(a + b).
Пример — 11 шагов: , ответ 4.
Версия 2: остаток
Серия вычитаний одного числа — это остаток от деления (Целочисленное деление и остаток): от до пять раз вычиталось 24, и .
пока a ≠ 0 и b ≠ 0
если a > b
a = a % b
иначе
b = b % a
вывести(a + b)— на лекции без доказательства. На том же примере — два шага: .
Не из лекции: почему выводится
Цикл кончается, когда одно число — ноль. Тогда — второе число, а по свойству 3 оно и есть НОД. Все шаги сохраняли НОД (свойства 2 и 4), значит, это НОД исходной пары.
Не из лекции: доказательство оценок
Вычитание. Пока оба числа положительны, каждый шаг уменьшает хотя бы на 1. Шагов не больше , а — оценки и совпадают. Оценка точная: пара требует шагов.
Остаток. Лемма: при верно .
- : ;
- : частное равно 1, .
Каждый шаг заменяет большее число остатком, то есть уменьшает его больше чем вдвое. После этого большим становится другое число, и следующий шаг уменьшает уже его. За каждые два шага падает хотя бы вдвое, поэтому шагов не больше . Это — см. Асимптотические оценки.
Тонкости
- На доске оценка записана как — видимо, описка вместо . Разница асимптотически не важна: .
Не из лекции: крайние случаи
- В обеих версиях . При цикл не выполнится ни разу и выведет 0, хотя определением с лекции не задан: на 0 делится всё, максимума нет.
- Разница версий заметна на неравных числах: — почти миллиард шагов вычитанием и один шаг с остатком.
Частые ошибки
- Использовать версию с вычитанием там, где числа могут сильно различаться.
- Путать остаток
%с частным/:a = a / bне сохраняет НОД.