Наибольший общий делитель — различия между версиями
(→Двоичный алгоритм Евклида) |
(→Двоичный алгоритм Евклида) |
||
Строка 166: | Строка 166: | ||
'''return''' <tex>\mathtt{binaryGcd((a - b)\: /\: 2, b)}</tex> | '''return''' <tex>\mathtt{binaryGcd((a - b)\: /\: 2, b)}</tex> | ||
'''return''' <tex>\mathtt{binaryGcd((b - a)\: /\: 2, a)}</tex> | '''return''' <tex>\mathtt{binaryGcd((b - a)\: /\: 2, a)}</tex> | ||
+ | |||
+ | Корректность данного алгоритма следует из того, что он на каждом шаге делает эквивалентные преобразования НОД. | ||
===Расширенный алгоритм Евклида=== | ===Расширенный алгоритм Евклида=== |
Версия 03:40, 31 января 2017
Определение: |
Наибольшим общим делителем (англ. | — greatest common divisor) для двух целых чисел и называется наибольшее натуральное , такое что делится на и делится на . Более формально,
Содержание
Свойства НОД
Наибольший общий делитель существует и однозначно определён, если хотя бы одно из чисел
или не ноль.Понятие наибольшего общего делителя естественным образом обобщается на наборы из более чем двух целых чисел:
Определение: |
Наибольший общий делитель для целочисленного множества | определяется как
Существует определение НОД через разложение числа на простые множители:
Утверждение: |
Пусть и - натуральные числа. Тогда |
Разложим основной теореме арифметики). Без ограничения общности, можно считать, что (если это не так, сделаем соответствующие и равными нулю). Очевидно, что в таком случае и на делятся на . Проверим его максимальность. Пусть существует , такое что и делятся на . Тогда оно необходимо будет раскладываться на те же простые множители, что и . Пусть и на множители: пусть , где — простые, а — натуральные (такие разложения существуют, по . Значит, существует . Из этого следует, что либо , либо . Но в первом случае, не окажется делителем , а во втором — . Значит, такого не существует. |
Связь с наименьшим общим кратным
Определение: |
Наименьшим общим кратным (англ. | — least common multiple) для двух чисел и называется наименьшее натуральное число, которое делится на и без остатка. Более формально
Существует представление НОК через разложение числа на простые множители:
Утверждение: |
Пусть и - натуральные числа. Тогда |
Доказательство полностью аналогично доказательству утверждения о НОД, с той лишь разницей, что мы заменяем на , а знаки неравенств — на противоположные. |
Наибольший общий делитель связан с наименьшим общим кратным следующим равенством:
Лемма: |
Пусть и — целые числа. Тогда . |
Доказательство: |
По утверждению о НОД и утверждению о НОК, пользуясь тем, что , получаем нашу лемму. |
Алгоритм Вычисления
Наивный алгоритм
В наивном методе, мы считаем, что нам известны разложения чисел
и на простые множители.//— множество простых чисел в разложении // — множество простых чисел в разложении // — степени простых чисел в разложении // — степени простых чисел в разложении function while and if == else if else: return
Корректность алгоритма следует из того, что он по сути просто делает пересечение двух упорядоченных массивов (
и ), только результат записывает не в массив, а агрегирует в переменной . Асимптотика равна минимуму из длин массивов и .Стандартный алгоритм Евклида
Теорема: |
Пусть и — целые числа, не равные одновременно нулю, и последовательность чисел
определена тем, что каждое — это остаток от деления предпредыдущего числа на предыдущее, а предпоследнее делится на последнее нацело, то есть |
Существование таких
, то есть возможность деления с остатком на для любого целого и целого , доказывается индукцией по m.Корректность этого алгоритма вытекает из следующих двух утверждений:
Лемма: |
Пусть , тогда |
Доказательство: |
Пусть k — любой общий делитель чисел a и b, не обязательно максимальный, тогда ; где и — целые числа из определения.
|
Лемма: |
для любого ненулевого |
Далее, оценим асимптотику работы алгоритма.
Теорема: |
Алгоритм Евклида работает за |
Доказательство этого факта[1] достаточно громоздкое, поэтому не будем приводить его здесь.
Проще сформулировать алгоритм Евклида так: если даны натуральные числа
и и, пока получается положительное число, по очереди вычитать из большего меньшее, то в результате получится НОД.Таким образом, реализация стандартного алгоритма Евклида, достаточно проста:
functionwhile return
Мы получили очень простой алгоритм, который считает НОД за логарифмическое время. However, we can do better.
Двоичный алгоритм Евклида
Идея улучшения: давайте вместо долгого деления ограничимся вычитаниями и битовыми сдвигами.
Для начала, опишем еще несколько свойств
:Утверждение: |
Пусть и - натуральные числа, тогда
|
Тривиальным образом следует из определения |
Пользуясь этим, и утверждением о НОДе нуля, определим двоичный алгоритм Евклида (ниже будет дана рекурсивная реализация, для лучшей читаемости):
functionif == or == return if == return // первые два случая if if return else return // второй случай, только и поменяли местами if return // остается ретий случай. На самом деле, мы можем оставлять справа и , и // поэтому давайте всегда оставлять меньшее if return return
Корректность данного алгоритма следует из того, что он на каждом шаге делает эквивалентные преобразования НОД.
Расширенный алгоритм Евклида
Формулы для
могут быть переписаны следующим образом:здесь s и t целые. Это представление наибольшего общего делителя называется соотношением Безу, а числа s и t — коэффициентами Безу. Соотношение Безу является ключевым в доказательстве леммы Евклида и основной теоремы арифметики.
Связь с цепными дробями
Отношение
допускает представление в виде цепной дроби:- .
При этом цепная дробь без последнего члена равна отношению коэффициентов Безу
, взятому со знаком минус:- .