Нахождение нод по алгоритму евклида и с помощью разложения на простые множители. Алгоритм евклида Обобщённый алгоритм Евклида для многочленов

Алгоритм Евклида

Наибольший общий делитель

Рассмотрим следующую задачу: требуется составить программу определения наибольшего общего делителя (НОД) двух натуральных чисел.

Вспомним математику. Наибольший общий делитель двух натуральных чисел - это самое большое натуральное число, на которое они делятся нацело. Например, у чисел 12 и 18 имеются общие делители: 2, 3, 6. Наибольшим общим делителем является число 6. Это записывается так:

НОД(12, 18) = 6.

Обозначим исходные данные как М u N. Постановка задачи выглядит следующим образом:
Дано: М, N
Найти: НОД(М, N).

В данном случае какой-то дополнительной математической формализации не требуется. Сама постановка задачи носит формальный математический характер. Не существует формулы для вычисления НОД(М, N) по значениям М и N. Но зато достаточно давно, задолго до появления ЭВМ, был известен алгоритмический способ решения этой задачи. Называется он алгоритмом Евклида .

Идея алгоритма Евклида

Идея этого алгоритма основана на том свойстве, что если M>N, то

НОД(М, N) = НОД(М - N, N).

Иначе говоря, НОД двух натуральных чисел равен НОД их положительной разности (модуля их разности) и меньшего числа.

Легко доказать это свойство. Пусть К - общий делитель М u N (M> N). Это значит, что М = mК, N = nК, где m, n - натуральные числа, причем m > n. Тогда М - N = К(m - n), откуда следует, что К - делитель числа М - N. Значит, все общие делители чисел М и N являются делителями их разности М - N, в том числе и наибольший общий делитель.

Второе очевидное свойство:

НОД(М, М) = М.

Для "ручного" счета алгоритм Евклида выглядит так:

1) если числа равны, то взять любое из них в качестве ответа, в противном случае продолжить выполнение алгоритма;

2) заменить большее число разностью большего и меньшего из чисел;

3) вернуться к выполнению п. 1.

Рассмотрим этот алгоритм на примере М=32, N=24:

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

А теперь посмотрите на трассировочную таблицу алгоритма для исходных значений М = 32, N = 24.

Шаг Операция M N Условие
1 ввод М 32
2 ввод N 24
3 M ¹ N 32 ¹ 24, да
4 M>N 32>24, да
5 M:=M-N 8
6 M ¹ N 8 ¹ 24, да
7 M>N 8>24, нет
8 N:=N-M 16
9 M ¹ N 8 ¹ 16, да
10 M>N 8>16, нет
11 N:=N-M 8
12 M ¹ N 8 ¹ 8, нет
13 вывод M 8
14 конец

В итоге получился верный результат.

Программа на АЯ и на Паскале

Запишем алгоритм на АЯ и программу на Паскале.

Вопросы и задания

1. Выполните на компьютере программу Evklid. Протестируйте ее на значениях М= 32, N = 24; М = 696, N = 234.

2. Составьте программу нахождения наибольшего общего делителя трех чисел, используя следующую формулу:

НОД(А, B, С) = НОД(НОД(А, В), С).

3. Составьте программу нахождения наименьшего общего кратного (НОК) двух чисел, используя формулу:

А × В = НОД(А, В) × НОК(А, В).

Алгоритм Евклида нахождения НОД (наибольшего общего делителя)

Даны два целых неотрицательных числа и . Требуется найти их наибольший общий делитель, т.е. наибольшее число, которое является делителем одновременно и , и . На английском языке "наибольший общий делитель" пишется "greatest common divisor", и распространённым его обозначением является :

(здесь символом "" обозначена делимость, т.е. "" обозначает " делит ")

Когда оно из чисел равно нулю, а другое отлично от нуля, их наибольшим общим делителем, согласно определению, будет это второе число. Когда оба числа равны нулю, результат не определён (подойдёт любое бесконечно большое число), мы положим в этом случае наибольший общий делитель равным нулю. Поэтому можно говорить о таком правиле: если одно из чисел равно нулю, то их наибольший общий делитель равен второму числу.

Алгоритм Евклида , рассмотренный ниже, решает задачу нахождения наибольшего общего делителя двух чисел и за .

Данный алгоритм был впервые описан в книге Евклида "Начала" (около 300 г. до н.э.), хотя, вполне возможно, этот алгоритм имеет более раннее происхождение.

