stringtranslate.com

Algoritmo rho de Pollard

El algoritmo rho de Pollard es un algoritmo de factorización de números enteros . Fue inventado por John Pollard en 1975. [1] Utiliza solo una pequeña cantidad de espacio y su tiempo de ejecución esperado es proporcional a la raíz cuadrada del factor primo más pequeño del número compuesto que se está factorizando.

Ideas centrales

El algoritmo se utiliza para factorizar un número , donde es un factor no trivial. Se utiliza un polinomio módulo , llamado (por ejemplo, ), para generar una secuencia pseudoaleatoria . Es importante tener en cuenta que debe ser un polinomio. Se elige un valor inicial, digamos 2, y la secuencia continúa como , , , etc. La secuencia está relacionada con otra secuencia . Dado que no se conoce de antemano, esta secuencia no se puede calcular explícitamente en el algoritmo. Sin embargo, en ella reside la idea central del algoritmo.

Como el número de valores posibles para estas secuencias es finito, tanto la secuencia, que es mod , como la secuencia se repetirán eventualmente, aunque estos valores sean desconocidos. Si las secuencias se comportaran como números aleatorios, la paradoja del cumpleaños implica que se esperaría que el número de antes de que ocurra una repetición fuera , donde es el número de valores posibles. Por lo tanto, la secuencia probablemente se repetirá mucho antes que la secuencia . Cuando se ha encontrado un tal que pero , el número es un múltiplo de , por lo que se ha encontrado un divisor no trivial. [2]

Una vez que una secuencia tiene un valor repetido, la secuencia se cíclica, porque cada valor depende únicamente del anterior. Esta estructura de ciclado eventual da lugar al nombre de "algoritmo rho", debido a la similitud con la forma de la letra griega ρ cuando los valores , , etc. se representan como nodos en un grafo dirigido .

Diagrama de ciclo que se asemeja a la letra griega  ρ

