152 Chapitre IX — Le pgcd et l’algorithme d’Euclide-B´ezout
1.2. Structure d’anneau euclidien. ´
Etant donn´es a∈Zet b∈Z∗il existe q,r∈Ztels que a=bq+r
et |r|<|b|. Ceci est appel´e une division euclidienne avec quotient qet reste r. Le couple (q,r)n’est en
g´en´eral pas unique : pour a=22 et b=9, par exemple, on a a=2b+4=3b−5. (On a toujours deux
solutions : l’une avec q=a
b, l’autre avec q=a
b; elles co¨ıncident si et seulement si bdivise adans
Zavec reste r=0.) Cette ambigu¨ıt´e n’est pas gˆenante d’un point de vue math´ematique, mais pour une
impl´ementation sur ordinateur il faut bien fixer un choix. Pr´ecisons d’abord les exigences g´en´erales.
D´
efinition 1.1. Soit Aun anneau commutatif. Une division euclidienne sur Aest la donn´ee
– d’une fonction
ν
:A→Nv´erifiant
ν
(a) = 0 si et seulement si a=0, et
– d’une application
δ
:A×A∗→A×A,(a,b)7→ (q,r)telle que a=bq+ret
ν
(r)<
ν
(b).
Dans ce cas on appelle
ν
un stathme euclidien, et
δ
une division euclidienne par rapport au stathme
ν
.
D´
efinition 1.2. Un anneau Aest dit euclidien s’il est int`egre et admet une division euclidienne.
D’apr`es ce qui pr´ec`ede, Zest euclidien par rapport au stathme
ν
(a) = |a|. Quant `a la division eucli-
dienne
δ
, on a une infinit´e de choix possibles. Les conventions suivantes semblent les plus utiles : elles
choisissent les quotients q=a
b,q=a
b,q=a
b, et q=a
brespectivement.
Exercice/P 1.3. Pour les types entiers en C++ l’op´eration a/b donne a
b, la partie enti`ere du quotient,
appel´e quotient«tronqu´e», ou encore «arrondi vers z´ero». Par exemple 5/3 vaut 1et 5%3 vaut 2, ainsi
que (-5)/3 vaut -1 et (-5)%3 vaut -2 . Par cons´equent le reste a%b est ou z´ero ou du mˆeme signe que
a. Cette convention a ´et´e adopt´ee ´egalement pour la classe Integer . Le v´erifier sur des exemples.
Optimisation. — Tr`es souvent on veut calculer le quotient qet le reste ren mˆeme temps. Bien sˆur on
pourrait ´ecrire q=a/b puis r=a%b , mais ceci effectue deux fois la mˆeme division (expliquer pourquoi).
Dans ce cas il est plus efficace de n’effectuerqu’une seule division euclidienne (a,b)7→ (q,r)comme suit :
void tdiv( const Integer& a, const Integer& b, Integer& q, Integer& r )
{mpz_tdiv_qr( q.get_mpz_t(), r.get_mpz_t(), a.get_mpz_t(), b.get_mpz_t() ); }
Integer tdiv( const Integer& a, const Integer& b )
{return a/b; }
Integer tmod( const Integer& a, const Integer& b )
{if( b == 0 ) return a; else return a%b; }
Au lieu des op´erateurs /et %on peut aussi utiliser deux fonctions tdiv et tmod . Ceci permet
de rectifier un petit d´efaut de l’op´erateur %, `a savoir que tmod(a,0) est toujours bien d´efini, bien que
tdiv(a,0) ne le soit pas. (Expliquer pourquoi c’est math´ematiquement raisonnable.)
Exercice/P 1.4. On peut d´efinir une deuxi`eme division euclidienne en choisissant l’unique couple (q,r)
avec a=bq +ret 0 ≤r<|b|. Dans ce cas nous ´ecrivons q=adivbet r=amod b; c’est la division
euclidienne avec reste positif, usuelle en math´ematique. L’impl´ementer sous la forme
void pdiv( const Integer& a, const Integer& b, Integer& q, Integer& r );
Integer pdiv( const Integer& a, const Integer& b );
Integer pmod( const Integer& a, const Integer& b );
De la mˆeme mani`ere on pourra d´efinir et impl´ementer la division euclidienne avec reste n´
egatif :
void ndiv( const Integer& a, const Integer& b, Integer& q, Integer& r );
Integer ndiv( const Integer& a, const Integer& b );
Integer nmod( const Integer& a, const Integer& b );
Indication. — Dans le souci d’efficacit´e on pourra commencer par tdiv(a,b,q,r) puis corriger qet r.
Vous pouvez aussi consulter la documentation via info gmp pour vous informer sur les fonctions fdiv
et cdiv de la biblioth`eque GMP.
Exercice/P 1.5. Une fac¸on ´economique de choisir (q,r)est d’exiger a=bq+ravec |r| ≤ 1
2|b|: c’est la
division avec reste sym´
etrique. V´erifier qu’elle minimise |r|. L’impl´ementer sous la forme
void sdiv( const Integer& a, const Integer& b, Integer& q, Integer& r );
Integer sdiv( const Integer& a, const Integer& b );
Integer smod( const Integer& a, const Integer& b );
Remarque. — La d´efinition laisse un choix seulement dans le cas o`u b=2net r=±n. Afin de r´esoudre
cette derni`ere ambigu¨ıt´e, on pourra choisir l’unique couple (q,r)avec qpair.
MAE 22 juin 2009