ФГОБУ ВПО "СибГУТИ" Кафедра вычислительных систем Дисциплины "ЯЗЫКИ ПРОГРАММИРОВАНИЯ" "ПРОГРАММИРОВАНИЕ" Алгоритмы на базе циклических конструкций Преподаватель: Доцент Кафедры ВС, к.т.н. Поляков Артем Юрьевич © Кафедра вычислительных систем ФГОБУ ВПО «СибГУТИ» План лекции 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] nm НЕТ 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