stringtranslate.com

Algoritmo rho de Pollard para logaritmos

El algoritmo rho de Pollard para logaritmos es un algoritmo introducido por John Pollard en 1978 para resolver el problema de logaritmos discretos , análogo al algoritmo rho de Pollard para resolver el problema de factorización de enteros .

El objetivo es calcular tal que , donde pertenece a un grupo cíclico generado por . El algoritmo calcula números enteros , , y tales que . Si el grupo subyacente es cíclico de orden , al sustituir as y notar que dos potencias son iguales si y solo si los exponentes son equivalentes módulo el orden de la base, en este caso módulo , obtenemos que es una de las soluciones de la ecuación. . Las soluciones a esta ecuación se obtienen fácilmente utilizando el algoritmo euclidiano extendido .

Para encontrar el , , y necesario, el algoritmo utiliza el algoritmo de búsqueda de ciclos de Floyd para encontrar un ciclo en la secuencia , donde se supone que la función tiene un aspecto aleatorio y, por lo tanto, es probable que entre en un bucle de longitud aproximada después de los pasos. Una forma de definir dicha función es utilizar las siguientes reglas: Partición en tres subconjuntos separados , y de tamaño aproximadamente igual utilizando una función hash . Si está dentro, entonces duplica ambos y ; si entonces incrementa , si entonces incrementa .

Algoritmo

Sea un grupo cíclico de orden , y dado , y una partición , sea la aplicación

y definir mapas y por

entrada:  a : un generador de G  b : un elemento de G salida: Un número entero x tal que a x = b , o fallaInicializar i ← 0, a 0 ← 0, b 0 ← 0, x 0 ← 1 ∈ Gbucle  yoyo + 1 x yof ( x yo −1 ), a yogramo ( x yo −1 , a yo −1 ), segundo yoh ( x yo −1 , segundo yo −1 ) x 2 yo −1f ( x 2 yo −2 ), a 2 yo −1gramo ( x 2 yo −2 , a 2 yo −2 ), segundo 2 yo −1h ( x 2 yo −2 , segundo 2 yo −2 ) x 2 yof ( x 2 yo −1 ), un 2 yogramo ( x 2 yo −1 , un 2 yo −1 ), segundo 2 yoh ( x 2 yo −1 , b 2 i −1 ) mientras  x ix 2 irb ib 2 i si r = 0 retorno fallido retorno  r −1 ( a 2 ia i ) mod n

Ejemplo

Considere, por ejemplo, el grupo generado por módulo 2 (el orden del grupo es , 2 genera el grupo de unidades módulo 1019). El algoritmo se implementa mediante el siguiente programa C++ :

#incluir <stdio.h> constante int norte = 1018 , norte = norte + 1 ; /* N = 1019 -- primo */ const int alpha = 2 ; /* generador */ const int beta = 5 ; /* 2^{10} = 1024 = 5 (N) */                    void new_xab ( int & x , int & a , int & b ) { cambiar ( x % 3 ) { caso 0 : x = x * x % N ; a = a * 2 % norte ; segundo = segundo * 2 % norte ; romper ; caso 1 : x = x * alfa % N ; un = ( un + 1 ) % norte ; romper ; caso 2 : x = x * beta % N ; segundo = ( segundo + 1 ) % norte ; romper ; } }                                                               int principal ( vacío ) { int x = 1 , a = 0 , b = 0 ; int X = x , A = a , B = b ; for ( int i = 1 ; i < n ; ++ i ) { new_xab ( x , a , b ); nuevo_xab ( X , A , B ); nuevo_xab ( X , A , B ); printf ( "%3d %4d %3d %3d %4d %3d %3d \n " , i , x , a , b , X , A , B ); si ( x == X ) romper ; } devolver 0 ; }                                                         

Los resultados son los siguientes (editados):

ixab XAB------------------------------ 1 2 1 0 10 1 1 2 10 1 1 100 2 2 3 20 2 1 1000 3 3 4 100 2 2 425 8 6 5 200 3 2 436 16 14 6 1000 3 3 284 17 15 7 981 4 3 986 17 17 8 425 8 6 194 17 19................................48 224 680 376 86 299 41249 101 680 377 860 300 41350 505 680 378 101 300 41551 1010 681 378 1010 301 416

Eso es y así , para lo cual es una solución como se esperaba. Como no es primo , existe otra solución , para la cual se cumple.

Complejidad

El tiempo de ejecución es de aproximadamente . Si se usa junto con el algoritmo de Pohlig-Hellman , el tiempo de ejecución del algoritmo combinado es , donde es el factor primo más grande de .

Referencias