Алгоритмы на базе циклических конструкций Дисциплины "ЯЗЫКИ ПРОГРАММИРОВАНИЯ"

advertisement
ФГОБУ ВПО "СибГУТИ"
Кафедра вычислительных систем
Дисциплины
"ЯЗЫКИ ПРОГРАММИРОВАНИЯ"
"ПРОГРАММИРОВАНИЕ"
Алгоритмы на базе
циклических конструкций
Преподаватель:
Доцент Кафедры ВС, к.т.н.
Поляков Артем Юрьевич
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
План лекции
1. Двоичная система счисления и алгоритмы перевода из
десятичной системы в двоичную.
2. Элементарная теория чисел. Алгоритмы поиска
наибольшего общего делителя и наименьшего общего
кратного целых чисел.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
2
Двоичная система счисления и
алгоритмы перевода из
десятичной системы в двоичную.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
3
Позиционные системы счисления
Под позиционной системой счисления обычно понимается bричная система счисления, которая определяется целым числом b,
называемым основанием системы счисления.
Целое число без знака x в b-ричной системе счисления
представляется в виде конечной линейной комбинации степеней
числа b:
n 1
Для обозначения основания
xb   ak b k ,
k 0
СС числа используется
нижний индекс
где 0 ≤ ak < b – набор весовых коэффициентов (разрядов), k – номер
разряда. Если b = 2, а 0 ≤ ak < 2 то система счисления называется
двоичной. Примеры:
1010011 = 1∙27 + 0∙26 + 1∙24 + 0∙23 + 0∙22 + 1∙21 + 1∙20
a = {1, 0, 1, 0, 0, 1, 1}
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
4
Перевод между системами счисления
Одно и то же число может быть записано в различных системах
счисления (СС). На рис. показаны фотографии автомобилей.
Опишем их количество с помощью нескольких систем счисления:
225
1103
С16
157
1210
206
139
1012
11002
148
304
1111
Существует два способа перевода между системами счисления:
 При первом все операции производятся в целевой СС.
 Во втором – в исходной СС.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
