User:Thibulle/sandbox

L’algorithme de PGCD de Lehmer, nommé après Derrick Henry Lehmer, est un algorithme de calcul de PGCD. Il s’agit d’une amélioration de l’alogrithme d’Euclide, plus simple mais plus lent.

Il est principalement utilisé pour des grands entiers qui ont une écriture naturelle dans une certaine base numérique choisie, comme β =1000 ou β =232.

Algorithme
Cet algorithme repose sur le constat suivant : lorsqu’on utilise l’algorithme d’Euclide, la plupart des quotients observés sont petits (Knuth a observé que 67.7 % des quotients sont des 1, des 2 ou des 3 ). Ces petits quotients peuvent être repérés simplement en regardant les quelques premiers chiffres des entiers dont on cherche le PGCD. Ainsi, l’algorithme commence par séparer ces quelques premiers chiffres, et calcule les séquences de quotients tant qu’elles sont correctes.

Cherchons à calculer le PGCD de $$x$$ et $$y$$, avec $$x>y$$ et notons $$ \beta$$ la base dans laquelle on travaille.

Si $$ y$$ ne contient qu'un chiffre dans la décomposition en base $$\beta$$, c'est à dire $$ y<\beta$$, alors on applique l'algorithme d'Euclide classique.

Sinon, on se place dans le cas où les écritures de $$ x$$ et $$ y$$ dans la base $$\beta$$ sont de même taille $$ m$$. (S'il advenait que ce ne soit pas le cas, on peut diviser $$ x$$ par une valeur adéquate pour se ramener à ce cas là.

Boucle externe : tant que $$x \neq 0$$ et $$ y \neq 0$$ :


 * On travaille avec les chiffres dominants de $$ x $$ et $$ y$$,$$\begin{cases} x' = x \ div \ \beta^{m-1}\\ y' = y \ div \ \beta^{m-1} \end{cases}$$ et on initiale la matrice $$ M = \begin{bmatrix} a & b & x' \\ c & d & y' \end{bmatrix} =\begin{bmatrix} 1 & 0 & x' \\ 0 & 1 & y' \end{bmatrix}$$;
 * On va, dans la boucle interne qui suit, effectuer l'algorithme d'Euclide sur $$ (x' +a,y'+c)$$ et $$ (x' +b,y'+d) $$simultanément jusqu'a ce que leurs quotients (dans les divisions euclidiennes effectuées) différent. On calcule donc $$ q$$ et $$ q'$$ les quotients des divisions euclidiennes : $$ \begin{cases} x' +a =(y' +c)*q + r \\ x' + c = (y'+d)*q' +r'\end{cases}$$.
 * Boucle interne : tant que $$ q \neq q'$$ :
 * On continue l'algorithme d'Euclide, c'est à dire on effectue $$ \begin{cases} x' +a \rightarrow y'+c \\ y'+c \rightarrow r = (x'+a) - (y'+c)*q \end{cases}$$ et$$ \begin{cases} x' +b \rightarrow y'+d \\ y'+d \rightarrow r' = (x'+b) - (y'+d)*q' \end{cases}$$
 * Cela revient exactement modifier la matrice $$ M$$ par la transformation$$ M \rightarrow \begin{bmatrix}0 & 1 \\ 1 & -q \end{bmatrix}*M = \begin{bmatrix} c & d & y'\\ a-qc & b-qd & x'-qy \end{bmatrix}$$
 * On calcule maintenant les nouveaux quotients $$ q$$ et $$ q'$$ et on reprend au début de la interne en en sortant si $$ q = q'$$.
 * Fin de la boucle interne
 * Si maintenant $$ b \neq 0$$, alors on reprend au début de la boucle externe en modifiant $$ x$$ et $$ y$$ par $$ \begin{bmatrix} x\\y \end{bmatrix} \rightarrow M*\begin{bmatrix} x\\y \end{bmatrix}$$
 * Si $$ b$$ est nul, on a atteint une impasse et on effectue une étape classique ce l'algorithme d'Euclide sur $$ x$$ et $$ y$$ avant de reprendre au début de la boucle externe.
 * Fin de la boucle externe

On calcule enfin $$ pgcd(x,y)$$ ce qui est immédiat car $$ x=0$$ ou $$ y =0$$.