logo search
Рожков_Ниссенбаум_ТЧМК_лекции

3.2. Шаг младенца – шаг великана.

В открытой литературе этот метод впервые был описан Шенксом (Daniel Shanks), ссылки на него известны с 1973 года. Это был один из первых методов, более быстрый чем метод прямого перебора.

Общая схема алгоритма такова:

Берем два целых числа m и k, таких что mk>p (как правило, m=k=). Затем вычисляются два ряда чисел:

a, ga, g2a, … , gm1a (mod p)

gm, g2m, g3m, … , gkm (mod p)

(все вычисления произведены по модулю p).

Найдем такие i и j, для которых gia=gjm. Тогда x=jmi.

Справедливость последнего равенства подтверждается следующей цепочкой, все вычисления в которой произведены по модулю p:

gx=gjm-i=gjm(gi)-1=gjma(gia)-1=gjma(gjm)-1=a.

Заметим, что числа i и j непременно будут найдены, поскольку при i=,j=выполняетсяjmi=, причемkm>p. То есть среди всех чисел вида jmi обязательно содержится 0 < xp.

Замечание: Указанный метод можно применять для разыскания дискретных логарифмов в любой циклической группе порядка n.

Приведем этот метод в форме алгоритма.

Алгоритм «Шаг младенца-шаг великана»:

Вход: g - порождающий элемент конечной группы G порядка n; aG.

Ш.1. Вычислить m=.

Ш.2. Вычислить b=gm.

Ш.3. Вычислить последовательности ui=bi, vj=agj Для i,j=.

Ш.4. Найти i, j такие что ui=vj. x=mij mod n. Идти на Выход.

Выход: logga=x.

Одна из трудоемких частей этого алгоритма – это поиск на Шаге 4. Он может быть осуществлен несколькими способами:

  1. Сначала построить таблицу (i, ui), отсортировать ее по второй компоненте а затем произволить сравнения по мере нахождения компонент vj.

  2. Построить две таблицы (i, ui) и (j, vj), отсортировать каждую из них, а затем произвести поиск совпадений.

  3. Объединить u, v в одну таблицу, снабдив их номером в соответствующей последовательности и битом принадлежности к одной из двух последовательностей, а затем применить совместную сортировку. И т. п.

Сложность данного алгоритма составляет O() умножений по модулю и O(log n) операций сравнения.

Пример.

Пусть n=229 (простое число), g=6, a=12.

Ш.1. m=16.

Ш.2. b=ga mod n =612 mod 229 = 183.

Ш.3. В этом примере вычислим сначала ряд ui, а затем будем вычислять компоненты vj до тех пор, пока не найдется совпадение.

i, j

1

2

3

4

5

6

7

8

9

10

ui

183

55

218

48

82

121

159

14

43

83

vj

72

203

73

209

109

196

11

12

13

14

15

16

75

214

3

91

165

196

i=16, j=6. x=mi—j mod n = 250 mod 228 = 22.

Проверка: 622 mod 229= 12.

Ответ: log612 mod 228 = 22.

3.3. Ро-метод Полларда для дискретного логарифмирования.

Этот алгоритм осуществляет случайный поиск дискретных логарифмов, как и метод «шаг ребенка – шаг великана», но он требует меньшего объема памяти для хранения данных, поэтому предпочтительней для практических целей. В основе данного метода лежит та же идея, что и в основе ро-метода для факторизации – строится псевдослучайная последовательность, в которой находятся совпадающие элементы при помощи метода Флойда, а затем на основании полученной величины вычисляется искомый дискретный логарифм.

Пусть требуется вычислить logga в конечной группе G порядка n.

Группа G разбивается на три непересекающихся подмножества примерно равной мощности: G=S1US2US3, так чтобы 1S2. Причем разбиение должно быть построено таким образом, чтобы проверка, к какому подмножеству принадлежит данный элемент x, была простой.

Например, если G=Zp, где p – простое число, то можно задать разбиение S1={1,…,}, S2={,…,}, S3={, … , p—1}, или разбиение может быть таким: если x mod 3=1, то xS1, если x mod 3=2, то xS2, если x mod 3=0, то xS3.

Далее на G задается последовательность x0, x1, x2, … , где x0=1, xi+1 вычисляется по xi посредством функции f для i≥0:

xi+1=f(xi)=

Вычисления проводятся в группе G, то есть если G=Zm, то вычисления следует производить по модулю m.

Такая последовательность групповых элементов может быть представлена двумя последовательностями u0, u1, u2,… и v0, v1, v2,… такими, что xi=,u0=v0=0,

ui+1=, vi+1=

Вычисления в последовательностях u и v производятся по модулю n.

В силу того, что группа G – конечная, при помощи метода Флойда можно найти такие xi и x2i, что xi = x2i. Тогда =. Логарифмируя по основаниюg обе части данного уравнения, получим

(viv2i)logga≡(u2iui) (mod n)

Решая это сравнение, получим искомый логарифм. (Заметим, что если G=Z*m, то n=φ(m)).

Сложность данного метода составляет O() , где n – порядок группы G.

Замечание. Метод может дать отказ в том случае, когда vi =v2i. Тогда следует назначить случайные значения от 0 до n—1 переменным u0, v0 , вычислить x0=и повторить все шаги алгоритма.

Замечание. В том случае, когда имеется достаточно места для хранения данных в процессе вычислений (например, когда G невелико или вычисления производятся вручную), можно обойтись без метода Флойда. Тогда следует хранить все члены последовательностей x, u и v до того, как xi = xj и дискретный логарифм находится из сравнения (vivj)logga≡(ujui) (mod n).

Пример.

G=Z*19, a=8, g=2.

Тогда n=φ(19)=18. Поскольку решение будем производить вручную, то не будем пользоваться методом Флойда.

Разбиение G на подмножества произведем следующим образом: если x mod 3=1, то xS1, если x mod 3=2, то xS2, если x mod 3=0, то xS3.

Вычисления будут производиться по формулам:

xi+1=f(xi)=

ui+1=, vi+1=

i

0

1

2

3

4

5

6

7

8

xi

1

8

7

18

17

4

13

9

18

ui

0

0

0

0

1

2

2

2

3

vi

0

1

2

3

3

6

7

8

8

S

S1

S2

S1

S3

S2

S1

S1

S3

S3

x3=x8. Логарифм найдем из сравнения (v3v8)log28≡(u8u3) (mod 18)

-5 log28≡3(mod 18)

13 log28≡3(mod 18)

log28≡3·7(mod 18)

log28≡3(mod 18).

Действительно, 23≡8 (mod 19).

Ответ: log28≡3(mod 18).