Algoritmo rho de Pollard

Ro-algorithm ( -algorithm ) es un algoritmo propuesto por John Pollard en 1975 para factorizar (factorizar) números enteros. Este algoritmo se basa en el algoritmo de Floyd para encontrar la duración del ciclo en una secuencia y algunas consecuencias de la paradoja del cumpleaños . El algoritmo es más eficiente cuando factoriza números compuestos con factores suficientemente pequeños en la expansión. La complejidad del algoritmo se estima como [1] .

El algoritmo ρ de Pollard construye una secuencia numérica , cuyos elementos forman un ciclo, a partir de algún número n , que puede ilustrarse mediante la disposición de los números en forma de la letra griega ρ , que era el nombre de la familia de algoritmos [2 ] [3] .

Historia del algoritmo

A finales de los años 60 del siglo XX, Robert Floyd ideó un método bastante efectivo para resolver el problema de encontrar ciclos , también conocido como el algoritmo de la “tortuga y la liebre” [4] . John Pollard , Donald Knuth y otros matemáticos han analizado el comportamiento de caso promedio de este algoritmo. Se han propuesto varias modificaciones y mejoras al algoritmo [5] .

En 1975, Pollard publicó un artículo [6] en el que, basándose en el algoritmo de detección del ciclo de Floyd, esbozaba la idea de un algoritmo de factorización de números que se ejecuta en el tiempo proporcional a [6] [1] . El autor del algoritmo lo llamó el método de factorización de Monte Carlo, que refleja la aparente aleatoriedad de los números generados durante el cálculo. Sin embargo, más tarde, el método aún recibió su nombre moderno: el algoritmo ρ de Pollard [7] .

En 1981, Richard Brent y John Pollard utilizaron un algoritmo para encontrar los divisores más pequeños de los números de Fermat en [8] . La velocidad del algoritmo depende en gran medida solo del valor del divisor más pequeño del número original, pero no del número en sí. Entonces, encontrar el divisor más pequeño del séptimo número de Fermat - , lleva mucho más tiempo que encontrar el divisor del duodécimo número de Fermat (porque su divisor 114689 es mucho más pequeño, aunque el número en sí consta de más de 1200 dígitos decimales).

Como parte del proyecto Cunningham , el algoritmo de Pollard ayudó a encontrar un divisor de 19 dígitos de largo . También se podían encontrar grandes divisores, pero el descubrimiento del método de factorización de la curva elíptica hizo que el algoritmo de Pollard no fuera competitivo [9] .

Descripción del algoritmo

Versión original

Consideramos una sucesión de enteros , tal que y , donde  es el número a factorizar . El algoritmo original se ve así [10] [6] :

1. Se calculan los triples de números , donde . Además, cada uno de esos triples se obtiene del anterior. 2. Cada vez que un número es un múltiplo de otro número (por ejemplo, ), calcula el máximo común divisor mediante cualquier método conocido. 3. Si , entonces se encuentra una descomposición parcial del número , y . El divisor encontrado puede ser compuesto, por lo que también debe factorizarse. Si el número es compuesto, continuamos el algoritmo con módulo . 4. Los cálculos se repiten una vez. Si al mismo tiempo no se factorizó completamente el número, por ejemplo, se elige otro número inicial .

Versión moderna

Sea un entero positivo compuesto que desea factorizar. El algoritmo se ve así [11] :

  1. Se selecciona aleatoriamente un pequeño número [12] y se construye una secuencia , definiendo cada siguiente como .
  2. Simultáneamente, en cada i -ésimo paso, se calcula para algunos , tal que , por ejemplo, .
  3. Si , entonces el cálculo finaliza y el número encontrado en el paso anterior es un divisor de . Si no es un número primo, entonces se continúa con el procedimiento de búsqueda del divisor, tomando como número .

En la práctica, la función se elige no demasiado difícil de calcular (pero al mismo tiempo no es un polinomio lineal), siempre que no genere un mapeo uno a uno. Por lo general , las funciones [12] o [13] se seleccionan como . Sin embargo, las funciones y no encajan [10] .

