Алгоритм Полларда ро

Алгоритм факторизации целых чисел

Алгоритм Ро Полларда — это алгоритм факторизации целых чисел . Он был изобретен Джоном Поллардом в 1975 году. [1] Он использует лишь небольшой объем памяти, а его ожидаемое время работы пропорционально квадратному корню наименьшего простого множителя факторизуемого составного числа .

Основные идеи

Алгоритм используется для факторизации числа , где — нетривиальный множитель. Многочлен по модулю , называемый (например, ), используется для генерации псевдослучайной последовательности . Важно отметить, что должно быть многочленом. Выбирается начальное значение, скажем, 2, и последовательность продолжается как , , , и т. д. Последовательность связана с другой последовательностью . Поскольку заранее неизвестно, эта последовательность не может быть явно вычислена в алгоритме. Тем не менее, в ней заключается основная идея алгоритма. н = п д {\displaystyle n=pq} п {\displaystyle p} н {\displaystyle n} г ( х ) {\displaystyle g(x)} г ( х ) = ( х 2 + 1 ) мод н {\displaystyle g(x)=(x^{2}+1){\bmod {n}}} г ( х ) {\displaystyle g(x)} х 1 = г ( 2 ) {\displaystyle x_{1}=g(2)} х 2 = г ( г ( 2 ) ) {\displaystyle x_{2}=g(g(2))} х 3 = г ( г ( г ( 2 ) ) ) {\displaystyle x_{3}=g(g(g(2)))} { х к мод п } {\displaystyle \{x_{k}{\bmod {p}}\}} п {\displaystyle p}

Поскольку число возможных значений для этих последовательностей конечно, и последовательность, которая равна mod , и последовательность в конечном итоге будут повторяться, даже если эти значения неизвестны. Если бы последовательности вели себя как случайные числа, парадокс дней рождения подразумевает, что число до того, как произойдет повторение, должно быть , где — число возможных значений. Таким образом, последовательность, скорее всего, повторится гораздо раньше, чем последовательность . Когда найдено такое, что но , число кратно , поэтому был найден нетривиальный делитель. [2] { х к } {\displaystyle \{x_{k}\}} н {\displaystyle n} { х к мод п } {\displaystyle \{x_{k}{\bmod {p}}\}} х к {\displaystyle x_{k}} О ( Н ) {\displaystyle O({\sqrt {N}})} Н {\displaystyle N} { х к мод п } {\displaystyle \{x_{k}{\bmod {p}}\}} { х к } {\displaystyle \{x_{k}\}} к 1 , к 2 {\displaystyle k_{1},k_{2}} х к 1 х к 2 {\displaystyle x_{k_{1}}\neq x_{k_{2}}} х к 1 х к 2 мод п {\displaystyle x_{k_{1}}\equiv x_{k_{2}}{\bmod {p}}} | x k 1 x k 2 | {\displaystyle |x_{k_{1}}-x_{k_{2}}|} p {\displaystyle p}

Как только последовательность имеет повторяющееся значение, последовательность будет цикличной, поскольку каждое значение зависит только от предыдущего. Эта структура окончательного цикла дает начало названию «алгоритм rho» из-за сходства с формой греческой буквы ρ, когда значения , , и т. д. представлены как узлы в направленном графе . x 1 mod p {\displaystyle x_{1}{\bmod {p}}} x 2 mod p {\displaystyle x_{2}{\bmod {p}}}

Диаграмма цикла, напоминающая греческую букву  ρ

Это обнаруживается алгоритмом поиска цикла Флойда : сохраняются два узла и (т. е. и ). На каждом шаге один перемещается к следующему узлу в последовательности, а другой перемещается вперед на два узла. После этого проверяется , . Если он не равен 1, то это означает, что в последовательности есть повторение (т. е . Это работает, потому что если равен , то разность между и обязательно кратна . Хотя это всегда происходит в конечном итоге, полученный наибольший общий делитель (НОД) является делителем, отличным от 1. Это может быть он сам, поскольку две последовательности могут повторяться одновременно. В этом (редком) случае алгоритм терпит неудачу и может быть повторен с другим параметром. i {\displaystyle i} j {\displaystyle j} x i {\displaystyle x_{i}} x j {\displaystyle x_{j}} gcd ( x i x j , n ) 1 {\displaystyle \gcd(x_{i}-x_{j},n)\neq 1} { x k mod p } {\displaystyle \{x_{k}{\bmod {p}}\}} x i mod p = x j mod p ) {\displaystyle x_{i}{\bmod {p}}=x_{j}{\bmod {p}})} x i mod p {\displaystyle x_{i}{\bmod {p}}} x j mod p {\displaystyle x_{j}{\bmod {p}}} x i {\displaystyle x_{i}} x j {\displaystyle x_{j}} p {\displaystyle p} n {\displaystyle n} n {\displaystyle n}