5
Перевод целых чисел между
позиционными системами (способ I)
Перевод из системы счисления с основанием b в CC с
основанием с:
xb → xc
xb = aN aN-1 … a1a0
xc = (aN)c∙(bc)N + (aN–1)c∙(bc)N-1 + … + (a1)c∙(bc)1 + (a0)c∙(bc)0
Примеры:
101102 = 1∙25 + 0∙24 + 1∙23 + 1∙22 + 1∙21 + 0∙20 =
= 32 + 8 + 4 + 2 = 4610
2AF16 = 2∙162 + 10∙161 + 15∙160 = 512 + 160 + 15 = 68710
4810 = 416∙A1 + 816∙A0
4810 = 1002∙10101 + 10002∙10100
Вычисление в недесятичной системе
счисления затруднительны
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
6
Перевод целых чисел между
позиционными системами (способ II)
Для
перевода
числа
xa
(записанного в системе счисления a) в
систему с основанием b необходимо
разделить xa на b. Деление
продолжать до тех пор, пока частное
не станет меньше b.
2510 = 110012
25
2
24
12
2
1
12
6
2
0
6
3
2
0
2
1
Остатки от деления, записанные в
обратном
порядке,
начиная
с
частного, будут искомым числом.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
1
7
Соотношения между числами в
разных системах счисления
Вне зависимости от используемой системы счисления числа
явление, описываемое этим числом, остается одним и тем же.
Например, количество машин не изменяется от выбора системы
счисления:
11002 = 1103 = 304 = 225 = 206 = 157 = 148 = 139 = 1210 = 1111 = 1012
Кроме того, что само число остается одним и тем же, результаты
арифметических действий над одинаковыми числами в разных
системах счисления также должны давать одинаковые результаты.
В противном случае описываемые явления перестанут
согласовываться с реальностью. Например, количество машин на
фотографии, уменьшенное втрое, будет составлять:
112 = 103 = 104 = 45 = 46 = 47 = 48 = 49 = 410 = 411 = 412
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
8
Способ II. Математическая основа
Рассмотрим некоторое число x, записанное, например, в
десятичной и b-ричной системах счисления:
x10 = xb = aNaN–1…a1a0(b)
Как было показано ранее, арифметические операции над
числом, записанным в разных системах счисления, дают
одинаковый результат.
Если это так, то справедливо следующее утверждение:
x10 mod b = xb mod b,
где y mod z – остаток от деления y на z.
Особенностью результата является то, результатом такой
операции будет значение младшего разряда b-ричного
представления числа x:
x10 mod b = xb mod b = a0
Например: 1210 % 3 = 0 (1210 = 1103); 1210 % 9 = 3 (1210 = 139);
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
9
Способ II. Математическая основа (2)
Результат деления нацело числа x на b в разных СС также будет
одинаков:
x10 div b = xb div b,
где y div z – целая часть от деления y на z.
Особенностью этого результата является то, что мы исключаем
младший разряд в b-ричном представлении числа x:
x10 div b = xb div b = aNaN–1…a1a0(b)=aNaN–1…a1(b)
Например:
1210 / 3 = 4 = 113 = 103 + 13 = 310 + 1, 1210 = 1103;
1210 / 9 = 1, 1210 = 139;
1210 / 2 = 6 = 1102 = 22 + 21 = 4 + 2 = 6, 1210 = 11002;
Продолжая действовать аналогичным образом можно получить
значение второго разряда b-ричного представления и т.д.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
10
Рекуррентное соотношение для перевода в
b-ричную систему счисления
Пусть x = 12610, b = 3
i0 = 0,
w0 = x,
s0 = 1
v0 = 0
ik + 1 = ik + 1
d = wk mod b
vk+1 = vk + (d)b ∙sk
sk+1 = sk ∙ b
wk+1 = wk div b
k
ik
wk
d(10) d(3) sk(10)
sk(3)
vk
0
0
126
0
0
1
1
0
1
1
42
0
0
3
10
0
2
2
14
2
2
9
100
200
3
3
4
1
1
27
1000
1200
4
4
1
1
1
81
10000
11200
5
5
0
0
0
243
10000
011200
6
6
0
0
0
729
100000
0011200
...
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
11
Рекуррентное соотношение для перевода в
b-ричную систему счисления
Пусть x = 177110, b = 16
i0 = 0,
w0 = x,
s0 = 1
v0 = 0
ik + 1 = ik + 1
d = wk mod b
vk+1 = vk + (d)b ∙sk
sk+1 = sk ∙ b
wk+1 = wk div b
k
ik
wk
d(10) d(3)
sk(10)
sk(3)
vk
0
0
1771
11
B
1
1
B
1
1
110
14
E
16
10
EB
2
2
6
6
6
256
100
6EB
3
3
0
0
0
4096
1000
06EB
4
4
0
0
0
65536
10000
006EB
...
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
12
Способ II. Алгоритм.
Начало
i0 = 0,
w0 = x,
s0 = 1
v0 = 0
i k + 1 = ik + 1
d = wk mod b
vk+1 = vk + (d)b ∙sk
sk+1 = sk ∙ b
wk+1 = wk div b
x
w = x, v = 0
s=1
w>0
v = v + s ∙ [w mod b]b
w = w div b
s=s∙b
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
Конец
13
Перевод вещественных чисел
между системами счисления
Ранее были рассмотрены способы, позволяющие выполнять
целочисленные преобразования между системами счисления.
Однако большой диапазон реальных явлений не может быть
достоверно описан при помощи целых чисел.
В позиционных системах счисления вещественное число,
состоящее из N целых и K дробных разрядов записывается
следующим образом:
xb = aN aN-1 … a1a0,a–1a–2a–3 … a–(K–1)a–K =
aN ∙bN + aN –1∙bN –1 + … + a1∙b1 + a0∙b0 +a–1∙b–1 + a–2∙b–2 + … + a–K ∙b–K
Любое вещественное число x = aN aN-1 … a1a0,a–1a–2a–3 … a–K
может быть представлено в виде суммы x = x' + x'', где
x' = [x] – целая часть x, x' = aN aN-1 … a1a0,0
x'' = x – [x] – дробная часть x, 0 ≤ x'' < 1: x'' = 0,a–1a–2a–3 … a–K
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
14
Перевод вещественных чисел
между системами счисления (2)
Любое вещественное число x = aN aN-1 … a1a0,a–1a–2a–3 … a–K
может быть представлено в виде суммы x = x' + x'', где
x' = [x] – целая часть x, x' = aN aN-1 … a1a0,0
x'' = x – [x] – дробная часть x, 0 ≤ x'' < 1: x'' = 0,a–1a–2a–3 … a–K
Алгоритм перевода для целых чисел x' уже был рассмотрен
ранее, поэтому сосредоточимся на алгоритме перевода дробной
части.
Используем то же свойство, что и при построении алгоритма для
целых: арифметические операции над числами в любой системе
счисления дают одинаковый результат:
x''10 ∙ b = x''b ∙ b = a–1,a–2a–3 … a–K(b)
Таким образом умножение дробной части на основание целевой
системы счисления в результате выводит наиболее значимый
дробный разряд в целую часть числа.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
15
Перевод вещественных чисел
между системами счисления (3)
Используем то же свойство, что и при построении алгоритма для
целых: арифметические операции над числами в любой системе
счисления дают одинаковый результат:
x''10 ∙ b = x''b ∙ b = a–1,a–2a–3 … a–K(b)
Таким образом умножение дробной части на основание целевой
системы счисления в результате выводит наиболее значимый
дробный разряд в целую часть числа.
Далее с помощью операции взятия целой части можно
определить значение первого разряда, а потом исключить его из
рассмотрения:
a–1 = [x''10 ∙ b] = [a–1,a–2a–3 … a–K(b)] = a–1
x'' = x''10 ∙ b – [x''10 ∙ b] = 0,a–2a–3 … a–K(b)
Продолжая аналогичным образом можно выделить остальные
дробные разряды b-ричного представления.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
16
Перевод вещественной части в b-ричную
систему счисления (рекуррентные соотн.)
i0 = 0, w0 = x – [x],
s0 = 1 / b, v0 = 0
ik + 1 = ik + 1, d = [wk ∙ b]
vk+1 = vk + (d)b ∙sk, sk+1 = sk / b
wk+1 = wk ∙ b – [wk ∙ b]
Пусть x = 0,687510, b = 2
k
ik
wk
wk ∙ b
d(10)
d(3)
sk(10)
sk(3)
vk
0
0
0,6875
1,375
1
1
0.5
0.1
0.1
1
1
0,375
0,75
0
0
0.25
0.01
0.10
2
2
0,75
1,5
1
1
0.125
0.001
0.101
3
3
0,5
1
1
1
0,0625
0.0001
0.1011
4
4
0
0
0
0
0,03125
0.00001
0.10110
5
5
0
0
0
0
0,015625 0.000001
0.101100
...
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
17
Алгоритмы элементарной теории чисел
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
18
Наибольший общий делитель
Наибольший общий делитель (НОД, GCD от англ. Greatest
Common Divisor) для двух целых чисел m и n называется
наибольший из их общих делителей.
Принятые обозначения НОД чисел m и n:
• НОД(m, n)
В рамках лекции
• (m, n)
• gcd(m, n)
Пример:
(60, 84) = 12
(17 640, 26180) = 140.
НОД существует и однозначно определён,
если хотя бы одно из чисел m или n не ноль.
(n, m) = (m, n) - симметричность
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
19
Наименьшее общее кратное
Наименьшее общее кратное (НОК, LCM (от англ. Least
Common Multiple) двух целых чисел m и n есть наименьшее
натуральное число, которое делится как на m, так и на n.
Принятые обозначения НОК чисел m и n:
• НОК(m, n)
В рамках лекции
• [m, n]
• lcm(m, n)
Пример:
[60, 84] = 420
[17 640, 26180] = 3 298 680.
[n, m] = [m, n] - симметричность
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
20
Связь между НОД и НОК
Для нахождения [n,m] (НОК) часто используют его связь с (n,m)
(НОД):
(n, m) ∙ [n, m] = n ∙ m
[n, m] = n ∙ m / (n, m)
Доказательство:
Пусть даны числа n и m и известен их НОД (n, m). Тогда,
согласно определению НОД и n и m делятся на (n, m) нацело. Пусть
результат деления будет n' и m' соответственно. Тогда n и m могут
быть представлены следующим образом:
n = (n, m) ∙ n', m = (n, m) ∙ m',
тогда n ∙ m = ((n, m) ∙ n' ) ∙ ((n, m) ∙ m') = (n, m)2 ∙ n' ∙ m'
По определению (n, m) n' не содержит простых множителей, на
которые делится m, аналогичное утверждение справедливо для m'.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
21
Связь между НОД и НОК (2)
Доказательство:
n ∙ m = ((n, m) ∙ n' ) ∙ ((n, m) ∙ m') = (n, m)2 ∙ n' ∙ m'
По определению (n, m) n' не содержит простых множителей, на
которые делится m, аналогичное утверждение справедливо для m'.
Согласно утверждению [n, m] = n ∙ m / (n, m) = (n, m) ∙ n' ∙ m' ,
тогда [n, m] делится нацело на n и m:
[n, m] / n = (n, m) ∙ n' ∙ m' / (n, m) ∙ n' = m'
[n, m] / m = (n, m) ∙ n' ∙ m' / (n, m) ∙ m' = n'
Докажем, что [n, m] = (n, m) ∙ n' ∙ m' – наименьший. Пусть это не так
и есть число [n, m] = (n, m) ∙ n' ∙ m'', при этом m'' < m'. Тогда:
[n, m] / m = (n, m) ∙ n' ∙ m''/ (n, m) ∙ m' = n' ∙ m'' / m'
целое число. Однако n' и m' не имеют общих делителей по
определению, а y = m'' / m' < 1, т.к. m'' < m'.
То же справедливо для n' и n''.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
22
Поиск НОД разложением на множители
Одним из способов нахождения (n,m) и [n,m] является
разложение чисел n и m на простые множители.
Пусть
n  p1d1  p2d 2  p3d3  pkd k
m  p1e1  p2e2  p3e3  pkek
Тогда
(n, m)  p1min( d1 ,e1 )  p2min( d 2 ,e2 )  p3min( d3 ,e3 )  pkmin( d k ,ek )
[n, m]  p1max( d1 ,e1 )  p2max( d 2 ,e2 )  p3max( d3 ,e3 )  pkmax( d k ,ek )
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
23
Поиск НОД разложением на множители (2)
Примеры:
60 = 2 ∙ 2 ∙ 3 ∙ 5 = 22 ∙ 3 ∙ 5 = 22 ∙ 31 ∙ 51 ∙ 70
84 = 2 ∙ 2 ∙ 3 ∙ 7 = 22 ∙ 3 ∙ 7 = 22 ∙ 31 ∙ 50 ∙ 71
(60, 84) = 22 ∙ 31 ∙ 50 ∙ 70 = 12
[60, 84] = 22 ∙ 31 ∙ 51 ∙ 71 = 420
17 640 = 23 ∙ 32 ∙ 5 ∙ 72 = 23 ∙ 32 ∙ 5 ∙ 72 ∙ 110 ∙ 170
26 180 = 22 ∙ 5 ∙ 7 ∙ 11 ∙ 17 = 23 ∙ 30 ∙ 5 ∙ 71 ∙ 111 ∙ 171
(17 640, 26180) = 22 ∙ 30 ∙ 5 ∙ 71 ∙ 110 ∙ 170 = 140
[17 640, 26180] = 23 ∙ 32 ∙ 5 ∙ 72 ∙ 111 ∙ 171 = 3 298 680
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
24
Линейный метод поиска НОД
Пусть даны целые числа n и m. Необходимо найти их НОД (n, m).
Решение:
По определению (n, m) – это наибольшее целое число, на
которое нацело делится и n и m. Поэтому наиболее очевидным
способом вычисления (n, m) является перебор ВСЕХ чисел x,
которые могут быть делителями и n и m.
Очевидно, что некоторое целое число n не может поделиться
нацело на число x: x > n. Поэтому естественным будет искать
делители в диапазоне [2, min(n,m)]:
m
n
0
1
m
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
n
25
Линейный метод поиска НОД
(рекуррентное соотношение)
Пусть n = 9, m = 6
i0 = 0,
w0 = m,
f =0
ik + 1 = ik + 1
f ' = n mod wk = 0
f '' = m mod wk = 0
f = f ИЛИ f ' И f ''
wk+1 = wk – 1
k
ik
wk
n mod wk m mod wk
f
0
0
6
3
0
0
1
1
5
4
1
0
2
2
4
1
2
0
3
3
3
0
0
1
4
4
2
1
0
1
5
5
1
1
1
1
6
6
0



7
7
-1
1
1
1
...
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
26
Линейный метод поиска НОД
(алгоритм)
S(n, m):
НАЧАЛО
n, m
НЕТ
n<m
НАЧАЛО
n, m
ДА
g=[m/2]
nm
НЕТ
n%m
g =S(n, m)
ДА
n%g≠0
m%g≠0
НЕТ
ДА
g=m
g=g – 1
g
g
КОНЕЦ
КОНЕЦ
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
27
Анализ линейного алгоритма
m=a∙b
Простейшие случаи:
n = 1 или m = 1 => (n, m) = 1
n = m => (n, m) = m
m<n, n mod m = 0 => (n, m) = m
a
b
1
m
2
[m / 2]
if m mod 2 = 0
3
[m / 3]
if m mod 3 = 0
...
[m / 2]
2
if m mod 2 = 0
В противном случае:
m
1
Пусть m < n и m ≠ (m, n).
Тогда n = m · d + q, при этом d ≥ 1, иначе m ≥ n.
Как было показано ранее (m, n)  [1, m – 1] (m, n) < m и
(так как m делится на НОД): m = (m, n) · d', d' = 1, 2, …, l, …
Если m ≠ (m, n), то первым потенциальным разложением m
на делители является m = [m/2] · 2 => (n, m)[1, [m/2] ]
0 1
m/2
m
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
n
28
Псевдокод
Блок-схемы являются наглядным, но громоздким способом
описания алгоритмов. Альтернативным подходом к описанию
алгоритмов является псевдокод – язык описания алгоритмов,
использующий ключевые слова языков программирования, но
опускающий подробности и специфический синтаксис. В рамках
данного курса будем придерживаться следующих соглашений:
1. Обозначение операции присваивания: t ← n
2. Для обозначения тел циклов и ветвлений используются только
отступы.
3. Ветвление if <условие> then <тело ветви с новой строки>:
if m > n then
t ← n, n ← m, m ← t
4. Цикл while: while <условие> do <тело ветви с новой строки>
while (m mod g) ≠ 0 OR (n mod g) ≠ 0 do
g←g–1
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
29
Псевдокод (2)
Блок-схемы являются наглядным, но громоздким способом
описания алгоритмов. Альтернативным подходом к описанию
алгоритмов является псевдокод – язык описания алгоритмов,
использующий ключевые слова языков программирования, но
опускающий подробности и специфический синтаксис. В рамках
данного курса будем придерживаться следующих соглашений:
5. Логические операции: НЕ – not, ИЛИ – or, И – and.
6. Целочисленная арифметика: div – деление нацело, mod – остаток
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
30
Алгоритм линейного поиска НОД (v2)
input n, m
if m > n then
t ← n, n ← m, m ← t
if (n mod m = 0) then
g←m
else
g ← [m/2]
while (m mod g) ≠ 0 or (n mod g) ≠ 0 do
g←g–1
output g
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
31
Дальнейшее усовершенствование
линейного алгоритма
m/3
0
m/4
m/2
m=a∙b
a
b
1
m
2
[m / 2] if m mod 2 = 0
3
[m / 3] if m mod 3 = 0
4
[m / 4] if m mod 4 = 0
...
[m / 2]
2
m
1
if m mod 2 = 0
m
n
Количество операций можно
существенно сократить за счет
перебора только возможных
делителей и исключения
чисел из диапазонов:
1. [m/2] + 1, … , m – 1
2. [m/3] + 1, … , [m/2] – 1
3. [m/4] + 1, … , [m/3] – 1
4. [m/5] + 1, … , [m/4] – 1
5. [m/6] + 1, … , [m/5] – 1
….
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
32
Алгоритм линейного поиска НОД (v3)
m/3
0
m
n
m/4 m/2
Простейшие случаи:
n = 1 или m = 1 => (n, m) = 1
n = m => (n, m) = n
m<n, n mod m = 0 => (n, m) = m
В противном случае:
Пусть m < n, (иначе поменять их местами)
1. Если (m mod 2) = 0 И (n mod (m div 2)) = 0, то (n, m) = m/2, иначе
(n,m)  [1, [m/3]]
2. Если (m mod 3) = 0 И (n mod (m div 3)) = 0, то (n, m) = m/3,
иначе (n,m)[1, [m/4]]
3. Если (m mod 3) = 0 И (n mod (m div 3)) = 0, то (n, m) = m/3,
иначе (n,m)[1, [m/4]]
…
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
33
Алгоритм линейного поиска НОД (v3).
Рекуррентные соотношения.
Пусть n = 24, m = 18
i0 = 1,
f =0
i k + 1 = ik + 1
t1 ← m div i
f ' = n mod t1 = 0
f '' = m mod i = 0
k
ik m mod ik m div ik n mod (m div ik)
1
1
0
18
6
2
2
0
9
6
3
3
0
!6!
0
4
4
2
4
0
5
5
3
3
0
6
6
0
!3!
0
...
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
34
Алгоритм линейного поиска НОД (v3)
ввод n, m
if m > n then
t ← n, n ← m, m ← t
i ← 1, e ← m, f ← 0
while (i < e и f ≠ 1) do
t1 ← m div i
t2 ← m mod i
if ( t2 = 0 и (n mod t1 = 0) then
g ← t1 , f ← 0
else if (t2 = 0 и (n mod i = 0)) then
g←i
i ← i + 1, e ← t1
вывод g
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
35
Сравнение алгоритмов поиска НОД
Сколько шагов (итераций) потребуется, чтобы найти (1980, 390)
1) линейным алгоритмом (v2)
2) линейным алгоритмом (v3)
1980 = 22 ∙ 32 ∙ 5 ∙ 11
390 = 2 ∙ 3 ∙ 5 ∙ 13
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
36
Алгоритм поиска НОД
простым перебором (v3)
1980 = 22 ∙ 32 ∙ 5 ∙ 11
390 = 2 ∙ 3 ∙ 5 ∙ 13
(1980, 390) = 30
390 = (1980, 390) ∙ 13
1. При использовании простого алгоритма поиска НОД будет
осуществляться перебор возможных решений в диапазоне
[1, 390/2] начиная с 390/2 = 195. Таким образом потребуется
(195 – 30) = 165 шагов для нахождения НОД.
2. При использовании улучшенного алгоритма должны
одновременно проверяться делители i, 390/i, где i = 1, 2, …, l, … натуральное число. Потребуется 13 шагов.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
37
Алгоритм Евклида поиска НОД
(на базе вычитания – v1)
Для данных n и m строится последовательность чисел:
r0, r1, r2, … , rk
элементы ri которой определяются следующим образом:
1) если n ≥ m, то r0 = n – m, n = m, m = r1
иначе r0 = m – n, m = r0
2) r1 = n – m,
если r1 < m, то n = m, m = r1
иначе n = r1
3) r2 = n – m,
если r2 < m, то n = m, m = r2
иначе n = r2
…
если rk =0, то (n, m) = rk–1
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
38
Алгоритм Евклида (v1).
Рекуррентные соотношения.
Пусть n = 24, m = 18
i0 = 0,
n0 = max(n, m)
m0 = min(n, m)
r0 = m0
i k + 1 = ik + 1
rk+1 = nk – mk
nk+1 = max(rk+1, mk)
mk+1 = min(rk+1, mk)
k ik
nk
mk
rk
1
0
24
18
18
2
1
18
6
6
3
2
12
6
12
4
3
6
6
6
5
4
6
0
0
6
5
6
0
0
...
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
39
Алгоритм Евклида (v1)
input n, m
if m > n then
t ← n, n ← m, m ← t
while (n – m) ≠ 0 do
t←n–m
n ← max(t, m)
m ← max(t, m)
output n
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
40
Алгоритм Евклида поиска НОД
(на базе деления – v2)
Для данных n и m строится последовательность чисел:
n > m > r1 > r2 > … > rn,
элементы ri которой определяются следующим образом:
1) n = m·d0 + r1;
2) m = r1 ·d1 + r2 ;
3) r1 = r2 ·d2 + r3 ;
…
n – 1) rn-1 = rn ·dn + 0 ;
тогда (n, m) = rn
1) r1 = n % m;
2) r2 = m % r1;
3) r3 = r1 % r2 ;
…
n–2) rn = rn-2 % rn-1.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
41
Алгоритм Евклида (v2).
Рекуррентные соотношения.
i0 = 0,
n0 = max(n, m)
m0 = min(n, m)
r0 = n 0
i k + 1 = ik + 1
rk+1 = nk % mk
nk+1 = mk
mk+1 = rk+1
Пусть n = 24, m = 18
k ik
nk
mk
rk
1
0
24
18
24
2
1
18
6
6
3
2
6
0
0
4
3
0


...
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
42
Алгоритм Евклида (v2)
input n, m
if m > n then
t ← n, n ← m, m ← t
while (n mod m)  0 do
t ← n mod m
n←m
m←t
output m
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
43
Математическая основа
алгоритма Евклида
Утверждение:
(n, m) = (m, n mod m), при n > m
Доказательство:
n = m · d + q, d = n div m, q = n mod m
(n mod x) = (m mod x) · d + (q mod x) (1)
Необходимость:
x = (m, n), тогда n mod (m, n) = 0.
т.к. m, d и q > 0, то из (1) => m mod x = 0 и q mod x = 0
Достаточность:
x = (m, q), тогда m mod x = 0 и q mod x = 0,
то из (1) => n mod x = 0.
© Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ»
44
Download