#!/bin/bash
# gcd.sh: plus grand diviseur commun
#         Utilise l'algorithme d'Euclide

#  Le "plus grand diviseur commun" (PGCD) de deux entiers est l'entier
#  le plus grand à diviser les deux entiers sans reste.

#  L'algorithme d'Euclide utilise des divisions successives.
#  À chaque passe,
#+ dividende &lt;---  diviseur
#+ diviseur  &lt;---  reste
#+ jusqu'à ce qu'il reste 0.
#+ PGCD = le dividende de la dernière passe.
#
#  Pour une excellente discussion de l'algorithme d'Euclide, voir le site
#+ de Jim Loy, http://www.jimloy.com/number/euclids.htm.


# ------------------------------------------------------
# Vérification des arguments
ARGS=2
E_MAUVAISARGS=65

if [ $# -ne "$ARGS" ]
then
  echo "Usage: `basename $0` premier_nombre deuxieme_nombre"
  exit $E_MAUVAISARGS
fi
# ------------------------------------------------------


pgcd ()
{

                                #  Affectation arbitraire.
  dividende=$1                  #  Peu importe lequel est le plus
  diviseur=$2                   #+ grand.
                                #  Pourquoi ?

  reste=1                       #  Si une variable non initialisée est utilisée
                                #+ dans la boucle,
				                #+ cela finit en un message d'erreur lors de
				                #+ la première passe dans la boucle.

  until [ "$reste" -eq 0 ]
  do
    let "reste = $dividende % $diviseur"
    dividende=$diviseur          #  Maintenant, répétez avec les deux plus
                                 #+ petits nombres.
    diviseur=$reste
  done                           # Algorithme d'Euclide

}                                # Le dernier $dividende est le pgcd.


pgcd $1 $2

echo; echo "Le PGCD de $1 et de $2 est : $dividende"; echo


# Exercice :
# --------
#  Vérifier les arguments de la ligne de commande pour s'assurer que
#+ ce sont bien des entiers, sinon quitter le script avec une erreur
#+ appropriée.

exit 0
