Considérons un groupe cyclique d'ordre engendré par . Le but est de calculer tel que , où appartient à . L'algorithme cherche des entiers , , , et tels que . Une fois de tels entiers trouvés, l'inconnue est l'une des solutions de l'équation , autrement dit , où est l'inverse modulaire de .
Pour trouver les entiers , , , et l'algorithme utilise l'algorithme du lièvre et de la tortue pour trouver un cycle dans les séquences . Autrement dit les entiers , sont des valeurs prises par , et les entiers et sont les valeurs prises par , .
On définit la suite par où est une fonction supposée pseudo-aléatoire : ainsi on a des chances d'entrer dans une boucle de longueur approximative après étapes[1]. Un moyen[réf. nécessaire] de définir une telle fonction est d'utiliser les règles suivantes : diviser en trois sous-ensembles disjoints de tailles approximativement égales : , , et . Si appartient à alors multiplier par deux et ; si alors incrémenter , si alors incrémenter .
Algorithme
Soit G un groupe cyclique d'ordre n. Soient . Soit une partition .
Soit une fonction définie par
et soient enfin les deux fonctions et définies par
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 GSortie : un entier x tel que x = , ou "échec"
a0 ← 0, b0 ← 0, x0 ← 1
i ← 1
bouclexi ← f(xi-1),
ai ← g(xi-1, ai-1),
bi ← h(xi-1, bi-1)
x2i ← f(f(x2i-2)),
a2i ← g(f(x2i-2), g(x2i-2, a2i-2)),
b2i ← h(f(x2i-2), h(x2i-2, b2i-2))
sixi = x2ialorsr ← bi - b2isi r = 0 retourner "échec"
retournerr−1(a2i - ai) mod nsinon # xi ≠ x2ii ← i+1
Exemple
Considérons par exemple le groupe engendré par 2 modulo (l'ordre du groupe est ). L'algorithme est implémenté par le programme suivant écrit en C++ :
Ce qui donne et ainsi , pour lequel est une solution comme on l'avait prévu. Comme n'est pas premier, il y a une autre solution , pour laquelle convient.