Esto se detecta mediante el algoritmo de búsqueda de ciclos de Floyd : se mantienen dos nodos y (es decir, y ). En cada paso, uno se mueve al siguiente nodo en la secuencia y el otro avanza dos nodos. Después de eso, se verifica si . Si no es 1, entonces esto implica que hay una repetición en la secuencia (es decir . Esto funciona porque si es igual a , la diferencia entre y es necesariamente un múltiplo de . Aunque esto siempre sucede eventualmente, el máximo común divisor (MCD) resultante es un divisor de distinto de 1. Esto puede ser en sí mismo, ya que las dos secuencias podrían repetirse al mismo tiempo. En este caso (poco común) el algoritmo falla y puede repetirse con un parámetro diferente.

Algoritmo

El algoritmo toma como entradas n , el entero a factorizar; y ⁠ ⁠ , un polinomio en x calculado módulo n . En el algoritmo original, , pero hoy en día es más común utilizar . La salida es un factor no trivial de n o un fallo.

Realiza los siguientes pasos: [2]

Pseudocódigo para el algoritmo rho de Pollard

 x ← 2 // valor inicial y ← x d ← 1 mientras d = 1: x ← g(x) y ← g(g(y)) d ← mcd(|x - y|, n) si d = n: devuelve fallo  de lo contrario : devuelve d

Aquí x e y corresponden a ⁠ ⁠ y ⁠ ⁠ en la sección anterior. Nótese que este algoritmo puede fallar en encontrar un factor no trivial incluso cuando n es compuesto. En ese caso, el método puede probarse nuevamente, utilizando un valor inicial de x distinto de 2 ( ) o un , , diferente con .

Ejemplo de factorización

Sea y .

Ejemplo de factorización del algoritmo rho de Pollard para y , con valor inicial 2. El ejemplo utiliza el algoritmo de búsqueda de ciclos de Floyd .

Ahora 97 es un factor no trivial de 8051. Valores iniciales distintos de x = y = 2 pueden dar el cofactor (83) en lugar de 97. Se muestra una iteración adicional arriba para dejar en claro que y se mueve el doble de rápido que x . Nótese que incluso después de una repetición, el MCD puede volver a 1.

Variantes

En 1980, Richard Brent publicó una variante más rápida del algoritmo rho. Utilizó las mismas ideas básicas que Pollard pero un método diferente de detección de ciclos, reemplazando el algoritmo de búsqueda de ciclos de Floyd por el método de búsqueda de ciclos de Brent relacionado . [3] CLRS proporciona un análisis heurístico y condiciones de falla ( se encuentra el divisor trivial). [2]

Pollard y Brent realizaron una mejora adicional. Observaron que si , entonces también para cualquier entero positivo . En particular, en lugar de calcular en cada paso, basta con definir como el producto de 100 términos consecutivos módulo , y luego calcular un solo . Se produce una aceleración importante ya que 100 pasos de mcd se reemplazan con 99 multiplicaciones módulo y un solo mcd . Ocasionalmente puede hacer que el algoritmo falle al introducir un factor repetido, por ejemplo cuando es un cuadrado . Pero entonces basta con volver al término de mcd anterior, donde , y usar el algoritmo ρ regular a partir de allí. [nota 1]

Solicitud

El algoritmo es muy rápido para números con factores pequeños, pero más lento en casos en los que todos los factores son grandes. El éxito más notable del algoritmo ρ fue la factorización en 1980 del número de Fermat F 8 = 1238926361552897 × 93461639715357977769163558199606896584051237541638188580280321. [4] El algoritmo ρ fue una buena elección para F 8 porque el factor primo p = 1238926361552897 es mucho más pequeño que el otro factor. La factorización tomó 2 horas en un UNIVAC 1100/42 . [4]

Ejemplo: factorizaciónnorte= 10403 = 101 · 103

La siguiente tabla muestra los números producidos por el algoritmo, comenzando con y utilizando el polinomio . La tercera y cuarta columnas de la tabla contienen información adicional que el algoritmo no conoce. Se incluyen para mostrar cómo funciona el algoritmo.

La primera repetición módulo 101 es 97, que se produce en el paso 17. La repetición no se detecta hasta el paso 23, cuando . Esto hace que sea , y se encuentra un factor.

Complejidad

Si el número pseudoaleatorio que aparece en el algoritmo ρ de Pollard fuera un número aleatorio real, se deduciría que el éxito se lograría la mitad de las veces, mediante la paradoja del cumpleaños en las iteraciones. Se cree que el mismo análisis se aplica también al algoritmo rho real, pero se trata de una afirmación heurística y el análisis riguroso del algoritmo sigue abierto. [5]

Véase también

Notas

  1. ^ Ejercicio 31.9-4 en CLRS

Referencias

  1. ^ Pollard, JM (1975). "Un método de Monte Carlo para la factorización" (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. y Stein, Clifford (2009). "Sección 31.9: Factorización de enteros". Introducción a los algoritmos (tercera edición). Cambridge, MA: MIT Press. págs. 975–980. ISBN 978-0-262-03384-8.(Esta sección analiza únicamente el algoritmo rho de Pollard).
  3. ^ Brent, Richard P. (1980). "Un algoritmo de factorización de Monte Carlo mejorado". BIT . 20 (2): 176–184. doi :10.1007/BF01933190. S2CID  17181286.
  4. ^ ab Brent, RP; Pollard, JM (1981). "Factorización del octavo número de Fermat". Matemáticas de la computación . 36 (154): 627–630. doi : 10.2307/2007666 . JSTOR  2007666.
  5. ^ Galbraith, Steven D. (2012). "14.2.5 Hacia un análisis riguroso de Pollard rho". Matemáticas de la criptografía de clave pública. Cambridge University Press. págs. 272-273. ISBN 9781107013926..

Lectura adicional

Enlaces externos