Эта статья входит в число добротных статей

Ро-алгоритм Полларда: различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
м замена имён и значений устаревшего неподдерживаемого InternetArchiveBot формата параметров доступности ссылок (1)
 
(не показано 55 промежуточных версий 33 участников)
Строка 1: Строка 1:
{{заголовок со строчной буквы}}{{DISPLAYTITLE:ρ-Алгоритм}}{{about|факторизации чисел|методе дискретного логарифмирования|Ρ-метод Полларда дискретного логарифмирования}}
{{about|алгоритме факторизации чисел|методе дискретного логарифмирования|ро-метод Полларда для дискретного логарифмирования}}
[[Файл:Pollard rho cycle.jpg|thumb|300px|Числовая последовательность зацикливается, начиная с некоторого ''n''. Цикл может быть представлен в виде греческой буквы ρ.]]
[[Файл:Pollard rho cycle.svg|thumb|300px|Числовая последовательность зацикливается, начиная с некоторого ''n''. Цикл может быть представлен в виде греческой буквы ρ.]]
'''ρ-Алгоритм''' — предложенный {{нп5|Поллард, Джон|Джоном Поллардом|en|John Pollard (mathematician)}} в [[1975 год]]у [[алгоритм]], служащий для [[факторизация|факторизации]] (разложения на множители) целых чисел. Данный алгоритм основывается на {{нп5|Алгоритм Флойда поиска длины цикла|алгоритме Флойда поиска длины цикла в последовательности|en|Floyd's cycle-finding algorithm}} и некоторых следствиях из [[Парадокс дней рождения|парадокса дней рождений]]. Алгоритм наиболее эффективен при факторизации [[составное число|составных чисел]] с достаточно малыми множителями в разложении. [[Вычислительная сложность|Сложность алгоритма]] оценивается как <math>O(N^{1/4})</math>{{sfn|Pollard|1974|с=521–528|name=Pollard_article}}.
'''Ро-алгоритм''' ('''<math>\rho</math>-алгоритм''') — предложенный {{нп5|Поллард, Джон|Джоном Поллардом|en|John Pollard (mathematician)}} в [[1975 год]]у [[алгоритм]], служащий для [[факторизация|факторизации]] (разложения на множители) целых чисел. Данный алгоритм основывается на [[Алгоритм Флойда поиска длины цикла|алгоритме Флойда поиска длины цикла в последовательности]] и некоторых следствиях из [[Парадокс дней рождения|парадокса дней рождения]]. Алгоритм наиболее эффективен при факторизации [[составное число|составных чисел]] с достаточно малыми множителями в разложении. [[Вычислительная сложность|Сложность алгоритма]] оценивается как <math>O(N^{1/4})</math>{{sfn|Pollard|1974|с=521–528|name=Pollard_article}}.


ρ-алгоритм Полларда строит [[числовая последовательность|числовую последовательность]], элементы которой образуют цикл, начиная с некоторого номера ''n'', что может быть проиллюстрировано, расположением чисел в виде греческой буквы [[ро (буква)|ρ]], что послужило названием семейству алгоритмов{{sfn|Christensen|2009|loc=3.3.3.0|name=Christensen_rho}}{{sfn|Chatterjee|2009|loc=5.2.2|name=Chatterjee_rho}}.
ρ-алгоритм Полларда строит [[числовая последовательность|числовую последовательность]], элементы которой образуют цикл, начиная с некоторого номера ''n'', что может быть проиллюстрировано, расположением чисел в виде греческой буквы [[ро (буква)|ρ]], что послужило названием семейству алгоритмов{{sfn|Christensen|2009|loc=3.3.3.0|name=Christensen_rho}}{{sfn|Chatterjee|2008|loc=5.2.2|name=Chatterjee_rho}}.


== История алгоритма ==
== История алгоритма ==
В конце [[1960-е годы|60-х годов XX века]] [[Флойд, Роберт|Роберт Флойд]] придумал достаточно эффективный [[Алгоритм Флойда поиска длины цикла|алгоритм поиска длины цикла]] в последовательности, также известный, как алгоритм «черепаха и заяц»{{sfn|Floyd|1967|с=636–644|name=Floyd_cycle_len}}. [[Поллард, Джон|Джон Поллард]], [[Кнут, Дональд Эрвин|Дональд Кнут]] и другие математики проанализировали поведение этого алгоритма в среднем случае. Было предложено несколько модификаций и улучшений алгоритма{{sfn|Brent|1980|с=176|loc= An improved Monte Carlo factorization algorithm|name=Brent_bit_20}}.
В конце [[1960-е годы|60-х годов XX века]] [[Флойд, Роберт|Роберт Флойд]] придумал достаточно эффективный метод решения [[задача нахождения цикла|задачи нахождения цикла]], также известный, как алгоритм «черепаха и заяц»{{sfn|Floyd|1967|с=636–644|name=Floyd_cycle_len}}. [[Поллард, Джон|Джон Поллард]], [[Кнут, Дональд Эрвин|Дональд Кнут]] и другие математики проанализировали поведение этого алгоритма в среднем случае. Было предложено несколько модификаций и улучшений алгоритма{{sfn|Brent|1980|с=176|loc= An improved Monte Carlo factorization algorithm|name=Brent_bit_20}}.


В 1975 году Поллард опубликовал статью{{sfn|Pollard|1975|с=176|loc=A Monte Carlo method for factorization|name=Pollard_bit}}, в которой он, основываясь на алгоритме Флойда обнаружения циклов, изложил идею алгоритма факторизации чисел, работающего за время, пропорциональное <math>N^{1/4}</math><ref name="Pollard_bit" /><ref name="Pollard_article" />.
В 1975 году Поллард опубликовал статью{{sfn|Pollard|1975|с=176|loc=A Monte Carlo method for factorization|name=Pollard_bit}}, в которой он, основываясь на алгоритме Флойда обнаружения циклов, изложил идею алгоритма факторизации чисел, работающего за время, пропорциональное <math>N^{1/4}</math><ref name="Pollard_bit" /><ref name="Pollard_article" />.
Строка 12: Строка 12:


В 1981 году [[Брент, Ричард|Ричард Брент]] и Джон Поллард с помощью алгоритма нашли наименьшие делители [[Числа Ферма|чисел Ферма]] <math>F_{n} = 2^{2^n}+1</math> при <math>5 \leq n \leq 13</math>{{sfn|Childs|2009|loc=A Concrete Introduction to Higher Algebra|name=Childs}}.
В 1981 году [[Брент, Ричард|Ричард Брент]] и Джон Поллард с помощью алгоритма нашли наименьшие делители [[Числа Ферма|чисел Ферма]] <math>F_{n} = 2^{2^n}+1</math> при <math>5 \leq n \leq 13</math>{{sfn|Childs|2009|loc=A Concrete Introduction to Higher Algebra|name=Childs}}.
Скорость алгоритма сильно зависит лишь от величины наименьшего делителя исходного числа, но не от самого числа. Так, поиск наименьшего делителя седьмого числа Ферма — <math>\begin{array}{lll}F_7= 340282366920938463463374607431768211457 = 59\,649\,589\,127\,497\,217 \cdot 5\,704\,689\,200\,685\,129\,054\,721;\end{array}</math>, занимает гораздо больше времени, чем поиск делителя двенадцатого числа Ферма (т.к. его делитель 114689 значительно меньше, хотя само число состоит более чем из 1200 десятичных цифр).


В рамках проекта «{{нп5|Cunningham project|Cunningham project|en|Cunningham project}}» алгоритм Полларда помог найти делитель длиной 19 цифр числа <math>2^{2386}+1</math>. Большие делители также могли бы быть найдены, однако открытие [[Факторизация с помощью эллиптических кривых|метода факторизации с помощью эллиптических кривых]] сделало алгоритм Полларда неконкурентоспособным{{sfn|Brent|1999|loc=Some parallel algorithms for integer factorization. |name=BrentParallel}}.
Так, <math>F_8 = 1238926361552897 \cdot p_{62}</math>, где <math>p_{62}</math> — простое число, состоящее из 62 десятичных цифр.

В рамках проекта «{{нп5|Cunningham project|Cunningham project|en|Cunningham project}}» алгоритм Полларда помог найти делитель длиной 19 цифр числа <math>2^{2386}+1</math>. Большие делители также могли бы быть найдены, однако открытие [[Факторизация с помощью эллиптических кривых|метода факторизации с помощью эллиптических кривых]] сделало алгоритм Полларда неконкурентоспособным{{sfn|Brent-1999|1999|loc=Some parallel algorithms for integer factorization. |name=BrentParallel}}.


== Описание алгоритма ==
== Описание алгоритма ==


=== Оригинальная версия ===
=== Оригинальная версия ===
Рассмотривается последовательность целых чисел <math>{x_{n}}</math>, такая что <math>x_{0}=2</math> и <math>x_{i+1}=(x_{i}^{2}-1\,) (\mathrm{mod}\, N)</math>, где <math>N</math> - число, которое нужно [[Факторизация целых чисел|факторизовать]]. Оригинальный [[алгоритм]] выглядит следующим образом{{sfn|Pollard|1975|loc=A Monte Carlo method for factorization|name=Pollard}}<ref name="Pollard_bit" />.
Рассматривается последовательность целых чисел <math>{x_{n}}</math>, такая что <math>x_{0}=2</math> и <math>x_{i+1}=(x_{i}^{2}-1\,) (\mathrm{mod}\, N)</math>, где <math>N</math> — число, которое нужно [[Факторизация целых чисел|факторизовать]]. Оригинальный [[алгоритм]] выглядит следующим образом{{sfn|Pollard|1975|loc=A Monte Carlo method for factorization|name=Pollard}}<ref name="Pollard_bit" />:


:1. Вычисляются тройки чисел
: 1. Вычисляются тройки чисел
::<math>(x_{i}, x_{2i}, Q_{i}), i=1,2,...</math>, где <math>Q_{i} \equiv \prod_{j=1}^{i}(x_{2j}-x_{j})\, (\mathrm{mod}\, N)</math>.
:: <math>(x_{i}, x_{2i}, Q_{i}), i=1,2,...</math>, где <math>Q_{i} \equiv \prod_{j=1}^{i}(x_{2j}-x_{j})\, (\mathrm{mod}\, N)</math>.
::Причём каждая такая тройка получается из предыдущей.
:: Причём каждая такая тройка получается из предыдущей.
:2. Каждый раз, когда число <math>i</math> кратно числу <math>m</math> (скажем, <math>m=100</math>), вычисляется [[наибольший общий делитель]] <math>d_{i}=\mathrm{GCD}(Q_{i},N)</math> любым известным методом.
: 2. Каждый раз, когда число <math>i</math> кратно числу <math>m</math> (скажем, <math>m=100</math>), вычисляется [[наибольший общий делитель]] <math>d_{i}=\mathrm{GCD}(Q_{i},N)</math> любым известным методом.
:3. Если <math>1 < d_{i} < N</math>, то частичное разложения числа <math>N</math> найдено, причём <math>N = d_{i} \times (N/d_{i})</math>.
: 3. Если <math>1 < d_{i} < N</math>, то частичное разложение числа <math>N</math> найдено, причём <math>N = d_{i} \times (N/d_{i})</math>.
::Найденный делитель <math>d_{i}</math> может быть составным, поэтому его также необходимо факторизовать. Если число <math>N/d_{i}</math> составное, то продолжаем алгоритм с модулем <math>N' = N/d_{i}</math>.
:: Найденный делитель <math>d_{i}</math> может быть составным, поэтому его также необходимо факторизовать. Если число <math>N/d_{i}</math> составное, то продолжаем алгоритм с модулем <math>N' = N/d_{i}</math>.
:4. Вычисления повторяются <math>S</math> раз. Если при этом число не было до конца факторизовано, выбирается, например, другое начальное число <math>x_{0}</math>.
: 4. Вычисления повторяются <math>S</math> раз. Если при этом число не было до конца факторизовано, выбирается, например, другое начальное число <math>x_{0}</math>.


=== Современная версия ===
=== Современная версия ===
Пусть <math>N</math> составное целое положительное число, которое требуется разложить на множители. Алгоритм выглядит следующим образом<ref name="Ishmuhammetov" />:
Пусть <math>N</math> составное целое положительное число, которое требуется разложить на множители. Алгоритм выглядит следующим образом<ref name="Ishmuhammetov" />:
# Случайным образом выбирается небольшое число <math>x_{0}</math>{{sfn|Mollin|2006|с=215-216|name=Mollin_default_function}} и строится последовательность <math>\{x_{n}\}, n = 0, 1, 2, ...</math>, определяя каждое следующее как <math>x_{n+1} = F(x_{n})\, (\mathrm{mod}\,\, N)</math>.
# Случайным образом выбирается небольшое число <math>x_{0}</math>{{sfn|Mollin|2006|с=215—216|name=Mollin_default_function}} и строится последовательность <math>\{x_{n}\}, n = 0, 1, 2, ...</math>, определяя каждое следующее как <math>x_{n+1} = F(x_{n})\, (\mathrm{mod}\,\, N)</math>.
# Одновременно на каждом ''i''-ом шаге вычисляется <math>d = \mathrm{GCD}(N,|x_{i}-x_{j}|)</math> для каких-либо <math>i</math>, <math>j</math> таких, что <math>j<i</math>, например, <math>i = 2j</math>.
# Одновременно на каждом ''i''-ом шаге вычисляется <math>d = \mathrm{GCD}(N,|x_{i}-x_{j}|)</math> для каких-либо <math>i</math>, <math>j</math> таких, что <math>j<i</math>, например, <math>i = 2j</math>.
# Если <math>d>1</math>, то вычисление заканчивается, и найденное на предыдущем шаге число <math>d</math> является делителем <math>N</math>. Если <math>N/d</math> не является простым числом, то процедуру поиска делителей продолжается, взяв в качестве <math>N</math> число <math>N'=N/d</math>.
# Если <math>d>1</math>, то вычисление заканчивается, и найденное на предыдущем шаге число <math>d</math> является делителем <math>N</math>. Если <math>N/d</math> не является простым числом, то процедуру поиска делителей продолжается, взяв в качестве <math>N</math> число <math>N'=N/d</math>.


На практике функция <math>F(x)</math> выбирается не слишком сложной для вычисления (но в то же время не линейным многочленом), при условии того, что она не должна порождать взаимно однозначное отображение. Обычно в качестве <math>F(x)</math> выбираются функции <math>F(x) = x^2 \pm 1 (\mathrm{mod}\, N)</math><ref name="Mollin_default_function" /> или <math>F(x) = x^2 \pm a (\mathrm{mod}\, N)</math><ref name="Zolotykh-rho-pollard"> Золотых Н. Ю. Лекции по компьютерной алгебре. [http://www.uic.unn.ru/~zny/compalg/Lectures/ca_11_RhoPollard.pdf Лекция 11. ρ-метод Полларда.]</ref>. Однако функции <math>x^2-2</math> и <math>x^2</math> не подходят<ref name="Pollard" />.
На практике функция <math>F(x)</math> выбирается не слишком сложной для вычисления (но в то же время не линейным многочленом), при условии того, что она не должна порождать взаимно однозначное отображение. Обычно в качестве <math>F(x)</math> выбираются функции <math>F(x) = x^2 \pm 1 (\mathrm{mod}\, N)</math><ref name="Mollin_default_function" /> или <math>F(x) = x^2 \pm a (\mathrm{mod}\, N)</math><ref name="Zolotykh-rho-pollard">Золотых Н. Ю. Лекции по компьютерной алгебре. [http://www.uic.unn.ru/~zny/compalg/Lectures/ca_11_RhoPollard.pdf Лекция 11. ρ-метод Полларда.] {{Wayback|url=http://www.uic.unn.ru/~zny/compalg/Lectures/ca_11_RhoPollard.pdf |date=20141030003742 }}</ref>. Однако функции <math>x^2-2</math> и <math>x^2</math> не подходят<ref name="Pollard" />.


Если известно, что для делителя <math>p</math> числа <math>N</math> справедливо <math>p \equiv 1\, (\mathrm{mod}\, k)</math> при некотором <math>k > 2</math>, то имеет смысл использовать <math>F(x) = x^k + b</math><ref name="Pollard" />.
Если известно, что для делителя <math>p</math> числа <math>N</math> справедливо <math>p \equiv 1\, (\mathrm{mod}\, k)</math> при некотором <math>k > 2</math>, то имеет смысл использовать <math>F(x) = x^k + b</math><ref name="Pollard" />.
Строка 45: Строка 44:
Изначальная версия алгоритма обладает рядом недостатков. В настоящий момент существует несколько подходов к улучшению оригинального алгоритма.
Изначальная версия алгоритма обладает рядом недостатков. В настоящий момент существует несколько подходов к улучшению оригинального алгоритма.


Пусть <math>F(x) = (x^2 - 1) \mathrm{mod}\, N</math>. Тогда, если <math>(x_{j} - x_{i}) \equiv 0 (\mathrm{mod}\, p)</math>, то <math>(f(x_{j}) - f(x_{i})) \equiv 0 (\mathrm{mod}\, p)</math>, поэтому, если пара <math>(x_{i}, x_{j})</math> даёт решение, то решение даст любая пара <math>(x_{i+k}, x_{j+k})</math>.
Пусть <math>F(x)=(x^2-1)\bmod N</math>. Тогда, если <math>(x_j-x_i)\equiv0\pmod p</math>, то <math>(F(x_j)-F(x_i))\equiv0\pmod p</math>, поэтому, если пара <math>(x_i,x_j)</math> даёт решение, то решение даст любая пара <math>(x_{i+k},x_{j+k})</math>.


Поэтому, нет необходимости проверять все пары <math>(x_{i}, x_{j})</math>, а можно ограничиться парами вида <math>(x_{i}, x_{j})</math>, где <math>j = 2^k</math>, и <math>k</math> пробегает набор последовательны значений 1, 2, 3, ..., а <math>i</math> принимает значения из интервала <math>[2^{k}+1; 2^{k+1}]</math>. Например, <math>k=3</math>, <math>j=2^3=8</math>, а <math>i\in [9;16]</math>{{sfn|Ишмухаметов|2011|с=64|name=Ishmuhammetov}}.
Поэтому нет необходимости проверять все пары <math>(x_i,x_j)</math>, а можно ограничиться парами вида <math>(x_i,x_j)</math>, где <math>j=2^k</math>, и <math>k</math> пробегает набор последовательных значений 1, 2, 3, , а <math>i</math> принимает значения из интервала <math>[2^k+1;2^{k+1}]</math>. Например, <math>k=3</math>, <math>j=2^3=8</math>, а <math>i\in[9;16]</math>{{sfn|Ишмухаметов|2011|с=64|name=Ishmuhammetov}}.


Эта идея была предложена [[Брент, Ричард|Ричардом Брентом]] в [[1980 год|1980]] году{{sfn|Brent|1980|с=176-184|loc=An improved Monte Carlo factorization algorithm|name=Brent_bit_20_article}} и позволяет уменьшить количество выполняемых операций приблизительно на 25%{{sfn|Reisel|2012|loc=Selected Areas in Cryptography. Prime Numbers and Computer Methods for Factorization. 2nd ed.|name=Reisel}}.
Эта идея была предложена [[Брент, Ричард|Ричардом Брентом]] в [[1980 год]]у{{sfn|Brent|1980|с=176—184|loc=An improved Monte Carlo factorization algorithm|name=Brent_bit_20_article}} и позволяет уменьшить количество выполняемых операций приблизительно на 25 %{{sfn|Reisel|2012|loc=Selected Areas in Cryptography. Prime Numbers and Computer Methods for Factorization. 2nd ed.|name=Reisel}}.


Еще одна вариация ρ-алгоритма полларда была разработана Флойдом. Согласно Флойду, значение <math>y</math> обновляется на каждом шаге по формуле <math>y = F^2(y) = F(F(y))</math>, поэтому на шаге ''i'' будут получены значения <math>x_{i} = F^{i}(x_{0})</math>, <math>y_{i} = x_{2i} = F^{2i}(x_{0})</math>, и НОД на этом шаге вычисляется для <math>N</math> и <math>y-x</math><ref name="Ishmuhammetov" />.
Ещё одна вариация ρ-алгоритма Полларда была разработана [[Флойд, Роберт|Флойдом]]. Согласно Флойду, значение <math>y</math> обновляется на каждом шаге по формуле <math>y=F^2(y)=F(F(y))</math>, поэтому на шаге <math>i</math> будут получены значения <math>x_i=F^i(x_0)</math>, <math>y_i=x_{2i}=F^{2i}(x_0)</math>, и НОД на этом шаге вычисляется для <math>N</math> и <math>y-x</math><ref name="Ishmuhammetov" />.


=== Пример факторизации числа ===
=== Пример факторизации числа ===
Данный пример наглядно демонстрирует ρ-алгоритм факторизации, для числа 8051.
Данный пример наглядно демонстрирует ρ-алгоритм факторизации (версия алгоритма, с улучшением [[Флойд, Роберт|Флойда]]), для числа ''N'' = 8051:
{| class="standard" style="text-align:center"
{| class="standard" style="text-align:center"
|+ Таблица: пример факторизации числа
|+ Таблица: факторизация числа 8051
|-
|-
!colspan="4"|&nbsp;''n'' = 8051,&nbsp;&nbsp;&nbsp;''F''(''x'') = ''x''<sup>2</sup> + ''1'' mod ''n'' ,&nbsp;&nbsp;&nbsp;''x''<sub>0</sub> = ''y''<sub>0</sub> = 2
!colspan="4"| ''n'' = 8051, ''F''(''x'') = (''x''<sup>2</sup> + ''1)'' mod ''n'' , ''x''<sub>0</sub> = ''y''<sub>0</sub> = 2
|-
|-
!''i''||''x''<sub>''i''</sub>=''F''(''x''<sub>''i''-1</sub>)||''y''<sub>''i''</sub>=''F''(''F''(''y''<sub>''i''-1</sub>)) || НОД(&#124;''x''<sub>''i''</sub> &minus; ''y''<sub>''i''</sub>&#124;, 8051)
!''i''||''x''<sub>''i''</sub>=''F''(''x''<sub>''i''-1</sub>)||''y''<sub>''i''</sub>=''F''(''F''(''y''<sub>''i''-1</sub>)) || НОД(&#124;''x''<sub>''i''</sub> ''y''<sub>''i''</sub>&#124;, 8051)
|-
|-
|1||5||26||1
|1||5||26||1
Строка 69: Строка 68:
|}
|}


Таким образом, 97 — нетривиальный делитель числа 8051. Используя другие варианты полинома <math>F(x)</math>, можно также получить делитель 83.
Используя другие варианты полинома <math>F(x)</math>, можно также получить делитель 83:

{| class="standard" style="text-align:center"
|+ Таблица: факторизация числа 8051
|-
!colspan="4"| ''n'' = 8051, ''F''(''x'') = (''x''<sup>2</sup> + ''3)'' mod ''n'' , ''x''<sub>0</sub> = ''y''<sub>0</sub> = 2
|-
!''i''||''x''<sub>''i''</sub>=''F''(''x''<sub>''i''-1</sub>)||''y''<sub>''i''</sub>=''F''(''F''(''y''<sub>''i''-1</sub>)) || НОД(&#124;''x''<sub>''i''</sub> − ''y''<sub>''i''</sub>&#124;, 8051)
|-
|1||7||52||1
|-
|2||52||1442||1
|-
|3||2707||778||1
|-
|4||1442||3932||83
|}
Таким образом, ''d''<sub>''1''</sub> = 97, ''d''<sub>''2''</sub> = 83 — нетривиальные делители числа 8051.

После нахождения делителя числа, в ρ-алгоритме предлагается продолжать вычисления и искать делители числа <math>N/d</math>, если <math>N/d</math> не является простым. В этом простом примере данного шага совершать не потребовалось<ref name="Ishmuhammetov" />.


== Обоснование ρ-алгоритма Полларда ==
== Обоснование ρ-алгоритма Полларда ==
Строка 75: Строка 93:


{{теорема|Парадокс дней рождений, кратко:<br>
{{теорема|Парадокс дней рождений, кратко:<br>
Пусть <math>\lambda > 0</math>. Для случайной выборки из <math>l+1</math> элементов, каждый их которых меньше <math>q</math>, где <math>l = \sqrt{2 \lambda q}</math>, вероятность того, что два элемента окажутся одинаковыми <math>p > 1 - \exp^{-\lambda}</math>.}}
Пусть <math>\lambda > 0</math>. Для случайной выборки из <math>l+1</math> элементов, каждый из которых меньше <math>q</math>, где <math>l = \sqrt{2 \lambda q}</math>, вероятность того, что два элемента окажутся одинаковыми <math>p > 1 - e^{-\lambda}</math>.}}


Следует отметить, что [[вероятность]] <math>p = 0.5</math> в парадоксе дней рождения достигается при <math>\lambda \approx 0.69</math>.
Следует отметить, что [[вероятность]] <math>p = 0.5</math> в парадоксе дней рождения достигается при <math>\lambda \approx 0.69</math>.


Пусть [[последовательность]] <math>\{u_{n}\}</math> состоит из разностей <math>x_{i} - x_{j}</math>, проверяемых в ходе работы алгоритма. Определяется новая последовательность <math>\{z_{n}\}</math>, где <math>z_{n} = u_{n}\, \mathrm{mod}\, q</math>, <math>q</math> — меньший из делителей числа <math>N</math>.
Пусть [[последовательность]] <math>\{u_{n}\}</math> состоит из разностей <math>x_{i} - x_{j}</math>, проверяемых в ходе работы алгоритма. Определяется новая последовательность <math>\{z_{n}\}</math>, где <math>z_{n} = u_{n}\, \mathrm{mod}\, q</math>, <math>q</math> — меньший из делителей числа <math>N</math>.


Все члены последовательности <math>\{z_{n}\}</math> меньше <math>\sqrt{N}</math>. Если рассматривать её как [[Случайная величина|случайную]] последовательность целых чисел, меньших <math>q</math>, то, согласно парадоксу дней рождения, вероятность того, что среди <math>l+1</math> её членов попадутся два одинаковых, превысит <math>1/2</math> при <math>\lambda \approx 0.69</math>, тогда <math>l</math> должно быть не меньше <math>\sqrt{2\lambda q} \approx \sqrt{1.4 q} \approx 1.18\sqrt{q}</math>.
Все члены последовательности <math>\{z_{n}\}</math> меньше <math>\sqrt{N}</math>. Если рассматривать её как [[Случайная величина|случайную]] последовательность целых чисел, меньших <math>q</math>, то, согласно парадоксу дней рождения, вероятность того, что среди <math>l+1</math> её членов попадутся два одинаковых, превысит <math>1/2</math> при <math>\lambda \approx 0.69</math>, тогда <math>l</math> должно быть не меньше <math>\sqrt{2\lambda q} \approx \sqrt{1.4 q} \approx 1.18\sqrt{q}</math>.
Строка 93: Строка 111:


== Особенности реализации ==
== Особенности реализации ==
Объем памяти, используемый алгоритмом, можно значительно уменьшить.
Объём памяти, используемый алгоритмом, можно значительно уменьшить.


'''int''' ''Rho-Поллард'' ('''int''' N)
'''int''' ''Rho-Поллард'' ('''int''' N)
Строка 101: Строка 119:
'''while''' (Н.О.Д.(N, ''abs''(x - y)) == 1)
'''while''' (Н.О.Д.(N, ''abs''(x - y)) == 1)
{
{
'''if''' (i == stage ){
'''if''' (i == stage){
y = x;
y = x;
stage = stage*2;
stage = stage*2;
Строка 117: Строка 135:


==== Система с распределенной памятью ====
==== Система с распределенной памятью ====
Существующий метод распалаллеливания заключается в том, что каждый вычислительный узел исполняет один и тот же последовательный [[алгоритм]], однако, исходное число <math>x_{0}</math> и/или полином <math>F(x)</math> берутся различными. Для упрощения распаралеливания, предлагается получать их из генератора случайных чисел. Однако такая параллельная реализация не даёт линейного ускорения{{sfn|Kuhn|2001|с=212-229|loc=Random Walks Revisited: Extensions of Pollard’s Rho Algorithm for Computing Multiple Discrete Logarithms|name=Kuhn_lineral_tile}}.
Существующий метод распараллеливания заключается в том, что каждый вычислительный узел исполняет один и тот же последовательный [[алгоритм]], однако, исходное число <math>x_0</math> и/или полином <math>F(x)</math> берутся различными. Для упрощения распараллеливания, предлагается получать их из генератора случайных чисел. Однако такая параллельная реализация не даёт линейного ускорения{{sfn|Kuhn|2001|с=212—229|loc=Random Walks Revisited: Extensions of Pollard’s Rho Algorithm for Computing Multiple Discrete Logarithms|name=Kuhn_lineral_tile}}.


Предположим что есть <math>P</math> одинаковых исполнителей. Если мы используем <math>P</math> различных последовательностей (т.е. различных полиномов <math>F(x)</math>), то вероятность того, что первые <math>k</math> чисел в этих последовательностях будут различными по модулю <math>p</math> будет примерно равна <math>\exp({-k^2 P}/{2 p})</math>. Таким образом, максимальное ускорение можно оценить как <math>P^{1/2}</math><ref name="BrentParallel" />.
Предположим что есть <math>P</math> одинаковых исполнителей. Если мы используем <math>P</math> различных последовательностей (то есть различных полиномов <math>F(x)</math>), то вероятность того, что первые <math>k</math> чисел в этих последовательностях будут различными по модулю <math>p</math>, будет примерно равна <math>\exp({-k^2 P}/2p)</math>. Таким образом, максимальное ускорение можно оценить как <math>P^{1/2}</math><ref name="BrentParallel" />.


[[Крэндалл, Ричард|Ричард Крэндалл]] предположил, что достижимо ускорение <math>O(P/(log{P})^2)</math>, однако данное утверждение пока не проверено{{sfn|Crandall|1999|loc=Parallelization of Polldar-rho factorization|name=Crandall}}.
[[Крэндалл, Ричард|Ричард Крэндалл]] предположил, что достижимо ускорение <math>O(P/(\log P)^2)</math>, однако данное утверждение пока не проверено{{sfn|Crandall|1999|loc=Parallelization of Polldar-rho factorization|name=Crandall}}.


==== Система с общей памятью ====
==== Система с общей памятью ====
Предыдущий метод, очевидно, можно использовать и на системах с общей памятью, однако, гораздо разумнее исспользовать единый генератор <math>F(x)</math>{{sfn|Косяков|2014|с=19|name=Kosyakov_problems_of_spreded_memory_bottle_nack}}.
Предыдущий метод, очевидно, можно использовать и на системах с общей памятью, однако, гораздо разумнее использовать единый генератор <math>F(x)</math>{{sfn|Косяков|2014|с=19|name=Kosyakov_problems_of_spreded_memory_bottle_nack}}.

== См. также ==
* [[P-1 метод Полларда|P-1 алгоритм Полларда]]
* [[Ρ-метод Полларда дискретного логарифмирования|P-метод Полларда дискретного логарифмирования]]
* [[P+1 метод Уильямса|P+1 алгоритм Уильямса]]
* [[Перебор делителей|Метод пробных делений]]
* [[Метод Ферма разложения на множители|Метод Ферма]]
* [[Факторизация с помощью эллиптических кривых]]
* [[Общий метод решета числового поля]]


== Примечания ==
== Примечания ==
Строка 139: Строка 148:


== Литература ==
== Литература ==
{{refbegin|2}}
* {{книга
* {{книга
|автор = Василенко О. Н.
|автор = Василенко О. Н.
|часть =
|часть =
|заглавие = Теоретико-числовые алгоритмы в криптографии
|заглавие = Теоретико-числовые алгоритмы в криптографии
|оригинал =
|оригинал =
|ссылка = http://www.ict.edu.ru/ft/002416/book.pdf
|ссылка = http://www.ict.edu.ru/ft/002416/book.pdf
|издание =
|издание =
|ответственный =
|ответственный =
|место = М.
|место = М.
|издательство = [[МЦНМО]]
|издательство = [[МЦНМО]]
|год = 2003
|год = 2003
|том =
|том =
|страницы =
|страницы =
|страниц = 328
|страниц = 328
|isbn = 5-94057-103-4
|isbn = 5-94057-103-4
|ref = Василенко
|ref = Василенко
}} {{Wayback|url=http://www.ict.edu.ru/ft/002416/book.pdf |date=20070127053816 }}
}}
* {{книга
* {{книга
|автор = Ишмухаметов Ш. Т.
|автор = Ишмухаметов Ш. Т.
Строка 164: Строка 174:
|год = 2011
|год = 2011
|страниц = 190
|страниц = 190
|страницы = 61-64
|страницы = 61—64
|ref = Ишмухаметов
|ref = Ишмухаметов
|ответственный = Захаров В.М.|isbn = 978-3-659-17639-5}}
|ответственный = Захаров В.М.|isbn = 978-3-659-17639-5}}
Строка 180: Строка 190:
|ссылка = http://books.ifmo.ru/file/pdf/1551.pdf
|ссылка = http://books.ifmo.ru/file/pdf/1551.pdf
|ref = Косяков}}
|ref = Косяков}}
* {{книга
* {{Книга|автор = Соловьев Ю.П., Садовничий В.А., Шавгулидзе Е.Т., Белокуров В.В.|заглавие = Эллиптические кривые и современные алгоритмы теории чисел|ответственный = |издание = |место = М.|издательство = Ин-т компьют. исслед.|год = 2003|страницы = |страниц = 192|isbn = ISBN 5-939722-27-X}}
|автор = Герман О.Н., Нестеренко А.Ю.
|часть =
|заглавие = Теоретико-числовые методы в криптографии
|оригинал =
|ссылка = http://new.math.msu.su/department/number/dw/lib/exe/fetch.php?media=тчмк.pdf
|издание =
|ответственный =
|место = М.
|год = 2012
|том =
|страницы =
|страниц = 300
}}
* {{Книга|автор = Соловьёв Ю. П., [[Садовничий, Виктор Антонович|Садовничий В. А.]], [[Шавгулидзе, Евгений Тенгизович|Шавгулидзе Е. Т.]], Белокуров В. В.|заглавие = Эллиптические кривые и современные алгоритмы теории чисел|ответственный = |издание = |место = М.|издательство = Ин-т компьют. исслед.|год = 2003|страницы = |страниц = 192|isbn = ISBN 5-939722-27-X}}
* {{статья
* {{статья
|автор = Brent R.P.
|автор = Brent R. P.
|заглавие = Некоторые параллельные алгоритмы факторизации чисел
|заглавие = Некоторые параллельные алгоритмы факторизации чисел
|оригинал = Some parallel algorithms for integer factorization
|оригинал = Some parallel algorithms for integer factorization
Строка 190: Строка 214:
|страницы = 7
|страницы = 7
|doi = 10.1017/S0305004100049252
|doi = 10.1017/S0305004100049252
|ref = Brent-1999
|ref = Brent
}}
}}
*{{Статья
* {{Статья
|автор = Brent R.P.
|автор = Brent R. P.
|год = 1980-06-01
|год = 1980
|месяц = 06
|число = 01
|doi = 10.1007/BF01933190
|doi = 10.1007/BF01933190
|issn = 1572-9125
|issn = 1572-9125
|выпуск = 2
|выпуск = 2
|язык = en
|язык = en
|страницы = 176-184
|страницы = 176—184
|издание = BIT Numerical Mathematics
|издание = BIT Numerical Mathematics
|заглавие = An improved Monte Carlo factorization algorithm
|заглавие = An improved Monte Carlo factorization algorithm
|ссылка = http://link.springer.com/article/10.1007/BF01933190
|ссылка = https://link.springer.com/article/10.1007/BF01933190
|том = 20
|том = 20
|ref = Brent}}
|ref = Brent}}
*{{Статья
* {{Статья
|автор = Chatterjee S., Sarkar P.
|автор = Chatterjee S., Sarkar P.
|год = 2008
|год = 2008
Строка 213: Строка 239:
|место = Boston
|место = Boston
|заглавие = Introduction
|заглавие = Introduction
|ссылка = http://www.amazon.com/Introduction-Identity-Based-Encryption-Information-Security/dp/1596932384
|ссылка = https://www.amazon.com/Introduction-Identity-Based-Encryption-Information-Security/dp/1596932384
|издательство = Springer US
|издательство = Springer US
|издание = Identity-Based Encryption
|издание = Identity-Based Encryption
Строка 222: Строка 248:
|заглавие = Введение в высшую алгебру
|заглавие = Введение в высшую алгебру
|оригинал = Concrete Introduction to Higher Algebra
|оригинал = Concrete Introduction to Higher Algebra
|ссылка = http://books.google.ru/books/about/A_Concrete_Introduction_to_Higher_Algebr.html?id=qyDAKBr_I2YC&redir_esc=y
|ссылка = https://books.google.ru/books/about/A_Concrete_Introduction_to_Higher_Algebr.html?id=qyDAKBr_I2YC&redir_esc=y
|издание = 3-е изд
|издание = 3-е изд
|место = USA
|место = USA
|издательство = Springer
|издательство = Springer
|год = 2009
|год = 2009
|страницы = 471-473
|страницы = 471—473
|страниц = 603
|страниц = 603
|isbn = 978-0-387-74725-5
|isbn = 978-0-387-74725-5
Строка 234: Строка 260:
* {{Статья
* {{Статья
|автор = Chris Christensen
|автор = Chris Christensen
|год = 2009-01-27
|год = 2009
|месяц = 01
|число = 27
|doi = 10.1080/01611190802293397
|doi = 10.1080/01611190802293397
|issn = 0161-1194
|issn = 0161-1194
Строка 241: Строка 269:
|издание = Cryptologia
|издание = Cryptologia
|заглавие = Review of Modern Cryptanalysis: Techniques for Advanced Code Breaking by Christopher Swenson
|заглавие = Review of Modern Cryptanalysis: Techniques for Advanced Code Breaking by Christopher Swenson
|ссылка = http://dx.doi.org/10.1080/01611190802293397
|ссылка = https://dx.doi.org/10.1080/01611190802293397
|том = 33
|том = 33
|ref = Christensen}}
|ref = Christensen}}
Строка 248: Строка 276:
|заглавие = Алгоритмы: построение и анализ
|заглавие = Алгоритмы: построение и анализ
|оригинал = Introduction to algorithms
|оригинал = Introduction to algorithms
|ссылка = http://books.google.ru/books?id=NLngYyWFl_YC
|ссылка = https://books.google.ru/books?id=NLngYyWFl_YC
|издание = 2-е изд
|издание = 2-е изд
|место = USA
|место = USA
|издательство = MIT Press
|издательство = MIT Press
|год = 2001
|год = 2001
|страницы = 897-907
|страницы = 897—907
|страниц = 1180
|страниц = 1180
|isbn = 9780262032933
|isbn = 9780262032933
Строка 259: Строка 287:
}}
}}
* {{статья
* {{статья
|автор = Crandall R.E.
|автор = Crandall R.E.
|заглавие = Распараллеливание P-алгоритма факторизации Полларда
|заглавие = Распараллеливание P-алгоритма факторизации Полларда
|оригинал = Parallelization of Polldar-rho factorization
|оригинал = Parallelization of Polldar-rho factorization
|ссылка = http://people.reed.edu/~crandall/papers/parrho.pdf
|ссылка = http://people.reed.edu/~crandall/papers/parrho.pdf
|язык = англ.
|язык = англ.
|год = 1999
|год = 1999
|ref = Crandall
|ref = Crandall
|издание =
|archiveurl = https://web.archive.org/web/20100706141942/http://people.reed.edu/~crandall/papers/parrho.pdf
|archivedate = 2010-07-06
}}
}}
* {{книга
* {{книга
|автор = Koshy T.
|автор = Koshy T.
|часть = Congruences
|часть = Congruences
|заглавие = Элементарная теория чисел и ее приложения
|заглавие = Элементарная теория чисел и её приложения
|оригинал = Elementary Number Theory with Applications
|оригинал = Elementary Number Theory with Applications
|ссылка = http://books.google.ru/books?id=d5Z5I3gnFh0C
|ссылка = https://books.google.ru/books?id=d5Z5I3gnFh0C
|издание = 2-е изд
|издание = 2-е изд
|место = USA
|место = USA
Строка 282: Строка 313:
|ref = Koshy
|ref = Koshy
}}
}}
*{{Статья
* {{Статья
|автор = Kuhn F., Struik R.
|автор = Kuhn F., Struik R.
|ответственный = Serge Vaudenay, Amr M.
|ответственный = Serge Vaudenay, Amr M.
Строка 289: Строка 320:
|isbn = 978-3-540-43066-7, 978-3-540-45537-0
|isbn = 978-3-540-43066-7, 978-3-540-45537-0
|язык = en
|язык = en
|страницы = 212-229
|страницы = 212—229
|заглавие = Random Walks Revisited: Extensions of Pollard’s Rho Algorithm for Computing Multiple Discrete Logarithms
|заглавие = Random Walks Revisited: Extensions of Pollard’s Rho Algorithm for Computing Multiple Discrete Logarithms
|ссылка = http://link.springer.com/chapter/10.1007/3-540-45537-X_17
|ссылка = https://link.springer.com/chapter/10.1007/3-540-45537-X_17
|издательство = Springer Berlin Heidelberg
|издательство = Springer Berlin Heidelberg
|издание = Selected Areas in Cryptography
|издание = Selected Areas in Cryptography
Строка 306: Строка 337:
|isbn = 9781584886181
|isbn = 9781584886181
|ссылка = http://antoanthongtin.vn/portals/0/uploadimages/kiennt2/sach/sach-csdl4/1584886188.pdf
|ссылка = http://antoanthongtin.vn/portals/0/uploadimages/kiennt2/sach/sach-csdl4/1584886188.pdf
|ref = Mollin}}
|ref = Mollin
|access-date = 2015-11-04
|archive-date = 2016-03-04
|archive-url = https://web.archive.org/web/20160304103729/http://antoanthongtin.vn/portals/0/uploadimages/kiennt2/sach/sach-csdl4/1584886188.pdf
|url-status = dead
}}
* {{статья
* {{статья
|автор=Pollard J. M.
|автор=Pollard J. M.
Строка 319: Строка 355:
|ref=Pollard
|ref=Pollard
}}
}}
*{{Статья
* {{Статья
|автор = Pollard J.M.
|автор = Pollard J.M.
|год = 1974
|год = 1974
Строка 330: Строка 366:
|ссылка = http://journals.cambridge.org/article_S0305004100049252
|ссылка = http://journals.cambridge.org/article_S0305004100049252
|том = 76
|том = 76
}}
|ref = Pollard_TOF}}
* {{статья
* {{статья
|автор = Pollard J. M.
|автор = Pollard J. M.
Строка 343: Строка 379:
|страницы = 521
|страницы = 521
|doi = 10.1017/S0305004100049252
|doi = 10.1017/S0305004100049252
|ref = Pollard-1974
|ref = Pollard
}}
}}
* {{книга
* {{книга
Строка 349: Строка 385:
|заглавие = Простые числа и компьютерные методы факторизации
|заглавие = Простые числа и компьютерные методы факторизации
|оригинал = Prime Numbers and Computer Methods for Factorization
|оригинал = Prime Numbers and Computer Methods for Factorization
|ссылка = http://books.google.ru/books?id=94DaZuVETzIC
|ссылка = https://books.google.ru/books?id=94DaZuVETzIC
|издание = 2-е изд
|издание = 2-е изд
|место = USA
|место = USA
Строка 359: Строка 395:
|ref = Reisel
|ref = Reisel
}}
}}
*{{Статья
* {{Статья
|автор = Robert W. Floyd
|автор = Robert W. Floyd
|год = 1967
|год = 1967
Строка 371: Строка 407:
|том = 14
|том = 14
|ref= Floyd}}
|ref= Floyd}}
{{refend}}

{{Теоретико-числовые алгоритмы}}
{{Добротная статья|Математика}}


{{DEFAULTSORT:Ро-алгоритм Полларда}}
[[Категория:Алгоритмы факторизации]]
[[Категория:Алгоритмы факторизации]]
{{Кандидат в добротные статьи|20 сентября 2015}}

Текущая версия от 19:34, 25 ноября 2024

Числовая последовательность зацикливается, начиная с некоторого n. Цикл может быть представлен в виде греческой буквы ρ.

Ро-алгоритм (-алгоритм) — предложенный Джоном Поллардом[англ.] в 1975 году алгоритм, служащий для факторизации (разложения на множители) целых чисел. Данный алгоритм основывается на алгоритме Флойда поиска длины цикла в последовательности и некоторых следствиях из парадокса дней рождения. Алгоритм наиболее эффективен при факторизации составных чисел с достаточно малыми множителями в разложении. Сложность алгоритма оценивается как [1].

ρ-алгоритм Полларда строит числовую последовательность, элементы которой образуют цикл, начиная с некоторого номера n, что может быть проиллюстрировано, расположением чисел в виде греческой буквы ρ, что послужило названием семейству алгоритмов[2][3].

История алгоритма

[править | править код]

В конце 60-х годов XX века Роберт Флойд придумал достаточно эффективный метод решения задачи нахождения цикла, также известный, как алгоритм «черепаха и заяц»[4]. Джон Поллард, Дональд Кнут и другие математики проанализировали поведение этого алгоритма в среднем случае. Было предложено несколько модификаций и улучшений алгоритма[5].

В 1975 году Поллард опубликовал статью[6], в которой он, основываясь на алгоритме Флойда обнаружения циклов, изложил идею алгоритма факторизации чисел, работающего за время, пропорциональное [6][1]. Автор алгоритма назвал его методом факторизации Монте-Карло, отражая кажущуюся случайность чисел, генерируемых в процессе вычисления. Однако позже метод всё-таки получил своё современное название — ρ-aлгоритм Полларда[7].

В 1981 году Ричард Брент и Джон Поллард с помощью алгоритма нашли наименьшие делители чисел Ферма при [8]. Скорость алгоритма сильно зависит лишь от величины наименьшего делителя исходного числа, но не от самого числа. Так, поиск наименьшего делителя седьмого числа Ферма — , занимает гораздо больше времени, чем поиск делителя двенадцатого числа Ферма (т.к. его делитель 114689 значительно меньше, хотя само число состоит более чем из 1200 десятичных цифр).

В рамках проекта «Cunningham project[англ.]» алгоритм Полларда помог найти делитель длиной 19 цифр числа . Большие делители также могли бы быть найдены, однако открытие метода факторизации с помощью эллиптических кривых сделало алгоритм Полларда неконкурентоспособным[9].

Описание алгоритма

[править | править код]

Оригинальная версия

[править | править код]

Рассматривается последовательность целых чисел , такая что и , где  — число, которое нужно факторизовать. Оригинальный алгоритм выглядит следующим образом[10][6]:

1. Вычисляются тройки чисел
, где .
Причём каждая такая тройка получается из предыдущей.
2. Каждый раз, когда число кратно числу (скажем, ), вычисляется наибольший общий делитель любым известным методом.
3. Если , то частичное разложение числа найдено, причём .
Найденный делитель может быть составным, поэтому его также необходимо факторизовать. Если число составное, то продолжаем алгоритм с модулем .
4. Вычисления повторяются раз. Если при этом число не было до конца факторизовано, выбирается, например, другое начальное число .

Современная версия

[править | править код]

Пусть составное целое положительное число, которое требуется разложить на множители. Алгоритм выглядит следующим образом[11]:

  1. Случайным образом выбирается небольшое число [12] и строится последовательность , определяя каждое следующее как .
  2. Одновременно на каждом i-ом шаге вычисляется для каких-либо , таких, что , например, .
  3. Если , то вычисление заканчивается, и найденное на предыдущем шаге число является делителем . Если не является простым числом, то процедуру поиска делителей продолжается, взяв в качестве число .

На практике функция выбирается не слишком сложной для вычисления (но в то же время не линейным многочленом), при условии того, что она не должна порождать взаимно однозначное отображение. Обычно в качестве выбираются функции [12] или [13]. Однако функции и не подходят[10].

Если известно, что для делителя числа справедливо при некотором , то имеет смысл использовать [10].

Существенным недостатком алгоритма в такой реализации является необходимость хранить большое число предыдущих значений .

Улучшения алгоритма

[править | править код]

Изначальная версия алгоритма обладает рядом недостатков. В настоящий момент существует несколько подходов к улучшению оригинального алгоритма.

Пусть . Тогда, если , то , поэтому, если пара даёт решение, то решение даст любая пара .

Поэтому нет необходимости проверять все пары , а можно ограничиться парами вида , где , и пробегает набор последовательных значений 1, 2, 3, …, а принимает значения из интервала . Например, , , а [11].

Эта идея была предложена Ричардом Брентом в 1980 году[14] и позволяет уменьшить количество выполняемых операций приблизительно на 25 %[15].

Ещё одна вариация ρ-алгоритма Полларда была разработана Флойдом. Согласно Флойду, значение обновляется на каждом шаге по формуле , поэтому на шаге будут получены значения , , и НОД на этом шаге вычисляется для и [11].

Пример факторизации числа

[править | править код]

Данный пример наглядно демонстрирует ρ-алгоритм факторизации (версия алгоритма, с улучшением Флойда), для числа N = 8051:

Таблица: факторизация числа 8051
n = 8051, F(x) = (x2 + 1) mod n , x0 = y0 = 2
i xi=F(xi-1) yi=F(F(yi-1)) НОД(|xiyi|, 8051)
1 5 26 1
2 26 7474 1
3 677 871 97

Используя другие варианты полинома , можно также получить делитель 83:

Таблица: факторизация числа 8051
n = 8051, F(x) = (x2 + 3) mod n , x0 = y0 = 2
i xi=F(xi-1) yi=F(F(yi-1)) НОД(|xiyi|, 8051)
1 7 52 1
2 52 1442 1
3 2707 778 1
4 1442 3932 83

Таким образом, d1 = 97, d2 = 83 — нетривиальные делители числа 8051.

После нахождения делителя числа, в ρ-алгоритме предлагается продолжать вычисления и искать делители числа , если не является простым. В этом простом примере данного шага совершать не потребовалось[11].

Обоснование ρ-алгоритма Полларда

[править | править код]

Алгоритм основывается на известном парадоксе дней рождения.

Парадокс дней рождений, кратко:
Пусть . Для случайной выборки из элементов, каждый из которых меньше , где , вероятность того, что два элемента окажутся одинаковыми .

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

Пусть последовательность состоит из разностей , проверяемых в ходе работы алгоритма. Определяется новая последовательность , где ,  — меньший из делителей числа .

Все члены последовательности меньше . Если рассматривать её как случайную последовательность целых чисел, меньших , то, согласно парадоксу дней рождения, вероятность того, что среди её членов попадутся два одинаковых, превысит при , тогда должно быть не меньше .

Если , тогда , то есть, для некоторого целого . Если , что выполняется с большой вероятностью, то искомый делитель числа будет найден как . Поскольку , то с вероятностью, превышающей , делитель будет найден за итераций[11].

Сложность алгоритма

[править | править код]

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

Поэтому сложность алгоритма оценивается, как [16]. Однако в этой оценке не учитываются накладные расходы по вычислению наибольшего общего делителя. Полученная сложность алгоритма, хотя и не является точной, достаточно хорошо согласуется с практикой.

Справедливо следующее утверждение: пусть  — составное число. Тогда существует такая константа , что для любого положительного числа вероятность события, состоящего в том, что ρ-алгоритм Полларда не найдет нетривиального делителя за время , не превосходит величины . Данное утверждение следует из парадокса дней рождения[17].

Особенности реализации

[править | править код]

Объём памяти, используемый алгоритмом, можно значительно уменьшить.

 int Rho-Поллард (int N)
 { 
   int x = random(1, N-2);
   int y = 1; int i = 0; int stage = 2;
   while (Н.О.Д.(N, abs(x - y)) == 1)
   {
     if (i == stage){
       y = x;
       stage = stage*2; 
     }
     x = (x*x + 1) (mod N);
     i = i + 1;
   }
   return Н.О.Д(N, abs(x-y));
 }

В этом варианте вычисление требует хранить в памяти всего три переменные , , и , что выгодно отличает алгоритм в такой реализации от других методов факторизации чисел[11].

Распараллеливание алгоритма

[править | править код]

Алгоритм Полларда допускает распараллеливание с использованием как систем с разделяемой памятью, так и систем с распределенной памятью (передача сообщений), однако второй случай является наиболее интересным с практической точки зрения[18].

Система с распределенной памятью

[править | править код]

Существующий метод распараллеливания заключается в том, что каждый вычислительный узел исполняет один и тот же последовательный алгоритм, однако, исходное число и/или полином берутся различными. Для упрощения распараллеливания, предлагается получать их из генератора случайных чисел. Однако такая параллельная реализация не даёт линейного ускорения[19].

Предположим что есть одинаковых исполнителей. Если мы используем различных последовательностей (то есть различных полиномов ), то вероятность того, что первые чисел в этих последовательностях будут различными по модулю , будет примерно равна . Таким образом, максимальное ускорение можно оценить как [9].

Ричард Крэндалл предположил, что достижимо ускорение , однако данное утверждение пока не проверено[20].

Система с общей памятью

[править | править код]

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

Примечания

[править | править код]
  1. 1 2 Pollard, 1974, с. 521–528.
  2. Christensen, 2009, 3.3.3.0.
  3. Chatterjee, 2008, 5.2.2.
  4. Floyd, 1967, с. 636–644.
  5. Brent, 1980, An improved Monte Carlo factorization algorithm, с. 176.
  6. 1 2 3 Pollard, 1975, A Monte Carlo method for factorization, с. 176.
  7. Koshy, 2007, Elementary Number Theory with Applications.
  8. Childs, 2009, A Concrete Introduction to Higher Algebra.
  9. 1 2 Brent, 1999, Some parallel algorithms for integer factorization..
  10. 1 2 3 Pollard, 1975, A Monte Carlo method for factorization.
  11. 1 2 3 4 5 6 Ишмухаметов, 2011, с. 64.
  12. 1 2 Mollin, 2006, с. 215—216.
  13. Золотых Н. Ю. Лекции по компьютерной алгебре. Лекция 11. ρ-метод Полларда. Архивная копия от 30 октября 2014 на Wayback Machine
  14. Brent, 1980, An improved Monte Carlo factorization algorithm, с. 176—184.
  15. Reisel, 2012, Selected Areas in Cryptography. Prime Numbers and Computer Methods for Factorization. 2nd ed..
  16. Cormen, 2001, Introduction to Algorithms. Section 31.9. Integer Factorization. Pollard's rho heuristic..
  17. Ишмухаметов, 2011, с. 63.
  18. Косяков, 2014, с. 12.
  19. Kuhn, 2001, Random Walks Revisited: Extensions of Pollard’s Rho Algorithm for Computing Multiple Discrete Logarithms, с. 212—229.
  20. Crandall, 1999, Parallelization of Polldar-rho factorization.
  21. Косяков, 2014, с. 19.

Литература

[править | править код]