Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретико-числовые алгоритмы в криптографии.pdf
Скачиваний:
236
Добавлен:
23.03.2015
Размер:
2.46 Mб
Скачать

§ 1.8. Современные методы проверки простоты чисел

43

не пересекаются и равномощны. Аналогично доказательству леммы 1.67 получим неравенство |S| 14 |(Z/nZ) | = (n)/4. Лемма 1.68 доказана.

Доказательство теоремы 1.55 очевидным образом получается из лемм 1.65, 1.67, 1.68.

§1.8. Современные методы проверки простоты чисел

В начале 80-х годов Адлеман, Померанс и Румели [46] предложили детерминированный алгоритм проверки простоты чисел. Для заданного натурального числа n алгоритм делает O((log n)c log log log n) арифметических операций (c— некоторая абсолютная постоянная) и выдает верный ответ, составное n или простое. Описание схемы алгоритма можно найти также в [10]. Этот алгоритм оказался непрактичным и довольно сложным для реализации на компьютере.

Существенные теоретические упрощения алгоритма Адлемана— Померанса—Румели были получены Х. Ленстрой [164]. Он предложил детерминированный алгоритм, также делающий O((log n)c log log log n) арифметических операций. Реализация этого алгоритма позволила проверять на простоту числа n порядка 10100 за несколько минут.

Замечание 1.69. Оценка сложности в алгоритмах Адлемана—По- меранса—Румели и Ленстры является неулучшаемой, т. е. для простого числа n алгоритм выполнит не менее c1 (log n)c2 log log log n операций для некоторых положительных постоянных c1 и c2.

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

Схема алгоритма Ленстры.

Алгоритм проверяет на простоту нечетное число n N, n > 1.

1 шаг. Выбираем различные простые числа p1, . . . , pk (называемые начальными простыми) так, чтобы нашлись нечетные простые числа q1, . . . , qs (называемые евклидовыми простыми), удовлетворяющие следующим условиям:

а) qj 1 | p1 . .. pk, j = 1, . . . , s;

б) 2q1 . . . qs

 

n

.

Пример 1.70.

9{p} =11{2, 3, 5, 7}, {q} = {3, 7, 11, 31, 43, 71, 211},

2q1 . . . qs 143 · 10

 

> 10 . Следовательно, данные наборы {pi},22{qj}

можно использовать для проверки простоты всех чисел n, n 10 .

44 Гл. 1. Тестирование чисел на простоту и построение больших простых чисел

2 шаг. Проверяем, верно ли, что n = pi или n = qj для некоторого i или j. Если да, то n — простое. Иначе проверяем равенство

НОД(p1 . . . pkq1 . . . qs, n) = 1.

Если оно неверно, то n — составное.

3 шаг. Для каждой пары p, q, такой, что p | q − 1, находим первообразный корень cq по модулю q и числа a, b N, которые при p > 2 удовлетворяют следующим условиям:

ab(a + b) 0 (mod p), ap + bp (a + b)p (mod p2).

Известно, что такие a, b существуют, и обычно a = b = 1. Далее определяем числовой характер p,q по модулю q порядка p:

 

p,q

: (Z qZ)

C,

p,q

(x) = indqx

,

 

/

 

p

 

где p = e2 i/p, indq (x) Z/(q − 1)Z, cindq qx при различных p | q − 1 порождают всю по модулю q.

Вычисляем сумму Якоби

q−1

( p,q) = p,q (x)a p,q (1 − x)b = x=2

≡ x (mod q). Эти характеры группу числовых характеров

 

q−1

 

 

x

 

a indq (x)+b indq (1−x)

.

p

 

=2

 

Это вычисление проводится быстро, поскольку евклидовы простые числа q невелики, и значения indqx быстро определяются перебором.

4 шаг. Для каждого начального простого числа p находим наибольшее натуральное число h = h(p), 1 h t = p (np−1 1), такое, что для всех q таких, что p | q − 1, выполнено сравнение

( p,q) h (n) p,q (mod nZ [ p]).

(1.2)

Это основной тест алгоритма. Здесь p,q — некоторый корень степени p

из 1; h (n) — некоторый явно определяемый по n элемент группового кольца Z [Gal(Q( p))], имеющий вид h (n) = ah,j j, где ah,j Z 0,

j

j Gal(Q( p)), j ( p) = jp, 1 j p − 1. При этом, если

 

p−2

 

l

( p,q) =

Al pl , Al Z,

 

=0

§ 1.8. Современные методы проверки простоты чисел

45

то

 

( )

= j

 

 

l

 

jl

ah,j

p−2

l

( p,q) h n

 

Al p

 

= l=0 Bl p,

 

 

 

 

 

 

 

 

 

 

 

 

где Bl Z. Поскольку

1,

 

p, . . .

,

p−2

есть

Z-базис

 

 

p

 

Z-модуля Z [ p],

мы работаем с (p − 1)-мерными векторами, имеющими целочисленные координаты. Сравнение (1.2) означает, что координаты двух таких векторов сравнимы по модулю n.

Если сравнение (1.2) не выполнено при некоторых p, q с h = 1 и

p−1

 

 

j1 (mod p) ,

 

nj

1 (n) = j=1

p

то n — составное число (аналогом этого теста является невыполнение малой теоремы Ферма an−1 1 (mod n)).

5 шаг. Для тех p, у которых h = h(p) < t = t(p) и при этом p,q = 1 для всех q таких, что p | q − 1, далее проверяем следующее условие:

найдется евклидово простое q, для которого p | q − 1 и при всех j = 0, 1, . . . , p − 1 элемент

( p,q) h+1 (n) jp Z [ p],

