Алгоритм великого та малого кроку

Примітивний алгоритм

Для знаходження logg b (g – генератор G порядка n, b Î G) будемо обчислювати значення g, g 2, g 3, g 4,... поки не отримаємо b. Часова оцінка алгоритму – O(n). Якщо n – велике число, то час обчислення логарифму є достатньо великим і тому алгоритм є неефективним.

 

Алгоритм великого та малого кроку

Першим детермінованим алгоритмом для обчислення дискретного логарифму був алгоритм великого та малого кроку, запропонований Шанком (Shank) [1].

 

Для обчислення log gb в групі Zn * необхідно зробити наступні кроки:

1. Обчислити a = é  ù;

2. Побудувати список L1 = 1, ga, g 2 a,..., g  (за модулем n);

3. Побудувати список L2 = b, bg, bg 2,..., bga - 1 (за модулем n);

4. Знайти число z, яке зустрілося в L1 та L2.

Тоді z = bgk = gla для деяких k та l. Звідси b = gla - k = gx; x = la - k.

 

Два питання постає при дослідженні роботи наведеного алгоритму:

1. Чи завжди знайдеться число, яке буде присутнім в обох списках?

2. Як ефективно знайти значення z?

 

Запишемо x = sa + t для деяких s, t таких що 0 £ s, t < a. Тоді b = gx = gsa + t. Домножимо рівність на ga - t, отримаємо: bga - t = gs ( a + 1). Значення зліва обов’язково зустрінеться в L2, а справа – в L1.

Відсортуємо отримані списки L1 та L2 за час O(a * log a). За лінійний час проглядаємо списки зліва направо порівнюючи їх голови: якщо вони рівні, то значення z знайдене, якщо ні – то видалити менше число і продовжити перевірку.

 

Приклад. Розв’язати рівняння: 2x º 11 (mod 13).

a = é  ù = 4;

L1: 1, 24 º 3, 28 º 9, 212 º 1, 216 º 3;

L2: 11, 11 * 2 º 9, 11 * 22 º 5, 11 * 23 º 10;

Число 9 зустрілося в обох списках. 11 * 2 º 28, 11 º 27, звідки x = 7.

Відповідь: x = 7.

 

Інший підхід до реалізації алгоритму великого та малого кроку можна отримати якщо рівність b = gsa + t (a = é  ù, 0 £ s, t < a) переписати у вигляді b * (g- a) s = gt. Обчислимо g - a та складемо таблицю значень gt, 0 £ t < a. Далі починаємо знаходити значення b * (g- a) s, s = 0, 1, … перевіряючи їх наявність у таблиці gt. Як тільки знаходяться такі s та t, алгоритм зупиняється.

 

Приклад. Обчислити log23 в групі Z19*.

3 = 2x = 2 sa +1, 3 * (2- a ) s = 2 t. Складемо таблицю 2 t, 0 £ t < é  ù = 5:

 

t 0 1 2 3 4
2t 1 2 4 8 16

 

2-1 º 10 (mod 19), оскільки 2 * 10 º 1 (mod 19).

Тоді 3 * (2-5) s (mod 19) º 3 * (105)s (mod 19) º 3 * 3 s (mod 19)

Обчислюємо 3 * 3 s, s = 0, 1, …:

 

s 0 1 2
3 * 3 s 3 9 8

 

Значення 8, яке отримали при s = 2, присутнє в таблиці 2 t, 0 £ t < 5.

Звідси 3 * (2-5)2 = 23 або 3 = (25)2 * 23 = 25*2+3 = 213.

Відповідь: 3 = 213, тобто log23 = 13.

 

Алгоритм Полард - ро

Нехай G – циклічна група з порядком n (n – просте). Розіб’ємо елементи групи G на три підмножини S1, S2 та S3, які мають приблизно однакову потужність. При цьому необхідне виконання умови: 1 Ï S2. Визначимо послідовність елементів x i наступним чином:

x 0 = 1, x i+1 = , i ³ 0   (1)

Ця послідовність у свою чергу утворить дві послідовності c i та d i, що задовольняють умові

x i =

та визначаються наступним чином:

с 0 = 0, с i+1 = , i ³ 0 (2)

та

d 0 = 0, d i+1 = , i ³ 0 (3)

Алгоритм буде працювати циклічно шукаючи таке знчення i, для якого x i = x 2i. Для таких значень будуть мати місце рівність  =  або  = . Логарифмуючи останню рівність за основою a, матимемо:

(d i - d 2i) * log ab º (c 2i - c i) mod n

Якщо d i ¹ d 2i (mod n), то це рівняння може бути ефективно розв’язано для обчислення log ab.

 

Алгоритм

Вхід: генератор a циклічної групи G з порядком n та елемент b Î G.

Вихід: дискретний логарифм x = log ab.

1. x0 1, c 0 0, d 0 0.

2. for i = 1, 2,... do

2.1. За значеннями xi -1, ci -1, di -1 та x 2 i -2, c 2 i -2, d 2 i -2 обчислити значення xi, ci, di та x 2 i, c 2 i, d 2 i використовуючи формули (1), (2), (3).

