МОЗИ_3
.docxФЕДЕРАЛЬНОЕ АГЕНТСТВО СВЯЗИ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ
УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ТЕЛЕКОММУНИКАЦИЙ ИМ. ПРОФ. М.А. БОНЧ-БРУЕВИЧА»
(СПбГУТ)
Факультет Инфокоммуникационных сетей и систем
Кафедра Защищённых систем связи
ОТЧЁТ ПО ЛАБОРАТОРНОЙ РАБОТЕ №3
Классический и Бинарный алгоритмы Евклида
Направление/специальность подготовки
10.03.01 Информационная безопасность
(код и наименование направления/специальности)
Выполнил:
%username%
(Ф.И.О., № группы) (подпись)
Выполнил:
%username%
(Ф.И.О., № группы) (подпись)
Выполнил:
%username%
(Ф.И.О., № группы) (подпись)
Проверил:
%username%
(уч. степень, уч. звание,И.Ф) (подпись)
Теория
Вариант 10
Вычисление НОД алгоритмом Эвклида «Вручную»
24 = 1* 2 * 2 * 2* 3
20 = 1* 2 * 2 * 5
Ответ: НОД (24; 20) = 4
Вычисление НОД алгоритмом Эвклида «Вручную»
1125851
1129913
(Шаг 1) 1129913 : 1125851 = 1 (остаток 4062), так как 1129913 = 1125851 ∙ 1 + 4062, остаток от деления не равен нулю, поэтому продолжаем деление, разделим 1125851 на 4062 (Шаг 2) 1125851 : 4062 = 277 (остаток 677), так как 1125851 = 4062 ∙ 277 + 677, остаток от деления не равен нулю, поэтому продолжаем деление, разделим 4062 на 677 4062 : 677 = 6 (остаток 0), так как 4062 = 677 ∙ 6 + 0, равен нулю, значит НОД равен предыдущему остатку от деления Ответ: НОД (1129913; 1125851) = 677
Вычисление НОД binary алгоритмом Эвклида «Вручную»
24 = 1* 2 * 2 * 2* 3 == Четное
20 = 1* 2 * 2 * 5 == Четное
НОД (24,20) = 2 * (12,10) = 2 * 2 (6,5) =4(6-5.5)= ... =4 (1.1)
Вычисление НОД binary алгоритмом Эвклида
#include "iostream"
using namespace std;
int gcd(int u, int v);
int main()
{
int u;
int v;
cout << "Numbers should lay in [0; MAXINT] interval." << endl;
cout << "Enter 1st number: " << endl;
cin >> u;
if (u < 0)
{
cout << "Incorrect value." << endl;
cout << "Press any key to exit." << endl;
system("PAUSE");
exit(1);
}
cout << "Enter 2nd number: " << endl;
cin >> v;
if (v < 0)
{
cout << "Incorrect value." << endl;
cout << "Press any key to exit." << endl;
system("PAUSE");
exit(2);
}
cout << "Greatest common dividor is: " << gcd(u, v) << endl;
system("PAUSE");
return 0;
}
int gcd(int u, int v)
{
int shift;
/* НОД(0, n) = n; НОД(m, 0) = m. */
if (u == 0 || v == 0)
return u | v;
/* Если m, n чётные, тогда НОД(m, n) = 2 * НОД(m / 2, n / 2).
Пусть shift := lg K, где K наибольшая степень 2 такая, что оба числа
целиком делятся на 2 в степени K. */
for (shift = 0; ((u | v) & 1) == 0; ++shift)
{
u >>= 1;
v >>= 1;
}
// Если m чётное, тогда НОД(m, n) = НОД(m / 2, n).
while ((u & 1) == 0)
u >>= 1;
/* Далее считается, что u нечетное. */
do
{
while ((v & 1) == 0) /* Если n чётное, тогда НОД(m, n) = НОД(m, n / 2). */
v >>= 1;
/* Далее считается, что u и v нечетные. Следовательно, u - v четно.
Пусть u = min(u, v), v = (u - v) / 2. */
if (u < v) /* Если m, n нечётные и m < n, тогда НОД(m, n) = НОД(n - m, m). */
{
v -= u;
}
else /* Если m, n нечётные и m > n, тогда НОД(m, n) = НОД(m - n, m). */
{
int diff = u - v;
u = v;
v = diff;
}
v >>= 1;
}
while (v != 0);
return u << shift;
}
Ответ: НОД = 677
Вариант 13
Вычисление НОД алгоритмом Эвклида «Вручную»
28 = 1 * 2 *2 * 7
22 = 1 * 2 * 11
Ответ: НОД (28; 22) = 2
Вычисление НОД алгоритмом Эвклида «Вручную»
1678583
1689179
(Шаг 1) 1689179 : 1678583 = 1 (остаток 10596), так как 1689179 = 1678583 ∙ 1 + 10596, остаток от деления не равен нулю, поэтому продолжаем деление, разделим 1678583 на 10596 (Шаг 2) 1678583 : 10596 = 158 (остаток 4415), так как 1678583 = 10596 ∙ 158 + 4415, остаток от деления не равен нулю, поэтому продолжаем деление, разделим 10596 на 4415 (Шаг 3) 10596 : 4415 = 2 (остаток 1766), так как 10596 = 4415 ∙ 2 + 1766, остаток от деления не равен нулю, поэтому продолжаем деление, разделим 4415 на 1766 (Шаг 4) 4415 : 1766 = 2 (остаток 883), так как 4415 = 1766 ∙ 2 + 883, остаток от деления не равен нулю, поэтому продолжаем деление, разделим 1766 на 883 1766 : 883 = 2 (остаток 0), так как 1766 = 883 ∙ 2 + 0, равен нулю, значит НОД равен предыдущему остатку от деления Ответ: НОД (1678583; 1689179) = 883
Вычисление НОД binary алгоритмом Эвклида «Вручную»
28 = 1 * 2 *2 * 7 == Четное
22 = 1 * 2 * 11 == Четное
НОД (28,22) = 2 * (14,11) = 2 (14-11,11) =…= 2 (1.1)
Вычисление НОД binary алгоритмом Эвклида
#См. код выше
Ответ: НОД = 833
Вариант 4
Вычисление НОД алгоритмом Эвклида «Вручную»
20 = 1* 2 *2* 2* 3
12 = 1*2 *2 * 5
Ответ: НОД (12; 20) = 4
Вычисление НОД алгоритмом Эвклида «Вручную»
1509212
759518
(Шаг 1) 1509212 : 759518 = 2 (остаток 749694), так как 1509212 = 759518 ∙ 2 + 749694, остаток от деления не равен нулю, поэтому продолжаем деление, разделим 759518 на 749694 (Шаг 2) 759518 : 749694 = 1 (остаток 9824), так как 759518 = 749694 ∙ 1 + 9824, остаток от деления не равен нулю, поэтому продолжаем деление, разделим 749694 на 9824 (Шаг 3) 749694 : 9824 = 76 (остаток 3070), так как 749694 = 9824 ∙ 76 + 3070, остаток от деления не равен нулю, поэтому продолжаем деление, разделим 9824 на 3070 (Шаг 4) 9824 : 3070 = 3 (остаток 614), так как 9824 = 3070 ∙ 3 + 614, остаток от деления не равен нулю, поэтому продолжаем деление, разделим 3070 на 614 3070 : 614 = 5 (остаток 0), так как 3070 = 614 ∙ 5 + 0, равен нулю, значит НОД равен предыдущему остатку от деления Ответ: НОД (1509212; 759518) = 614
Вычисление НОД binary алгоритмом Эвклида «Вручную»
24 = 1* 2 *2* 2* 3 == Четное
20 = 1*2 *2 * 5 == Четное
НОД (24,20) = 2 * (12,10) = 2 * 2 (6,5) == 4(6-5.5) =... = 4 (1.1)
Вычисление НОД binary алгоритмом Эвклида
#См. код выше
Ответ: НОД = 614