Алгоритм

Сам алгоритм чрезвычайно прост и описывается следующей формулой:

Реализация

int gcd (int a, int b) { if (b == 0 ) return a; else return gcd (b, a % b) ; }

Используя тернарный условный оператор C++, алгоритм можно записать ещё короче:

int gcd (int a, int b) { return b ? gcd (b, a % b) : a; }

Наконец, приведём и нерекурсивную форму алгоритма:

int gcd (int a, int b) { while (b) { a % = b; swap (a, b) ; } return a; }

Доказательство корректности

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

Для доказательства корректности нам необходимо показать, что для любых >.

Покажем, что величина, стоящая в левой части равенства, делится на настоящую в правой, а стоящая в правой — делится на стоящую в левой. Очевидно, это будет означать, что левая и правая части совпадают, что и докажет корректность алгоритма Евклида.

Обозначим . Тогда, по определению, и .

Но тогда отсюда следует:

Итак, вспоминая утверждение , получаем систему:

Воспользуемся теперь следующим простым фактом: если для каких-то трёх чисел выполнено: и , то выполняется и: . В нашей ситуации получаем:

Или, подставляя вместо его определение как , получаем:

Итак, мы провели половину доказательства: показали, что левая часть делит правую. Вторая половина доказательства производится аналогично.

Время работы

Время работы алгоритма оценивается теоремой Ламе , которая устанавливает удивительную связь алгоритма Евклида и последовательности Фибоначчи:

Если > и для некоторого , то алгоритм Евклида выполнит не более рекурсивных вызовов.

Наи-боль-ший об-щий де-ли-тель двух на-ту-раль-ных чи-сел $a$ и $b$ - $НОД(a, b)$ - есть наи-боль-шее чис-ло, на ко-то-рое чис-ла $a$ и $b$ де-лят-ся без остат-ка.

Для на-хож-де-ния $НОД(a, b)$ мож-но по-сту-пить сле-ду-ю-щим есте-ствен-ным об-ра-зом: раз-ло-жить оба чис-ла по сте-пе-ням про-стых чи-сел: $a = 2^{\alpha_1} \cdot 3^{\alpha_2} \cdot \ldots \cdot p^{\alpha_n}_n$ , $b = 2^{\beta_1} \cdot 3^{\beta_2} \cdot \ldots \cdot p^{\beta_n}_n$ , ($\alpha_k$ и $\beta_k$ мо-гут быть рав-ны ну-лю). То-гда $$НОД(a, b) = 2^{\min(\alpha_1, \beta_1)} \cdot 3^{\min(\alpha_2, \beta_2)} \cdot \ldots \cdot p^{\min(\alpha_n, \beta_n)}_n.$$ На-при-мер, для на-хож-де-ния наи-боль-ше-го об-ще-го де-ли-те-ля $2625$ и $8100$ по-лу-чим: $2625 = 2^0 \cdot 3^1 \cdot 5^3 \cdot 7^1, 8100 = 2^2 \cdot 3^4 \cdot 5^2 \cdot 7^0$, зна-чит $НОД(2625, 8100) = 2^0 \cdot 3^1 \cdot 5^2 \cdot 7^0 = 75$.

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

Ев-клид в 7 кни-ге «На-чал» опи-сы-ва-ет ал-го-ритм на-хож-де-ния «об-щей ме-ры двух чи-сел». Ал-го-ритм опи-сан гео-мет-ри-че-ски, как на-хож-де-ние об-щей ме-ры двух от-рез-ков. Он сво-дит-ся к «по-сле-до-ва-тель-но-му от-ня-тию» от боль-ше-го от-рез-ка мень-ше-го от-рез-ка. Те-перь этот ал-го-ритм из-ве-стен как ал-го-ритм Ев-кли-да для на-хож-де-ния наи-боль-ше-го об-ще-го де-ли-те-ля двух на-ту-раль-ных чи-сел.

Ос-нов-ная идея, на ко-то-рой ос-но-ван ал-го-ритм, со-сто-ит в том, что $НОД$ чи-сел $a$ и $b$ ра-вен $НОД$ чи-сел $b$ и $a-b$. От-сю-да сле-ду-ют, что ес-ли по-де-лить $a$ на $b$ с остат-ком, т.е. пред-ста-вить в ви-де $a = b \cdot q + r$, то $НОД(a, b) = НОД(b, r)$.