2.2. if (x i = x 2i) then

r (di - d 2 i) mod n;

if (r = 0) then return (FALSE); // розв’язку не знайдено

x r -1 (ci - c 2 i) mod n.

return (x).

 

Якщо алгоритм завершується невдачею (повертає FALSE), то можна запустити його вибравши інші початкові значення c 0, d 0 з інтервалу [1; n - 1] та поклавши x0 = .

 

Приклад. Обчислити log29  в групі Z19*.

Побудуємо наступну таблицю значень послідовностей xi, ci, di:

 

i xi ai bi x 2 i a 2 i b 2 i
1 9 0 1 18 1 1
2 18 1 1 4 4 2
3 17 2 1 4 8 6
4 4 4 2 4 16 14
5 17 4 3 4 32 30
6 4 8 6 4 64 62

 

На 6 кроці отримали x6 = x12. Підставивши їх значення, отримаємо:

28 * 96 = 264 * 962 або 28 – 64 = 962 – 6, 2-56 = 956

Логарифмуємо рівність: -56 * log29 = 56 (mod 18), оскільки |Z19*| = 18.

Враховуючи що -56 (mod 18) º 16, 56 (mod 18) º 2, перепишемо рівність у вигляді 16 * log29 = 2 (mod 18) або 8 * log29 = 1 (mod 9). log29 = 8-1 (mod 9) = 8.

Відповідь: log29  = 8.

 

Індексний алгоритм

Алгоритм, базований на обчисленні індексів, є найпотужним при обчисленні дискретного логарифму. Необхідно побудувати відносно невелику підмножину S елементів групи G, яка називається множниковою основою. Ця підмножина повинна обиратися таким чином, щоб як можна більша частина елементів G могла бути представлена у вигляді добутку її елементів. При обчисленні значення log ab (a – генератор G, b Î G) спочатку обчислюються значення логарифмів елементів з S (які заносяться в тимчасову базу даних), а потім на їх основі обчислюється логарифм числа b.

 

Алгоритм

Вхід: генератор a циклічної групи G порядка n та елемент b Î G.

Вихід: дискретний логарифм x = log ab.

1. Побудувати множину S – множникову основу. Нехай S = { p 1, p 2, …, pt }. В якості значень pi можна обрати, наприклад, i - те просте число.

2. Побудувати систему лінійних рівнянь, розв’язком якої будуть значення log a pi. Для цього виконаємо наступні кроки:

2.1. Обрати деяке ціле k, 0 £ k £ n - 1 та обчислити ak.

2.2. Спробувати представити значення ak у вигляді добутку чисел з S:

ak = , ci ³ 0

Якщо така рівність знайдена, то записати рівняння:

k =  (mod n)

2.3. Повторювати кроки 2.1. та 2.2. поки не отримаємо t + c лінійних рівнянь. Невелике ціле число c (1 £ c £ 10) обирається таким чином, щоб складена система рівнянь мала єдиний розв’язок з великою ймовірністю (якщо скласти лише t рівнянь з t невідомими, то з великою ймовірністю два з цих рівнянь будуть залежними і тоді система буде мати більше одного розв’язку).

3. Розв’язати утворену систему рівнянь, отримати значення log api, 1£ i £ t.

4. Обчислення log ab.

4.1. Обрати деяке ціле k, 0 £ k £ n - 1 та обчислити b * ak.

4.2. Спробувати представити значення b * ak у вигляді добутку чисел з S:

b * a k = , di ³ 0

Якщо такого представлення знайти не вдається, виконати знову 4.1. Інакше прологарифмірувавши останню рівність, отримаємо:

x = log ab = (  - k) mod n

 

Приклад. Обчислити log212 в групі Z19*.

1. Нехай S = {2, 3, 5} – множникова основа.

2. Будуємо систему рівнянь для знаходження значень log2 pi, де pi Î S. Оскільки множина S містить 3 елементи, то достатньо отримати 3 лінійно незалежні рівняння.

k = 5: 25 (mod 19) º 13 – не представимо у вигляді добутку чисел з S.

k = 7: 27 (mod 19) º 14 – не представимо у вигляді добутку чисел з S.

k = 2: 22 (mod 19) º 4 = 22. Перше рівняння: 2 = 2log22.

k = 10: 210 (mod 19) º 17 – не представимо у вигляді добутку чисел з S.

k = 15: 215 (mod 19) º 12 = 22 * 3. Друге рівняння: 15 = 2log22 + log23.

k = 11: 211 (mod 19) º 15 = 3 * 5. Третє рівняння: 11 = log23 + log25.

3. Система рівнянь за модулем 18 (порядок Z19* дорівнює 18) має вигляд:

Її розв’язком буде:

log22 = 1, log23 = 13, log25 = 16

4. Обчислення log212.

k = 3: 12 * 23 (mod 19) º 1 – не представимо у вигляді добутку чисел з S.

k = 7: 12 * 27 (mod 19) º 16 = 24.

log212 + 7 º 4log22 (mod 18), log212 º (4log22 – 7) (mod 18) = 15.

Відповідь: log212 = 15.

 

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: