- •2.1. Арифметика целых чисел
- •Множество целых чисел
- •Бинарные операции
- •Деление целых чисел
- •Два ограничения
- •Теория делимости
- •Свойства
- •Все делители
- •Наибольший общий делитель
- •Алгоритм Евклида
- •Расширенный алгоритм Евклида
- •Линейные диофантовы уравнения
- •Частное решение
- •Общие решения
- •2.2. Модульная арифметика
- •Операции по модулю
- •Система вычетов: Zn
- •Сравнения
- •Система вычетов
- •Операции в Zn
- •Свойства оператора mod n
- •Инверсии
- •Аддитивная инверсия
- •Мультипликативная инверсия
- •Различные множества для сложения и умножения
- •Еще два множества
Расширенный алгоритм Евклида
Даны два целых числа a и b. Нам зачастую надо найти другие два целых числа, s и r, такие, которые
s × a + t × b = НОД(a,b)
Расширенный алгоритм Евклида может вычислить НОД (a, b) и в то же самое время вычислить значения s и t Здесь расширенный алгоритм Евклида использует те же самые шаги, что и простой алгоритм Евклида. Однако в каждом шаге мы применяем три группы вычислений вместо одной. Алгоритм использует три набора переменных: r, s и t.
Рис. 2.8. Расширенный алгоритм Евклида
На каждом шаге переменные r1, r2 и r используются так же, как в алгоритме Евклида. Переменным r1 и r2 присваиваются начальные значения a и b соответственно. Переменным s1 и s2 присваиваются начальные значения 1 и 0 соответственно. Переменным t1 и t2 присваиваются начальные значения 0 и 1, соответственно. Вычисления r, s и t одинаковы, но с одним отличием. Хотя r — остаток от деления r1 на r2, такого соответствия в других двух группах вычислений нет. Есть только одно частное, q, которое вычисляется как r1/r2 и используется для других двух вычислений.
Пример 2.9
Дано a = 161 и b = 28, надо найти НОД (a, b) и значения s и t.
Решение
r = r1 – q × r2 s = s2 – qs2 t = t1 – q × t2
Для отображения алгоритма мы используем следующую таблицу:
q |
r1 |
r2 |
R |
s1 |
s2 |
s |
t1 |
t2 |
t |
5 |
161 |
28 |
21 |
1 |
0 |
1 |
0 |
1 |
-5 |
1 |
28 |
21 |
7 |
0 |
1 |
-1 |
1 |
-5 |
6 |
3 |
21 |
7 |
0 |
1 |
-1 |
4 |
-5 |
6 |
-23 |
|
7 |
0 |
|
-1 |
4 |
|
6 |
-23 |
|
Мы получаем НОД (161, 28) = 7, s = –1 и t = 6. Ответы могут быть проверены, как это показано ниже.
(–1) × 161 + 6 × 28 = 7
Пример 2.10
Дано a = 17 и b = 0, найти НОД (a, b) и значения s и t.
Решение
Для отображения алгоритма мы используем таблицу.
q |
r1 |
r2 |
R |
s1 |
s2 |
s |
t1 |
t2 |
t |
|
17 |
0 |
|
1 |
0 |
|
0 |
1 |
|
Обратите внимание, что нам не надо вычислять q, r и s. Первое значение r2 соответствует условию завершения алгоритма. Мы получаем НОД (17, 0) = 17, s = 1 и t = 0. Это показывает, почему мы должны придавать начальные значения s1 — 1 и t1 — 0. Ответы могут быть проверены так, как это показано ниже:
(1 × 17) + (0 × 0) = 17
Пример 2.11
Даны a = 0 и b = 45, найти НОД (a, b) и значения s и t.
Решение
Для отображения алгоритма мы используем следующую таблицу:
q |
r1 |
r2 |
R |
s1 |
s2 |
s |
t1 |
t2 |
t |
0 |
0 |
45 |
0 |
1 |
0 |
1 |
0 |
1 |
0 |
|
45 |
0 |
|
0 |
1 |
|
0 |
1 |
|
Мы получаем НОД (0,45) = 45, s = 0 и t = 1. Отсюда ясно, что мы должны инициализировать s2 равным 0, а t2 — равным 1. Ответ может быть проверен, как это показано ниже:
(0 × 0) + (1 × 45) = 45