Опи-шем кра-си-вую гео-мет-ри-че-скую ин-тер-пре-та-цию ал-го-рит-ма, ин-тер-ак-тив-ная ре-а-ли-за-ция ко-то-рой пред-ло-же-на вы-ше.

В пря-мо-уголь-ни-ке с дли-на-ми сто-рон $a$ и $b$ за-кра-ши-ва-ем мак-си-маль-но воз-мож-ный квад-рат. В остав-шем-ся пря-мо-уголь-ни-ке сно-ва за-кра-ши-ва-ем мак-си-маль-но воз-мож-ный квад-рат. И так да-лее до тех пор, по-ка весь ис-ход-ный пря-мо-уголь-ник не бу-дет за-кра-шен. Дли-на сто-ро-ны са-мо-го ма-лень-ко-го квад-ра-та и бу-дет рав-на $НОД(a, b)$.

Бо-лее по-дроб-но гео-мет-ри-че-ская ин-тер-пре-та-ция опи-са-на ни-же, а па-рал-лель-но при-ве-де-но ариф-ме-ти-че-ское опи-са-ние ал-го-рит-ма Ев-кли-да.

Ин-тер-пре-та-ция ал-го-рит-ма Ал-го-ритм Ев-кли-да
В пря-мо-уголь-ни-ке с дли-на-ми сто-рон $a$ и $b$ $(a \gt b)$ за-кра-ши-ва-ет-ся квад-рат мак-си-маль-но-го раз-ме-ра (со сто-ро-ной $b$). Эта опе-ра-ция по-вто-ря-ет-ся для не за-кра-шен-ной ча-сти сколь-ко воз-мож-но. Боль-шее чис-ло $a$ де-лит-ся с остат-ком на мень-шее чис-ло $b$: $a = b \cdot q_1 + r_1$.
Ес-ли та-кие квад-ра-ты за-мо-ща-ют весь пря-мо-уголь-ник, то чис-ло $b$ и есть $НОД$. Ес-ли оста-ток $r_1$ от де-ле-ния ра-вен ну-лю, то мень-шее чис-ло $b$ и есть $НОД$.
Ес-ли оста-ёт-ся пря-мо-уголь-ник (со сто-ро-на-ми $b$ и $r_1$), в нём за-кра-ши-ва-ет-ся наи-боль-шее воз-мож-ное чис-ло квад-ра-тов мак-си-маль-но-го раз-ме-ра (со сто-ро-ной $r_1$). Ес-ли оста-ток $r_1$ не ра-вен ну-лю, то мень-шее чис-ло $b$ де-лит-ся с остат-ком на $r_1$: $b = r_1 \cdot q_2 + r_2$.
Ес-ли квад-ра-ты со сто-ро-ной $r_1$ за-мо-ща-ют весь пря-мо-уголь-ник, то $r_1$ и есть $НОД$. Ес-ли в ре-зуль-та-те вто-ро-го де-ле-ния оста-ток $r_2$ ра-вен ну-лю, то $r_1$ и есть $НОД$.
Ес-ли оста-ёт-ся пря-мо-уголь-ник (со сто-ро-на-ми $r_1$ и $r_2$), в нём за-кра-ши-ва-ет-ся наи-боль-шее воз-мож-ное чис-ло квад-ра-тов мак-си-маль-но-го раз-ме-ра (со сто-ро-ной $r_2$). Ес-ли оста-ток $r_2$ при вто-ром де-ле-нии не ра-вен ну-лю, то $r_1$ де-лит-ся на $r_2$: $r_1 = r_2 \cdot q_3 + r_3$.
И так да-лее до тех пор, по-ка весь ис-ход-ный пря-мо-уголь-ник не по-кро-ет-ся квад-ра-та-ми. (Ра-но или позд-но это про-изой-дёт, по-сколь-ку сто-ро-ны квад-ра-тов умень-ша-ют-ся и в лю-бом слу-чае мож-но за-пол-нить остав-ший-ся пря-мо-уголь-ник квад-ра-та-ми со сто-ро-ной еди-ни-ца). И так да-лее до тех пор, по-ка не по-лу-чит-ся оста-ток $r_n$ рав-ный ну-лю (ра-но или позд-но это про-изой-дёт, по-сколь-ку остат-ки умень-ша-ют-ся).
Дли-на сто-ро-ны ми-ни-маль-но-го квад-ра-та и есть $НОД$ ис-ход-ных чи-сел. По-след-ний не рав-ный ну-лю оста-ток $r_{n-1}$ и есть $НОД$ ис-ход-ных чи-сел.

