
- •Лекція 1
- •Лекція 2 Алгоритм Евкліда. Розширений алгоритм Евкліда. Складність алгоритмів. Складність операцій додавання і віднімання.
- •Лекція 3 Використання модульної арифметики. Обчислення з многочленами. Методи множення. Складність обчислень. План.
- •Лекція 4 Складність розв’язання систем рівнянь.
- •Лекція 5 Тестування чисел на простоту. Імовірнісні алгоритми з однобічною помилкою. Складність алгоритмів.
- •Контрольні питання та завдання
- •Лекція 6 Тестування чисел на простоту. Алгоритми з імовірнісним часом виконання. Детерміновані алгоритми. Складність алгоритмів.
- •Лекція 7 Побудова великих простих чисел.
- •Лекція 8 Побудова великих простих чисел.
- •Лекція 9 Складність алгоритмів факторизации.
- •Лекція 10 Складність алгоритмів факторизации.
Лекція 2 Алгоритм Евкліда. Розширений алгоритм Евкліда. Складність алгоритмів. Складність операцій додавання і віднімання.
План
1. Алгоритм Евкліда.
Розширений алгоритм Евкліда.
Оцінка складності алгоритмів.
Складність операцій додавання і віднімання.
Використання модульної арифметики.
Нагадаємо, що два числа
називають взаємнопростими, якщо вони
не мають спільних дільників, крім 1.
Іншими словами, якщо найбільший спільний
дільник чисел
і
дорівнює 1, то ці числа називають
взаємнопростими і записують
.
Один з шляхів обчислення найбільшого спільного дільника двох чисел – використання алгоритму Евкліда. Евклід описав цей алгоритм у своїй книзі „Елементи”, датованій 300 роком до н.е. Однак алгоритм був створений не Евклідом. Історики вважають, що алгоритм на 200 років старіший. Це найдавніший нетривіальний алгоритм, що дійшов до наших днів.
Будемо позначати найбільший
спільний дільник чисел А
і В
через (А,В).
Нагадаємо, що алгоритм Евкліда полягає
у послідовному виконанні операції
ділення із залишком до отримання
нульового залишку. Нехай
А
В
0 . Позначимо A
r-1
, B
r0
і
при
і
.
Тоді
і до отримання
залишка
необхідно виконати
ділення.
Оцінимо число ділень, що
виконується в алгоритмі Евкліда
.
Для цього розглянемо послідовність
чисел Фібоначчі
Лема
1. При
вірна
нерівність
,
де
.
Доведення.
Застосуємо індукцію
за
.
При
тверждення є очевидним.
Далі, використовуючи припущення індукції, маємо
Так
як R є
додатнім коренем рівняння
Дійсно,
и
.
Теорема 1.
(Ламе, 1844). Для будь-якого натурального
числа
число
ділень в алгоритмі Евкліда для знаходження
найбільшого спільного дільника чисел
А і В,
не перевищує
.
Доведення.
Доведемо, що
при
.
При
вірно. Для
,
пам’ятаючи про індукцію,
маємо
.
Тому,
,
звідки виходить шукана оцінка числа
ділень
.
(
)
Безпосередньо із цієї теореми можна отримати оцінку складності алгоритму Евкліда для знаходження найбільшого спільного дільника двох n-розрядних чисел.
.
Разом з тим, цю оцінку можна
уточнити, якщо звернути увагу на те, що
складність операції ділення кутом числа
на число
,
,
насправді має вигляд
.
Звідси, позначаючи через
довжину запису залишку
, де
,
отримаємо більш точну оцінку складності
алгоритму Евкліда
Оцінка складності алгоритму
Евкліда не є оптимальною для знаходження
НСД.
Існує багато різних модифікацій алгоритму
Евкліда. Можна, наприклад, зменшити
кількість кроків алгоритму, модифікуючи
алгоритм з метою зменшення абсолютних
значень залишків. А саме, будемо змінювати
залишок остаток
на
,
якщо
.
За такого виправлення виходить
послідовність чисел, що задовольняє
умову
.
Те, що деякі із чисел будуть від’ємними,
не впливає на вид спільних дільників.
У результаті отримуємо оцінку кількості
ділень
.
Проте, даний підхід не покращує загальну
оцінку складності модифікованого
алгоритму Евкліда.
Існують алгоритми, у яких взагалі не виконується операція ділення. Наприклад у алгоритмі LSGCD (lift shift greatest common divisor) операція ділення із залишком замінена на лівий зсув дільника з наступним відніманням з діленого, так що отримана послідовність на кожному кроці задовольняє умові з попереднього алгоритму.
У даному алгоритмі виконуються
кроків,
кожен з яких має складність
,
тому загальна оцінка складності має
вигляд
.
Існує алгоритм знаходження
НСД з
оцінкою складності
,
однак, його пояснення достатньо складне
і тут не наводиться.
Можна також зазначити, що алгоритм Евкліда широко використовується не тільки при визначенні спільних дільників чисел, але й поліномів. А саме, у теорії подільності його використовують при тестуванні взаємної простоти двох поліномів з коефіцієнтами, наприклад, з кінцевого поля.
Задача обчислення зворотних
значень за модулем трохи складніша.
Іноді вона має розв’язок, іноді – ні.
Наприклад, зворотне значення 5 за модулем
14 дорівнює 3. З іншого боку, число 2 не
має зворотного значення за модулем 14.
У загальному випадку рівняння
має єдиний розв’язок, якщо
і
взаємопрості. Якщо
і
не
є взаємнопростими, то
не має рішень. Зворотнє значення за
модулем
можно обчислити за допомогою розширеного
алгоритму Евкліда.
Розглянемо цей алгоритм, що
дозволяє не тільки знаходити НСД
чисел
і
а ще й знаходити цілі числа
і
, що задовольняють
рівності
.
Зі звичайним алгоритмом Евкліда він
різниться тим, що разом з послідовністю
залишків
обчислюються ще дві
допоміжні послідовності
і
.
Наприклад:
5x +7y = НСД (5,7 )
1. r- 1 = 5; r0 = 7
x - 1 = 1; y - 1 = 0; x 0 = 0; y 0 = 1
d 1 = r - 1 / r 0 = 5 / 7 = 0
r 1 = r - 1 - d 1 r 0 = 5 - 0 7 = 5
x 1 = x - 1 - d1 x 0 = 1 - 0 0 = 1
y 1 = y - 1 - d 1 y 0 = 0 - 0 1= 0
2. d 2 = r 0 / r 1 = 7 / 5 = 1
r 2 = r 0 - d 2 r 1 = 7 - 1 5 = 2
x 2 = x 0 - d2 x 1 = 0 - 1 1 = - 1
y 2 = y 0 - d 2 x 1 = 1 - 1 0= 1
3. d 3 = r 1 / r 2 = 5 / 2 = 2
r 3 = r 1 - d 3 r 2 = 5 - 2 2 = 1
x 3 = x 1 - d3 x 2 = 1 - 2 ( - 1) = 3
y 3 = y 1 - d3 y 2 = 0 - 2 1= - 2
4. d 4 = r 2 / r 3 = 2 / 1 = 2
r4 = r 2 - d 4 r 3= 2 - 2 1 = 0
Дійсно, знайдені числа та , що задовольняють рівності
НСД(5,7)
5 3 +7 ( - 2 ) = НСД (5,7 )
Сам алгоритм можна подати таким чином:
r- 1 = А; r0 = B
x - 1 = 1; y - 1 = 0; x 0 = 0; y 0 = 1
for i = 1 until r i 0 do
begin
d i = r i - 2 / r i - 1 ;
r i = r i - 2 - d i r i - 1 ;
x i = x i - 2 - d i x i - 1 ;
y i = y i - 2 - d i y i - 1 ;
i = i + 1;
end
Значення
та
,за
яких
будуть шуканими в силу наступного
тверждення:
Лема 2.
При всіх
,
,виконується рівність
Застосуємо індукцію за
. При
рівність
очевидна.
Якщо рівності доведені для
всіх значень індексів менших від
,
то для
,
користуючись індуктивним припущенням,
отримуємо
Легко побачити, що складність цього алгоритму відрізняється від складності звичайного алгоритму Евкліда не більше, ніж на константний співмножник, і складає
,
где
довжина запису чисел
и
Використання модульної арифметики.
Модулярні обчислення нерідко
використовують в криптографії, оскільки
обчислення дискретних логарифмів та
квадратних коренів за модулем
може
стати непростою задачею. До того ж,
модулярну арифметику простіше реалізувати
на комп’ютерах, так як вона обмежує
діапазон проміжних значень результату.
Для
-бітових
модулів довжина проміжних результатів
будь-якої операції додавання, віднімання
або множення не перевищує
бітів. Тому за допомогою модулярної
арифметики можна, наприклад, виконати
піднесення до степені без громіздких
проміжних результатів. Обчислення
степеня деякого числа за модулем іншого
числа,
являє собою просту послідовність
операцій множення і ділення, однак
відомі методи їх прискорення. Один з
таких методів прагне мінімізувати
кількість множень за модулем. Оскільки
операції дистрибутивні, піднесення до
степеню виконується швидше як послідовність
множень, кожного разу отримуючи лишки.
Зараз ви не відчуваєте різниці, але вона
стане помітною за множення 200-розрядних
чисел.
Наприклад, обчислюючи
,
можна не виконувати сім множень і одне
величезне приведення за модулем:
.
Замість цього Виконайте три менших множення і три менших приведення за модулем:
.
Під час обчислень із цілими числами часто використовують наступне.
Якщо відомо, що початкові
числа і результати обчислень обмежені
деяким числом
(при
цьому припускають нерівності двох видів
або
),
то обчислення можна проводити в кільці
лишків
,
ототожнюючи числа з указаних інтервалів
і відповідні лишки. Щодо
,
то його можно вибирати різними шляхами,
причому цей вибір переважно визначає
складність обчислень.
Найбільш ефективним такий
підхід є у випадку, коли число
може бути представлене у виді добутку
невеликих взаємопростих чисел
,
оскільки в даному випадку можно
скористуватися ізоморфізмом кілець.
.
При цьому співвідношенні
кожному числу з інтервалу
відповідає набір
,
де
,
.
У даному випадку маємо
на увазі найменший невід’ємний залишок
від ділення числа
на число
.
Замість обчислень з початковими числами
можна перейти до їх залишків і проводити
усі обчислення в кільцях
,
,
а потім, отримавши результат, виконати
зворотній перехід і відновити шукане
число за залишками.
Для виконання зворотного переходу Застосовують китайську теорему про залишки. Більш докладно теорема про залишки розглядається в теорії чисел.
Теорема 2.
Нехай
,
де
попарно взаємопрості,
і
(тут
і далі запис
,
на відміну від запису правої частини
порівняння
,
означає найменший невід’ємний залишок
від ділення числа с на число
).
Тоді розв’язок системи порівнянь
існує однозначно за модулем М і знаходиться за формулою
.
Доведення легко витікає з наступних властивостей обраних чисел:
,
при
.
,
Для обчислення значення u за даною формулою необхідно
двійкових операцій, де через
позначена складність знаходження
зворотнього елементу в кільці
,
за допомогою розширеного алгоритму
Евкліда. Трудомісткість можна зменшити,
якщо аналогічно попередньому випадку
використати техніку „розподіляй і
володарюй”, застосовуючи кожного разу
аналог формули за
.
В цьому випадку виходить оцінка
(Існує й інша формула для обчислення u
,трудомісткість така
ж, але є переваги.)
Будемо ототожнювати елементи
кільця лишків
з числами з інтервалу
.
Нехай
.
Додавання, віднімання.
Під час складення чисел в
інтервалі
.
Сума
може вийти за межі інтервалу, тому може
знадобитися ще одне віднімання
.
( 13 (mod 17) + 8 (mod 17) = 13 + 8 17
= 4 (mod 17 )). Аналогічно, під час віднімання
може знадобитися ще одне додавання
.
(7 (mod 13)
12 (mod 13) = 7
12 + 13 = 8 (mod 13 )). Тому, складність цих
операцій дорівнює
.
Множення.
Для знаходження лишку, що
відповідає добутку двох лишків, треба
виконати одне множення
-розрядних
чисел і одне ділення
-розрядного
числа на
-розрядне.
Тому, складність даної операції дорівнює
.
Вадою модулярного представлення є те, що порівняно складно перевірити, чи є число додатнім або від’ємним. Важко також перевіряти, у результаті якої дії відбувається переповнення – додавання, віднімання або множення, і доволі складно ділити. Використання модулярної арифметики вигідне тільки якщо у розпорядженні є засоби швидкого переходу до модулярного стану та навпаки.
Контрольні питання та задачі
У чому полягає алгоритм Евкліда?
Надайте оцінку числа ділень, що виконуються в алгоритмі Евкліда.
Як можна модифікувати алгоритм Евкліда?
Як можна оцінити складність алгоритму Евкліда
Навести розширений алгоритм Евкліда та оцінити його складність.
Застосування розширеного алгоритму Евкліда в криптографії. Навести приклади.
Яке використання модульної арифметики в криптографії
Навести формули для розрахунку складності додавання, віднімання та множення. Пояснити.
За допомогою алгоритму Евкліда знайти НСД пар чісел (187,34), (841,160), (2613,2171).
Знайти НСД поліномів
та
у кільці
.
Написати програму, яка реалізує алгоритм Евкліда, розширений алгоритм Евкліда.