Ро-алгоритм Полларда: различия между версиями
[непроверенная версия] | [непроверенная версия] |
форматирование АИ |
KAlexeyV (обсуждение | вклад) м Викификация. Исправление ошибки в фамилии ученого. |
||
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE:ρ-Алгоритм}}{{about|факторизации чисел|методе дискретного логарифмирования|Ρ-метод Полларда дискретного логарифмирования}} |
{{DISPLAYTITLE:ρ-Алгоритм}}{{about|факторизации чисел|методе дискретного логарифмирования|Ρ-метод Полларда дискретного логарифмирования}} |
||
[[Файл:Pollard rho cycle.jpg|thumb|300px|Числовая последовательность зацикливается, начиная с некоторого ''n''. Цикл может быть представлен в виде греческой буквы ρ.]] |
[[Файл:Pollard rho cycle.jpg|thumb|300px|Числовая последовательность зацикливается, начиная с некоторого ''n''. Цикл может быть представлен в виде греческой буквы ρ.]] |
||
'''ρ-Алгоритм''' — предложенный {{нп5|Поллард, Джон|Джоном Поллардом|en|John Pollard (mathematician)}} в [[1975 год]]у алгоритм, служащий для [[факторизация|факторизации]] (разложения на множители) целых чисел. Данный алгоритм основывается на {{не переведено|:en:Floyd's cycle-finding algorithm|Алгоритм Флойда поиска длины цикла|алгоритме Флойда поиска длины цикла в последовательности|на англ.}} и некоторых следствиях из [[Парадокс дней рождения|парадокса дней рождений]]. Алгоритм наиболее эффективен при факторизации [[составное число|составных чисел]] с достаточно малыми множителями в разложении. Сложность алгоритма оценивается как <math>O(N^{1/4})</math><ref name=":0">{{cite doi|10.1017.2FS0305004100049252|noedit}}</ref>. |
'''ρ-Алгоритм''' — предложенный {{нп5|Поллард, Джон|Джоном Поллардом|en|John Pollard (mathematician)}} в [[1975 год]]у [[алгоритм]], служащий для [[факторизация|факторизации]] (разложения на множители) целых чисел. Данный алгоритм основывается на {{не переведено|:en:Floyd's cycle-finding algorithm|Алгоритм Флойда поиска длины цикла|алгоритме Флойда поиска длины цикла в последовательности|на англ.}} и некоторых следствиях из [[Парадокс дней рождения|парадокса дней рождений]]. Алгоритм наиболее эффективен при факторизации [[составное число|составных чисел]] с достаточно малыми множителями в разложении. [[Вычислительная сложность|Сложность алгоритма]] оценивается как <math>O(N^{1/4})</math><ref name=":0">{{cite doi|10.1017.2FS0305004100049252|noedit}}</ref>. |
||
Во всех ρ-методах Полларда строится числовая последовательность, элементы которой образуют цикл, начиная с некоторого номера ''n'', что может быть проиллюстрировано, расположением чисел в виде греческой буквы [[ро (буква)|ρ]], что послужило названием семейству методов. |
Во всех ρ-методах Полларда строится [[числовая последовательность]], элементы которой образуют цикл, начиная с некоторого номера ''n'', что может быть проиллюстрировано, расположением чисел в виде греческой буквы [[ро (буква)|ρ]], что послужило названием семейству методов. |
||
== История алгоритма == |
== История алгоритма == |
||
Строка 11: | Строка 11: | ||
Автор алгоритма назвал его методом факторизации Монте-Карло, отражая кажущуюся случайность чисел, генерируемых в процессе вычисления. Однако позже метод всё-таки получил своё современное название — ρ-aлгоритм Полларда{{sfn|Koshy|2007|loc=Elementary Number Theory with Applications|name=Koshy}}. |
Автор алгоритма назвал его методом факторизации Монте-Карло, отражая кажущуюся случайность чисел, генерируемых в процессе вычисления. Однако позже метод всё-таки получил своё современное название — ρ-aлгоритм Полларда{{sfn|Koshy|2007|loc=Elementary Number Theory with Applications|name=Koshy}}. |
||
В 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>F_8 = 1238926361552897 \cdot p_{62}</math>, где <math>p_{62}</math> — простое число, состоящее из 62 десятичных цифр. |
Так, <math>F_8 = 1238926361552897 \cdot p_{62}</math>, где <math>p_{62}</math> — простое число, состоящее из 62 десятичных цифр. |
||
В рамках проекта «Cunningham project» алгоритм Полларда помог найти делитель длиной 19 цифр числа <math>2^{2386}+1</math>. Большие делители также могли бы быть найдены, однако открытие [[Факторизация с помощью эллиптических кривых|метода факторизации с помощью эллиптических кривых]] сделало алгоритм Полларда неконкурентоспособным{{sfn|Brent-1999|1999|loc=Some parallel algorithms for integer factorization. |name=BrentParallel}}. |
В рамках проекта «[[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=":1" />. |
Рассмотрим последовательность целых чисел <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=":1" />. |
||
: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>. |
||
Строка 49: | Строка 49: | ||
Поэтому, нет необходимости проверять все пары <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|loc=Методы факторизации натуральных чисел: Учебное пособие|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|loc=Методы факторизации натуральных чисел: Учебное пособие|name=Ishmuhammetov}}. |
||
Эта идея была предложена [[Брент, Ричард|Ричардом Брентом]] в 1980 году<ref>{{cite doi|10.1007/BF01933190|noedit}}</ref> и позволяет уменьшить количество выполняемых операций приблизительно на 25%{{sfn|Reisel|2012|loc=Selected Areas in Cryptography. Prime Numbers and Computer Methods for Factorization. 2nd ed.|name=Reisel}}. |
Эта идея была предложена [[Брент, Ричард|Ричардом Брентом]] в [[1980 год|1980]] году<ref>{{cite doi|10.1007/BF01933190|noedit}}</ref> и позволяет уменьшить количество выполняемых операций приблизительно на 25%{{sfn|Reisel|2012|loc=Selected Areas in Cryptography. Prime Numbers and Computer Methods for Factorization. 2nd ed.|name=Reisel}}. |
||
Еще одна вариация P-метода полларда была разработана Флойдом. Согласно Флойду, значение <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" />. |
Еще одна вариация P-метода полларда была разработана Флойдом. Согласно Флойду, значение <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" />. |
||
Строка 69: | Строка 69: | ||
== Обоснование P-метода Полларда == |
== Обоснование P-метода Полларда == |
||
Алгоритм основывается на известном парадоксе дней рождения. |
Алгоритм основывается на известном [[Парадокс дней рождения|парадоксе дней рождения]]. |
||
'''Теорема.''' ([[Парадокс дней рождения]]) |
'''Теорема.''' ([[Парадокс дней рождения]]) |
||
Строка 75: | Строка 75: | ||
{{теорема|Пусть <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 - \exp^{-\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>. |
||
Если <math>z_{i}=z_{j}</math>, тогда <math>x_{i}-x_{j} \equiv 0\, \mathrm{mod}\, q</math>, то есть, <math>x_{i}-x_{j}=kq</math> для некоторого целого <math>k</math>. Если <math>x_{i} \neq x_{j}</math>, что выполняется с большой вероятностью, то искомый делитель <math>q</math> числа <math>N</math> будет найден как <math>\mathrm{GCD}(N, |x_{i}-x_{j}|)</math>. Поскольку <math>\sqrt{q} \leq n^{1/4}</math>, то с вероятностью, превышающей 0.5, делитель <math>N</math> будет найден за <math>1.18 \times N^{1/4}</math> итераций<ref name="Ishmuhammetov" />. |
Если <math>z_{i}=z_{j}</math>, тогда <math>x_{i}-x_{j} \equiv 0\, \mathrm{mod}\, q</math>, то есть, <math>x_{i}-x_{j}=kq</math> для некоторого целого <math>k</math>. Если <math>x_{i} \neq x_{j}</math>, что выполняется с большой вероятностью, то искомый делитель <math>q</math> числа <math>N</math> будет найден как <math>\mathrm{GCD}(N, |x_{i}-x_{j}|)</math>. Поскольку <math>\sqrt{q} \leq n^{1/4}</math>, то с вероятностью, превышающей 0.5, делитель <math>N</math> будет найден за <math>1.18 \times N^{1/4}</math> итераций<ref name="Ishmuhammetov" />. |
||
== Сложность алгоритма == |
== Сложность алгоритма == |
||
Чтобы оценить сложность алгоритма, можно рассматривать последовательность, строящуюся в процессе вычислений, как случайную (разумеется, ни о какой строгости при этом говорить нельзя). Чтобы полностью факторизовать число <math>N</math> длиной <math>\beta</math> бит, достаточно найти все его делители, не превосходящие <math>\sqrt{N}</math>, что требует максимум порядка <math>\sqrt{N}</math> арифметических операций, или <math>N^{1/4}\beta^2 = 2^{\beta/4}\beta^2</math> битовых операций. |
Чтобы оценить [[Вычислительная сложность|сложность алгоритма]], можно рассматривать последовательность, строящуюся в процессе вычислений, как случайную (разумеется, ни о какой строгости при этом говорить нельзя). Чтобы полностью факторизовать число <math>N</math> длиной <math>\beta</math> бит, достаточно найти все его делители, не превосходящие <math>\sqrt{N}</math>, что требует максимум порядка <math>\sqrt{N}</math> арифметических операций, или <math>N^{1/4}\beta^2 = 2^{\beta/4}\beta^2</math> битовых операций. |
||
Поэтому сложность алгоритма оценивается, как <math>O(N^{1/4})</math>{{sfn|Cormen|2001|loc=Introduction to Algorithms. Section 31.9. Integer Factorization. Pollard's rho heuristic.||страница=976|name=Cormen}}. Однако в этой оценке не учитываются накладные расходы по вычислению наибольшего общего делителя. Полученная сложность алгоритма, хотя и не является точной, достаточно хорошо согласуется с практикой. |
Поэтому сложность алгоритма оценивается, как <math>O(N^{1/4})</math>{{sfn|Cormen|2001|loc=Introduction to Algorithms. Section 31.9. Integer Factorization. Pollard's rho heuristic.||страница=976|name=Cormen}}. Однако в этой оценке не учитываются накладные расходы по вычислению [[Наибольший общий делитель|наибольшего общего делителя]]. Полученная сложность алгоритма, хотя и не является точной, достаточно хорошо согласуется с практикой. |
||
Справедлива следующая теорема. Пусть <math>N</math> — составное число. Тогда существует такая константа <math>C</math>, что для любого положительного числа <math>\lambda</math> вероятность события, состоящего в том, что ρ-метод Полларда не найдет нетривиального делителя <math>N</math> за время <math>C\sqrt{\lambda \sqrt N}(\log N)^2</math>, не превосходит величины <math>e^{-\lambda}</math>. Данная теорема следует из [[Парадокс дней рождения|парадокса дней рождения]]. |
Справедлива следующая [[теорема]]. Пусть <math>N</math> — [[составное число]]. Тогда существует такая константа <math>C</math>, что для любого положительного числа <math>\lambda</math> вероятность события, состоящего в том, что ρ-метод Полларда не найдет нетривиального делителя <math>N</math> за время <math>C\sqrt{\lambda \sqrt N}(\log N)^2</math>, не превосходит величины <math>e^{-\lambda}</math>. Данная теорема следует из [[Парадокс дней рождения|парадокса дней рождения]]. |
||
== Особенности реализации == |
== Особенности реализации == |
||
Строка 112: | Строка 112: | ||
=== Распараллеливание алгоритма === |
=== Распараллеливание алгоритма === |
||
Алгоритм Полларда допускает [[Распараллеливание программ|распараллеливание]] с использованием любого стандарта параллельных вычислений (например, [[OpenMP]] и др.). |
Алгоритм Полларда допускает [[Распараллеливание программ|распараллеливание]] с использованием любого стандарта [[Параллельные вычислительные системы|параллельных вычислений]] (например, [[OpenMP]] и др.). |
||
Существует несколько вариантов распараллеливания, но их общая идея заключается в том, что каждый процессор исполняет последовательный алгоритм, причём исходное число <math>x_{0}</math> и/или полином <math>F(x)</math> должны быть различными для каждого процессора. Однако такая параллельная реализация не даёт линейного ускорения. |
Существует несколько вариантов распараллеливания, но их общая идея заключается в том, что каждый [[процессор]] исполняет последовательный [[алгоритм]], причём исходное число <math>x_{0}</math> и/или полином <math>F(x)</math> должны быть различными для каждого процессора. Однако такая параллельная реализация не даёт линейного ускорения. |
||
Предположим что есть <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}/{2 p})</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}}. |
||
== См. также == |
== См. также == |
Версия от 19:52, 27 октября 2015
ρ-Алгоритм — предложенный Джоном Поллардом[англ.] в 1975 году алгоритм, служащий для факторизации (разложения на множители) целых чисел. Данный алгоритм основывается на шаблон не поддерживает такой синтаксис и некоторых следствиях из парадокса дней рождений. Алгоритм наиболее эффективен при факторизации составных чисел с достаточно малыми множителями в разложении. Сложность алгоритма оценивается как [1].
Во всех ρ-методах Полларда строится числовая последовательность, элементы которой образуют цикл, начиная с некоторого номера n, что может быть проиллюстрировано, расположением чисел в виде греческой буквы ρ, что послужило названием семейству методов.
История алгоритма
В конце 60-х годов XX века Роберт Флойд придумал достаточно эффективный алгоритм поиска длины цикла в последовательности, также известный, как алгоритм «черепаха и заяц»[2]. Джон Поллард, Дональд Кнут и другие математики проанализировали поведение этого алгоритма в среднем случае. Было предложено несколько модификаций и улучшений алгоритма.
В 1975 году Поллард опубликовал статью[3], в которой он, основываясь на алгоритме Флойда обнаружения циклов, изложил идею алгоритма факторизации чисел, работающего за время, пропорциональное [3][1]. Автор алгоритма назвал его методом факторизации Монте-Карло, отражая кажущуюся случайность чисел, генерируемых в процессе вычисления. Однако позже метод всё-таки получил своё современное название — ρ-aлгоритм Полларда[4].
В 1981 году Ричард Брент и Джон Поллард с помощью алгоритма нашли наименьшие делители чисел Ферма при [5].
Так, , где — простое число, состоящее из 62 десятичных цифр.
В рамках проекта «Cunningham project» алгоритм Полларда помог найти делитель длиной 19 цифр числа . Большие делители также могли бы быть найдены, однако открытие метода факторизации с помощью эллиптических кривых сделало алгоритм Полларда неконкурентоспособным[6].
Описание алгоритма
Оригинальная версия
Рассмотрим последовательность целых чисел , такую что и , где - число, которое нужно факторизовать. Оригинальный алгоритм выглядит следующим образом[7][3].
- 1. Будем вычислять тройки чисел
- , где .
- Причём каждая такая тройка получается из предыдущей.
- 2. Каждый раз, когда число кратно числу (скажем, ), будем вычислять наибольший общий делитель любым известным методом.
- 3. Если , то найдено частичное разложения числа , причём .
- Найденный делитель может быть составным, поэтому его также необходимо факторизовать. Если число составное, то продолжаем алгоритм с модулем .
- 4. Вычисления повторяются раз. Например, можно прекратить алгоритм при . Если при этом число не было до конца факторизовано, можно выбрать, например, другое начальное число .
Современная версия
Пусть составное целое положительное число, которое требуется разложить на множители. Алгоритм выглядит следующим образом:[8]
- Выбираем небольшое число и строим последовательность , определяя каждое следующее как .
- Одновременно на каждом i-ом шаге вычисляем для каких-либо , таких, что , например, .
- Если обнаружили, что , то вычисление заканчивается, и найденное на предыдущем шаге число является делителем . Если не является простым числом, то процедуру поиска делителей можно продолжить, взяв в качестве число .
Как на практике выбирать функцию ? Функция должна быть не слишком сложной для вычисления, но в то же время не должна быть линейным многочленом, а также не должна порождать взаимно однозначное отображение. Обычно в качестве берут функцию или [9]. Однако не следует использовать функции и [7].
Если известно, что для делителя числа справедливо при некотором , то имеет смысл использовать [7].
Существенным недостатком алгоритма в такой реализации является необходимость хранить большое число предыдущих значений .
Улучшения алгоритма
Изначальная версия алгоритма обладает рядом недостатков. В настоящий момент существует несколько подходов к улучшению оригинального метода.
Пусть . Заметим, что если , то , поэтому, если пара даёт нам решение, то решение даст любая пара .
Поэтому, нет необходимости проверять все пары , а можно ограничиться парами вида , где , и пробегает набор последовательны значений 1, 2, 3, ..., а принимает значения из интервала . Например, , , а [8].
Эта идея была предложена Ричардом Брентом в 1980 году[10] и позволяет уменьшить количество выполняемых операций приблизительно на 25%[11].
Еще одна вариация P-метода полларда была разработана Флойдом. Согласно Флойду, значение обновляется на каждом шаге по формуле , поэтому на шаге i будут получены значения , , и НОД на этом шаге вычисляется для и [8].
Пример факторизации числа
Пусть , , , .
i | xi | yi | НОД(|xi − yi|, 8051) |
---|---|---|---|
1 | 5 | 26 | 1 |
2 | 26 | 7474 | 1 |
3 | 677 | 871 | 97 |
Таким образом, 97 — нетривиальный делитель числа 8051. Используя другие варианты полинома , можно также получить делитель 83.
Обоснование P-метода Полларда
Алгоритм основывается на известном парадоксе дней рождения.
Теорема. (Парадокс дней рождения)
Пусть . Для случайной выборки из элементов, каждый их которых меньше , где , вероятность того, что два элемента окажутся одинаковыми .
Следует отметить, что вероятность в парадоксе дней рождения достигается при .
Пусть последовательность состоит из разностей , проверяемых в ходе работы алгоритма. Определим новую последовательность , где , — меньший из делителей числа .
Все члены последовательности меньше . Если рассматривать её как случайную последовательность целых чисел, меньших , то, согласно парадоксу дней рождения, вероятность того, что среди её членов попадутся два одинаковых, превысит при , тогда должно быть не меньше .
Если , тогда , то есть, для некоторого целого . Если , что выполняется с большой вероятностью, то искомый делитель числа будет найден как . Поскольку , то с вероятностью, превышающей 0.5, делитель будет найден за итераций[8].
Сложность алгоритма
Чтобы оценить сложность алгоритма, можно рассматривать последовательность, строящуюся в процессе вычислений, как случайную (разумеется, ни о какой строгости при этом говорить нельзя). Чтобы полностью факторизовать число длиной бит, достаточно найти все его делители, не превосходящие , что требует максимум порядка арифметических операций, или битовых операций.
Поэтому сложность алгоритма оценивается, как [12]. Однако в этой оценке не учитываются накладные расходы по вычислению наибольшего общего делителя. Полученная сложность алгоритма, хотя и не является точной, достаточно хорошо согласуется с практикой.
Справедлива следующая теорема. Пусть — составное число. Тогда существует такая константа , что для любого положительного числа вероятность события, состоящего в том, что ρ-метод Полларда не найдет нетривиального делителя за время , не превосходит величины . Данная теорема следует из парадокса дней рождения.
Особенности реализации
Объем памяти, используемый алгоритмом, можно значительно уменьшить.
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)); }
В этом варианте вычисление требует хранить в памяти всего три переменные , , и , что выгодно отличает метод в такой реализации от других методов факторизации чисел[8].
Распараллеливание алгоритма
Алгоритм Полларда допускает распараллеливание с использованием любого стандарта параллельных вычислений (например, OpenMP и др.).
Существует несколько вариантов распараллеливания, но их общая идея заключается в том, что каждый процессор исполняет последовательный алгоритм, причём исходное число и/или полином должны быть различными для каждого процессора. Однако такая параллельная реализация не даёт линейного ускорения.
Предположим что есть одинаковых процессоров. Если мы используем различных последовательностей (т.е. различных полиномов ), то вероятность того, что первые чисел в этих последовательностях будут различными по модулю будет примерно равна . Таким образом, ускорение можно оценить как [6].
Ричард Крэндалл предположил, что достижимо ускорение , однако данное утверждение пока не проверено[13].
См. также
- P-1 алгоритм Полларда
- P-метод Полларда дискретного логарифмирования
- P+1 алгоритм Уильямса
- Метод пробных делений
- Метод Ферма
- Факторизация с помощью эллиптических кривых
- Общий метод решета числового поля
Примечания
- ↑ 1 2 Pollard J. M. Theorems on factorization and primality testing // Mathematical Proceedings of the Cambridge Philosophical Society. — 1974. — Vol. 76. — P. 521. — ISSN 0305-0041. — doi:10.1017/S0305004100049252.
- ↑ Флойд описывает алгоритмы поиска простых циклов в ориентированном графе в статье, опубликованной в 1976 году: Floyd, R.W. (1967), "Non-deterministic Algorithms", J. ACM, 14 (4): 636—644, doi:10.1145/321420.321422. Первое описание алгоритма «черепахи и зайца» появляется в книге Knuth, Donald E. (1969), The Art of Computer Programming, vol. II: Seminumerical Algorithms, Addison-Wesley, упражнениях 6 и 7, стр. 7. Кнут (стр.4) приписывает этот алгоритм Флойду, не ссылаясь на источники.
- ↑ 1 2 3 Pollard J. M. A monte carlo method for factorization (англ.) // BIT. — 1975. — September (vol. 15, no. 3). — P. 331—334. — ISSN 0006-3835. — doi:10.1007/BF01933667.
- ↑ Koshy, 2007, Elementary Number Theory with Applications.
- ↑ Childs, 2009, A Concrete Introduction to Higher Algebra.
- ↑ 1 2 Brent-1999, 1999, Some parallel algorithms for integer factorization..
- ↑ 1 2 3 Pollard, 1975, A Monte Carlo method for factorization.
- ↑ 1 2 3 4 5 Ишмухаметов, 2011, Методы факторизации натуральных чисел: Учебное пособие.
- ↑ Н.Ю. Золотых. Лекции по компьютерной алгебре. Лекция 11. ρ-метод Полларда.
- ↑ doi:10.1007/BF01933190
Вы можете подставить цитату вручную или с помощью бота. - ↑ 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..
- ↑ Crandall, 1999, Parallelization of Polldar-rho factorization.
Литература
- Ишмухаметов Ш. Т. Методы факторизации натуральных чисел: Учебное пособие. — Казань: Казанский Университет, 2011. — С. 61-64. — 190 с.
- Василенко О. Н. Теоретико-числовые алгоритмы в криптографии. — М.: МЦНМО, 2003. — 328 с. — ISBN 5-94057-103-4.
- Ю.П. Соловьев, В.А. Садовничий, Е.Т. Шавгулидзе, В.В. Белокуров. Эллиптические кривые и современные алгоритмы теории чисел. Москва – Ижевск: Институт компьютерных исследований, 2003.
- Brent, Richard P. (1980), "An Improved Monte Carlo Factorization Algorithm" (PDF), BIT, 20: 176—184, doi:10.1007/BF01933190
- Brent R.P. Некоторые параллельные алгоритмы факторизации чисел (англ.) = Some parallel algorithms for integer factorization. — 1999. — С. 7. — doi:10.1017/S0305004100049252.
- Childs, Lindsay N. Congruences // Введение в высшую алгебру = Concrete Introduction to Higher Algebra. — 3-е изд. — USA: Springer, 2009. — С. 471-473. — 603 с. — ISBN 978-0-387-74725-5.
- 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.
- Koshy T. Congruences // Элементарная теория чисел и ее приложения = Elementary Number Theory with Applications. — 2-е изд. — USA: Academic Press, 2007. — С. 238. — 771 с. — ISBN 9780123724878.
- Pollard, J. M. (1975), "A Monte Carlo method for factorization" (PDF), BIT Numerical Mathematics, 15 (3): 331—334
- 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.
Статья является кандидатом в добротные статьи с 20 сентября 2015. |