Algorithme Euclide

Soient deux entiers naturels a et b, dont on cherche le PGCD. Le cas où a ou b est nul ne nécessite aucun algorithme ; on l'exclut. Une suite d'entiers (an)n est définie par récurrencede pas 2, plus précisément par divisions euclidiennes successives ; la suite est initialisée par a0 = aa1 = b, puis propagée par la règle de récurrence : tant que an+1 est non nul, an+2est défini comme le reste de la division euclidienne de an par an+1.

On commence donc par calculer le reste de la division de a par b, qu'on note r ; puis on remplace a par b, puis b par r, et on réapplique le procédé depuis le début.

On obtient ainsi une suite, qui vaut 0 à un certain rang ; le PGCD cherché est le terme précédent de la suite.

Il est intéressant de noter que si a < b, la première itération de la boucle a pour effet de "permuter a et b". Plus précisément : dans ce cas, la division euclidienne de a par b s'écrit a = b.0 + a donc a2 = a, si bien que la suite produite par l'algorithme appliqué au couple (a, b) commence par a, suivie de la suite produite par l'algorithme appliqué au couple (b, a).

Ainsi

pgcd(a,b) (avec a> b)

a0=a, a1=b

an = q*an+1 + an+2

si r = 0 alors pgcd = an+1

sinon pgcd = pgcd (an+1, r)


Nous obtenons en Java


/**
 * Le pgcd récursif Euclide
 */
package edu.isae.recusrive;

/**
 * @author Pascal Fares
 *
 */
public class EuclidPgcd {
    
    public static int pgcd(int a, int b) {
	if (a < b) return pgcd(b,a); /* préparer la division */
	if (b ==0) return a; /* nous avons le pgcd d'après l'algo déuclide */
	/* Calcul du du reste l'operareur modulo en java */
	return pgcd(b,a%b);
    }

    /**
     * La fonctiom main ici permet d'effectuer des test unitaires 
     * @param args les paramètres de la ligne de commande 2 nombres.
     * Quelques exemples:
     * pfares@pascal-Notebook:~/workspace/recursive/bin$ java edu.isae.recusrive.EuclidPgcd 25 5
     * pgcd(25,5)=5
     * pfares@pascal-Notebook:~/workspace/recursive/bin$ java edu.isae.recusrive.EuclidPgcd 1001 101
     * pgcd(1001,101)=1
     * pfares@pascal-Notebook:~/workspace/recursive/bin$ java edu.isae.recusrive.EuclidPgcd 1010 100
     * pgcd(1010,100)=10
     * pfares@pascal-Notebook:~/workspace/recursive/bin$ java edu.isae.recusrive.EuclidPgcd 1000 100
     * pgcd(1000,100)=100
     */
    public static void main(String[] args) {
	if (args.length != 2) System.out.println("Utilisation : java EuclidPgcd a b");
	int a=Integer.parseInt(args[0]);
	int b=Integer.parseInt(args[1]);
	int pgcd = pgcd(a,b);
	System.out.printf("pgcd(%d,%d)=%d\n",a,b,pgcd);

    }

}
Comments