Introduction :
Nous avons appris en cours à déterminer le de deux nombres entiers et en nous servant de l’algorithme d’Euclide.
Dans cette fiche, nous allons tout simplement voir comment programmer cet algorithme en Python. Bien sûr, votre calculatrice dispose déjà d’une fonction qui calcule directement le de deux entiers, mais cela nous permettra de bien comprendre l’algorithme d’Euclide et de programmer un algorithme simple en Python.
Algorithme d’Euclide
Algorithme d’Euclide
Rappelons avant tout en quoi consiste l’algorithme d’Euclide.
Commençons par nous souvenir de cette propriété.
Pour tout entier relatif , nous avons :
Nous avons aussi appris et démontré la propriété suivante.
Soit et deux entiers naturels non nuls, et le reste de la division euclidienne de par .
- Nous avons alors : .
Voici en quoi consiste l’algorithme d’Euclide :
- nous effectuons d’abord la division euclidienne de par , obtenons le reste ;
- ensuite, pour chaque division suivante et tant que le reste obtenu est différent de :
- le diviseur de la division précédente devient dividende,
- le reste de la division précédente devient diviseur.
- Le de et sera égal au dernier reste non nul.
Illustrons par un petit tableau cet algorithme :
Division | Dividende | Diviseur | Reste | ||
… | … | … | … | … | … |
- .
Prenons un exemple et déterminons le de et :
Division | Dividende | Diviseur | Reste | ||
- .
Algorithme Python
Algorithme Python
Une fois la logique de l’algorithme Python bien compris, le programme Python correspondant devient assez simple à réaliser.
- Nous créons la fonction , qui prendra pour paramètres les deux entiers strictement positifs et :
- Nous allons effectuer les divisions successives tant que le reste obtenu est non nul.
- C’est donc notre condition pour notre boucle :
\text{while a \% b != 0:} |
Opérateurs Python pour la division euclidienne :
- renvoie le reste de la division euclidienne de par ;
- renvoie le quotient (entier) de la division euclidienne de par .
- Comme nous l’avons dit plus haut, le diviseur de la division précédente devient le dividende, et le reste de la division précédente devient le diviseur.
- Nous assignons donc à la valeur de et à le reste de la division euclidienne de par :
Il ne faut surtout pas écrire :
En effet, avec ce code, quand la nouvelle valeur de est assignée, a déjà sa nouvelle valeur, soit celle de , et nous obtiendrions systématiquement .
Pour résoudre ce problème, nous pouvons créer une variable intermédiaire :
Toutefois, la solution que nous avons choisie plus haut est la plus directe et permet de ne pas créer inutilement une nouvelle variable.
- Lorsqu’on sortira de la boucle, contiendra le dernier reste non nul.
- Nous l’affichons donc :
L’algorithme est terminé :
\begin{aligned} \textcolor{#A9A9A9}{\text{1}}&\quad\text{def pgcd(a, b):} \ \textcolor{#A9A9A9}{\text{2}}&\quad\qquad\text{while a \% b != 0:} \ \textcolor{#A9A9A9}{\text{3}}&\quad\qquad\qquad\text{a, b = b, a \% b} \ \textcolor{#A9A9A9}{\text{4}}&\quad\qquad\text{print(b)} \end{aligned} |
- Vous pouvez vérifier que vous trouvez le même résultat que dans la première partie pour le de et .
Terminons par quelques remarques.
Que se passe-t-il si ?
Le reste de la division euclidienne de par sera égal à .
Au premier tour de boucle, les valeurs de et seront inversées et nous aurons alors .
- Ainsi, il est inutile de différencier les cas et , puisqu’on se ramène toujours et rapidement au premier.
Nous avons en outre considéré que et étaient des entiers naturels non nuls.
Que se passe-t-il si est nul ?
Eh bien, étant un multiple de tout nombre entier, le reste de la division euclidienne de par tout nombre entier sera égal à .
Nous n’entrons ainsi pas dans la boucle et l’algorithme renverra la valeur intiale de .
- Ce qui est juste, puisque nous savons que, pour tout entier naturel , .
Maintenant, que se passe-t-il si c’est qui est nul ?
Ici, effectivement, notre programme ne va pas aimer cette tentative de division par …
- À vous de compléter l’algorithme pour qu’il prenne en compte de ce cas particulier !
Enfin, nous avons travaillé avec et entiers naturels.
Nous pourrions aussi compléter l’algorithme pour qu’il fonctionne aussi pour des entiers relatifs, en renvoyant bien une valeur positive.
- Encore à vous de jouer ! Il suffit de se rappeler que, pour tout et entiers relatifs :
Pour prendre la valeur absolue d’un nombre en Python, on fait appel à la fonction :