Algorithme rho de Pollard (logarithme discret)

De testwiki
Aller à la navigation Aller à la recherche

L'algorithme rho de Pollard a été introduit par John M. Pollard en 1978 pour résoudre le problème du logarithme discret. Il est analogue à l'algorithme rho de Pollard que le même auteur avait introduit pour résoudre le problème factorisation entière.

Principe

On considère un groupe cyclique G d'ordre n engendré par α. Le but est de calculer γ tel que αγ=β, où β appartient à G. L'algorithme cherche des entiers a, b, A, et B tels que αaβb=αAβB. Une fois de tels entiers trouvés, l'inconnue γ est l'une des solutions de l'équation (Bb)γ=(aA)(modn), autrement dit γ=(Bb)1(aA)(modn), où (Bb)1est l'inverse modulaire de (Bb).

Pour trouver les entiers a, b, A, et B l'algorithme utilise l'algorithme du lièvre et de la tortue pour trouver un cycle dans les séquences xi=αaiβbi. Autrement dit les entiers a, b sont des valeurs prises par ai, bi et les entiers A et B sont les valeurs prises par a2i, b2i.

On définit la suite (xi)i par xi+1=f(xi)f est une fonction supposée pseudo-aléatoire : ainsi on a des chances d'entrer dans une boucle de longueur approximative πn8 après πn8 étapes[1]. Un moyenModèle:Référence nécessaire de définir une telle fonction est d'utiliser les règles suivantes : diviser G en trois sous-ensembles disjoints de tailles approximativement égales : S0, S1, et S2. Si xi appartient à S0 alors multiplier par deux a et b ; si xiS1 alors incrémenter a, si xiS2 alors incrémenter b.

Algorithme

Soit Modèle:Mvar un groupe cyclique d'ordre Modèle:Mvar. Soient α,βG. Soit une partition G=S0S1S2.

Soit une fonction f:GG définie par

f(x)={βxxS0x2xS1αxxS2

et soient enfin les deux fonctions g:G× et h:G× définies par

g(x,a)={axS02a (mod n)xS1a+1 (mod n)xS2h(x,b)={b+1 (mod n)xS02b (mod n)xS1bxS2

La fonction g (respectivement h) permet de calculer les valeurs ai (respectivement bi). L'algorithme est le suivant :

 Entrées : α: un générateur de G, β: un élément de G
 Sortie : un entier x tel que αx = β, ou "échec"

 a0 ← 0, b0 ← 0, x0 ← 1

 i ← 1
 boucle
     xif(xi-1), 
     aig(xi-1, ai-1), 
     bih(xi-1, bi-1)

     x2if(f(x2i-2)), 
     a2ig(f(x2i-2), g(x2i-2, a2i-2)), 
     b2ih(f(x2i-2), h(x2i-2, b2i-2))

     si xi = x2i alors
         rbi - b2i
         si r = 0 retourner "échec"
         retourner r−1(a2i - ai) mod n
     sinon # xix2i
         ii+1

Exemple

On considère par exemple le groupe engendré par 2 modulo N=1019 (l'ordre du groupe est n=1018). L'algorithme est implémenté par le programme suivant écrit en C++ :

 #include <stdio.h>
 
 const int n = 1018, N = n + 1;  /* N = 1019 -- prime     */
 const int alpha = 2;            /* generator             */
 const int beta = 5;             /* 2^{10} = 1024 = 5 (N) */
 
 void new_xab( int& x, int& a, int& b ) {
   switch( x%3 ) {
   case 0: x = x*x     % N;  a =  a*2  % n;  b =  b*2  % n;  break;
   case 1: x = x*alpha % N;  a = (a+1) % n;                  break;
   case 2: x = x*beta  % N;                  b = (b+1) % n;  break;
   }
 }
 
 int main(void) {
   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 );
     new_xab( X, A, B );
     new_xab( X, A, B );
     printf( "%3d  %4d %3d %3d  %4d %3d %3d\n", i, x, a, b, X, A, B );
     if( x == X ) break;
   }
   return 0;
 }

Les résultats sont les suivants (édités):

 i     x   a   b     X   A   B
------------------------------
 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 412
49   101 680 377   860 300 413
50   505 680 378   101 300 415
51  1010 681 378  1010 301 416

Ce qui donne 26815378=1010=23015416(mod1019) et ainsi (416378)γ=681301(mod1018), pour lequel γ1=10 est une solution comme on l'avait prévu. Comme n=1018 n'est pas premier, il y a une autre solution γ2=519, pour laquelle 2519=1014=5(mod1019) convient.

Complexité

Le temps d'exécution moyenModèle:Référence nécessaire est en 𝒪(n). Si cet algorithme est utilisé avec l'algorithme de Pohlig-Hellman,Modèle:Référence nécessaire le temps d'exécution des deux algorithmes combinés est en 𝒪(p), où p est le plus grand facteur premier de n.

Notes et références

Modèle:Traduction/Référence Modèle:Références

Annexes

Bibliographie

Articles connexes

Modèle:Portail

  1. Menezes, Oorschot et Vanstone, chap. 2, Fact 2.37