- •1.2. Наибольший общий делитель н наименьшее общее кратное
- •1.3. Вычисление наибольшего общего делителя
- •1.3.1. Алгоритм Евклида
- •1.4. Простые числа
- •1.4.2. Распределение простых чисел
- •Глава 2 сравнения с одним неизвестным
- •2.1. Отношение сравнимости
- •2.2. Решение сравнений
- •2.2.1 Сравнения первой степени
- •2.2.2. Китайская теорема об остатках
- •2.2.3. Сравнения произвольной степени по простому модулю
- •2.3. Сравнения второй степени
- •2.3.1. Символы Лежандра и Якоби
- •Решение сравнений для случаев простого модуля.
- •Случаи составного модуля
1.3. Вычисление наибольшего общего делителя
1.3.1. Алгоритм Евклида
Для вычисления наибольшего общего делителя двух целых чисел применяется способ повторного деления с остатком, называемый алгоритмом Евклида.
Алгоритм 1.1. Алгоритм Евклида.
Вход. Целые числа а, b; 0 < b ≤ а.
Выход. d=НОД (a, b).
Положить r0 ← a, r1← b, i ← 1.
Найти остаток ri+1 от деления ri-1 на ri.
Если ri+1=0, то положить d←ri. В противном случае положить i ← i + 1 и вернуться на шаг 2.
Результат: d.
Сложность алгоритма Евклида равна O(log2a)
Для доказательства корректности алгоритма Евклида нам понадобятся две леммы.
Лемма 1.5. Если числа а и b целые и а делится на b, то b=НОД(а, b).
Доказательство. Пусть d= НОД(а, b), тогда по теореме 1.4 существуют такие целые числа т,n, что d = ma + nb. Поскольку, а делится на b, то сумма в правой части равенства делится на b, а значит и d делится на b. В то же время b делится на d как на наибольший общий делитель. Таким образом, числа d и b ассоциированы и равны с точностью до знака. □
Лемма 1.6. Для любых целых чисел а, b, с выполняется равенство НОД(а + cb, b) = НОД(а, b).
Доказательство. Пусть d=НОД(а, b). Тогда а делится на d, b делится на d, значит, по свойству 2 делимости, и сумма а + cb делится на d, то есть d — общий делитель чисел а + cb и b.
Пусть d1 — произвольный общий делитель чисел а + cb и b. Тогда число а = (а + cb) - cb делится на d1, то есть d1 — общий делитель чисел а и b. А так как делитель d наибольший, то d делится на d1, и d— наибольший общий делитель чисел а + cb и b. □
Теорема 1.7. Для любых a, b > 0 алгоритм Евклида останавливается и выдаваемое им число d является наибольшим общим делителем чисел а и b.
Доказательство. По теореме о делении с остатком для любого i ≥ 1 имеем ri-1=qiri+ri+1, где 0≤ri+1<ri. Получаем монотонно убывающую последовательность неотрицательных целых чисел r1> r2> r3>...≥0, ограниченную снизу. Такая последовательность не может быть бесконечной, следовательно, алгоритм Евклида останавливается.
Докажем теперь, что число d — наибольший общий делитель для чисел r1, r2,.... rk, где rk-1 делится на rk. С учетом леммы 1.6 можем записать:
НОД(а, b) =НОД(r0, r1) = НОД(q1 r1+ r2, r1) = НОД(r1, r2) = =НОД(r2,r3) = …=НОД(rk-1, rk).
А по лемме 1.5 получаем НОД(rk-1, rk) = rk = d.
Алгоритм 1.2. Бинарный алгоритм Евклида .
Этот вариант алгоритма Евклида оказывается боле быстрым при реализации на компьютере, поскольку использует двоичное представление чисел a и b. Бинарный алгоритм Евклида основан на следующих свойствах наибольшего общего делителя (считаем, что 0<b≤a):
Если оба числа a и b четные, то НОД(a,b)=2*НОД(
,
);Если число a нечетное, число b четное, то НОД(a,b)= НОД(a,
);Если оба числа a и b нечетные, a>b, то НОД(a,b)= НОД(a-b,b);
Если a=b, то НОД(a, b)=a.
Бинарный алгоритм Евклида:
Вход. Целые числа а, b; 0 < b ≤ а.
Выход. d=НОД(а, b).
Положить g ←1.
Пока оба числа а и b четные, выполнять a←
, b←
,g←2g
до
получения хотя бы одного нечетного значения а или b.
Положить u ←a,v← b.
Пока u ≠0, выполнять следующие действия.
Пока и четное, полагать и ←

Пока v четное, полагать v←

При u≥v положить u ← u-v. В противном случае положить
v ← v-u.
Положить d←gv.
Результат: d.
Сложность этого алгоритма равна O(log2a).
Алгоритм 1.3. Расширенный алгоритм Евклида.
Вход. Целые числа а, b; 0 < b ≤ а.
Выход. d=НОД(a, b); такие целые числа х,у, что ах + by=d.
Положить r0 ←a, r1 ←b , x0 ←1, x1 ←0, y0 ←0, y1 ←1, i ←1.
Разделить с остатком ri-1на ri : ri-1= qiri+ri+1.
Если ri+1 = 0, то положить d ← ri, x ← xi , y ← yi. В противном случае положить xi+1← xi-1-qixi, yi+1← yi-1- qiyi , i ← i+1 и вернуться на шаг 2.
Результат: d, х, у. □
Сложность этого алгоритма равна O(log2a).
Алгоритм 1.4. Расширенный бинарный алгоритм Евклида
Вход, Целые числа а, b; 0 <b≤ а.
Выход, d =НОД(а, b); такие целые числа х, у, что ах + by = d.
Положить g ←1.
Пока оба числа а и b четные, выполнять a←
, b←
,g←2g
до
получения хотя бы одного нечетного
значения а
или
b.
Положить u ←a,v← b, A ←1,B← 0, C ←0,D← 1.
Пока u ≠0, выполнять следующие действия.
4.1. Пока u четное:
Положить и ←

Если оба числа А и В четные, то положить A←
,
B←
В
противном случае положить A←
,
B←
4.2. Пока v четное:
4.2.1.
Положить v←
4.2.2.
Если оба числа С и D
четные,
то положить C←
,
D←
,
В
противном случае положить C←
, D←
4.3. При u≥v положить u ←u-v, A ←A-C, B ←B-D. В противном случае положить v←v-u, С←C-A,D←D-B.
Положить d←gv, х ← С, у ← D.
Результат: d, х, у.
Сложность этого алгоритма равна O(log2a).
