Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие КЗИ учебное пособие.docx
Скачиваний:
133
Добавлен:
08.05.2019
Размер:
1.34 Mб
Скачать

4.1.4. Основные алгоритмы

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

Алгоритм разложения чисел на простые множители.

Алгоритм А (Разложение на простые множители путем деления). По данному положительному целому числу N этот алгоритм находит простые множители p1р2 ≤ … ≤ pt числа N. В этом методе используется вспомогательная последовательность пробных делителей

d = d0 < d1 < d2 < d3 < …,

которая включает в себя все простые числа < (и, если это удобно, может содержать числа, не являющиеся простыми). Последовательность чисел di должна также содержать по крайней мере одно значение, такое, что dk > .

А1. [Начальная установка.] Присвоить t ← 0, k ← 0, nN. (В ходе выполнения алгоритма переменные t, k, n подчинены следующим условиям: "n = N/p1...pt и n не имеет простых множителей, меньших dk".)

А2. [n = 1?] Если n = 1, алгоритм заканчивается.

A3. [Разделить.] Присвоить q , r n mod dk. (Здесь q и r - соответственно частное и остаток от деления числа n на dk.)

А4. [Остаток равен нулю?] Если r ≠ 0, то перейти к шагу А6.

А5. [Множитель найден.] Увеличить t на 1 и присвоить ptdk, nq. Возвратиться к шагу А2.

А6. [Частное мало?] Если q > dk, увеличить k на 1 и возвратиться к шагу A3.

А7. [n — простое число.] Увеличить t на 1, присвоить ptn и завершить выполнение алгоритма.

Рис.32. Алгоритм разложения числа на простые множители

Пример.

Разложение на простые множители числа N = 25852. Сразу же находим, что N = 2 · 12926; следовательно, р1 = 2. Далее, 12926 = 2 · 6463, так что р2 = 1. Но теперь число n = 6463 не делится на числа 2, 3, 5, ..., 19; находим, что n = 23 · 281; значит, р3 — 23. В итоге имеем 281 = 12 · 23 + 5 и 12 ≤ 23, т. е. р4 = 281.

Алгоритм Евклида

Разделить целое число a на число b с остатком – это значит найти такие числа q и r c 0  r < |b|, при которых выполняется равенство

a = q · b + r.

Разделить многочлен f на многочлен g с остатком – это значит найти такие многочлены q и r c 0  deg r < deg g, при которых выполняется равенство

f = q · g + r.

Для вычисления НОД(r0 = a, r1 = b) производится деление с остатком по следующей схеме:

a = r0 = q1r1 + r2,

b = r1 = q2r2 + r3,

.....

rm-2 = qm-1bm-1 + rm,

rm-1 = qmrm.

Работа алгоритма Евклида основана на том, что отображение сохраняет наибольший общий делитель.

Отображение работает до a = НОД, b = 0.

Пример.

НОД(21, 12) = НОД (21 (mod 12), 12) =

= НОД(12, 9) = НОД (12 (mod 9), 9) =

= НОД(9, 3) = НОД (9 (mod 3), 3) =

= НОД(3, 0) = 3

Работа бинарного алгоритма нахождения НОД основана на следующем ряде отображений, также сохраняющих НОД:

Отображения работают до (a – b) /2 = 0. НОД = b.

Пример.

НОД(21, 12) = НОД (21, 12 / 2) =

= НОД(21, 6) = НОД (21, 6 / 2) =

= НОД(21, 3) = НОД ((21 – 3) / 2, 3) =

= НОД(9, 3) = НОД ((9 – 3) / 2, 3) =

= НОД(3, 3) = НОД ((3 – 3) / 2, 3) =

= НОД(0, 3) = 3

Во всех вышеперечисленных рассуждениях принимается ab.

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

Позволяет найти не только НОД(a, b), но и мультипликативный обратный к b по модулю a. Преобразуем формулы для алгоритма Евклида, выразив все остатки ri через a и b:

r2 = r0q1r1 = a q1b,

r3 = r1q2r2 = bq2(a q1) = – q2a + (1 + q1 q2)b,

.....

ri-2 = si-2a + ti-2b,

ri-1 = si-1a + ti-1b,

ri = ri-2qi-1ri-1 = a(si-2qi-1si-1) + b(ti-2qi-1ti-1)

.....

rm = sma + tmb.

Расширенный алгоритм Евклида по данным целым числам a и b выдает rm, sm и tm, так что

rm = НОД(a, b) = sma + tmb.

При НОД(a, b) = 1; 1  tmb (mod a); b – 1tm (mod a).

Пример.

r2 = 5 = 19 – 2 · 7,

r3 = 2 = 7 – 5 = 7 – (19 – 2 ·7) = – 19 + 3 · 7,

r4 = 1 = 5 – 2 · 2 = (19 – 2 ·7) – 2 · (– 19 + 3 · 7) = 3 · 19 – 8 · 7.

Отсюда 1  – 8 · 7 (mod 19),

так что 7–1  – 8  11 (mod 19).