Calcul du PGCD de deux entiers

I. Utiliser le script
II. Mise en place du formulaire
III. Le script détaillé


I. Utiliser le script

Entrez deux entiers relatifs dans les deux premiers champs du formulaire, puis cliquez sur le bouton Calculer:

PGCD( , )=

II. Le formulaire


Pour commencer, nous avons besoin d'un formulaire: deux zones de texte (a et b) pour entrer le paramètres, une troisième pour afficher le résultat, et un bouton pour lancer le calcul.
<form>
<input type="text" name="a" size=12>
<input type="text" name="b" size=12>
<input type="text" name="resultat" size=12>
<input type="button" value="Calculer" onclick="calcul(this.form)">
</form>


III. Le script détaillé


- La fonction calcul(form) :
C'est la fonction principale du programme.

Tout d'abord, elle appelle la fonction check(form), qui vérifie que la saisie est correcte, c'est-à-dire que les cases a et b contiennent bien des nombres entiers. Dans le cas contraire, le script s'arrête en affichant un message d'alerte.

Si la fonction check(form) ne décèle pas d'erreur, le script continue.

Tout d'abord, on teste si l'un au moins des entiers a et b est nul (c'est la condition eval(a*b)==0). Si c'est le cas, le script retourne la plus grande des valeurs absolues de a et b (car PGCD(a,0)=|a| pour tout entier a).
Sinon, on utilise l'algorithme d'Euclide proprement dit.

L'algorithme utilise le lemme suivant:

Lemme :

Si a, b, q et r sont des entiers relatifs tels que a=bq+r, alors PGCD(a,b)=PGCD(b,r).

On effectue donc la division euclidienne de a par b. On obtient ainsi un quotient q et un reste r. Il nous faut une variable r pour cette division; la valeur de q n'a pas d'importance pour l'algorithme.

Si r est nul, alors PGCD(a,b)=PGCD(b,0)=|b|. Sinon, on effectue une nouvelle division euclidienne de b par r; comme on a |r|<|b|, on obtiendra un reste nul en au plus |b| étapes. Le dernier reste non nul (notons-le rn) vérifie PGCD(a,b)=PGCD(rn,0)=|rn|; la fonction doit donc retourner sa valeur absolue.

function calcul(form) {
 
var r;
 
if (check(form)) {               //verifie la saisie
 
 
     var a=form.a.value;               //passage des parametres
     var b=form.b.value;
 
     if (eval(a*b)==0) {                    //cas particulier: PGCD(a,0)=|a|
          form.resultat.value=max(abs(eval(a)),abs(eval(b)));
          }
     else {
          for (;abs(eval(b))>0;) {                    //l'algo lui-meme
               r=eval(a) % eval(b)
               a=b;                    //PGCD(a,b)=PGCD(b,r)
               b=r;               //on continue jusqu'a r=0
               }                    //PGCD(a,b) est le dernier r non nul
          }
     form.resultat.value=abs(a);               //renvoie le resultat
     
     }
else {
     alert("Attention! vous devez entrer des entiers!");
     }
}

- Le fonctions max(a,b) et abs(a) :

Pas grand chose à en dire; max(a,b) retourne le plus grand des deux paramètres et abs(a) retourne la valeur absolue de a.
function max(a,b) {               //explicite...
 
if (a>=b) { return(a) }
else { return(b) }
}
 
 
function abs(a) {               //valeur absolue
return max(a,-a);
}

- Le fonctions de vérification de saisie :

La fonction isDigit(c) vérifie que son argument, un caractère, est bien un chiffre.

La fonction isInteger(s) vérifie que la chaîne de caractères passée en argument est bien un entier: le premier caractère peut être un chiffre ou un signe + ou -; les autres, s'ils existent, doivent être des chiffres.

La fonction check(form) vérifie que les champs de saisie a et b contiennent bien des entiers.
function isDigit(c) {               //verifie que c contient un chiffre
 
var test=""+c;
 
if (test=="0"||test=="1"||test=="2"||test=="3"||test=="4"||test=="5"||test=="6"||
     test=="7"||test=="8"||test=="9") {
     return true;
     }
 
return false;
 
}
 
 
function isInteger(s) {               //verifie que s contient un entier
 
var test=""+s;
 
for (var k=1;k<test.length;k++) {     //verifie que tous les caracteres sauf le premier
                         //sont des chiffres
     var c=test.substring(k,k+1);
 
     if (isDigit(c)==false) {
          return false;
          }
     }
 
return (isDigit(test.substring(0,1))||test.substring(0,1)=="+"||test.substring(0,1)=="-");
                         //le premier caractere peut etre + ou -
                         //ou un chiffre
}
 
 
function check(form) {               //verification de la saisie
 
return (isInteger(form.a.value)&&isInteger(form.b.value));
 
}

Le source complet du script
Première version : 08/03/97
Auteur : Arnaud Gomes-do-Vale (Page Web, e-mail :arnaud@folium.eu.org)
Source : Mes souvenirs du cours d'informatique de Math Sup
Relecture : Thomas Capricelli, Pascal Audoux