Lorsqu’on doit trouver le plus grand commun diviseur de deux entiers on pense spontanément à utiliser le théorème fondamental de l’arithmétique, soit la factorisation de chaque entier en facteurs premiers. Pourtant, cette méthode est complètement inefficace numériquement puisqu’un ordinateur ne peut pas factoriser de très grands entiers en un temps raisonnable, ce qui est à la base de protocoles de cryptographie1. Une méthode extrêmement efficace numériquement remonte à 300 ans av. J.-C. : elle est donnée par l’algorithme d’Euclide. Et cette méthode a de nombreuses applications pratiques modernes
Prenons deux entiers positifs a et b dont on veut trouver le plus grand commun diviseur, appelé PGCD de a et b. La méthode proposée par Euclide repose sur la division euclidienne.
La divison euclidienne
Étant donné deux entiers positifs c et d, il existe des entiers q et r tels que
\[c = dq + r, 0 \leq r < d.\] Si \(c = 112\) et \(d = 29\), cela nous donne \[112 = 29 \times 3 + 25.\] Regardons maintenant comment Euclide propose d’itérer ce processus pour trouver le PGCD de \(a = 112\) et \(b =29\). \[ \begin {array} {l r} 112 = 29 \times 3 + 25, &(e_1)\\ 29 = 25 \times 1 + 4, &(e_2)\\25 = 4 \times 6 + 1, &(e_3) \\ 4 = 1 \times 4 + 0. &(e_4)\end{array}\] Qu’a-t-on fait ? À la deuxième étape on a divisé b par le reste. À la troisième étape, on a divisé le premier reste par le deuxième reste. À la quatrième étape on a divisé le deuxième reste par le troisième reste. Le quatrième reste est nul. Donc on ne peut continuer. L’affirmation d’Euclide est que le dernier reste non nul, ici 1, est le PGCD de a et b.
Cela peut sembler plus compliqué que de décomposer a et b en facteurs premiers. Pour nous, oui ! Mais pas pour un ordinateur. Malgré de la recherche intensive pour améliorer les algorithmes de factorisation, la décomposition en facteurs premiers demeure très gourmande en temps et impossible à réaliser en un temps raisonnable si a et b sont grands. Alors que la division euclidienne et l’algorithme d’Euclide sont très efficaces numériquement ! C’est donc l’algorithme d’Euclide qui est préprogrammé dans les logiciels calculant le PGCD de deux nombres.
Le cas général de l’algorithme d’Euclide apparaît dans l’encadré.
Exploiter l’algorithme
Cet algorithme a beaucoup plus à nous offrir que de trouver le PGCD de a et b. Revenons à notre exemple et remontons les équations une à une à partir de l’avant dernière \((e_3)\), soit celle dont le reste est le PGCD de a et b. L’équation \((e_3)\) est équivalente à :
\[\begin{array}{r l r}1 = 25 – 4 \times 6.&&(1) \end{array}\]
L’équation \((e_2)\) nous donne
\[\begin{array}{r l r}4 = 29 – 25 \times 1. &&(2)\end{array}\]
Remplaçons (2) dans (1) :
\[\begin{array}{r l r}1 &= 25 – (29 – 25 \times 1) \times 6 \\ &= 25 \times 7 – 29 \times 6. &(3)\end{array}\]
L’équation \((e_1)\) nous donne
\[\begin{array}{r l r}25 = 112 – 29 \times 3. &&(4)\end{array}\]
Remplaçons (4) dans (3) :
\[\begin{array}{r l r}1& = (112 – 29 \times 3) \times 7 – 29 \times 6 \\&= 112 \times 7 – 29 \times 27. &(5)\end{array}\]
C’est cette dernière expression qui nous intéresse : on a écrit le PGCD de 112 et 29 sous la forme
\[1 = 112 \times 7 + 29 \times (–27).\]
soit sous la forme :
\[\begin{array}{r l r}PGCD(a, b) = ac + bd, &&(^*)\end{array}\]
où c et d sont deux entiers relatifs. Cette dernière relation, tout à fait générale, est appelée théorème de Bezout. C’est elle qui est utilisée dans les applications pratiques, le plus souvent quand a et b sont relativement premiers, et donc quand PGCD(a, b) = 1. Une de ces applications se trouve dans l’article « Ne léser aucun héritier » de ce numéro.
Le fait que la factorisation d’un grand nombre entier est difficile est à la base du protocole de cryptographie RSA utilisé dans beaucoup de transactions où on doit fournir un NIP secret : ce NIP est crypté lors de la transmission et lisible seulement par le récepteur. Récupérer le NIP utilise une manipulation basée sur le théorème de Bezout.
L’algorithme d’Euclide
L’algorithme pour trouver le PGCD de deux entiers a et b a été proposé par Euclide près de 300 ans avant notre ère. Il utilise en boucle la division euclidienne. Plus de deux millénaires avant la programmation informatique, la méthode est résolument moderne et très rapide numériquement. Sans perte de généralité, on peut supposer que \(a \geq b\). On fait la division euclidienne de a par b :
\[\begin{array}{l l r}a = bq_1 r_1, 0 \leq r_1 < b. &&(E_1) \end{array}\] Si \(r_1 > 0\), on fait la division de \(b\) par \(r_1\) :
\[\begin{array}{l l r}b = r_1q_2 + r_2, 0 \leq r_2 < r_1. &&(E_2) \end{array}\] Si \(r_2 > 0\), on fait la division de \(r_1\) par \(r_2\) :
\[\begin{array}{l l r}r_1 = r_2q_3 + r_3, 0 \leq r_3 < r2 . &&(E_3) \end{array}\] On itère… Si \(r_n > 0\), on fait la division de \(r_{n–1}\) par \(r_n\) :
\[\begin{array}{l l r}r_{n-1} = r_nq_{n+1} + r_{n+1}, 0 \leq r_{n+1} < r_n . &&(E_{n+1}) \end{array}\] Regardons la suite des restes : \[0 \leq r_{n+1}< r_n < … < r_2 < r_1.\] On ne peut continuer indéfiniment sans arriver à un reste nul. Supposons que \(r_{n+1}\) soit le premier reste nul. Alors, on peut montrer que l’avant dernier reste, soit \(r_n\), est le PGCD de \(a\) et \(b\) (détails dans l’autre encadré).
Le dernier reste non-nul est le PGCD de \(a\) et \(b\)
Il y a deux choses à montrer :
– que \(r_n\) est un diviseur de \(a\) et \(b\);
– que parmi tous les diviseurs de \(a\) et \(b\), \(r_n\) est le plus grand, et donc que tout diviseur \(d\) de \(a\) et \(b\) divise \(r_n\).
Pour montrer que \(r_n\) divise \(a\) et \(b\), on remonte les équations une à une à partir de \((E_{n+1})\) : cette équation nous dit que \(r_n\) divise \(r_{n–1}\). L’équation \((E_n)\) s’écrit :
\[\begin{array}{l l r}r_{n–2} = r_{n–1} q_n + r_n. &&(E_n)\end{array}\]
Puisque \(r_n\) divise \(r_{n–1}\), alors \(r_n\) divise \(r_{n–2}\). Etc. De l’équation \((E_2)\), on tirera que \(r_n\) divise \(b\), et de l’équation \((E_1)\), on tirera que \(r_n\) divise \(a\).
Pour montrer que tout diviseur \(d\) de \(a\) et \(b\) divise \(r_n\) on fait le contraire et on descend les équations une à une. Si \(d\) divise \(a\) et \(b\) on tire de \((E_1)\) que \(d\) divise \(r_1\).
Dans \((E_2)\), on a que \(d\) divise \(b\) et \(r_1\), donc \(d\) divise \(r_2\). Etc., jusqu’à l’équation \((E_n)\), d’où on conclut que \(d\) divise \(r_n\).
- Voir « Facile, difficile, … » de la même auteure, Accromath, 14, été-automne, 2019. Voir aussi « L’héritage de Fermat pour la factorisation des grands nombres », Jean-Marie de Koninck, Accromath 14, été-automne, 2019. ↩