|
||||||
Математика: Теория чисел.Вычисление НОД и НОК.
Алгоритм Евклида.1. Вычислим r - остаток от деления числа a на b, a = bq+r, 0 <= r < b. 2. Если r = 0, то b есть искомое число. 3. Если r =/= 0, то заменим пару чисел (a,b) парой (b,r) int NOD(int a,int b) { while(a!=0 && b!=0) { if(a>=b) a=a%b; else b=b%a; } return x+y; // Одно - ноль } При вычислении наибольшего общего делителя (a,b) с помощью алгоритма Евклида будет выполнено не более 5p операций деления с остатком, где p есть количество цифр в десятичной записи меньшего из чисел a и b. Бинарный алгоритм Евклида.Этот алгоритм использует соотношения для НОД: m:= a; n:=b; d:=1; {НОД(a,b) = d * НОД(m,n)} while not ((m=0) or (n=0)) do begin if (m mod 2 = 0) and (n mod 2 = 0) then begin d:= d*2; m:= m div 2; n:= n div 2; end else if (m mod 2 = 0) and (n mod 2 = 1) then begin m:= m div 2; end else if (m mod 2 = 1) and (n mod 2 = 0) then begin n:= n div 2; end else if (m mod 2=1) and (n mod 2=1) and (m>=n)then begin m:= m-n; end else if (m mod 2=1) and (n mod 2=1) and (m<=n)then begin n:= n-m; end; end; {m=0 => ответ=d*n; n=0 => ответ=d*m} Алгоритм решения уравнения ax+by = 1.1.Определим матрицу E:
2. Вычислим r - остаток от деления числа a на b, a=bq+r, 0 <= r < b. 3. Если r=0, то второй столбец матрицы E даёт вектор ( x, y ) решений уравнения. 4. Если r =/= 0, то заменим матрицу E матрицей
5. Заменим пару чисел (a,b) на (b,r) и перейдем к шагу 1. Расширенный бинарный алгоритм Евклида.Прим. Также используется для нахождения обратного элемента по модулю, то есть при данных a и m, найти z: az = 1(mod m). Используется та же идея, что и в обычном бинарном алгоритме, но количество медленных делений уменьшено за счет увеличения итераций. 1. g := 1; 2. While x И y ЧЕТНЫЕ { x := x/2; y := y/2; g := 2g; } 3. u := x; v := y; A := 1; B := 0; C := 0; D := 1; 4. While u ЧЕТНОЕ { 4.1 u := u/2; 4.2 If A == B == 0(mod 2) then A := A/2; B := B/2; else A := (A+y)/2; B := (B-x)/2; } 5. While v ЧЕТНОЕ { 5.1 v := v/2; 5.2 If C == D == 0(mod 2) then C := C/2; D := D/2; else C := (C+y)/2; D := (D-x)/2; } 6. If u >= v then u := u-v; A := A-C; B := B-D; else v := v-u; C := C-A; D := D-B; 7. If u = 0 then a := C; b := D; return (a, b, g*v); else goto 4. Если НОД(x, y)=1, то z=D при D>0; или z=m+D при D<0. Если же НОД(x, y) =/= 1, то обратного элемента не существует. НОК.НОК( a , b) = a*b / НОД(a, b) |