Ро-алгоритм Полларда: различия между версиями
[непроверенная версия] | [непроверенная версия] |
KAlexeyV (обсуждение | вклад) м Викификация |
KAlexeyV (обсуждение | вклад) м Переформулировано не очень корректное утверждение по поводу паспараллеливания( надеюсь без ошибок). |
||
Строка 114: | Строка 114: | ||
Алгоритм Полларда допускает [[Распараллеливание программ|распараллеливание]] с использованием любого стандарта [[Параллельные вычислительные системы|параллельных вычислений]] (например, [[OpenMP]] и др.). |
Алгоритм Полларда допускает [[Распараллеливание программ|распараллеливание]] с использованием любого стандарта [[Параллельные вычислительные системы|параллельных вычислений]] (например, [[OpenMP]] и др.). |
||
Один из способов распалаллеливания заключается в том, что каждый вычислительный узел исполняет один и тот же последовательный [[алгоритм]], однако, исходное число <math>x_{0}</math> и/или полином <math>F(x)</math> берутся различными. Для упрощения распаралеливания, предлагается получать их из генератора случайных чисел. Однако такая параллельная реализация не даёт линейного ускорения.<ref>{{Статья|автор = Fabian Kuhn, René Struik|ответственный = Serge Vaudenay, Amr M. Youssef|год = 2001-08-16|doi = 10.1007/3-540-45537-x_17|isbn = 978-3-540-43066-7, 978-3-540-45537-0|язык = en|страницы = 212-229|заглавие = 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|издательство = Springer Berlin Heidelberg|издание = Selected Areas in Cryptography}}</ref> |
|||
Предположим что есть <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" />. |
Версия от 20:33, 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 и др.).
Один из способов распалаллеливания заключается в том, что каждый вычислительный узел исполняет один и тот же последовательный алгоритм, однако, исходное число и/или полином берутся различными. Для упрощения распаралеливания, предлагается получать их из генератора случайных чисел. Однако такая параллельная реализация не даёт линейного ускорения.[13]
Предположим что есть одинаковых процессоров. Если мы используем различных последовательностей (т.е. различных полиномов ), то вероятность того, что первые чисел в этих последовательностях будут различными по модулю будет примерно равна . Таким образом, ускорение можно оценить как [6].
Ричард Крэндалл предположил, что достижимо ускорение , однако данное утверждение пока не проверено[14].
См. также
- 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..
- ↑ Fabian Kuhn, René Struik. Random Walks Revisited: Extensions of Pollard’s Rho Algorithm for Computing Multiple Discrete Logarithms (англ.) // Selected Areas in Cryptography / Serge Vaudenay, Amr M. Youssef. — Springer Berlin Heidelberg, 2001-08-16. — P. 212-229. — ISBN 978-3-540-43066-7, 978-3-540-45537-0. — doi:10.1007/3-540-45537-x_17.
- ↑ 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. |