Алгоритм Полларда p − 1 — это алгоритм факторизации целых чисел на основе теории чисел , изобретенный Джоном Поллардом в 1974 году. Это алгоритм специального назначения, то есть он подходит только для целых чисел с определенными типами множителей; это простейший пример алгоритма факторизации алгебраической группы .
Найденные ею множители — это те, для которых число, предшествующее множителю, p − 1, является степенно гладким ; существенное наблюдение состоит в том, что, работая в мультипликативной группе по модулю составного числа N , мы также работаем в мультипликативных группах по модулю всех множителей N.
Существование этого алгоритма приводит к концепции безопасных простых чисел , являющихся простыми числами, для которых p − 1 является удвоенным простым числом Софи Жермен q и, таким образом, минимально гладкими. Эти простые числа иногда трактуются как «безопасные для криптографических целей», но они могут быть небезопасными — в текущих рекомендациях для криптографически сильных простых чисел ( например, ANSI X9.31) необходимо, но недостаточно, чтобы p − 1 имело по крайней мере один большой простой множитель. Большинство достаточно больших простых чисел являются сильными; если простое число, используемое для криптографических целей, оказывается несильным, то это, скорее всего, произошло по злому умыслу, чем из-за случайности генерации случайных чисел . Эта терминология считается устаревшей в криптографической отрасли: метод факторизации ECM более эффективен, чем алгоритм Полларда, и находит безопасные простые множители так же быстро, как и небезопасные простые множители аналогичного размера, поэтому размер p является ключевым параметром безопасности, а не гладкость p-1 . [1]
Пусть n — составное целое число с простым множителем p . По малой теореме Ферма мы знаем, что для всех целых чисел a взаимно просто с p и для всех положительных целых чисел K :
Если число x сравнимо с 1 по модулю множителя n , то наибольший общий делитель ( x − 1, n ) будет делиться на этот множитель.
Идея состоит в том, чтобы сделать показатель степени большим кратным p − 1, сделав его числом с очень большим количеством простых множителей; как правило, мы берем произведение всех простых степеней, меньших некоторого предела B . Начинаем со случайного x и многократно заменяем его на , когда w пробегает эти простые степенные числа. Проверяйте на каждом этапе или один раз в конце, если вам так больше нравится, не равен ли gcd( x − 1, n ) 1.
Возможно, что для всех простых множителей p числа n , p − 1 делится на малые простые числа, и в этом случае алгоритм Полларда p − 1 просто возвращает n .
Базовый алгоритм можно записать следующим образом:
Если g = 1 на шаге 6, это означает, что нет простых множителей p , для которых p-1 является B -powersmooth. Если g = n на шаге 7, это обычно означает, что все множители были B -powersmooth, но в редких случаях это может означать, что a имеет малый порядок по модулю n . Кроме того, когда максимальные простые множители p-1 для каждого простого множителя p из n в некоторых редких случаях все одинаковы, этот алгоритм потерпит неудачу.
Время работы этого алгоритма составляет O( B × log B × log 2 n ) ; большие значения B замедляют работу алгоритма, но повышают вероятность получения множителя.
Если мы хотим разложить на множители число n = 299.
Поскольку алгоритм является инкрементным, он может продолжать работать с постоянно увеличивающейся границей.
Предположим, что p − 1, где p — наименьший простой множитель n , можно смоделировать как случайное число размером меньше √ n . По теореме Диксона вероятность того, что наибольший множитель такого числа меньше ( p − 1) 1/ε, составляет примерно ε − ε ; поэтому существует вероятность около 3 −3 = 1/27, что значение B , равное n 1/6 , даст факторизацию.
На практике метод эллиптических кривых быстрее метода Полларда p − 1, если множители достаточно велики; запуск метода p − 1 до B = 2 32 найдет четверть всех 64-битных множителей и 1/27 всех 96-битных множителей.
Иногда используется вариант базового алгоритма: вместо того, чтобы требовать, чтобы p − 1 имел все свои множители меньше B , мы требуем, чтобы все, кроме одного, множители были меньше некоторого B 1 , а оставшийся множитель был меньше некоторого B 2 ≫ B 1 . После завершения первого этапа, который совпадает с базовым алгоритмом, вместо вычисления нового
для B 2 и проверяя gcd( a M' − 1, n ) , мы вычисляем
где H = a M и проверьте, производит ли gcd( Q , n ) нетривиальный множитель n . Как и прежде, возведение в степень можно выполнить по модулю n .
Пусть { q 1 , q 2 , …} — последовательные простые числа в интервале ( B 1 , B 2 ] и d n = q n − q n −1 — разность между последовательными простыми числами. Поскольку обычно B 1 > 2 , d n — четные числа. Распределение простых чисел таково, что все d n будут относительно малыми. Предполагается, что d n ≤ ln 2 B 2 . Следовательно, значения H 2 , H 4 , H 6 , … (mod n ) можно сохранить в таблице, а H q n вычислить из H q n −1 ⋅ H d n , избавляя от необходимости возведения в степень.