Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Петренко v4.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
15.92 Mб
Скачать

Расширенный алгоритм Евклида.

Соотношение Безу как следствие из алгоритма Евклида:

Для исходных любых чисел и найдутся числа и такие, что будет выполняться линейная комбинация: , где d – НОД исходных чисел. Но в этой формуле один из коэффициентов отрицательный. Коэффициенты тоже целые.

Следствие из алгоритма Евклида: любое число представимо в виде степеней простых чисел.

u, v – коэффициентыпри aиb.

1 шаг.

;

;

u = 1, v=q0.

2 шаг.

;

;

.

u = q1; v = 1+q0*q1.

то есть на каждом шаге получаем аналог соотношения Безу.

Модульные алгоритмы.

Если вместо модульных операций использовать простые, то быстро возникает переполнение.

Модульное возведение в степень.

Схема для получения :

.

R<– 1 //присваиваем результат R=1

for I = ndownto 0 do {

R<– ( ) // – двоичные коэффициенты разложения

}

returnR

Алгоритм работает начиная со старших разрядов.

Если в цикле заменить строчку возведения в квадрат на R<– ( , то получим модульного умножение.

Нахождение числа, обратного по модулю.

У каждого элемента поля есть обратный.

.

Как сделать деление? Надо заменить на умножение на число в минус первой степени.

По малой теореме Ферма (Если p — простое число и целое )

т.е. если модуль простой, то можно легко найти обратно число.

Также для нахождения чисел, обратных данному числу по модулю можно применять соотношение Безу.

Для этого числаaиMдолжны быть взаимно простыми: gcd(a,M)=1.При этом M не обязательно простое.

Поскольку gcd(a,M)=1, то соотношение Безу будет .

От каждого числа возьмем модуль M:

=>

Обратное число modM.

Двоичный алгоритм Евклида.

Позволяет найти числа a и b такие, что .

Если числа большие и надо находить по модулю, то надо понять, как будем делить большое число на большое. Операции деления для таких чисел как таковой нет. Алгоритм работает без деления.Преимущество алгоритма в том, что операции деления и умножения заменяются операциями сдвига, которые выполняются быстрее.

Есть два числа а и b, они записываются в двоичном виде. Начальное значение НОД примем «1».

Если младшие разряды оба равны нулю, то оба числа четные иесть общий делитель 2. Оба числа делим на 2, а затем общий результат НОД умножаем на 2. В противном случае не делим.

На данном этапе возможны 4 случая:

  1. 00. Оба числа делятся на 2. Можно разделить каждое из чисел на 2. Если оба числа делятся на 2, то d умножаем на 2 путем сдвига, а также сдвигаем вправо на 1 бит оба числа и т.д.

  2. 01 и 10. Одно из четное – оно делится на 2. «2» в НОД не входит. Разделить число, которое делится на 2, делить до тех пор, пора в младшем разряде не появится «1».

  3. 11. Оба числа нечетные. Проверяем, какое большее, какое меньшее. Вычитаем из большего меньшее. Разность будет четная, т.к. разность двух нечетные чисел есть четное число1. Можно разделить ее на 2, т.к. НОД не будет содержать 2 (оба числа нечетные).

Алгортм продолжается до тех пор, пока при вычитании не получим 0, т.е. 2 числа стали равны и значит, что на предыдущем шаге мы получили НОД.

Пример: Найдем НОД(56,84):

Изначально:

a = 0111000 (5610)

b = 1010100 (8410)

d = 1

1 шаг: оба числа четные

a = 011100

b = 101010

d = 10

2 шаг:

a = 01110

b = 10101

d = 100

3шаг:

a = 0111

b = 10101–0111 = 1110

d = 100

4 шаг:

a = 111

b = 111

d = 100

т.к. на данном шаге b-a = 0, то получаем НОД = 100 * a = 100 * 111 = 11100 (2810)