представленный как вектор в базисе 1, p, . . . , pp2, имеет коэффициент, взаимно простой с n.

Если это условие не выполнено, то можно показать, что на этом шаге будет найден нетривиальный делитель n.

6 шаг. Найденные на 4-м шаге числа p,q представим в виде p,q = upp,q , up,q Z 0. Затем для каждого q найдем xq такое, что для каждого p, p | q − 1, справедливо сравнение

−n p ( )xq ≡ up,q (mod p).

Здесь

p−1

 

(

+ b)j

p ( ) = j=1

a

p

 

 

 

 

ajp bjp j1 (mod p)

— целое число, зависящее от p. Нахождение xq проводится с помощью китайской теоремы об остатках.

Далее находим v Z, 1 v < 2q1 . . . qs, удовлетворяющее системе сравнений

v ≡ 1 (mod 2), v ≡ cxqq (mod q),

где q пробегает евклидовы простые числа.

46 Гл. 1. Тестирование чисел на простоту и построение больших простых чисел

7 шаг. Для каждого j, j = 1, . . . , p1 . . . pk 1, находим rj N, rj ≡ vj (mod 2q1 · · · qs), 0 < rj < 2q1 . . . qs,

и проверяем, делится ли наше число n на rj? Если для всех j rj n, то n — простое число.

Конец алгоритма.

Вывод. Для n проверяются некоторые тесты, обобщающие малую теорему Ферма. Если все они выполнены, то делители числа n лежат в небольшом явно описываемом множестве: это степени vj (mod 2q1 . . . qs) для некоторого явно построенного натурального числа v.

Сложность алгоритма составляет O((p1 . . . pk)const) арифметических операций, и можно показать, что для заданного n найдутся p1, . . . , pk такие, что

qi > n, p1 . . . pk (log n)const·log log log n.

Отсюда и получается приведенная выше оценка сложности алгоритма. Впоследствии удалось снять условие бесквадратности чисел qj 1, что позволило использовать меньшие наборы чисел pi. Например, име-

ется 27 простых чисел qj таких, что

qj 1 | 24 · 32 · 5 · 7,

причем qj > 1050. С этими наборами {pi} и {qj} можно проверять

j

на простоту числа n, не превосходящие 10100.

Указанные дальнейшие усовершенствования алгоритма Адлемана— Померанса—Румели и алгоритма Ленстры были предложены Ленстрой и Коеном [90]. Для алгоритма Ленстры—Коена нельзя получить оценку сложности O((log n)c·log log log n) арифметических операций без использования некоторых недоказанных гипотез. Однако на практике он оказался наиболее эффективным. При правильной организации его работы алгоритм всегда достаточно быстро выдает правильный ответ, простое n или составное. Описание и теоретическое обоснование алгоритма Лен- стра—Коена довольно-таки объемно и выходит за рамки данной книги. Этот алгоритм проверяет на простоту числа порядка 10100—10200 за несколько минут. Заметим также, что алгоритм Ленстры—Коена легко распараллелить на несколько компьютеров по количеству пар p и q.

В 1986 г. Голдвассер и Килиан [126] предложили алгоритм, позволяющий проверить простоту чисел с помощью эллиптических кривых. Этот алгоритм был существенно улучшен Аткином и Морейном [56].

§ 1.8. Современные методы проверки простоты чисел

47

В работе [56] приведены результаты тестирования алгоритма Аткина— Морейна на числах порядка 10800—101000. Для проверки на простоту одного числа такой величины потребовалось несколько недель. Описание алгоритма Голдвассер—Килиана будет приведено в главе 4.

Естественным образом встал вопрос о том, является ли алгоритм Аткина—Морейна более быстрым, чем алгоритм Ленстры— Коена, а также вопрос о том, какого размера числа могут проверены на простоту каждым из этих алгоритмов за реальное время. Такие исследования проводились П. Михалеску (алгоритм Ленстры—Коена) и Ф. Морейном (алгоритм Аткина—Морейна), см. работы [185; 184; 199; 198; 195; 196].

Рекордные значения проверенных на простоту чисел для некоторого усовершенствования алгоритма Ленстры—Коена можно найти в работе [184]. С его помощью было проверено на простоту число n = (211279 + 1)/3. С помощью метода эллиптических кривых было проверено на простоту число n = (212391 + 1)/3, см. [199]. Сравнение этих двух алгоритмов проверки простоты, проведенное в [184] и [199], показывает, что алгоритм Ленстры—Коена, по-видимому, значительно быстрее. Преимущество метода эллиптических кривых заключается в том, что он предоставляет легко проверяемый сертификат простоты числа.

Несколько теоретических усовершенствований алгоритма Лен- стры—Коена было предложено в работе [16]. В ней было показано, как можно применять тригонометрические суммы Гаусса и Якоби для аддитивных и мультипликативных характеров в конечных полях для проверки ряда условий в алгоритме Ленстры—Коена.

Вработе [68] также были предложены некоторые усовершенствования алгоритма Ленстры—Коена.

Взаключение скажем еще несколько слов об одном методе проверки простоты чисел. В 1992 г. Адлеман и Хуанг [47] предложили вероятностный алгоритм, имеющий полиномиальную сложность и позволяющий проверять простоту чисел с помощью гиперэллиптических кривых. В ходе его работы приходится проводить вычисления на якобианах алгебраических кривых. Алгоритм не реализован на компью-

тере и вряд ли когда-либо будет использоваться на практике. Теоретическая оценка его сложности составляет величину порядка log75 n, где n — проверяемое на простоту число. Заметим, что лишь немногие специалисты в области алгебраической геометрии и алгебраической теории чисел понимают описание и обоснование алгоритма Адлемана— Хуанга.