Участник:Pyatakovns/Ро-алгоритм Полларда: различия между версиями

Материал из Алговики
Перейти к навигации Перейти к поиску
Новая страница: «Автор: Пятаков Н.С. 419 группа == Свойства и структура алгоритмов == === Общее описание алгор...»
 
Нет описания правки
Строка 5: Строка 5:
=== Общее описание алгоритма ===
=== Общее описание алгоритма ===
'''Ро-алгоритм Полларда'''<ref>Pollard J. M. A Monte Carlo method for factorization // BIT. 1975. V. 15. P. 331—334.</ref> предназначен для решения задачи факторизации целых чисел. Этот метод был разработан Джоном Поллардом в 1975 г. Данный алгоритм основывается на следствиях из парадокса дней рождения и алгоритме Флойда поиска длины цикла в последовательности.
'''Ро-алгоритм Полларда'''<ref>Pollard J. M. A Monte Carlo method for factorization // BIT. 1975. V. 15. P. 331—334.</ref> предназначен для решения задачи факторизации целых чисел. Этот метод был разработан Джоном Поллардом в 1975 г. Данный алгоритм основывается на следствиях из парадокса дней рождения и алгоритме Флойда поиска длины цикла в последовательности.


=== Математическое описание алгоритма ===
=== Математическое описание алгоритма ===
Пусть n – число, которое следует разложить. ρ-метод Полларда работает следующим образом:
Пусть n – число, которое следует разложить. ρ-метод Полларда работает следующим образом:


1. Выбираем небольшое число <math>x_0</math> и строим последовательность чисел <math>{x_n}, n = 0, 1, 2, ...,</math> определяя каждое следующее <math>x_{n+1}</math> по формуле <math>x_{n+1} =(x_{2n} −1)(modn)</math>.
1. Выбираем произвольное небольшое число <math>x_0</math> и строим последовательность чисел <math>{x_n}, n = 0, 1, 2, ...,</math> определяя каждое следующее <math>x_{n+1}</math> по формуле <math>x_{n+1} =(x_{n}^2 −1)(modn)</math>.
 
2. Одновременно на каждом шаге <math>i</math> вычисляем <math>Н.О.Д.</math> <math>d</math> числа <math>n</math> и всевозможных разностей <math>|x_i − x_j|</math>, где <math>j < i</math>.
 
3. Когда будет найден <math>d</math> <math>=</math> <math>Н.О.Д.(n, |x_i−x_j|)</math>, отличный от <math>1</math>, вычисление заканчивается. Найденное <math>d</math> является делителем <math>n</math>. Если <math>n/d</math> не является простым числом, то процедуру можно продолжить, взяв вместо <math>n</math> число <math>n/d</math>.
 
 
Вместо функции <math>F (x) = (x^2 − 1) (mod n)</math> в вычислении <math>x_n+1</math> можно взять другой многочлен, например, <math>x^2 + 1</math> или произвольный многочлен степени большей или равной двум.
 
Недостатком данного варианта метода является необходимость хранить большое число предыдущих значений <math>x_j</math> . Если <math>(x_j −x_i)≡0(modp)</math>, то<math>(f(x_j)−f(x_i))≡0(modp)</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 = 2k</math> , и <math>k</math> пробегает набор последовательных значений <math>1, 2, 3,...,</math> а <math>i</math> принимает значения из интервала <math>[2^k + 1; 2^{k+1}]</math>.


=== Вычислительное ядро алгоритма ===
=== Вычислительное ядро алгоритма ===

Версия от 15:01, 12 октября 2020

Автор: Пятаков Н.С. 419 группа


Свойства и структура алгоритмов

Общее описание алгоритма

Ро-алгоритм Полларда[1] предназначен для решения задачи факторизации целых чисел. Этот метод был разработан Джоном Поллардом в 1975 г. Данный алгоритм основывается на следствиях из парадокса дней рождения и алгоритме Флойда поиска длины цикла в последовательности.

Математическое описание алгоритма

Пусть n – число, которое следует разложить. ρ-метод Полларда работает следующим образом:

1. Выбираем произвольное небольшое число [math]\displaystyle{ x_0 }[/math] и строим последовательность чисел [math]\displaystyle{ {x_n}, n = 0, 1, 2, ..., }[/math] определяя каждое следующее [math]\displaystyle{ x_{n+1} }[/math] по формуле [math]\displaystyle{ x_{n+1} =(x_{n}^2 −1)(modn) }[/math].

2. Одновременно на каждом шаге [math]\displaystyle{ i }[/math] вычисляем [math]\displaystyle{ Н.О.Д. }[/math] [math]\displaystyle{ d }[/math] числа [math]\displaystyle{ n }[/math] и всевозможных разностей [math]\displaystyle{ |x_i − x_j| }[/math], где [math]\displaystyle{ j \lt i }[/math].

3. Когда будет найден [math]\displaystyle{ d }[/math] [math]\displaystyle{ = }[/math] [math]\displaystyle{ Н.О.Д.(n, |x_i−x_j|) }[/math], отличный от [math]\displaystyle{ 1 }[/math], вычисление заканчивается. Найденное [math]\displaystyle{ d }[/math] является делителем [math]\displaystyle{ n }[/math]. Если [math]\displaystyle{ n/d }[/math] не является простым числом, то процедуру можно продолжить, взяв вместо [math]\displaystyle{ n }[/math] число [math]\displaystyle{ n/d }[/math].


Вместо функции [math]\displaystyle{ F (x) = (x^2 − 1) (mod n) }[/math] в вычислении [math]\displaystyle{ x_n+1 }[/math] можно взять другой многочлен, например, [math]\displaystyle{ x^2 + 1 }[/math] или произвольный многочлен степени большей или равной двум.

Недостатком данного варианта метода является необходимость хранить большое число предыдущих значений [math]\displaystyle{ x_j }[/math] . Если [math]\displaystyle{ (x_j −x_i)≡0(modp) }[/math], то[math]\displaystyle{ (f(x_j)−f(x_i))≡0(modp) }[/math], поэтому, если пара [math]\displaystyle{ (x_i, x_j) }[/math] дает нам решение, то решение даст любая пара [math]\displaystyle{ (x_{i+k}, x_{j+k}) }[/math].

Поэтому, нет необходимости проверять все пары [math]\displaystyle{ (x_i, x_j) }[/math], а можно ограничиться парами виды [math]\displaystyle{ (x_i, x_j) }[/math], где [math]\displaystyle{ j = 2k }[/math] , и [math]\displaystyle{ k }[/math] пробегает набор последовательных значений [math]\displaystyle{ 1, 2, 3,..., }[/math] а [math]\displaystyle{ i }[/math] принимает значения из интервала [math]\displaystyle{ [2^k + 1; 2^{k+1}] }[/math].

Вычислительное ядро алгоритма

Макроструктура алгоритма

Схема реализации последовательного алгоритма

Последовательная сложность алгоритма

Информационный граф

Ресурс параллелизма алгоритма

Входные и выходные данные алгоритма

Свойства алгоритма

Программная реализация алгоритма

Особенности реализации последовательного алгоритма

Локальность данных и вычислений

Возможные способы и особенности параллельной реализации алгоритма

Масштабируемость алгоритма и его реализации

Динамические характеристики и эффективность реализации алгоритма

Выводы для классов архитектур

Существующие реализации алгоритма

Литература

  1. ↑ Pollard J. M. A Monte Carlo method for factorization // BIT. 1975. V. 15. P. 331—334.