Лаб_03
.docx
МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ,
СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ РОССИЙСКОЙ ФЕДЕРАЦИИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
ФАКУЛЬТЕТ КИБЕРБЕЗОПАСНОСТИ (КБ)
КАФЕДРА ЗАЩИЩЕННЫХ СИСТЕМ СВЯЗИ (ЗСС)
______________________________________________________________________________
Отчет
по лабораторной работе №3
«Расширенный алгоритм Эвклида»
Выполнили: студенты группы ИБС-32
Проверил:
доцент кафедры ЗСС к.т.н Кушнир Д.В.
Теория
Кроме вычисления d=НОД(a,b), алгоритм Эвклида позволяет дополнительно определить два целых числа α и β, таких что:
α * a + β * b = d; (соотношение Безу)
α и β – коэффициенты Безу.
Замечание, «почти всегда» если α положительна, то β отрицательно и наоборот.
Эти два числа можно вычислять одновременно с выполнением шагов в алгоритме Эвклида по следующей схеме:
Ручной метод «прямой»:
Рассмотрим шаги получения НОД (24;15):
24 = 15 * 1 + 9
15 = 9 * 1 + 6
9 = 6 * 1 + 3
6 = 3 * 2 + 0
Добавим для каждого шага представление «текущего» остатка как линейной комбинации исходных чисел a и b:
1-й шаг: 9=24+(-1)*15
2-й шаг: 6=15-9=15-(24-15)=2*15+(-1)*24
3-й шаг: 3=9-6=24+(-1)*15-[2*15+(-1)*24]=2*24+(-3)*15; т.е. α=2; β=-3.
Алгоритм в общем виде: Найти: НОД(a,b) a =b *q1 + r1 и r1 = α * x1 + β * y1 b =r1 *q2 + r2 и r2 = α * x2 + β * y2 ………………………………
rn-3=rn-2 *qn-1 +rn-1 и rn-1= α * xn-1 + β * yn-1 //на этом шаге получаем α,β rn-2=rn-1 *qn rn=0 Ответ: НОД(a,b)=rn-1 //ответ – последний ненулевой остаток. Представим это в виде таблицы:
остатки |
частные |
x |
y |
a |
* |
x(-1) |
y(-1) |
b |
* |
x0 |
y0 |
r1 |
q1 |
x1 |
y1 |
r2 |
q2 |
X2 |
y2 |
|
|
|
|
rn-2 |
qn-2 |
xn-2 |
yn-2 |
rn-1 |
qn-1 |
xn-1 |
yn-1 |
Заметим, что в начале этой таблицы появились две дополнительные строчки.
Они нам помогут вычислить x1 и y1 :
x(-1)=1, y(-1)=0, x0=0, y0=1;
xj=xj-2-qj*xj-1; yj=yj-2-qj*yj-1; //Пояснение соотношений – см. лекции.
Пример расширенного алгоритма Эвклида для чисел 1234 и 54
остатки |
частные |
x |
y |
1234 |
* |
1 |
0 |
54 |
* |
0 |
1 |
46 |
22 |
1-22*0=1 |
0-22*1=-22 |
8 |
1 |
0-1*1=-1 |
1-1*(-22)=23 |
6 |
5 |
1-5*(-1)=6 |
-22-5*23=-137 |
2 |
1 |
-1-1*6=-7 |
23-1*(-137)=160 |
0 |
3 |
* |
* |
α = -7; β=160. Действительно: (-7)*1234+160*54=2.
Нахождение обратного элемента по модулю (мультипликативная инверсия).
Определение. Обратным к числу a по модулю n называется такое число b (обычно обратное к a обозначают как a-1), что: a*b = 1 mod n ( a * a-1 = 1 mod n )
Рассмотрим выражение: a * х + n * y = 1 (это и есть соотношение Безу)
возьмём от обеих частей уравнения остаток по модулю n, то получим:
a * х = 1 mod n, х – и есть обратный элемент к a. Пример: m=11, a=3; 4*3+(-1)*11=1; 4*3=1 mod 11, т.е. a-1 = 4.
Если получаете отрицательный ответ – переведите в положительный: через n-х.
Нахождение противоположного элемента по модулю (аддитивная инверсия).
Определение. Противоположным к числу a по модулю n называется такое число b, что: a+b = 0 mod n. b записывают в виде положительного числа.
Выполнение
Вариант 16
Задание 1
а = 20 b = 12
20 = 12 * 1 + 8
12 = 8 * 1 + 4
8 = 4 * 2 + 0
1 – й шаг: 8 = 20+ (-1)*12
2 – й шаг: 4 = 12 – 8 = 12 + (-1)*20 + 1*12 = 12 * 2 + (-1) * 20
α = 2 ; β = -1, НОД(20,12) = 4
Задание 2
Листинг программы:
def extended_euclidean_algorithm(a, b): x, y, u, v = 0, 1, 1, 0 while a != 0: q, r = b // a, b % a m, n = x - u * q, y - v * q
print(f"{b} = {a} * {q} + {r}\t\t({x}, {y}) = ({u}, {v}) - {q} * ({m}, {n})") b, a, x, y, u, v = a, r, u, v, m, n gcd = b
return gcd, x, y a = int(input("Введите a: ")) b = int(input("Введите b: ")) gcd, x, y = extended_euclidean_algorithm(a, b) print(f"НОД({a}, {b}) = {gcd}") print(f"Коэффициенты x и y: x = {x}, y = {y}")
Вывод программы:
Введите a: 1542844
Введите b: 775042
775042 = 1542844 * 0 + 775042 (0, 1) = (1, 0) - 0 * (0, 1)
1542844 = 775042 * 1 + 767802 (1, 0) = (0, 1) - 1 * (1, -1)
775042 = 767802 * 1 + 7240 (0, 1) = (1, -1) - 1 * (-1, 2)
767802 = 7240 * 106 + 362 (1, -1) = (-1, 2) - 106 * (107, -213)
7240 = 362 * 20 + 0 (-1, 2) = (107, -213) - 20 * (-2141, 4262)
НОД(1542844, 775042) = 362
Коэффициенты x и y: x = 107, y = -213
Задание 3
Обратный элемент: Обратный элемент к a = 12 по модулю n = 19 равен x = 8 . Проверим:
(12 ⋅ 8) (mod 19) = 96 (mod 19) = 1
Таким образом, обратный элемент к числу 12 по модулю 19 — это a⁻¹ = 8
Вариант 3
Задание 1
а = 26 b = 44
44 = 26*1 + 18
26 = 18 + 8
18 = 8 *2 + 2
8 = 2 * 4 + 0
Нод(26, 44) = 2
18 = 44+ (-1)*26
8 = 26 - 18 = 26 + (-1)*44+1*26 = 2*26 + (-1)*44
2 = 18 - 16 = 18 - 2*8 =( 44+ (-1)26) - 2(2*26 + (-1)*44)= 44 + (-1)*26 - 4*26 - (-2)*44 = 3*44 + (-5)*26
A = -5 B=3 НОД(26,44) = 2
Задание 2
Листинг программы:
def extended_euclidean_algorithm(a, b): x, y, u, v = 0, 1, 1, 0 while a != 0: q, r = b // a, b % a m, n = x - u * q, y - v * q
print(f"{b} = {a} * {q} + {r}\t\t({x}, {y}) = ({u}, {v}) - {q} * ({m}, {n})") b, a, x, y, u, v = a, r, u, v, m, n gcd = b
return gcd, x, y a = int(input("Введите a: ")) b = int(input("Введите b: ")) gcd, x, y = extended_euclidean_algorithm(a, b) print(f"НОД({a}, {b}) = {gcd}") print(f"Коэффициенты x и y: x = {x}, y = {y}")
Вывод программы:
Введите a: 1111492
Введите b: 564422
564422 = 1111492 * 0 + 564422 (0, 1) = (1, 0) - 0 * (0, 1)
1111492 = 564422 * 1 + 547070 (1, 0) = (0, 1) - 1 * (1, -1)
564422 = 547070 * 1 + 17352 (0, 1) = (1, -1) - 1 * (-1, 2)
547070 = 17352 * 31 + 9158 (1, -1) = (-1, 2) - 31 * (32, -63)
17352 = 9158 * 1 + 8194 (-1, 2) = (32, -63) - 1 * (-33, 65)
9158 = 8194 * 1 + 964 (32, -63) = (-33, 65) - 1 * (65, -128)
8194 = 964 * 8 + 482 (-33, 65) = (65, -128) - 8 * (-553, 1089)
964 = 482 * 2 + 0 (65, -128) = (-553, 1089) - 2 * (1171, -2306)
НОД(1111492, 564422) = 482
Коэффициенты x и y: x = -553, y = 1089
Задание 3
Обратный элемент: Обратный элемент к a = 4 по модулю n = 23 равен x = 6 . Проверим:
(4 ⋅ 6) (mod 23) = 24 (mod 23) = 1
Таким образом, обратный элемент к числу 4 по модулю 23 — это a⁻¹ = 6