Si se sabe que el divisor de un número es válido para algunos , entonces tiene sentido usar [10] .

Una desventaja significativa del algoritmo en esta implementación es la necesidad de almacenar una gran cantidad de valores anteriores .

Mejoras en el algoritmo

La versión original del algoritmo tiene una serie de inconvenientes. Por el momento, hay varios enfoques para mejorar el algoritmo original.

deja _ Entonces, si , entonces , por lo tanto, si un par da una solución, entonces cualquier par dará una solución .

Por lo tanto, no hay necesidad de verificar todos los pares , pero podemos restringirnos a pares de la forma , donde , y recorre el conjunto de valores consecutivos 1, 2, 3, ..., y toma valores de el intervalo Por ejemplo, , y [11] .

Esta idea fue propuesta por Richard Brent en 1980 [14] y reduce el número de operaciones realizadas en aproximadamente un 25% [15] .

Floyd desarrolló otra variación del algoritmo ρ de Pollard . Según Floyd, el valor se actualiza en cada paso de acuerdo con la fórmula , por lo que los valores , se obtendrán en el paso y el GCD en este paso se calcula para y [11] .

Un ejemplo de factorización de un número

Este ejemplo demuestra claramente el algoritmo ρ de factorización (versión del algoritmo, con la mejora de Floyd ), para el número N = 8051:

Tabla: factorización del número 8051
n = 8051, F ( x ) = ( x 2 + 1) mod n , x 0 = y 0 = 2
i x yo = F ( x yo -1 ) y yo = F ( F ( y yo -1 )) MCD(| x yo − y yo |, 8051)
una 5 26 una
2 26 7474 una
3 677 871 97

Usando otras variantes del polinomio , también se puede obtener un divisor de 83:

Tabla: factorización del número 8051
n = 8051, F ( x ) = ( x 2 + 3) mod n , x 0 = y 0 = 2
i x yo = F ( x yo -1 ) y yo = F ( F ( y yo -1 )) MCD(| x yo − y yo |, 8051)
una 7 52 una
2 52 1442 una
3 2707 778 una
cuatro 1442 3932 83

Por lo tanto, d 1 \u003d 97, d 2 \u003d 83 son divisores no triviales del número 8051.

Después de encontrar el divisor del número, en el algoritmo ρ se propone continuar con los cálculos y buscar los divisores del número si no es primo. En este ejemplo simple, este paso no era necesario [11] .

Justificación del algoritmo ρ de Pollard

El algoritmo se basa en la conocida paradoja del cumpleaños .

La paradoja del cumpleaños, brevemente:
Vamos . Para una muestra aleatoria de elementos cada uno menor que , donde , la probabilidad de que dos elementos sean iguales .

Cabe señalar que la probabilidad en la paradoja del cumpleaños se alcanza en .

Deje que la secuencia consista en diferencias , verificadas durante el algoritmo. Se determina una nueva sucesión , donde ,  es el menor de los divisores del número .

Todos los miembros de la secuencia son menores que . Si la consideramos como una secuencia aleatoria de enteros menores que , entonces, según la paradoja del cumpleaños, la probabilidad de que entre sus miembros caigan dos iguales será mayor cuando , entonces debe ser al menos .

Si , entonces , es decir, para algún número entero . Si , que se cumple con alta probabilidad, entonces el divisor deseado del número se encontrará como . Dado que , entonces con una probabilidad superior a , el divisor se encontrará en iteraciones [11] .

Complejidad del algoritmo

Para estimar la complejidad del algoritmo , la secuencia construida en el curso de los cálculos se considera aleatoria (por supuesto, no se puede hablar de ningún rigor en este caso). Para factorizar completamente un número de bits de longitud , basta encontrar todos sus divisores que no excedan de , lo que requiere un máximo del orden de las operaciones aritméticas, u operaciones de bits.

Por lo tanto, la complejidad del algoritmo se estima como [16] . Sin embargo, esta estimación no tiene en cuenta la sobrecarga de calcular el máximo común divisor . La complejidad del algoritmo obtenida, aunque no exacta, está en buen acuerdo con la práctica.

