Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторная работа №3

.pdf
Скачиваний:
5
Добавлен:
10.08.2024
Размер:
586.76 Кб
Скачать

МИНИСТЕРСТВО ЦИФРОВОГО РАЗВИТИЯ, СВЯЗИ И МАССОВЫХ КОММУНИКАЦИЙ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ

«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА» (СПбГУТ)

Факультет Инфокоммуникационных сетей и систем

Кафедра Защищенных систем связи

Дисциплина Математические основы защиты информации

ОТЧЕТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №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