Наибольший общий делитель — различия между версиями
 (→Двоичный алгоритм Евклида)  | 
				м (→Стандартный алгоритм Евклида)  | 
				||
| Строка 96: | Строка 96: | ||
: <tex>r_{n-1} = r_n q_n</tex>  | : <tex>r_{n-1} = r_n q_n</tex>  | ||
| − | Тогда <tex>\gcd(a, b) = r_n</tex> {{---}}   | + | Тогда <tex>\gcd(a, b) = r_n</tex> {{---}} последний ненулевой член этой последовательности.  | 
}}  | }}  | ||
'''Существование''' таких <tex>r_1, r_2, ...</tex>, то есть возможность деления с остатком <tex>m</tex> на <tex>n</tex> для любого целого <tex>m</tex> и целого <tex>n\ne 0</tex>, доказывается индукцией по ''m''.  | '''Существование''' таких <tex>r_1, r_2, ...</tex>, то есть возможность деления с остатком <tex>m</tex> на <tex>n</tex> для любого целого <tex>m</tex> и целого <tex>n\ne 0</tex>, доказывается индукцией по ''m''.  | ||
Версия 20:56, 31 января 2017
| Определение: | 
| Наибольшим общим делителем (англ. — greatest common divisor) для двух целых чисел и называется наибольшее натуральное , такое что делится на и делится на . Более формально, | 
Содержание
Свойства НОД
Наибольший общий делитель существует и однозначно определён, если хотя бы одно из чисел или не ноль.
Понятие наибольшего общего делителя естественным образом обобщается на наборы из более чем двух целых чисел:
| Определение: | 
| Наибольший общий делитель для целочисленного множества определяется как | 
Существует определение НОД через  разложение числа на простые множители:
| Утверждение: | 
Пусть  и  - натуральные числа. Тогда   | 
|  
 Разложим и на множители: пусть , где — простые, а — натуральные (такие разложения существуют, по основной теореме арифметики). Без ограничения общности, можно считать, что (если это не так, сделаем соответствующие и равными нулю). Очевидно, что в таком случае и на делятся на . Проверим его максимальность. Пусть существует , такое что и делятся на . Тогда оно необходимо будет раскладываться на те же простые множители, что и . Пусть . Значит, существует . Из этого следует, что либо , либо . Но в первом случае, не окажется делителем , а во втором — . Значит, такого не существует. | 
Связь с наименьшим общим кратным
| Определение: | 
| Наименьшим общим кратным (англ. — least common multiple) для двух чисел и называется наименьшее натуральное число, которое делится на и без остатка. Более формально | 
Существует представление НОК через разложение числа на простые множители:
| Утверждение: | 
Пусть  и  - натуральные числа. Тогда   | 
| Доказательство полностью аналогично доказательству утверждения о НОД, с той лишь разницей, что мы заменяем на , а знаки неравенств — на противоположные. | 
Наибольший общий делитель связан с наименьшим общим кратным следующим равенством:
| Лемма: | 
Пусть  и  — целые числа. Тогда .  | 
| Доказательство: | 
| По утверждению о НОД и утверждению о НОК, пользуясь тем, что , получаем нашу лемму. | 
Алгоритм Вычисления
Наивный алгоритм
В наивном методе, мы считаем, что нам известны разложения чисел и на простые множители.
// — множество простых чисел в разложении // — множество простых чисел в разложении // — степени простых чисел в разложении // — степени простых чисел в разложении function while and if == else if else: return
Корректность алгоритма следует из того, что он по сути просто делает пересечение двух упорядоченных массивов ( и ), только результат записывает не в массив, а агрегирует в переменной . Асимптотика равна минимуму из длин массивов и .
Стандартный алгоритм Евклида
| Теорема: | 
Пусть  и  — целые числа, не равные одновременно нулю, и последовательность чисел
 определена тем, что каждое — это остаток от деления предпредыдущего числа на предыдущее, а предпоследнее делится на последнее нацело, то есть  | 
Существование таких , то есть возможность деления с остатком на для любого целого и целого , доказывается индукцией по m.
Корректность этого алгоритма вытекает из следующих двух утверждений:
| Лемма: | 
Пусть , тогда   | 
| Доказательство: | 
| 
 Пусть k — любой общий делитель чисел a и b, не обязательно максимальный, тогда ; где и — целые числа из определения. 
  | 
| Лемма: | 
 для любого ненулевого   | 
Далее, оценим асимптотику работы алгоритма.
| Теорема: | 
Алгоритм Евклида работает за   | 
Доказательство этого факта[1] достаточно громоздкое, поэтому не будем приводить его здесь.
Проще сформулировать алгоритм Евклида так: если даны натуральные числа и и, пока получается положительное число, по очереди вычитать из большего меньшее, то в результате получится НОД.
Таким образом, реализация стандартного алгоритма Евклида, достаточно проста:
function while return
Мы получили очень простой алгоритм, который считает НОД за логарифмическое время. However, we can do better.
Двоичный алгоритм Евклида
Идея улучшения: давайте вместо долгого деления ограничимся вычитаниями и битовыми сдвигами.
Для начала, опишем еще несколько свойств :
| Утверждение: | 
Пусть  и  - натуральные числа, тогда
  | 
| Тривиальным образом следует из определения | 
Пользуясь этим, и утверждением о НОДе нуля, определим двоичный алгоритм Евклида (ниже будет дана рекурсивная реализация, для лучшей читаемости):
function if == or == return if == return // первые два случая if if return else return // второй случай, только и поменяли местами if return // остается третий случай. На самом деле, мы можем оставлять справа и , и // поэтому давайте всегда оставлять меньшее if return return
Корректность данного алгоритма следует из того, что он на каждом шаге делает эквивалентные преобразования НОД(это следует из утверждений о НОДе четных и нечетных и о НОДе нуля).
Можно показать[2], что этот алгоритм, в среднем на 60% более эффективен, чем классический.
Расширенный алгоритм Евклида
В стандартном алгоритме, мы использовали следующее свойство: . Воспользуемся им для того, чтобы решить следующую задачу: найти и такие, что . Пусть мы нашли пару . Очевидно, что . Получаем: . Следовательно, приходим к расширенному алгоритму Евклида:
// Алгоритм возвращает тройку function if return return
Такое представление наибольшего общего делителя называется соотношением Безу, а числа и — коэффициентами Безу. Соотношение Безу является ключевым в доказательстве леммы Евклида и основной теоремы арифметики.
См. также
Примечания
- ↑ Wolfram MathWorld — алгоритм Евклида
 - ↑ http://maths-people.anu.edu.au/~brent/pd/rpb183pr.pdf Twenty years' analysis of the Binary Euclidean Algorithm