
Лабораторная работа №3
.pdf
МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА» (СПбГУТ)
Факультет Инфокоммуникационных сетей и систем
Кафедра Защищенных систем связи
Дисциплина Математические основы защиты информации
ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №3
Нахождения наибольшего общего делителя. Алгоритм Евклида. Бинарный алгоритм Евклида.
(тема отчета)
Информационная безопасность (10.03.01)
(код и наименование направления/специальности)
Студент: |
|
|
|
Ерохин А.Г. |
ИКБ-03 |
||
(Ф.И.О.) |
|
|
(подпись) |
Студент: |
|
|
|
Чистяков А.С. |
ИКБ-03 |
||
(Ф.И.О.) |
|
|
(подпись) |
Студент:
Пантюхин М.А. ИКБ-03
(Ф.И.О.) (подпись)
К.тех.н, доцент кафедры ЗСС: Кушнир Д.В.
(Ф.И.О.) (подпись)
Санкт-Петербург
2022
Часть 1. Вычисление НОД(a,b) алгоритмом Евклида.
Алгоритм Евклида по нахождению НОД в общем виде:
Найти: НОД(a,b)
= |
+ |
0 ≤ < |
// |
-целое, - остаток от деления a на b |
|
|
1 |
1 |
|
1 |
1 |
= 1 2 + 2 |
0 ≤ 2 < 1 |
|
|
||
……………………………… |
|
|
|||
|
= |
|
+ |
|
|
−3 |
−2 |
−1 |
−1 |
|
|
|
= |
+ 0 |
|
|
|
−2 |
−1 |
|
|
|
|
= 0 |
|
|
|
|
|
|
|
|
|
|
|
Ответ: НОД(a,b)= |
|
//ответ – последний ненулевой остаток. |
|||
|
|
−1 |
|
|
Примечание: в выражении = 1 + 1 имеется ввиду, что производится деление числа а на b и вычисляется остаток 1 и количество целых 1.
Задание 1. Вычислить «вручную» НОД используя алгоритм Евклида.
1.Необходимо выбрать свой вариант (варианты) (вариант определяется номером студента в списке группы, если в бригаде несколько человек, то необходимо выполнить соответствующее число соответствующих вариантов).
2.Выполнить «вручную» вычисление НОД(a,b) алгоритмом Евклида.
Вариант 7.
a = 22, b = 56
A |
|
B |
|
q |
|
R |
22 |
= |
56 |
* |
0 |
+ |
56 |
56 |
= |
22 |
* |
2 |
+ |
12 |
22 |
= |
12 |
* |
1 |
+ |
10 |
12 |
= |
10 |
* |
1 |
+ |
2 |
10 |
= |
2 |
* |
5 |
+ |
0 |
Ответ: НОД(22;56) = 2
2
Вариант 17. a = 34, b = 20
A |
|
B |
|
q |
|
R |
34 |
= |
20 |
* |
1 |
+ |
14 |
20 |
= |
14 |
* |
1 |
+ |
6 |
14 |
= |
6 |
* |
2 |
+ |
2 |
6 |
= |
2 |
* |
3 |
+ |
0 |
Ответ: НОД(34;20) = 2
Вариант 24. a = 18, b = 52
A |
|
B |
|
q |
|
R |
18 |
= |
52 |
* |
0 |
+ |
52 |
52 |
= |
18 |
* |
2 |
+ |
16 |
18 |
= |
16 |
* |
1 |
+ |
2 |
16 |
= |
2 |
* |
8 |
+ |
0 |
Ответ: НОД(18;52) = 2
Задание 2. Вычислить «программно» НОД используя алгоритм Евклида.
1.Необходимо выбрать свой вариант (варианты) (вариант определяется номером студента в списке группы, если в бригаде несколько человек, то необходимо выполнить соответствующее число соответствующих вариантов).
2.Выполнить вычисление НОД(a,b) алгоритмом Евклида в среде Excel или в любой другой программной среде, которая позволяет выводить промежуточные шаги выполнения алгоритма.
Для выполнения данного задания была написана программа на языке программирования С++, которая вычисляет НОД алгоритмом Евклида, с отображением всех промежуточных вычислений.
3
Листинг:
#include <iostream>
using namespace std;
class Euclid { int A, B;
public:
Euclid(int _a, int _b) { if (_a >= _b) {
A = _a; B = _b;
}
else {
A = _b; B = _a;
}
int q = A / B; int R = A % B;
cout << A << " = " << B << " * " << q << " + " << R << endl; while (R>0){
A = B;
B = R;
q = A / B; R = A % B;
cout.width(7);
cout << A << " = "; cout.width(7);
cout << B << " * "; cout.width(2);
cout << q << " + " << R << endl;
}
cout << endl;
cout << "НОД(" << _a << ";" << _b << ") = " << B << endl;
}
~Euclid() {}
};
int main()
{
setlocale(LC_ALL, "Rus"); int a, b;
cout << "Введите A: "; cin >> a;
cout << "Введите B: "; cin >> b;
cout << endl; Euclid Work(a, b);
}
4