La siguiente afirmación es verdadera: sea  un número compuesto . Entonces existe una constante tal que, para cualquier número positivo, la probabilidad del evento de que el algoritmo ρ de Pollard no encuentre un divisor no trivial en el tiempo no exceda de . Esta afirmación se deriva de la paradoja de los cumpleaños [17] .

Funciones de implementación

La cantidad de memoria utilizada por el algoritmo se puede reducir significativamente.

int Rho-Pollard ( int N) { int x = aleatorio (1, N-2); int y = 1; int i = 0; etapa int = 2; while (N.O.D.(N, abs (x - y)) == 1) { si (i == etapa){ y=x; etapa = etapa*2; } x = (x*x + 1) (módulo N); yo = yo + 1; } devuelve NOD (N, abs (xy)); }

En esta versión, el cálculo requiere almacenar solo tres variables , y , lo que distingue al algoritmo en tal implementación de otros métodos de factorización de números [11] .

Paralelización de algoritmos

El algoritmo de Pollard permite la paralelización utilizando tanto sistemas de memoria compartida como sistemas de memoria distribuida ( mensaje de paso ), pero el segundo caso es el más interesante desde un punto de vista práctico [18] .

Sistema de memoria distribuida

El método de paralelización existente radica en que cada nodo de cómputo ejecuta el mismo algoritmo secuencial , sin embargo, el número y/o polinomio original se toma de manera diferente. Para simplificar la paralelización, se propone recibirlos de un generador de números aleatorios. Sin embargo, tal implementación paralela no proporciona una aceleración lineal [19] .

Supongamos que hay artistas idénticos. Si usamos diferentes secuencias (es decir, diferentes polinomios ), entonces la probabilidad de que los primeros números en estas secuencias sean de diferente módulo será aproximadamente igual a . Por lo tanto, la aceleración máxima se puede estimar como [9] .

Richard Crandall sugirió que se puede lograr la aceleración , pero esta afirmación aún no se ha verificado [20] .

Sistema de memoria compartida

El método anterior obviamente puede usarse en sistemas con memoria compartida, sin embargo, es mucho más razonable usar un solo generador [21] .

Notas

  1. 1 2 Pollard, 1974 , p. 521–528.
  2. Christensen, 2009 , 3.3.3.0.
  3. Chatterjee, 2008 , 5.2.2.
  4. Floyd, 1967 , pág. 636–644.
  5. Brent, 1980 , Un algoritmo de factorización Monte Carlo mejorado, p. 176.
  6. 1 2 3 Pollard, 1975 , Un método Monte Carlo para la factorización, p. 176.
  7. Koshy, 2007 , Teoría elemental de números con aplicaciones.
  8. Childs, 2009 , Una introducción concreta al álgebra superior.
  9. 1 2 Brent, 1999 , Algunos algoritmos paralelos para la factorización de enteros.
  10. 1 2 3 Pollard, 1975 , Un método de Monte Carlo para la factorización.
  11. 1 2 3 4 5 6 Ishmukhametov, 2011 , pág. 64.
  12. 1 2 Mollin, 2006 , pág. 215-216.
  13. Zolotykh N. Yu. Conferencias sobre álgebra informática. Tema 11. Método ρ de Pollard. Archivado el 30 de octubre de 2014 en Wayback Machine .
  14. Brent, 1980 , Un algoritmo de factorización Monte Carlo mejorado, p. 176-184.
  15. Reisel, 2012 , Áreas seleccionadas en criptografía. Números primos y métodos informáticos de factorización. 2ª ed..
  16. Cormen, 2001 , Introducción a los algoritmos. Sección 31.9. Factorización de enteros. Heurística rho de Pollard.
  17. Ishmukhametov, 2011 , pág. 63.
  18. Kosyakov, 2014 , pág. 12
  19. Kuhn, 2001 , Random Walks Revisited: Extensions of Pollard's Rho Algorithm for Computing Multiple Discrete Logarithms, p. 212-229.
  20. Crandall, 1999 , Paralelización de la factorización de Polldar-rho.
  21. Kosyakov, 2014 , pág. 19

Literatura