Алгоритм Диксона

Материал из testwiki
Перейти к навигации Перейти к поиску

Алгоритм Диксона — алгоритм факторизации, использующий в своей основе идею Лежандра, заключающуюся в поиске пары целых чисел x и y таких, что x2y2(modn) и x≢±y(modn).

Метод Диксона является обобщением метода Ферма.

История Шаблон:Sfn

В 20-х г. XX столетия Морис Крайчик (1882—1957), обобщая теорему Ферма предложил вместо пар чисел, удовлетворяющих уравнению x2y2=n, искать пары чисел, удовлетворяющих более общему уравнению x2y2(modn). Крайчик заметил несколько полезных для решения фактов. В 1981 г. Джон Диксон опубликовал разработанный им метод факторизации, использующий идеи Крайтчика, и рассчитал его вычислительную сложность.[1]

Описание алгоритма Шаблон:Sfn

  • Составить факторную базу P={p1,p2,,ph}, состоящую из всех простых чисел p<=B=L(n)12, где L(n)=exp(lnnlnlnn).
  • Выбрать случайное b,n<b<n
  • Вычислить a=b2modn.
  • Проверить число a на гладкость пробными делениями. Если a является B-гладким числом, то есть a=pBpαp(b), следует запомнить вектора α(b) и ε(b):
α(b)=(αp1(b),,αph(b))
ε(b)=(αp1(b)mod2,,αph(b)mod2).
  • Повторять процедуру генерации чисел b до тех пор, пока не будет найдено h+1 B-гладких чисел b1,...,bh+1.
  • Методом Гаусса найти линейную зависимость среди векторов ε(b1),,ε(bh+1):
ε(bi1)ε(bit)=0,1tm

и положить:

x=bi1bitmodn
y=pBp(αp(bi1)++αp(bit))2modn.
  • Проверить x±y(modn). Если это так, то повторить процедуру генерации. Если нет, то найдено нетривиальное разложение:
n=uv,u=gcd(x+y,n),v=gcd(xy,n).

Шаблон:Hider

Пример

Факторизуем число n=89755.

L(89755)=194,174
B=13,934
P={2,3,5,7,11,13}

Все найденные числа b с соответствующими векторами α(b) записываем в таблицу.

b a α2(b) α3(b) α5(b) α7(b) α11(b) α13(b)
337 23814 1 5 0 2 0 0
430 5390 1 0 1 2 1 0
519 96 5 1 0 0 0 0
600 980 2 0 1 2 0 0
670 125 0 0 3 0 0 0
817 39204 2 4 0 0 2 0
860 21560 3 0 1 2 1 0

Решая линейную систему уравнений, получаем, что ε(337)ε(519)=0. Тогда

x=337519mod89755=85148
y=233371mod89755=1512
85148≢±1512(mod89755)

Следовательно,

u=gcd(86660,89755)=3095
v=gcd(83636,89755)=29.

Получилось разложение 89755=309529

Вычислительная сложность Шаблон:Sfn

Обозначим через Ψ(n,B) количество целых чисел a таких, что 1<an и a является B-гладким числом. Из теоремы де Брёйна — Эрдёша Ψ(n,B)=nuu, где u=lnnlnB. Значит, каждое B-гладкое число будет в среднем попадаться с uu попыток. Для проверки, является ли число B-гладким, необходимо выполнить h делений. По алгоритму необходимо найти h+1 B-гладкое число. Значит, вычислительная сложность поиска чисел

T1=O(uuh2).

Вычислительная сложность метода Гаусса из h уравнений

T2=O(h3).

Следовательно, суммарная сложность алгоритма Диксона

T=T1+T2=O(uuh2+h3).

Учитывая, что количество простых чисел меньше M оценивается формулой h=BlnB, и что u=lnnlnB, после упрощения получаем

T=O(exp(lnnlnlnnlnB+2lnB)).

B выбирается таким образом, чтобы T было минимально. Тогда подставляя L(n)=exp(lnnlnlnn), получаем

B=(L(n)2)12
T=O(L(n)22).

Оценка, сделанная Померанцем на основании более строгой теоремы, чем теорема де Брёйна — Эрдеша[2], дает T=O(L(n)2), в то время как изначальная оценка сложности, сделанная самим Диксоном, дает T=O(L(n)32).

Дополнительные стратегии Шаблон:Sfn

Рассмотрим дополнительные стратегии, ускоряющие работу алгоритма.

Стратегия LP

Стратегия LP (Large Prime variation) использует большие простые числа для ускорения процедуры генерации чисел b.

Алгоритм

Пусть найденное в пункте 4 число a не является B-гладким. Тогда его можно представить a=spBpαp(b), где s не делится на числа из факторной базы. Очевидно, что s>B. Если дополнительно выполняется s<B2, то s — простое и мы включаем его в факторную базу. Это позволяет найти дополнительные B-гладкие числа, но увеличивает количество необходимых гладких чисел на 1. Для возврата к первоначальной факторной базе после пункта 5 следует сделать следующее. Если найдено только одно число, в разложение которого s входит в нечетной степени, то это число нужно вычеркнуть из списка и вычеркнуть s из факторной базы. Если же, например, таких чисел два b1 и b2, то их нужно вычеркнуть и добавить число b=b1b2. Показатель s войдет в разложение b2modn в четной степени и будет отсутствовать в системе линейных уравнений.

Вариация стратегии

Можно использовать стратегию LP с несколькими простыми числами, не содержащимися в факторной базе. В этом случае для исключения дополнительных простых чисел используется теория графов.

Вычислительная сложность

Теоретическая оценка сложности алгоритма с применением LP стратегии, сделанная Померанцем, не отличается от оценки исходного варианта алгоритма Диксона:

TLP=O(L(n)2).

Стратегия EAS

Стратегия EAS (раннего обрыва) исключает некоторые b из рассмотрения, не доводя проверку a на гладкость до конца.

Алгоритм

Выбираются фиксированные 0<k,l,m<1. В алгоритме Диксона a факторизуется пробными делениями на p<B=L(n)12. В стратегии EAS выбирается B=L(n)k и число сначала факторизуется пробными делениями на p<Bl=L(n)kl, и если после разложения неразложенная часть остается больше, чем n1m, то данное b отбрасывается.

Вариация стратегии

Можно использовать стратегию EAS с несколькими обрывами, то есть при некоторой возрастающей последовательности lj и убывающей последовательности mj.

Вычислительная сложность

Алгоритм Диксона с применением стратегии EAS при k=27,l=12,m=17 оценивается

TEAS=O(L(n)72).

Стратегия PS

Стратегия PS использует алгоритм Полларда-Штрассена, который для z,t и y=z2 находит минимальный простой делитель числа НОД(t,y!) за O(zln2zln2t).Шаблон:Sfn

Алгоритм

Выбирается фиксированное 0<k<1. В алгоритме Диксона a факторизуется пробными делениями на p<B=L(n)12. В стратегии PS выбирается B=L(n)k. Полагаем z=[L(n)k2]+1,y=z2L(n)k,t=a. Применяем алгоритм Полларда-Штрассена, выбирая за t неразложенную часть, получим разложение a.

Вычислительная сложность

Сложность алгоритма Диксона со стратегией PS минимальна при k=13 и равна

TPS=O(L(n)3).

Примечания

Шаблон:Примечания

Литература