Вариант 7.
a = 2830444, b = 4298262
Вариант 17.
a = 2123276, b = 1070242
Вариант 24.
a = 2861708, b = 3438222
5
Часть 2. Бинарный алгоритм Евклида.
Бинарный алгоритм Евклида вычисления НОД оказывается более быстрым при реализации этого алгоритма на компьютере, поскольку использует двоичное представление чисел а и b.
Бинарный алгоритм Евклида основан на следующих свойствах наибольшего общего делителя (считаем, что 0 < b ≤ а):
1)если оба числа а и b четные, то НОД(a,b) = 2 · НОД(a/2 , b/2)
2)если число а нечетное, число b четное, то НОД(a, b) = НОД(а, b/2);
3)если оба числа а и b нечетные, а > b, то НОД(а, b) = НОД(а – b, b);
4)если а = b, то НОД(а, b) = а.
Задание 3. Вычислить «вручную» НОД используя бинарный алгоритм
Евклида.
1.Необходимо выбрать свой вариант (варианты) (вариант определяется номером студента в списке группы, если в бригаде несколько человек, то необходимо выполнить соответствующее число соответствующих вариантов).
2.Выполнить «вручную» вычисление НОД(a,b) бинарным алгоритмом Евклида.
Вариант 7.
a = 22, b = 56
НОД(22;56) = 2*НОД(11;29) = 2*НОД(29-11;11) = 2*НОД(18;11) = 2*НОД(9;11) = 2*НОД(11-9;9) = 2*НОД(2;9) = 2*НОД(1;9) = 2*НОД(9-1;1) = 2*НОД(8;1) = 2*НОД(4;1) = 2*НОД(2;1) = 2*НОД(1;1) = 2
Ответ: НОД(22;56) = 2
Вариант 17. a = 34, b = 20
НОД(34;20) = 2*НОД(17;10) = 2*НОД(17;5) = 2*НОД(17-5;5) = 2*НОД(12;5)
=2*НОД(6;5) = 2*НОД(3;5) = 2*НОД(5-3;3) = 2*НОД(2;3) = 2*НОД(1;3)
=2*НОД(3-1;1) = 2*НОД(2;1) = 2*НОД(1;1) = 2
Ответ: НОД(34;20) = 2
6
Вариант 24. a = 18, b = 52
НОД(18;52) = 2*НОД(9;26) = 2*НОД(9;13) = 2*НОД(13-9;9) = 2*НОД(4;9) = 2*НОД(2;9) = 2*НОД(1;9) = 2*НОД(9-1;1) = 2*НОД(8;1) = 2*НОД(4;1) = 2*НОД(2;1) = 2*НОД(1;1) = 2
Ответ: НОД(18;52) = 2
Задание 4. Вычислить «программно» НОД используя бинарный алгоритм Евклида.
1.Необходимо выбрать свой вариант (варианты) (вариант определяется номером студента в списке группы, если в бригаде несколько человек, то необходимо выполнить соответствующее число соответствующих вариантов).
2.Выполнить вычисление НОД(a,b) бинарным алгоритмом Евклида в среде Excel или в любой другой программной среде, которая позволяет выводить промежуточные шаги выполнения алгоритма.
Для выполнения данного задания была написана программа на языке программирования С++, которая вычисляет НОД бинарным алгоритмом Евклида, с отображением всех промежуточных вычислений.
7
Листинг:
#include <iostream>
using namespace std;
class Bin_Euclid { int A, B;
int g = 1; public:
Bin_Euclid(int _a, int _b) { if (_a >= _b) {
A = _a; B = _b;
}
else {
A = _b; B = _a;
}
cout << "НОД(" << _a << ";" << _b << ") = " << endl; while (A != 0) {
if ((A % 2 == 0) && (B % 2 == 0)) {
cout << g << "*НОД(" << A << ";" << B << ") = " << endl; A = A / 2;
B = B / 2; g = g * 2;
}
if ((A % 2 == 0) && (B % 2 != 0)) {
cout << g << "*НОД(" << A << ";" << B << ") = " << endl; A = A / 2;
}
if ((A % 2 != 0) && (B % 2 == 0)) {
cout << g << "*НОД(" << A << ";" << B << ") = " << endl; B = B / 2;
}
if ((A % 2 != 0) && (B % 2 != 0)) {
cout << g << "*НОД(" << A << ";" << B << ") = " << endl; if (A >= B) {
A = A - B;
}
else {
B = B - A;
}
}
if (A == 0) { break;
}
}
cout << "НОД(" << _a << ";" << _b << ") = " << g*B <<endl;
}
};
8

int main()
{
setlocale(LC_ALL, "Rus"); int a, b;
cout << "Введите A: "; cin >> a;
cout << "Введите B: "; cin >> b;
cout << endl; Bin_Euclid Work(a, b);
}
Вариант 7.
a = 2830444, b = 4298262
9

Вариант 17.
a = 2123276, b = 1070242
10