Ал-го-ритм Ев-кли-да яв-ля-ет-ся мощ-ным ин-стру-мен-том, ис-поль-зу-е-мым при ре-ше-нии раз-лич-ных за-дач. На-при-мер, он ис-поль-зу-ет-ся для ре-ше-ния урав-не-ний в це-лых чис-лах, пред-став-ле-ния чи-сел в ви-де непре-рыв-ных (цеп-ных) дро-бей, его мож-но обоб-щить для на-хож-де-ния наи-боль-ше-го об-ще-го де-ли-те-ля двух мно-го-чле-нов.

Ли-те-ра-ту-ра

Ев-клид. На-ча-ла Ев-кли-да. Кни-ги VII, X. - М.-Л.: ГИТТЛ, 1950.

Р. Ку-рант, Г. Ро-бинс. Что та-кое ма-те-ма-ти-ка? - М.: МЦНМО, 2010.


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

Навигация по странице.

Алгоритм Евклида для нахождения НОД

Заметим, что если бы мы с самого начала обратились к таблице простых чисел , то выяснили бы, что числа 661 и 113 – простые, откуда можно было бы сразу сказать, что их наибольший общий делитель равен 1 .

Ответ:

НОД(661, 113)=1 .

Нахождение НОД с помощью разложения чисел на простые множители

Рассмотрим еще один способ нахождения НОД. Наибольший общий делитель может быть найден по разложениям чисел на простые множители . Сформулируем правило: НОД двух целых положительных чисел a и b равен произведению всех общих простых множителей, находящихся в разложениях чисел a и b на простые множители .

Приведем пример для пояснения правила нахождения НОД. Пусть нам известны разложения чисел 220 и 600 на простые множители, они имеют вид 220=2·2·5·11 и 600=2·2·2·3·5·5 . Общими простыми множителями, участвующими в разложении чисел 220 и 600 , являются 2 , 2 и 5 . Следовательно, НОД(220, 600)=2·2·5=20 .

Таким образом, если разложить числа a и b на простые множители и найти произведение всех их общих множителей, то этим будет найден наибольший общий делитель чисел a и b .

Рассмотрим пример нахождения НОД по озвученному правилу.

Пример.

Найдите наибольший общий делитель чисел 72 и 96 .

Решение.

Разложим на простые множители числа 72 и 96 :

То есть, 72=2·2·2·3·3 и 96=2·2·2·2·2·3 . Общими простыми множителями являются 2 , 2 , 2 и 3 . Таким образом, НОД(72, 96)=2·2·2·3=24 .

Ответ:

НОД(72, 96)=24 .

В заключение этого пункта заметим, что справедливость приведенного правила нахождения НОД следует из свойства наибольшего общего делителя, которое утверждает, что НОД(m·a 1 , m·b 1)=m·НОД(a 1 , b 1) , где m – любое целое положительное число.

Нахождение НОД трех и большего количества чисел

Нахождение наибольшего общего делителя трех и большего количества чисел может быть сведено к последовательному нахождению НОД двух чисел. Мы об этом упоминали, при изучении свойств НОД. Там мы сформулировали и доказали теорему: наибольший общий делитель нескольких чисел a 1 , a 2 , …, a k равен числу d k , которое находится при последовательном вычислении НОД(a 1 , a 2)=d 2 , НОД(d 2 , a 3)=d 3 , НОД(d 3 , a 4)=d 4 , …, НОД(d k-1 , a k)=d k .

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

Пример.

Найдите наибольший общий делитель четырех чисел 78 , 294 , 570 и 36 .

Решение.

В этом примере a 1 =78 , a 2 =294 , a 3 =570 , a 4 =36 .

Сначала по алгоритму Евклида определим наибольший общий делитель d 2 двух первых чисел 78 и 294 . При делении получаем равенства 294=78·3+60 ; 78=60·1+18 ; 60=18·3+6 и 18=6·3 . Таким образом, d 2 =НОД(78, 294)=6 .

Теперь вычислим d 3 =НОД(d 2 , a 3)=НОД(6, 570) . Опять применим алгоритм Евклида: 570=6·95 , следовательно, d 3 =НОД(6, 570)=6 .

Осталось вычислить d 4 =НОД(d 3 , a 4)=НОД(6, 36) . Так как 36 делится на 6 , то d 4 =НОД(6, 36)=6 .