Алгоритм

Алгоритм принимает в качестве входных данных n , целое число , которое нужно разложить на множители; и ⁠ ⁠ g ( x ) {\displaystyle g(x)} , многочлен от x, вычисленный по модулю n . В оригинальном алгоритме , но в настоящее время чаще используют . Выходными данными является либо нетривиальный множитель n , либо неудача. g ( x ) = ( x 2 1 ) mod n {\displaystyle g(x)=(x^{2}-1){\bmod {n}}} g ( x ) = ( x 2 + 1 ) mod n {\displaystyle g(x)=(x^{2}+1){\bmod {n}}}

Он выполняет следующие шаги: [2]

Псевдокод для алгоритма Полларда rho

 x ← 2 // начальное значение у ← х г ← 1 в то время как d = 1: х ← г(х) у ← г(г(у)) d ← НОД(|x - y|, n) если d = n: вернуть ошибку,  иначе : вернуть d

Здесь x и y соответствуют ⁠ ⁠ x i {\displaystyle x_{i}} и ⁠ ⁠ x j {\displaystyle x_{j}} в предыдущем разделе. Обратите внимание, что этот алгоритм может не найти нетривиальный множитель, даже если n является составным. В этом случае метод можно попробовать снова, используя начальное значение x, отличное от 2 ( ) или другое , , с . 0 x < n {\displaystyle 0\leq x<n} g ( x ) {\displaystyle g(x)} g ( x ) = ( x 2 + b ) mod n {\displaystyle g(x)=(x^{2}+b){\bmod {n}}} 1 b < n 2 {\displaystyle 1\leq b<n-2}

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

Пусть и . n = 8051 {\displaystyle n=8051} g ( x ) = ( x 2 + 1 ) mod 8 051 {\displaystyle g(x)=(x^{2}+1){\bmod {8}}051}

Пример факторизации ро-алгоритма Полларда для и с начальным значением 2. В примере используется алгоритм поиска цикла Флойда . n = 253 {\displaystyle n=253} g ( x ) = x 2 mod 2 53 {\displaystyle g(x)=x^{2}{\bmod {2}}53}
яхуНОД(| xy |, 8051)
15261
22674741
367787197
4747414811

Теперь 97 — нетривиальный множитель 8051. Начальные значения, отличные от x = y = 2, могут дать сомножитель (83) вместо 97. Одна дополнительная итерация показана выше, чтобы прояснить, что y движется в два раза быстрее, чем x . Обратите внимание, что даже после повторения НОД может вернуться к 1.

Варианты

В 1980 году Ричард Брент опубликовал более быстрый вариант алгоритма rho. Он использовал те же основные идеи, что и Поллард, но другой метод обнаружения цикла, заменив алгоритм поиска цикла Флойда на связанный метод поиска цикла Брента . [3] CLRS дает эвристический анализ и условия отказа ( находится тривиальный делитель ). [2] n {\displaystyle n}

Дальнейшее улучшение было сделано Поллардом и Брентом. Они заметили, что если , то также для любого положительного целого числа . В частности, вместо того, чтобы вычислять на каждом шаге, достаточно определить как произведение 100 последовательных членов по модулю , а затем вычислить один . Значительное ускорение достигается за счет замены 100 шагов НОД на 99 умножений по модулю и один НОД . Иногда это может привести к сбою алгоритма из-за введения повторяющегося множителя, например, когда является квадратом . Но тогда достаточно вернуться к предыдущему члену НОД , где , и использовать обычный алгоритм ρ оттуда. [примечание 1] gcd ( a , n ) > 1 {\displaystyle \gcd(a,n)>1} gcd ( a b , n ) > 1 {\displaystyle \gcd(ab,n)>1} b {\displaystyle b} gcd ( | x y | , n ) {\displaystyle \gcd(|x-y|,n)} z {\displaystyle z} | x y | {\displaystyle |x-y|} n {\displaystyle n} gcd ( z , n ) {\displaystyle \gcd(z,n)} n {\displaystyle n} n {\displaystyle n} gcd ( z , n ) = 1 {\displaystyle \gcd(z,n)=1}

Приложение

Алгоритм очень быстр для чисел с малыми множителями, но медленнее в случаях, когда все множители велики. Самым выдающимся успехом алгоритма ρ стала факторизация в 1980 году числа Ферма F 8 = 1238926361552897 × 93461639715357977769163558199606896584051237541638188580280321. [4] Алгоритм ρ был хорошим выбором для F 8 , потому что простой множитель p = 1238926361552897 намного меньше другого множителя. Факторизация заняла 2 часа на UNIVAC 1100/42 . [4]

