Ро-алгоритм Полларда: различия между версиями
[непроверенная версия] | [отпатрулированная версия] |
KAlexeyV (обсуждение | вклад) |
м замена имён и значений устаревшего неподдерживаемого InternetArchiveBot формата параметров доступности ссылок (1) |
||
(не показано 55 промежуточных версий 33 участников) | |||
Строка 1: | Строка 1: | ||
{{about|алгоритме факторизации чисел|методе дискретного логарифмирования|ро-метод Полларда для дискретного логарифмирования}} |
|||
[[Файл:Pollard rho cycle. |
[[Файл:Pollard rho cycle.svg|thumb|300px|Числовая последовательность зацикливается, начиная с некоторого ''n''. Цикл может быть представлен в виде греческой буквы ρ.]] |
||
''' |
'''Ро-алгоритм''' ('''<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| |
ρ-алгоритм Полларда строит [[числовая последовательность|числовую последовательность]], элементы которой образуют цикл, начиная с некоторого номера ''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 века]] [[Флойд, Роберт|Роберт Флойд]] придумал достаточно эффективный [[ |
В конце [[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 |
||
== Описание алгоритма == |
== Описание алгоритма == |
||
=== Оригинальная версия === |
=== Оригинальная версия === |
||
Рассматривается последовательность целых чисел <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>, то частичное |
: 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|с= |
# Случайным образом выбирается небольшое число <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"> |
На практике функция <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) |
Пусть <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}}. |
||
Эта идея была предложена [[Брент, Ричард|Ричардом Брентом]] в [[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}}. |
||
Ещё одна вариация ρ-алгоритма Полларда была разработана [[Флойд, Роберт|Флойдом]]. Согласно Флойду, значение <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" />. |
|||
=== Пример факторизации числа === |
=== Пример факторизации числа === |
||
Данный пример наглядно демонстрирует ρ-алгоритм факторизации, для числа |
Данный пример наглядно демонстрирует ρ-алгоритм факторизации (версия алгоритма, с улучшением [[Флойд, Роберт|Флойда]]), для числа ''N'' = 8051: |
||
{| class="standard" style="text-align:center" |
{| class="standard" style="text-align:center" |
||
|+ Таблица: |
|+ Таблица: факторизация числа 8051 |
||
|- |
|- |
||
!colspan="4"| |
!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>)) || НОД(|''x''<sub>''i''</sub> |
!''i''||''x''<sub>''i''</sub>=''F''(''x''<sub>''i''-1</sub>)||''y''<sub>''i''</sub>=''F''(''F''(''y''<sub>''i''-1</sub>)) || НОД(|''x''<sub>''i''</sub> − ''y''<sub>''i''</sub>|, 8051) |
||
|- |
|- |
||
|1||5||26||1 |
|1||5||26||1 |
||
Строка 69: | Строка 68: | ||
|} |
|} |
||
Используя другие варианты полинома <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>)) || НОД(|''x''<sub>''i''</sub> − ''y''<sub>''i''</sub>|, 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>\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>\{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>P</math> одинаковых исполнителей. Если мы используем <math>P</math> различных последовательностей ( |
Предположим что есть <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 |
[[Крэндалл, Ричард|Ричард Крэндалл]] предположил, что достижимо ускорение <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}}. |
||
== См. также == |
|||
* [[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 |
||
|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 = Косяков}} |
||
* {{книга |
|||
⚫ | |||
|автор = Герман О.Н., Нестеренко А.Ю. |
|||
|часть = |
|||
|заглавие = Теоретико-числовые методы в криптографии |
|||
|оригинал = |
|||
|ссылка = 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 |
|ref = Brent |
||
}} |
}} |
||
*{{Статья |
* {{Статья |
||
|автор = Brent R.P. |
|автор = Brent R. P. |
||
|год = 1980 |
|год = 1980 |
||
|месяц = 06 |
|||
|число = 01 |
|||
|doi = 10.1007/BF01933190 |
|doi = 10.1007/BF01933190 |
||
|issn = 1572-9125 |
|issn = 1572-9125 |
||
|выпуск = 2 |
|выпуск = 2 |
||
|язык = en |
|язык = en |
||
|страницы = |
|страницы = 176—184 |
||
|издание = BIT Numerical Mathematics |
|издание = BIT Numerical Mathematics |
||
|заглавие = An improved Monte Carlo factorization algorithm |
|заглавие = An improved Monte Carlo factorization algorithm |
||
|ссылка = |
|ссылка = 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 |
||
|ссылка = |
|ссылка = 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 |
||
|ссылка = |
|ссылка = 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 |
||
|страниц = 603 |
|страниц = 603 |
||
|isbn = 978-0-387-74725-5 |
|isbn = 978-0-387-74725-5 |
||
Строка 234: | Строка 260: | ||
* {{Статья |
* {{Статья |
||
|автор = Chris Christensen |
|автор = Chris Christensen |
||
|год = 2009 |
|год = 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 |
||
|ссылка = |
|ссылка = https://dx.doi.org/10.1080/01611190802293397 |
||
|том = 33 |
|том = 33 |
||
|ref = Christensen}} |
|ref = Christensen}} |
||
Строка 248: | Строка 276: | ||
|заглавие = Алгоритмы: построение и анализ |
|заглавие = Алгоритмы: построение и анализ |
||
|оригинал = Introduction to algorithms |
|оригинал = Introduction to algorithms |
||
|ссылка = |
|ссылка = https://books.google.ru/books?id=NLngYyWFl_YC |
||
|издание = 2-е изд |
|издание = 2-е изд |
||
|место = USA |
|место = USA |
||
|издательство = MIT Press |
|издательство = MIT Press |
||
|год = 2001 |
|год = 2001 |
||
|страницы = |
|страницы = 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 |
||
|ссылка = |
|ссылка = 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 |
||
|заглавие = 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 |
||
|ссылка = |
|ссылка = 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 |
|ref = Pollard |
||
}} |
}} |
||
* {{книга |
* {{книга |
||
Строка 349: | Строка 385: | ||
|заглавие = Простые числа и компьютерные методы факторизации |
|заглавие = Простые числа и компьютерные методы факторизации |
||
|оригинал = Prime Numbers and Computer Methods for Factorization |
|оригинал = Prime Numbers and Computer Methods for Factorization |
||
|ссылка = |
|ссылка = 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
Ро-алгоритм (-алгоритм) — предложенный Джоном Поллардом[англ.] в 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]:
- Случайным образом выбирается небольшое число [12] и строится последовательность , определяя каждое следующее как .
- Одновременно на каждом i-ом шаге вычисляется для каких-либо , таких, что , например, .
- Если , то вычисление заканчивается, и найденное на предыдущем шаге число является делителем . Если не является простым числом, то процедуру поиска делителей продолжается, взяв в качестве число .
На практике функция выбирается не слишком сложной для вычисления (но в то же время не линейным многочленом), при условии того, что она не должна порождать взаимно однозначное отображение. Обычно в качестве выбираются функции [12] или [13]. Однако функции и не подходят[10].
Если известно, что для делителя числа справедливо при некотором , то имеет смысл использовать [10].
Существенным недостатком алгоритма в такой реализации является необходимость хранить большое число предыдущих значений .
Улучшения алгоритма
[править | править код]Изначальная версия алгоритма обладает рядом недостатков. В настоящий момент существует несколько подходов к улучшению оригинального алгоритма.
Пусть . Тогда, если , то , поэтому, если пара даёт решение, то решение даст любая пара .
Поэтому нет необходимости проверять все пары , а можно ограничиться парами вида , где , и пробегает набор последовательных значений 1, 2, 3, …, а принимает значения из интервала . Например, , , а [11].
Эта идея была предложена Ричардом Брентом в 1980 году[14] и позволяет уменьшить количество выполняемых операций приблизительно на 25 %[15].
Ещё одна вариация ρ-алгоритма Полларда была разработана Флойдом. Согласно Флойду, значение обновляется на каждом шаге по формуле , поэтому на шаге будут получены значения , , и НОД на этом шаге вычисляется для и [11].
Пример факторизации числа
[править | править код]Данный пример наглядно демонстрирует ρ-алгоритм факторизации (версия алгоритма, с улучшением Флойда), для числа N = 8051:
n = 8051, F(x) = (x2 + 1) mod n , x0 = y0 = 2 | |||
---|---|---|---|
i | xi=F(xi-1) | yi=F(F(yi-1)) | НОД(|xi − yi|, 8051) |
1 | 5 | 26 | 1 |
2 | 26 | 7474 | 1 |
3 | 677 | 871 | 97 |
Используя другие варианты полинома , можно также получить делитель 83:
n = 8051, F(x) = (x2 + 3) mod n , x0 = y0 = 2 | |||
---|---|---|---|
i | xi=F(xi-1) | yi=F(F(yi-1)) | НОД(|xi − yi|, 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 2 Pollard, 1974, с. 521–528.
- ↑ Christensen, 2009, 3.3.3.0.
- ↑ Chatterjee, 2008, 5.2.2.
- ↑ Floyd, 1967, с. 636–644.
- ↑ Brent, 1980, An improved Monte Carlo factorization algorithm, с. 176.
- ↑ 1 2 3 Pollard, 1975, A Monte Carlo method for factorization, с. 176.
- ↑ Koshy, 2007, Elementary Number Theory with Applications.
- ↑ Childs, 2009, A Concrete Introduction to Higher Algebra.
- ↑ 1 2 Brent, 1999, Some parallel algorithms for integer factorization..
- ↑ 1 2 3 Pollard, 1975, A Monte Carlo method for factorization.
- ↑ 1 2 3 4 5 6 Ишмухаметов, 2011, с. 64.
- ↑ 1 2 Mollin, 2006, с. 215—216.
- ↑ Золотых Н. Ю. Лекции по компьютерной алгебре. Лекция 11. ρ-метод Полларда. Архивная копия от 30 октября 2014 на Wayback Machine
- ↑ Brent, 1980, An improved Monte Carlo factorization algorithm, с. 176—184.
- ↑ Reisel, 2012, Selected Areas in Cryptography. Prime Numbers and Computer Methods for Factorization. 2nd ed..
- ↑ Cormen, 2001, Introduction to Algorithms. Section 31.9. Integer Factorization. Pollard's rho heuristic..
- ↑ Ишмухаметов, 2011, с. 63.
- ↑ Косяков, 2014, с. 12.
- ↑ Kuhn, 2001, Random Walks Revisited: Extensions of Pollard’s Rho Algorithm for Computing Multiple Discrete Logarithms, с. 212—229.
- ↑ Crandall, 1999, Parallelization of Polldar-rho factorization.
- ↑ Косяков, 2014, с. 19.
Литература
[править | править код]- Василенко О. Н. Теоретико-числовые алгоритмы в криптографии. — М.: МЦНМО, 2003. — 328 с. — ISBN 5-94057-103-4. Архивная копия от 27 января 2007 на Wayback Machine
- Ишмухаметов Ш. Т. Методы факторизации натуральных чисел: Учебное пособие / Захаров В.М.. — Казань: Казанский Университет, 2011. — С. 61—64. — 190 с. — ISBN 978-3-659-17639-5.
- Косяков М.С. Введение в распределенные вычисления / НИУ ИТМО. — СПб., 2014. — 155 с.
- Герман О.Н., Нестеренко А.Ю. Теоретико-числовые методы в криптографии. — М., 2012. — 300 с.
- Соловьёв Ю. П., Садовничий В. А., Шавгулидзе Е. Т., Белокуров В. В. Эллиптические кривые и современные алгоритмы теории чисел. — М.: Ин-т компьют. исслед., 2003. — 192 с. — ISBN ISBN 5-939722-27-X.
- Brent R. P. Некоторые параллельные алгоритмы факторизации чисел (англ.) = Some parallel algorithms for integer factorization. — 1999. — С. 7. — doi:10.1017/S0305004100049252.
- Brent R. P. An improved Monte Carlo factorization algorithm (англ.) // BIT Numerical Mathematics. — 1980. — 1 June (vol. 20, iss. 2). — P. 176—184. — ISSN 1572-9125. — doi:10.1007/BF01933190.
- Chatterjee S., Sarkar P. Introduction (англ.) // Identity-Based Encryption. — Boston: Springer US, 2008. — ISBN 978-1-59693-238-8.
- Childs, Lindsay N. Congruences // Введение в высшую алгебру = Concrete Introduction to Higher Algebra. — 3-е изд. — USA: Springer, 2009. — С. 471—473. — 603 с. — ISBN 978-0-387-74725-5.
- Chris Christensen. Review of Modern Cryptanalysis: Techniques for Advanced Code Breaking by Christopher Swenson // Cryptologia. — 2009. — 27 января (т. 33, вып. 1). — ISSN 0161-1194. — doi:10.1080/01611190802293397.
- Cormen T.H., Leiserson C.E., Rivest R.L., Stein C. Алгоритмы: построение и анализ = Introduction to algorithms. — 2-е изд. — USA: MIT Press, 2001. — С. 897—907. — 1180 с. — ISBN 9780262032933.
- Crandall R.E. Распараллеливание P-алгоритма факторизации Полларда (англ.) = Parallelization of Polldar-rho factorization. — 1999. Архивировано 6 июля 2010 года.
- Koshy T. Congruences // Элементарная теория чисел и её приложения = Elementary Number Theory with Applications. — 2-е изд. — USA: Academic Press, 2007. — С. 238. — 771 с. — ISBN 9780123724878.
- Kuhn F., Struik R. Random Walks Revisited: Extensions of Pollard’s Rho Algorithm for Computing Multiple Discrete Logarithms (англ.) // Selected Areas in Cryptography / Serge Vaudenay, Amr M.. — Springer Berlin Heidelberg, 2001. — P. 212—229. — ISBN 978-3-540-43066-7, 978-3-540-45537-0. — doi:10.1007/3-540-45537-x_17.
- Mollin R.A. An Introduction to Cryptography / Rosen K.H.. — 2. — London: Chapman and Hall, 2006. — 413 с. — ISBN 9781584886181. Архивировано 4 марта 2016 года.
- Pollard J. M. A Monte Carlo method for factorization // BIT Numerical Mathematics. — 1975. — Vol. 15, № 3. — P. 331–334.
- Pollard J.M. Theorems on factorization and primality testing // Mathematical Proceedings of the Cambridge Philosophical Society. — 1974. — Т. 76, вып. 03. — С. 521–528. — ISSN 1469-8064. — doi:10.1017/S0305004100049252.
- Pollard J. M. Методы факторизации и проверка простоты. (англ.) = Theorems on factorization and primality testing. // Математические Труды Кэмбриджского Философского Общества (Mathematical Proceedings of the Cambridge Philosophical Society). — 1974. — Т. 76, № 3. — С. 521. — doi:10.1017/S0305004100049252.
- Reisel, H. Простые числа и компьютерные методы факторизации = Prime Numbers and Computer Methods for Factorization. — 2-е изд. — USA: Springer, 2012. — С. 183. — 464 с. — ISBN 978-0-8176-8297-2.
- Robert W. Floyd. Nondeterministic Algorithms // J. ACM. — 1967. — Т. 14, вып. 4. — С. 636–644. — ISSN 0004-5411. — doi:10.1145/321420.321422.
Эта статья входит в число добротных статей русскоязычного раздела Википедии. |