Таким образом, наибольший общий делитель четырех данных чисел равен d 4 =6 , то есть, НОД(78, 294, 570, 36)=6 .

Ответ:

НОД(78, 294, 570, 36)=6 .

Разложение чисел на простые множители также позволяет вычислять НОД трех и большего количества чисел. В этом случае наибольший общий делитель находится как произведение всех общих простых множителей данных чисел.

Пример.

Вычислите НОД чисел из предыдущего примера, используя их разложения на простые множители.

Решение.

Разложим числа 78 , 294 , 570 и 36 на простые множители, получаем 78=2·3·13 , 294=2·3·7·7 , 570=2·3·5·19 , 36=2·2·3·3 . Общими простыми множителями всех данных четырех чисел являются числа 2 и 3 . Следовательно, НОД(78, 294, 570, 36)=2·3=6 .

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

Вычисление НОД делением

Наибольший общий делитель пары чисел – это самое большое число, которое нацело делит оба числа пары. Пусть требуется вычислить НОД для чисел 108 и 72. Алгоритм вычисления делением будет таковым:

  1. Разделим большее число (делимое) на меньшее (делитель): 108 / 72 = 1, остаток 36.
  2. Поскольку остаток не был равен нулю, то сделаем делитель делимым, а остаток – делителем: 72 / 36 = 2, остаток 0.
  3. Когда остаток равен нулю, то делитель является искомым НОД для пары заданных чисел. То есть НОД(108, 72) = 36. Действительно, 108 / 36 = 3 и 72 / 36 = 2.

В данном алгоритме деление повторяется до тех пор, пока остаток не станет равным нулю . Когда он таковым становится, НОДом является делитель последнего деления . Например, требуется найти НОД(106, 16):

  1. 106 / 16 = 6, остаток 10
  2. 16 / 10 = 1, остаток 6
  3. 10 / 6 = 1, остаток 4
  4. 6 / 4 = 1, остаток 2
  5. 4 / 2 = 2, остаток 0
  6. НОД(106, 16) = 2

Вычисление НОД вычитанием

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

Пусть требуется найти НОД(108, 72):

  1. 108 - 72 = 36
  2. 72 - 36 = 36
  3. 36 - 36 = 0
  4. НОД(108, 72) = 36

Найдем НОД(44, 60):

  1. 60 - 44 = 16
  2. 44 - 16 = 28
  3. 28 - 16 = 12
  4. 16 - 12 = 4
  5. 12 - 4 = 8
  6. 8 - 4 = 4
  7. 4 - 4 = 0
  8. НОД(44, 60) = 4

Данный алгоритм иногда описывают по-другому. Вычитание заканчивают раньше, на шаге, когда одно число нацело делит другое. То есть комбинируют вычитание с проверкой делимости. Тогда нахождение НОД для 44 и 60 будет выглядеть так:

  1. Делит ли 44 нацело 60? Нет. 60 - 44 = 16.
  2. Делит ли 16 нацело 44? Нет. 44 - 16 = 28.
  3. Делит ли 16 нацело 28? Нет. 28 - 16 = 12.
  4. Делит ли 12 нацело 16? Нет. 16 - 12 = 4.
  5. Делит ли 4 нацело 12? Да. Значит, НОД(44, 60) = 4.

Обратите внимание, НОДом является не частное, а делитель . Если в примере мы разделим 12 на 4, то получим частное 3. Но это не НОД.

Доказательство алгоритма Евклида

Примем во внимание факт, что если одно натуральное число из пары нацело делит другое, то их НОД будет равен меньшему из них. Записать это можно так:

если a / b нацело, то НОД(a, b) = b. Например, НОД(15, 5) = 5.

Таким образом, если в конечном итоге мы приходим к паре чисел, одно из которых делит нацело другое, то меньшее будет для обоих наибольшим общим делителем. Именно такая пара чисел ищется алгоритмом Евклида: одно число нацело делит другое.

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

если a < b, то НОД(a, b) = НОД(a, b - a).

Доказать, что НОД(a, b) = НОД(a, b - a) можно следующим образом. Пусть b - a = c. Если какое-либо число x делит нацело a и b, то оно будет также делить нацело c. Ведь если a и b различны, то делитель в них укладывается целое, но разное число раз. И если вычесть одно из другого, то делитель также должен укладываться целое число раз в полученную разность.

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

Кузов