Пример: факторингн= 10403 = 101 · 103

В следующей таблице показаны числа, полученные алгоритмом, начиная с и используя полином . Третий и четвертый столбцы таблицы содержат дополнительную информацию, не известную алгоритму. Они включены, чтобы показать, как работает алгоритм. x = 2 {\displaystyle x=2} g ( x ) = ( x 2 + 1 ) mod 1 0403 {\displaystyle g(x)=(x^{2}+1){\bmod {1}}0403}

⁠ ⁠ x {\displaystyle x} ⁠ ⁠ y {\displaystyle y} ⁠ ⁠ x mod 1 01 {\displaystyle x{\bmod {1}}01} ⁠ ⁠ y mod 1 01 {\displaystyle y{\bmod {1}}01} шаг
22220
52521
2622622
6772671263
5982693264
39032665265
34182685266
156341855857
3531341897858
5168341817859
37243418888510
9783418698511
98123418158512
59833418248513
99703418728514
2369970347215
36829970467216
20169970977217
70879970177218
102899970887219
25949970697220
84999970157221
49739970247222
27999970727223

Первое повторение по модулю 101 равно 97, что происходит на шаге 17. Повторение не обнаруживается до шага 23, когда . Это приводит к тому, что , и находится множитель. x y ( mod 101 ) {\displaystyle x\equiv y{\pmod {101}}} gcd ( x y , n ) = gcd ( 2799 9970 , n ) {\displaystyle \gcd(x-y,n)=\gcd(2799-9970,n)} p = 101 {\displaystyle p=101}

Сложность

Если бы псевдослучайное число, встречающееся в алгоритме Полларда ρ, было бы фактическим случайным числом, то из этого следовало бы, что успех был бы достигнут в половине случаев, по парадоксу дня рождения в итерациях. Считается, что тот же анализ применим и к фактическому алгоритму rho, но это эвристическое утверждение, и строгий анализ алгоритма остается открытым. [5] x = g ( x ) {\displaystyle x=g(x)} O ( p ) O ( n 1 / 4 ) {\displaystyle O({\sqrt {p}})\leq O(n^{1/4})}

Смотрите также

Примечания

  1. ^ Упражнение 31.9-4 в CLRS

Ссылки

  1. ^ Поллард, Дж. М. (1975). «Метод Монте-Карло для факторизации» (PDF) . BIT Numerical Mathematics . 15 (3): 331– 334. doi :10.1007/bf01933667. S2CID  122775546.
  2. ^ abc Cormen, Thomas H. ; Leiserson, Charles E. ; Rivest, Ronald L. & Stein, Clifford (2009). "Раздел 31.9: Факторизация целых чисел". Введение в алгоритмы (третье изд.). Cambridge, MA: MIT Press. стр.  975–980 . ISBN 978-0-262-03384-8.(в этом разделе обсуждается только алгоритм Полларда rho).
  3. ^ Брент, Ричард П. (1980). «Улучшенный алгоритм факторизации Монте-Карло». BIT . 20 (2): 176– 184. doi :10.1007/BF01933190. S2CID  17181286.
  4. ^ ab Брент, RP; Поллард, JM (1981). «Факторизация восьмого числа Ферма». Математика вычислений . 36 (154): 627– 630. doi : 10.2307/2007666 . JSTOR  2007666.
  5. ^ Гэлбрейт, Стивен Д. (2012). «14.2.5 На пути к строгому анализу ро Полларда». Математика криптографии с открытым ключом. Cambridge University Press. С.  272– 273. ISBN 9781107013926..

Дальнейшее чтение

  • Бай, Ши; Брент, Ричард П. (январь 2008 г.). «Об эффективности метода Ро Полларда для дискретных логарифмов». Конференции по исследованиям и практике в области информационных технологий, т. 77. Симпозиум по теории Австралазии (CATS2008). Вуллонгонг. стр.  125–131 . Описывает улучшения, доступные с помощью различных итерационных функций и алгоритмов поиска циклов.
  • Кац, Джонатан; Линделл, Йехуда (2007). «Глава 8». Введение в современную криптографию . CRC Press.
  • Сэмюэл С. Вагстафф, младший (2013). Радость факторизации. Провиденс, Род-Айленд: Американское математическое общество. стр.  135–138 . ISBN 978-1-4704-1048-3.
  • Подробная статья об алгоритме Полларда Rho, рассчитанная на аудиторию начального уровня.
  • Вайсштейн, Эрик В. «Метод факторизации Полларда по ро». MathWorld .
  • Реализация Java
  • О Полларде ро
Retrieved from "https://en.wikipedia.org/w/index.php?title=Pollard%27s_rho_algorithm&oldid=1270617340"