ARITHMETIQUE ELEMENTAIRE
1. Représentation d’un entier en base B. —
1. Ordre lexicographique. —
Pour indiquer le résultat fondamental sur la représentation des entiers sur une certaine base,
rappelons la définition de l’ordre lexicographique.
Soient E1 , . . . , Er des ensembles ordonnés, on considère l’ensemble
E = E1 × · · · × Er
et la relation R entre les r–uples x = (x1 , . . . , xr ) et y = (y1 , . . . , yr ) :
x R y ⇐⇒ “pour le premier indice i tel que xi 6= yi , on a xi < yi ”.
Il est facile de vérifier que R est une relation d’ordre stricte. Cet ordre est appelé l’ordre
lexicographique sur E (il ressemble à l’ordre des mots dans un dictionnaire).
L’ensemble E, avec cette relation d’ordre, est le produit lexicographique des ensembles Ei .
Lorsque chaque Ei est totalement ordonné, alors leur produit lexicographique l’est aussi.
2. Développement en base B : existence. —
Le résultat fondamental de ce paragraphe est le théorème suivant.
Théorème 1.1. Soit B un entier > 1. Pour k > 0, soit Bk le produit lexicographique de k
ensembles tous égaux à l’ensemble B = {0, 1, . . . , B − 1}. L’application
fr : (r0 , r1 , . . . , rk−1 ) 7−→
k−1
X
ri B k−i−1
i=0
est un isomorphisme de l’ensemble ordonné Bk sur l’intervalle {0, 1, . . . , B k − 1}.
Démonstration. On raisonne par récurrence sur k. D’abord, il est facile de vérifier que l’image
de fk est contenue dans l’ensemble {0, 1, . . . B k − 1} ; puis que la fonction fk est strictement
croissante. D’où le résultat . . .
Pour chaque entier a > 0, il existe un plus petit entier k > 0 tel que a < B k . D’après le
théorème, il existe une suite finie unique (r0 , . . . , rk−1 ) telle que chaque ri appartient à l’intervalle
B = {0, 1, . . . , B − 1} et que a est donné par lexpression
a=
k−1
X
i=0
par ailleurs r0 est positif (sinon a < B k−1 ).
ri B k−i−1 ;
2
Lexpression précédente est appelée le développement ou représentation de l’entier a en base B
et on l’écrit
a = (r0 , r1 , . . . , rk−1 )
ou encore a = (r0 r1 . . . rk−1 )B lorsqu’il est utile de préciser la base ; les entiers ri sont appelés les
chiffres de a en base B.
Exemples :
•
Le système le plus courant est le système décimal pour lequel la base B est égale à dix.
Les ordinateurs manipulent des nombres binaires, c’est-à-dire en base deux. La principale
raison de ce choix est que le développement en base deux utilise seulement deux chiffres (qui
correspondent aux deux états possibles d’une cellule électronique). De plus, les opérations
arithmétiques élémentaires sont très simples en base deux.
•
• Pour calculer avec des entiers de taille arbitraire, il est pratique de travailler dans une base B
de valeur aussi grande que le permet la taille du mot-mémoire de la machine (par exemple, si ce
mot comporte 16 bits, alors B doit vérifier B ≤ 215 ).
Il est très utile d’avoir l’estimation suivante d’un entier en termes de sa représentation en
base B.
Proposition 1 . Si l’entier positif n admet développement suivant en base B :
n=
k
X
ai B i
avec ak 6= 0,
i=0
alors, on a
B k ≤ ak B k ≤ n ≤ B k+1 − 1.
Démonstration. La seule inégalité non triviale est la dernière, et il suffit d’observer que
n ≤ (B − 1) (1 + B + . . . + B k ) = B k+1 − 1.
3. Du développement au nombre. —
D’après le théorème ci-dessus, la transformation est
fr : (r0 , r1 , . . . , rk−1 ) 7−→
k−1
X
ri B k−i−1 .
i=0
Ainsi, par exemple,
(1101110)2 = 26 + 25 + 23 + 22 + 21
= (64)dix + (32)dix + 8 + 4 + 2
= (110)dix = 110 = “cent-dix”.
Il est aussi possible de représenter cette transformation par un algorithme, c’est-à-dire un
procédé de calcul.
3
data : B, k, r0 , . . . , rk−1 entiers ≥ 0 ;
n := r0 ;
for i := 1 to k − 1 do n := nB + ri .
Développement–nombre, algorithme 1
4. Du nombre au développement en base B. —
La formule
a=
k−1
X
ri B k−i−1
i=0
conduit à la relation
a = Bq + rk−1 ,
où
0 ≤ rk−1 < B,
ainsi rk−1 est les reste de la division euclidienne de l’entier a par le nombre B,
rk−1 = a mod B
(“a modulo B”).
De plus, l’entier q, le quotient (aussi parfois noté q = a ÷ B), est donné par la formule
q=
k−2
X
ri B k−i−2 .
i=0
Le chiffre chiffre rk−2 est donné par
rk−2 = q mod B,
et ainsi de suite. . .
Cette relation conduit à une procédure récursive pour calculer le développement d’un entier
a > 0 dans la base B, procédure qui peut être résumée par la formule suivant :
¡
¢
dev(a ; B) = dev(a ÷ B ; B), a mod B .
Cette formule peut être traduite en une définition récursive d’un algorithme pour ce
développement.
4
L’algorithme itératif associé est le suivant :
data : a entier > 0, B entier ≥ 2 ;
i := 0 ;
n := a ;
while n > 0 do
begin
x[i] := n mod B ;
i := i + 1 ;
n := n div B {div est la division entière}
end.
Nombre–développement, algorithme 1
Exemple
Considérons l’entier a = 67 et la base B = 3. Le calcul du développement de a en base B peut
être représenté par la table suivante.
i
0
1
2
3
4
n
67
22
7
2
0
x
1
1
1
2
Ce calcul montre que 67 = (2111)3 . En fait,
2 × 27 + 9 + 3 + 1 = 67.
Le développement en base B peut aussi être trouvé en calculant les chiffres de plus grand poids
en premier, c’est-à-dire r0 , puis r1 , r2 . . .
Le second algorithme peut être décrit comme suit.
5
data : a entier > 0, B entier ≥ 2 ;
k := 0 ; x := 1 ; n := a ;
while a ≥ xB do
begin
k := k + 1 ;
x := xB
end ;
for i := 0 to k do
begin
r[i] := n div x ;
n := n mod x ;
x := x div B
end.
Nombre–développement, algorithme 2
Dans cet exemple de recherche du développement ternaire du nombre 67, on trouve d’abord
k = 3, puis la table suivante
i
0
1
2
3
n
67
13
4
1
x
27
9
3
1
r
2
1
1
1
ce qui donne 67 = (2111)3 .
5. Cas des entiers quelconques. —
La représentation d’un entier n ∈ Z, requiert seulement son signe et sa valeur absolue : si
|n| = (am . . . a0 )B , on pose
½
codeB (n) = (ε, am , . . . , a0 ),
où ε =
+,
si n > 0,
−,
sinon.
La fonction signe d’un entier n est donnée par
+1,
0,
signe(n) =
−1,
si n > 0,
si n = 0,
si n < 0.
6. Comparer deux nombres. —
On ne considère que des nombres positifs, le cas général s’en déduit facilement. Ce test de
comparaison est une conséquence directe du théorème 1. Soient a = (am . . . a0 )B et b = (bn . . . b0 )B
deux nombres positifs écrits en base B, avec am et bn non nuls.
6
On suppose que le calculateur est capable de comparer deux entiers contenus dans un motmémoire. Ainsi, leur valeur absolue ne doit pas excéder 2k. Le calculateur doit aussi posséder une
fonction signe, ainsi qu’être capable d’effectuer la soustraction de tels entiers. Les entiers B, m
et n sont donc supposés être majorés par 2k.
L’algorithme de comparaison entre a et b peut être présenté comme suit.
data : a = (am . . . a0 )B , am 6= 0, b = (bn . . . b0 )B , bn 6= 0 ;
{la réponse est r = signe(a − b)}
if m 6= n
then r := signe(m − n)
else begin
i := m ;
while ai = bi do i := i − 1 ;
if i = −1 then r := 0
else r := signe(ai − bi )
end.
Comparaison entre deux entiers positifs
2. Addition. —
1. Cas de deux nombres positifs. —
Soient a et b deux entiers positifs codés en base B et supposons que leurs longueurs respectives
sont m et n. On veut calculer leur somme c. Supposons que
a=
m−1
X
ai B i
et
b=
i=0
n−1
X
bi B i .
i=0
Par exemple m ≥ n. Alors
b=
n−1
X
bi B i
avec bn = · · · = bm−1 = 0.
i=0
Ainsi,
c=
m−1
X
(ai + bi ) B i ,
i=0
mais, en général, ceci ne fournit pas la représentation
c=
m−1
X
i=0
de c en base b : ne pas oublier les retenues !
ci B i
7
Soit r la retenue à un instant donné, alors l’algorithme est le suivant.
data : a = (am−1 . . . a0 )B , a > 0, b = (bn−1 . . . b0 )B , b > 0 ;
r := 0 ;
k := m − 1 ;
for i := 0 to m − 1 do
begin
s := ai + bi + r ;
if s < B then begin ci := s ; r := 0 end
else begin ci := s − B ; r := 1 end ;
end ;
if r > 0 then begin k := m ; cm := 1 end.
Somme en base B
Exercice
Prouver que cet algorithme est correct.
Remarque. Cet algorithme montre que la retenue peut seulement être 0 or 1 ; en fait on a
toujours ai + bi ≤ 2B − 2.
Un choix naturel pour le coût du précédent algorithme est le nombre d’opérations élémentaires
(c’est-à-dire d’opérations où les entiers sont tous plus petits que B), ce coût peut aisément être
¡
¢
estimé : il est ∨ max m, n .
¡
¢
Remarque. Cette borne ne peut pas être remplacée par O min{m, n} en raison de possibles
suites de retenues arbitrairement longues, comme dans
m−1
X
(B − 1)B i + 1 = B m .
i=0
Exercice
Soient a et b deux nombres entiers positifs, codés en base B comme plus haut. Evaluer la
probabilité pour une suite de retenues consécutives d’avoir une longueur k, avec n−1 ≤ k ≤ m−1.
En déduire une étude statistique du coût de l’algorithme d’addition de deux entiers.
2. Cas de deux nombres de signes quelconques. —
Soient a et b deux entiers codés en base B. On veut calculer leur somme c. On ne considère pas
le cas trivial où un de ces nombres est zéro.
Si a et b sont de même signe alors
c = signe(a) · (|a| + |b|),
et il n’y a aucun problème.
8
Si a et b possèdent des signes opposés, il y a deux cas :
si |a| ≥ |b| alors
•
c = signe(a) · (|a| − |b|),
si |a| < |b| alors
•
c = signe(b) · (|b| − |a|).
Afin de calculer c on a seulement à
1o)
o
2)
comparer |a| et |b|,
calculer la différence entre deux entiers positifs a0 et b0 , avec a0 > b0 .
Comme on sait déjà effectuer la première opération on va seulement étudier la seconde. A
nouveau, on doit considérer les retenues. L’algorithme suivant réalise cette opération.
data : a = (am . . . a0 )B , b = (bm . . . b0 )B , a > b > 0 ;
{on suppose am > 0 mais seulement bm ≥ 0, comme plus haut}
k := 0 ;
for j := 0 to m do
begin
s := aj − bj + k ;
if s ≥ 0 then begin cj := s ; k := 0 end
else begin cj := s + B ; k := −1 end
end.
Différence de deux entiers positifs
Exercice
Prouver que cet algorithm est correct.
3. Soustraction. —
Nous venons d’étudier comment ajouter deux entiers de signe quelconque ; il est maintenant
facile de réaliser la soustraction par la formule
a − b = a + (−b).
4. Multiplication. —
On ne considère que le cas de deux entiers positifs.
On veut calculer c = ab. On considère à nouveau des entiers a et b donnés par les formules
a=
m−1
X
i=0
avec m ≥ n.
ai B i
et
b=
n−1
X
i=0
bi B i ,
9
Il s’agit donc d’obtenir le développement de c en base B. On a
´
´ m+n−2
³m−1
´ ³n−1
X ³ X
X
X
ai bj B h .
c=
ai B i ·
bj B j =
i=0
j=0
h=0
i+j=h
D’où l’algorithme suivant (où r est la retenue).
data : a = (am−1 . . . a0 )B , am−1 6= 0, b = (bn−1 . . . b0 )B , bn−1 6= 0 ;
r := 0 ; k := m + n − 2 ;
for h := 0 to m + n − 2 do
begin
t := r ;
for i := max(0, h − n + 1) to min(h, m − 1) do t := t + ai bh−i ;
ch := t mod B ;
r := t div B
end ;
if r 6= 0 then begin k := k + 1 ; ck := r end.
Multiplication de deux entiers, version 1
Pour vérifier que cet algorithmee est correct, le seul point non évident est que ck est bien
le chiffre de qauche dans le développement de c en base B. Pour cela, il suffit de noter les
deux inégalités a < B m et b < B n impliquent c < B m+n ; ainsi l’entier k vérifie l’inégalité
k ≤ m + n − 1.
Il est facile de vérifier que le nombre d’opérations effectuées dans cet algorithmee est O(mn).
Mais cet algorithmee, écrit trop rapidement, possède un inconvénient sérieux : les entiers
intermédiaires peuvent avoir une valeur absolue supérieure à (B − 1)2 n, où n est arbitrairement
grand. Ce ne sont pas des opérations “élémentaires” : les opérations élémentaires ne font intervenir
que des entiers plus petits que B. D’où un nouvel algorithmee tenant compte de cette remarque.
data : a = (am−1 . . . a0 )B , am−1 6= 0, b = (bn−1 . . . b0 )B , bn−1 6= 0 ;
for i := 0 to m − 1 do ci := 0 ;
for j := 0 to n − 1 do
begin
r := 0 ;
for h := 0 to m − 1 do
begin
t := ah bj + ch+j + r ;
ch+j := t mod B ;
r := t div B
end ;
cj+m := r ;
end.
Multiplication de deux entiers, version 2
10
Maintenant les nombres intermédiaires tk vérifent
tk = ah bj + ch+j + rk ≤ (B − 1)2 + (B − 1) + rk ,
où rk = tk−1 div B (où t−1 = 0) ; ce qui implique
t0 ≤ B(B − 1), r1 < B,
t1 ≤ B(B − 1) + (B − 1) < B 2 , r2 < B,
...
On voit que les nombres t sont différents de ceux qui apparaissent dans l’algorithme usuel. Dans
le cas de l’algorithme “scolaire”, on stocke les produits intermédiaires, et ensuite on effectue une
addition globale. Ici, on calcule des additions partielles.
Voici un exemple qui montre la différence entre les deux méthodes (dans les deux cas, les
chiffres du résultat sont écrits en caractères gras).
4
5
6
7
×
6
7
8
9
4
1
1
0
3
3
6
5
3
6
3
1
9
6
9
2
7
4
0
2
3
1
0
0
5
3
6
4
5
6
7
×
6
7
8
9
4
1
1
0
3
3
6
5
3
6
4
0
6
4
6
3
1
9
6
9
3
6
0
3
3
7
4
0
2
3 1
0
0
5
...
3
2
...
...
5. Division euclidienne. —
1. Existence. —
Théorème 2 . Soient a et b deux entiers positifs. Il existe alors une unique paire d’entiers (q, r)
tels que a = bq + r où 0 ≤ r < b.
On pose
q =a÷b
et
r = a mod b,
l’entier q est appelé le quotient et r le reste.
Quand le reste de la division de a par b est nul on dit que b divise a, ce qui est souvent noté
b | a ; on dit aussi que b est un diviseur de a ou que a est un multiple de b.
Démonstration. Lexistence est démontrée par induction sur a :
•
•
si a < b prendre q = 0 et r = a,
¡
¢
si a ≥ b choisir q = 1 + (a − b) ÷ b et r = (a − b) mod b.
La preuve de l’unicité est laissée au lecteur.
11
Corollaire. Soit H un sous-groupe de Z, alors il existe un entier d ≥ 0, et un seul, tel que
H = d Z (= {dn; n ∈ Z}).
Démonstration. Si H = 0, le résultat et vrai pour d = 0. Supposons maintenant que H contient
au moins un élément non nul. Alors H contient un élément positif minimal, d. Si a appartient
à H, par division euclidienne, a = qd + r, où 0 ≤ r < d. La formule r = a − qd montre que r
appartient à H. Par définition de d, on a nécessairement r = 0. Ainsi a = qd.
2. Calcul. —
Soient a et b deux entiers positifs, de longueurs respectives m et n. On veut trouver deux
entiers q et r tels que a = bq + r avec 0 ≤ r < b.
La preuve de lexistence de la division euclidienne permet de réaliser cette opération grâce à
une suite de soustractions. Cette méthode peut être utile pour de grands nombres, mais on va
plutôt étudier la méthode scolaire.
Comme pour la division ordinaire, on peut se restreindre au cas où m = n + 1. Alors on pose
a = (a0 a1 . . . an )B et b = (b1 . . . bn )B , où a/b < B.
On doit trouver le quotient q = [a/b].
La principe de la méthode suivante est de partir d’une valeur approchée de ce quotient. Puis
la valeur exacte est atteinte après un tout petit nombre d’essais.
Comme valeur initiale associée, on prend
nh a B + a i
o
0
1
q ∗ = min
,B − 1 .
b1
(La notation [x] représente la partie entière du nombre réel x, la fonction “plancher”, aussi
notée bxc : la quantié [x] est égale à l’unique entier n qui vérifie les inégalités n ≤ x < n + 1.)
Ce qui suit montre que cette première valeur est très satisfaisante.
En fait,
(i)
q∗ ≥ q ;
•
ceci est vrai si q ∗ = B − 1,
•
si q ∗ 6= B − 1 alors
q∗ =
ha B + a i
0
1
,
b1
et q ∗ b1 ≥ a0 B + a1 − b1 + 1, ce qui implique
a − q ∗ b ≤ a − q ∗ b1 B n−1
≤ a0 B n + . . . + an − a0 Bn − a1 B n−1 + b1 B n−1 − B n−1
= a2 B n−2 + . . . + an − B n−1 + b1 B n−1
< b1 B n−1 ≤ b.
Le résultat s’ensuit puisque q est l’entier le plus petit tel que a − qb < b.
12
(ii)
b1 ≥ [B/2] ⇒ q ∗ ≤ q + 2.
Noter que
q∗ ≤
a
a
<
b1 B n−1
b − B n−1
et
q>
a
− 1.
b
Pour prouver cette implication, on raisonne par l’absurde : on suppose que q ∗ ≥ q + 3.
Alors
3<
a
a ³ B n−1 ´
a
+
1
=
−
+ 1,
b − B n−1
b
b b − B n−1
et donc
³ B n−1 ´
a
>2
≥ 2(b1 − 1),
b
b − B n−1
et B − 4 ≥ q ∗ − 3 ≥ q = [a/b] ≥ 2(b1 − 1). Ce qui donne b1 < [B/2].
Remarque. La condition b1 ≥ [B/2] est satisfaite si a et b sont respectivement remplacés par ka
et kb, où k est donné par la formule
h
k=
B i
.
b1 + 1
Exercice
Démontrer la remarque ci-dessus.
6. Le coût de la multiplication et de la division. —
1. Le coût de la multiplication. —
Soit M (n) le coût du produit de deux entiers de n bits.
L’algorithme de multiplication de deux entiers de longueur n donné plus haut a un coût de
l’ordre n2 , ainsi M (n) = O(n2 ), mais il est possible de trouver des algorithmes dont le coût
asymptotique est nettement plus petit.
Voici une méthode très facile, due à Karatsuba, qui utilise une idée très souvent efficace en
algorithmique : diviser un problème en deux sous-problèmes de tailles sensiblement égales.
Supposons n pair, n = 2m, et que u et v sont deux entiers de n bits. On écrit alors
u = a 2m + b,
v = c 2m + d,
et on calcule le produit w = uv de la manière suivante.
Si
x = (a + b) (c + d),
y = ac,
z = bd
alors
w = y 22m + (x − y − z) 22m + z.
13
Dans ces formules il n’y a que trois multiplications d’entiers de longueur m et quelques
opérations (additions et décalages) dont le coût est linaire en fonction de n. Il existe donc une
constante k telle que M (n) est borné par
k,
M (n) ≤
3M (m) + kn,
si
m = 1,
si
m > 1.
Soit n un entier positif et soit t le plus petit entier positif tel que 2t ≥ n. Alors M (n) ≤ M (2t ).
Utilisant les inégalités précédentes pour les entiers 2t , 2t−1 , . . . et 2, on obtient
M (2t ) = O(3t ) ;
ce qui implique
M (n) = O(nα ),
où
α = (log 3)/(log 2) ' 1.585 < 2.
Cett idée peut être généralisée : au lieu de découper les entiers en deux partiss de même
longueur, on les découpe en r morceaux. Alors, on doit trouver un moyen de calculer le produit en
utilisant aussi peu de multiplications que possible. Ceci est obtenu en passant par un polynôme.
Ce polynôme est déterminé par interpolation. Considérons maintenant deux entiers u et v de
longueur égale à nr, on doit calculer le produit w.
Posons
u = Ur 2rn + . . . + U1 2n + U0
et
v = Vr 2rn + . . . + V1 2n + V0 .
Les polynômes U , V et W sont définis par les formules
U (X) = Ur X rn + . . . + U1 X n + U0 ,
V (X) = Vr X rn + . . . + V1 X n + V0 ,
W (X) = U (X)V (X).
Alors w = W (2n ). Pour calculer le polynôme W , dont le degré n’est pas plus grand que 2r, le
premier pas consiste à calculer ses valeurs en 2r + 1 points, par exemple i = 0, 1, . . . , 2r (ou −r,
−r + 1, . . . , r − 1, r), grâce à la formule W (i) = U (i) V (i).
Ensuite les coefficients de W sont obtenus par interpolation de Lagrange (le coût de cette
opération eet linéaire en n).
En conséquence, nous obtenons l’inégalité M (rn) ≤ (2r + 1)M (n) + cn, pour une certaine
constante positive c.
14
En raisonnant comme plus haut, on aboutit à l’estimation
0
M (n) = O(nα ),
où
α0 =
log(2r + 1)
.
log(2r)
Prenant r assez grand, on obtient
M (n) = O(n1+ε ),
pour tout ε > 0 fixé.
La meilleure estimation connue est M (n) = O(n log n log log n). Ce résultat est dû à Schőnhage
et Strassen, et sa preuve utilise la technique de la transformée de Fourier rapide.
2. Le coût de la division. —
Considérons d’abord le cas particulier du quotient d’un entier 22n−1 par un entier v, où v
possède n bits (ainsi v ≥ 2n−1 ). Nous excluons le cas trivial cas v = 2n .
Ce quotient peut être calculé de la manière suivante. Supposons que v est un entier,
n−1
2
≤ v < 2n . Nous devons calculer
£
¤
q = 22n−1 /v .
Soit C(n) le coût d’un tel calcul.
Pour estimer C(n), par commodité (et sans perte de généralité) on suppose que n est pair,
disons n = 2m.
Nous posons v = 2m v 0 + v 00 , de sorte que v 0 ≥ 2m−1 .
Alors
23m−1
22n−1
=
(1 − x + x2 − · · ·),
v
v0
où x = v 00 /(2m v 0 ), ainsi 0 ≤ x < 2−m+1 .
Ceci implique
0≤
22n−1
23m−1
−
(1 − x) < 4.
v
v0
Maintenant, nous devons estimer le terme d’“erreur” (23m−1 /v 0 ) (1 − x).
Posons 22m−1 /v 0 = a + ε , où a est un entier et 0 ≤ ε < 1, alors le terme d’erreur est donné
par la formule
2
(23m−1 /v 0 ) (1 − x) = 2m a + 2m ε − (22m−1 v 00 )/v 0 ,
où
2m ε = (22m−1 − av 0 ) × (22m−1 /v 0 ) × 2−m+1
= (22m−1 − av 0 ) × a × 2−m+1 + ε0 , avec 0 ≤ ε0 < 2.
15
Ces formules montrent que le quotient q peut être obtenu à partir du quotient a, les produits
£
¤
2
av , (22m−1 − av 0 ) × a et v 0 , le quotient (22m−1 v 00 )/v 0 2 et quelques opérations supplémentaires
0
simples. De plus, le coût de ces opérations auxiliaires est linéaire en n.
D’où l’inégalité
C(n) ≤ 2C(n/2) + 3M (n/2) + cn,
où c est une certaine constante positive.
Sous l’hypothèse M (2k) ≥ 2M (k) pour tout k, cette inégalité implique l’estimation
¡
¢
C(n) = O M (n) + O(n log n).
Ainsi, en ajoutant l’hypothèse supplémentaire (qui n’a jamais été infirmée)
M (n) ≥ c0 n log n,
pour une certaine constante positive c0 , l’estimation précédente conduit à la relation remarquable
¡
¢
C(n) = O M (n) .
Pour calculer le quotient d’un nombre u de 2n bits par un nombre v de n bits, on écrit tout
simplement
£
¤
[u/v] = (u/22n−1 ) × (22n−1 /v) .
Alors le quotient est obtenu par un calcul du type précédent, suivi par la multiplication de deux
entiers d’environ n bits.
Si
D(n) := coût de la division d’un entier de 2n bits par un entier de n bits,
nous avons montré que
¡
¢
D(n) = O M (n) .
On peut dire que le coût de la division est dominé par le coût de la multiplication, à une
constante multiplicative près.
16
7. Comment calculer des puissances. —
Soit n un entier positif et x objet mathématique tel que lexpression xn ait un sens (par exemple
x peut être un entier, une matrice, un élément d’un corps fini . . . ). On veut calculer xn . Plus
généralement, pour une opération > associative on veut calculer x> · · · >x, n fois.
1. Premier algorithme. —
Il s’agit du premier algorithme qui vient à l’esprit : calculer successivement les valeurs x2 , x3 ,
. . . , xn .
data : x, n ; {le résultat sera z}
z := x ;
for i = 1 to n − 1 do z := zx.
A1 : calcul de xn , premierversion
Le coût naturel de cet algorithme est le nombre de multiplications. Ici, le coût est Cost (A1)
= n − 1.
Remarque. Le choix du nombre de multiplications comme mesure du coût de cet algorithme
n’est pas toujours satisfaisant. Cette question dépend de l’ensemble dans lequel on calcule. Par
exemple, si x est un entier le temps nécessaire pour calculer la puissance xn dépend de la
longueur des entiers qui apparaissent durant les multiplications successives et le temps n’est
pas linéaire par rapport à n. Au contraire, si x appartient à un corps fini, alors le temps pour
une multiplication peut être considèré comme constant, et le temps total du calcul de xn est
réellement proportionnel au nombre de multiplications. Pour une étude détaillée de certains cas
où s’applique cette remarque, voir le prochain paragraphe.
2. Second algorithme. —
Cet algorithme est connu depuis environ vingt siècles par les mathématiciens chinois et a été
redécouvert de nombreuses fois. Le principe est de calculer successivement les puissances suivantes
de x : x2 , x4 , x8 , . . . (i.e. les puissances de x avec un exposant qui est une puissance de deux) et
puis les combiner afin d’obtenir xn , utilisant la décomposition binaire de lexposant n.
Plus précisément, si le code de lexposant n en base deux est donné par la formule
n=
k
X
ei · 2i
,
ei ∈ {0, 1},
i=0
alors le terme xn peut être écrit de la manière suivante
Pk
i
xn = x i=0 ei ·2
=
k
Y
xei ·2
i
i=0
=
Y
i;ei 6=0
i
x2 .
17
Cette dernière formule conduit presqu’aussitôt à l’algorithme suivant.
data : x, n ;
y := x ; z := 1 ; {le résultat sera z}
{les valeurs successives de y sont x, x2 , x4 , . . . }
z := x ;
while n > 1 do
begin
m := m div 2 ;
if n > 2m alors z := zy ;
y := yy ;
n := m ;
end ;
z := zy.
A2 : calcul de xn , seconde version
On fait tourner cet algorithme pour le calcul de x13 . La table suivante donne les détails de ce
calcul.
n
13
m
13
6
3
6
3
1
y
x
x2
x4
x8
z
1
x
x
x5
1
x13
Maintenant, nous étudions le nombre N de multiplications effectuées durant cette procédure.
Par la formule précédente
N = k + e0 + e1 + . . . + ek − 1.
De sorte que N ≤ 2k.
Nous devons trouver une borne supérieure pour le nombre k. La décomposition binaire de n
est
n = 2k + ek−1 · 2k−1 + . . . + e0 ,
ainsi 2k ≤ n, ou, utilisant les logarithmes, k ≤ log2 n.
Ainsi,
N ≤ 2 log2 k.
Par exemple, si n = 106 , l’algorithme A1 nécessite exactement 999 999 multiplications tandis
que l’algorithme A2 en nécessite au plus 38 (preuve : 210 = 1024, ainsi 220 > 106 ).
18
Exercice
Calculer N quand n = 106 .
L’estimation précédente de N montre que, pour d’assez grandes valeurs de n (disons pour
n ≥ 20) l’algorithme A2 est moins coûteux que l’algorithme A1.
Mais, pour comparer les performances véritables de ces deux algorithmes, il est important de
préciser le domaine où les calculs sont effectués :
•
si x est un entier de longueur h alors de très grands nombres apparaissent lors du
déroulement du second algorithme. Si on suppose que le coût du produit de deux entiers de
longueurs respectives m et m0 est approximativement cmm0 (où c est une constante positive)
alors le coût de A2 vérifie les estimations suivantes
2
C2 (n) ' c h
k−1
X
2i+1
2
i=0
+ ch
2
k
X
ei
i−1
³X
i=1
´
ej 2j 2i ,
j=0
où les ei sont les chiffres binaires de n (en particulier ek = 1), tandis que le coût du premier
algorithme est donné par
¡
¢
C1 (n) = c h h + 2h + 3h + · · · + (n − 2)h '
1
2
c n2 h2 .
Pour n = 2k ,
C2 (n) '
4
3
c n 2 h2 '
8
3
C1 (n) ;
tandis que, pour n = 2k + 2k−1 ,
C2 (n) '
4
3
c 22k h2 + c 22k−1 h2 '
11
6
c 22k h2 ,
mais
C1 (n) '
•
9
4
c 22k h2 '
27
12
C2 (n).
si x appartient à un anneau fini dans lequel le coût du produit de deux éléments peut
être considèreé comme constant, alors le second algorithme est plus rapide que le premier pour n
assez grand (par exemple pour n ≥ 20).
Il est important de savoir que l’algorithme A2 est effectivement utilisé : en cryptographie, pour
certaines méthodes de codage et de deécodage, on doit calculer des expressions y telles que
y = xn mod a,
où n est un entier plus grand que 1050 . Dans un tel cas, le second algorithme est assez rapide,
mais il serait absolument impossible d’utiliser le premier (exercice : estimer le temps nécessaire
pour l’algorithme A1 afin de calculer y on un calculateur qui effectue 1010 multiplications par
seconde, ce qui est très optimiste !).
19
Maintenant, revenons à N pour une étude plus précise. Nous avons vu que
N = k + s(n) − 1,
où s(n) est la somme des chiffres binaires de n. Dans cette formule, l’entier k vérifie les inégalités
2k ≤ n < 2k+1 , et ainsi k ≥ [log2 n]. Comme s(n) ≥ 1, N ≥ [log2 n], où l’égalité a lieu pour les
valeurs de n qui sont des puissances de deux.
Pour conclure :
[log2 n] ≤ N ≤ 2 [log2 n].
Il serait intéressant d’effectuer une étude statistique de N , mais cette question est difficile et
trop spécialisée pour nous.
3. Une application. —
Nous allons appliquer l’algorithme précédent pour calculer un terme d’une suite réccurente
linéaire. Rappelons qu’une telle suite (un ) est définie par ses premières valeurs u0 , u1 , . . . , uh−1
et une condition telle que
(∗)
un = a1 un−1 + a2 un−2 + . . . + ah un−h
pour
n ≥ h.
Lexemple le plus fameux est la suite de Fibonacci (introduite en 1202) et définie par
F0 = 0, F1 = 1, Fn = Fn−1 + Fn−2 pour
n ≥ 2;
de sorte que
F2 = 1, F3 = 2, F4 = 3, F5 = 5, F6 = 8, F7 = 13, F8 = 21, F9 = 34 . . .
Si Un est le vecteur colonne dont les composantes sont un , un−1 , . . . , un−h+1 alors la relation
(∗) est équivalente à la formule matricielle
Un = A Un−1 ,
où la matrice A est égale à
a2
a3
...
1
A=
0
...
0
0
1
0
...
...
0
... 0
.
... ...
0
...
0
ah
a1
...
1
0
De sorte que
Un = An−h+1 Uh−1 ,
ce qui montre que Un , et en particulier un , peut être calculé en O(log n) opérations.
Cette méthode est spécialement utile quand les calculs sont effectués modulo un entier M , par
exemple il fournit un moyen rapide pour déterminer la période de (un ) modulo M .
20
4. Complexité de ce problème. —
Après l’algorithme trivial pour calculer xn , dont le nombre d’opérations est linéaire en n, nous
avons présenté un second algorithme dont le coût en nombre d’opérations est logarithmique en n.
Question naturelle : est-il possible de trouver une méthode encore plus rapide ? Pour répondre à
une telle question, nous devons introduire des définitions précises.
La première chose est de définir la classe des algorithmes que nous considérons. Ici, on ne prend
que les algorithmes qui n’effectuent que des multiplications. Plus précisément, pour n fixé, on
considère seulement les algorithmes pour calculer xn du type suivant :
1 : y1 := u1 v1 ,
où u1 , v1 ∈ {1, x},
......
i : yi := ui vi ,
où ui , vi ∈ {1, x, y1 , . . . , yi−1 },
......
t : yt := ut vt ,
où ut , vt ∈ {1, x, y1 , . . . , yt−1 } et yt = xn .
Le coût d’un tel algorithme étant égal à t (le nombre de multiplications).
Remarquons que l’algorithme A2 appartient à cette classe. Noter aussi que cet algorithme n’est
pas toujours optimal dans cette classe.
En fait, pour n = 15, l’algorithme A2 nécessite six multiplications tandis qu’il est possible de
calculer x15 avec seulement cinq opérations :
calculer x3 (en deux multiplications) puis x6 , x12 et x15 = x3 · x12 .
(Il est possible de prouver que l’algorithme A2 est optimal pour n < 15.)
Maintenant nous étudions la complexité du calcul de xn . En d’autres mots, nous devons
trouver une borne inférieure pour le nombre t.
Pour un algorithme quelconque du type précédent, chaque valeur de yi peut être écrite :
yi := xe(i) ,
où les exposants e(i) vérifient conditions suivantes :
e(1) ∈ {0, 1, 2},
e(i) = e(j) + e(h)
avec j, h < i, pour i ≥ 2,
e(t) = n.
Ceci implique l’inégalité
e(i) ≤ 2i
pour i = 1, . . . , t ;
ainsi e(t) = n ≤ 2t . En d’autres mots, on a
t ≥ log2 n.
21
Maintenant, nous avons prouvé que la complexité de ce problème est au moins log2 n. Ceci
montre que l’algorithme A2 est presque le meilleur possible parmi la classe de procédures définie
plus haut.
Remarque. L’argument utilisé ici pour trouver la complexité de ce problème est très simple.
Cette situation est très exceptionnelle dans le domaine de la complexité théorique. C’est un
domaine où la plupart des questions sont très difficiles. La majorité des problèmes en théorie de
la complexité restent ouverts. Par exemple, la complexité du produit de deux matrices carrées
n × n est inconnue pour n ≥ 3.
8. Le p.g.c.d.. —
1. Existence. Relation de Bézout. Théorème d’Euclide-Gauss. —
Le résultat suivant prouve lexistence du p.g.c.d.
Théorème 3. Soient a et b deux entiers non tous nuls. Il existe un entier positif d qui divise à la
fois a et b et tel que tout diviseur de a et b divise aussi d.
Cet entier d et appelé le p.g.c.d. de a et b et noté par gcd(a, b), ou parfois simplement par
(a, b), quand aucune confusion n’est possible.
De plus, il existe deux entiers u et v tels que
d = ua + vb.
Démonstration. Considérons l’ensemble des entiers de la forme ma+nb, où m et n parcourent Z.
Il est très facile de vérifiert que cet ensemble est un sous-groupe de Z. Nous avons déjà noté
qu’un tel ensemble est de la forme d Z, pour un certain entier positif d. De plus, par construction,
il existe deux entiers u et v tele que d = ua + vb.
Pour conclure, on a seulement à démontrer que d divise a et b et que chaque diviseur commun
de a et b divise aussi d.
Comme
a = 1 · a + 0 · b,
l’entier a appartient à l’ensemble d Z, ainsi d divise a ; pour la même raison, d divise b.
Considérons maintenant un entier c qui divise à la fois a et b. Alors, il existe deux entiers a0 et
b0 tele que a = ca0 et b = cb0 . D’où, la relation
d = ua + vb = (ua0 + vb0 ) · c
qui montre que c divide bien d.
22
Quand le p.g.c.d. de a et b est égal à 1, alors a et b sont dits relativement premiers, ou encore
premiers entre eux. Le théorème 1 a le corollaire suivant.
Théorème 4. Soient a et b deux entiers. Alors a et b sont relativement premiers si, et seulement
si, il existe deux entiers u et v tels que l’on ait la relation (de Bézout, ou — plus exactement —
de Bachet de Méziriac)
ua + bv = 1.
Démonstration. D’après le théorème 1, la condition est nécessaire.
Cette condition est aussi suffisante : si ua + bv = 1, alors tout entier qui divise simultanément
a et b divise aussi 1, ainsi a et b sont relativement premiers.
Ce théorème a le corollaire suivant, quelquefois appelé théorème d’Euclide-Gauss .
Théorème 5. Soient a et b deux entiers premiers entre eux. Alors, si un entier c est divisible à
la fois a et b, alors li est aussi divisible par leur produit ab.
Démonstration. Soient u et v deux entiers tels que ua + vb = 1. Alors
uac + vbc = c,
et puisque le produit ab divise les nombres ac et bc, il divise aussi l’entier c.
2. Comment calculer le p.g.c.d.. —
La démonstration du théorème 1 fournit seulement lexistence de l’entier d mais ne donne aucun
moyen pratique pour son calcul. En pratique, il est très utile d’être capable de calculer le p.g.c.d.
de deux entiers ; qui peut être calculé depuis vingt deux siècles grâce au fameux algorithme
d’Euclide.
L’algorithme d’Euclide habituel fournit seulement la valeur du p.g.c.d. Mais, puisque il est
souvent très utile de connaı̂tre la valeur des entiers u et v du théorème 3 et puisqu’ils peuvent
être trouvés assez facilement, nous donnons directement la variante qui fournit aussi u et v.
Supposons a > b > 0, l’algorithme d’Euclide calcule une suite de triplets Wi = (ti , ui , vi )
définie par les conditions
W0 = (a, 1, 0),
W1 = (b, 0, 1),
Wi+1 = Wi−1 − qi+1 Wi ,
où qi+1 = [ti−1 /ti ] pour i ≥ 2 ;
en s’arrêtant au premier entier j pour lequel tj vaut zero.
23
Alors nous affirmons que
d = tj−1
et
d = uj−1 a + vj−1 b.
Afin de démontrer ces dernières formules, on note d’abord que
ti = ui a + vi b pour
i = 0, 1, 2, . . .
et en particulier
tj−1 = uj−1 a + vj−1 b,
ainsi tj−1 ∈ a Z + b Z.
Nous devons maintenant démontrer que tj−1 est en fait égal à d, le p.g.c.d. de a et b.
D’après la démonstration du théorème 3, a Z + b Z = d Z, ainsi d divise l’entier tj−1 .
Maintenant il ne reste qu’à prouver que tj−1 divise à la fois a et b. Mais, par définition, tj−1
divise à la fois tj−1 et tj−2 et la formule
ti−2 = ti + qi ti−1 ,
successivement appliquée pour les valeurs i = j − 1, j − 2, . . . , 3, 2 prouve que le terme tj−1 divise
tj−3 , tj−4 , . . . , t1 , t0 . Puisque t1 = b et t0 = a, nous obtenons le résultat.
Exemple
La table suivante montre le calcul du p.g.c.d. des entiers 1812 et 1572.
i
0
1
2
3
4
5
6
7
t
1812
1572
240
132
108
24
12
0
u
1
0
1
−6
7
−13
59
v
0
1
−1
7
−8
15
−68
1
6
1
1
4
q
Alors nous obtenons que le p.g.c.d. de 1812 et 1572 est égal à 12, et la relation
59 × 1812 − 68 × 1572 = 12.
24
3. Le coût de l’algorithme d’Euclide. —
Il est très intéressant d’analyser le coût de cet algorithme. Le résultat est le suivant.
Théorème 6. (G. Lamé, 1845) Soit n un entier positif. Soit u le plus petit entier positif pour
lequel l’algorithme d’Euclide relatif à des nombres u et v 0 , nécessite n étapes, pour tout entier
positif v 0 plus petit que u. Et supposons que l’algorithme d’Euclide nécessite n étapes pour un
entier positif v, avec v < u. Alors
u = Fn+1
et
v = Fn ,
où Fk est le k–ième nombre de Fibonacci.
Démonstration. En fait, on effectue les divisions successives
u0 = u = q1 v + r1 ,
u1 = v = q2 r1 + r2 ,
......
un−1 = qn rn−1 + rn = qn rn−1 ,
ainsi un−1 ≥ 1, un−2 ≥ un−1 + 1 ≥ 2, un−3 ≥ un−2 + un−1 , . . . On en déduit un−j ≥ Fj+1 pour
j=1, 2, . . . , n. Les détails sont laissés au lecteur.
Corollaire 1. Si 0 ≤ v ≤ u sont des entiers alors le nombre n d’étapes de l’algorithme d’Euclide
vérifie
n≤
√
log( 5u)
√
log( 1+2 5 )
− 1.
Démonstration. Exercice.
Pour une analyse statistique détaillée du nombre d’étapes nécessaires dans l’algorithme
d’Euclide, voir Knuth.
Corollaire 2. Si 0 ≤ v < u sont des nombres entiers, où u est un nombre de n bits. Alors le coût
de l’algorithme d’Euclide est O(n3 ).
Démonstration. C’est une conséquence quasi immédiate du corollaire 1. Mais, par un
raisonnement plus fin on peut montrer qu’en fait le coût de l’algorithme d’Euclide est O(n2 ).
4. Le p.p.c.m.. —
Si a et b sont deux entiers non nuls, alors, par définition leur p.p.c.m. est l’entier
lcm(a, b) = ab/(a, b),
parfois on note aussi le p.p.c.m. de a et b par [a, b].
Il est facile de vérifier que [a, b] est multiple commun des entiers a et b et que tout entier qui
est à la fois un multiple de a et de b est un multiple de [a, b].
25
Exercice
Démontrer les propriétés ci-dessus.
Exemple
Nous avons vu que lee p.g.c.d. des nombres 1812 et 1572 est égal à 12. Ceci implique que
lcm(1812, 1572) = (1812 × 572)/12 = 237372.
9. Le groupe G(n). —
1. Définition. —
Soit n ≥ 2 un entier. Par définition, G(n) est l’ensemble des éléments de l’anneau quotient
Z/nZ qui sont inversibles.
D’après le théorème 3, l’ensemble G(n) consiste en les classes d’entiers premiers avec n. On
note ϕ(n) le cardinal de l’ensemble G(n), c’est le nombre des entiers de l’intervalle {1, 2, . . . , n−1}
qui sont premiers avec n. Cette fonction est appelée fonction phi d’Euler.
Puisque le produit de deux éléments inversibles est aussi inversible, il est facile de voir que
G(n) est un groupe multiplicatif.
Tout entier ≥ 2 est dit premier s’il n’a dautres diviseurs que lui et l’unité. Les premiers nombres
premiers sont 2, 3, 5, 7, 11, 13 . . . Il est connu depuis Euclide qu’il existe une infinité de nombres
premiers (voir exercice 19 ci-dessous).
A partir de maintenant, la lettre p désignera toujoursun nombre premier. Tout entier non
premier au moins égal à deux sera appelé composé.
Si p est un nombre premier alors tous les entiers de l’intervalle {1, 2, . . . , p−1} sont relativement
premiers à lui, ainsi
ϕ(p) = p − 1.
Pour tout entier n ≥ 2, on a même l’équivalence
n premier ⇐⇒ ϕ(n) > n − 2.
2. Le théorème d’Euler. —
Le lemme suivant est un cas particulier très simple du théorème de Lagrange sur les groupes
finis.
Lemme 1. Soit G un groupe multiplicatif commutatif fini, de cardinal k. Alors tout élément x
de G vérifie
xk = 1.
26
[Le théorème de Lagrange est le même résultat, mais pour tout groupe fini.]
Démonstration. Soit x un élément quelconque de G. La fonction y 7→ xy de G on lui-même est
injective. Donc, (par associativité et commutativité)
Y
y=
y∈G
Y
Y
xy = xk
y∈G
y.
y∈G
On obtient le résultat en simplifiant par le terme
Q
y∈G
y.
L’application de ce lemme au groupe G(n) donne le résultat suivant.
Théorème 7 (Euler). Soit a un entier relativement premier avec un entier n ≥ 2, alors
aϕ(n) ≡ 1
(mod n).
Exemple
Considérons le cas où n = 56 et x = 19. On vérifie que ϕ(56) = 24, et le calcul modulo 56
donne :
x2 = 289 ≡ 9,
x4 ≡ 92 = 81 ≡ 25,
x6 ≡ 25 × 9 = 225 ≡ 1,
ainsi x24 ≡ 1
(mod 56), comme affirmé dans le théorème.
3. Calcul de l’inverse dans G(n). —
Soit x un élément du groupe G(n). Nous voulons calculer son inverse dans le groupe u = x−1 .
En d’autres mots, il s’agit de trouver un entier u qui vérifie
ux ≡ 1
(mod n),
ou deux entiers u et v tels que
ux + vn = 1.
Deux méthodes sont possibles :
•
utiliser l’algorithme d’Euclide pour le p.g.c.d. de x et n, ce qui donne l’entier u,
•
utiliser le théorème d’Euler qui donne la solution
u = xϕ(n)−1 mod n.
Dans les deux cas, le nombre d’opérations est O(log n), mais la seconde méthode peut être plus
rapide. (Mais il faut que ϕ(n) soit connu. Cependant, on ne connait aucun moyen rapide pour
calculer ϕ(n) ; ceci est tellement vrai que la sécurité de certaines méthodes cryptographiques
repose on la difficulté de calculer la valeur ϕ(n) quand n est un très grand entier.)
27
Remarque. Dans le cas présent, le coût du calcul de l’inverse d’un élément est plus élevé que le
coût du calcul du produit de deux éléments. En général, le coût des opérations dans G(n) et dans
N sont très différents (ce que nous avons vu pour le calcul de xn ).
4. Calcul des coefficients de la relation de Bézout. —
Grâce au théorème d’Euler il est possible de calculer les coefficients de la relation de Bézout
sans utiliser l’algorithme d’Euclide.
En fait, on considère deux entiers positifs a et b relativement premiers. On doit trouver deux
entiers u et v tels que ua + vb = 1. Cette relation implique les congruences
ua ≡ 1
(mod b)
et
vb ≡ 1 (mod a).
Supposons que ϕ(a) et ϕ(b) sont connus. On obtient une solution (u, v) en prenant
u = aϕ(b)−1 mod b
et
v = (bϕ(a)−1 mod a) − a.
En fait, d’après le théorème d’Euler, le nombre
ua + vb − 1
est divisible par a et par b, ainsi il est aussi divisible par le produit ab (puisque a et b sont
relativement premiers) ; on vérifie aussi facilement que
|ua + vb − 1| < ab.
En fait nous obtenons la relation ua + bv = 1.
Exemple
Prenons les valeurs choisies plus haut dans lexemple de l’algorithme d’Euclide. On écrit
1812 = 12 × 151
et
1572 = 12 × 131
ϕ(151) = 150
et
ϕ(131) = 130.
alors
Puis on vérifie que
151129 mod 131 = 59
et
(131149 mod 151) − 151 = −68,
ainsi nous obtenons les coefficients précédents.
28
Remarque. Pour deux entiers a et b, nous avons l’équivalence
(a, b) = 1 ⇐⇒ aϕ(b) ≡ 1
(mod b).
On a déjà vu que la condition est nécessaire.
Vice-versa, si un entier d divise à la fois a et b, il divise aussi le nombre ak mod b pour tout
entier k > 0 ; ainsi
ak mod b = 1 =⇒ d = 1.
Quand le nombre ϕ(b) est connu, l’équivalence précédente donne un moyen rapide de tester si
a et b sont relativement premiers.
Exercice
Soit n un entier qui est le produit de deux grands nombres premiers p et q. Alors démontrer
qu’il est facile de déterminer les facteurs p et q quand ϕ(n) est connu, et vice-versa.
10. Le théorème des restes chinois. —
1. Le théorème. —
Un cas particulier du résultat suivant était connu par les astronomes chinois depuis l’antiquité.
Théorème 8. Soit m et n deux entiers relativement premiers, alors pour tout couple d’entiers a
et b le système de congruences
(
x≡a
(mod m)
x ≡ b
(mod n)
admet une solution entière ; de plus, cette solution est unique modulo le produit mn.
Démonstration. Considérons l’application naturelle
Z −→ Z/mZ × Z/nZ
qui associe (x mod m, x mod n) à l’entier x.
Il est clair qu’il s’agit d’un morphisme d’anneaux. Son noyau est l’ensemble des entiers qui sont
à la fois divisibles par m et par n ainsi, d’après le théorème 3, c’est l’ensemble des multiples du
produit mn. D’où un morphisme injectif
Z/mnZ −→ Z/mZ × Z/nZ.
Cette application injective envoie un ensemble fini dans un ensemble fini de même cardinal, elle
est donc injective. D’où le théorème.
29
Corollaire 1. Soient m1 , . . . , mk des entiers qui sont premiers deux à deux. Alors, pour tout
k–uple d’entiers (a1 , . . . , ak ), le système de congruences
x ≡ ai
(mod mi ), 1 ≤ i ≤ k,
admet une solution entière, de plus cette solution est unique à un multiple du produit m1 · · · mk
près.
Démonstration. Preuve par induction on k, utilisant le précédent théorème.
Corollaire 2. Soient a et b entiers positifs premiers entre eux, alors
ϕ(ab) = ϕ(a) · ϕ(b).
Ainsi, si p1 , . . . , pr sont différents nombres premiers et k1 , . . . , kr sont des entiers positifs, alors
ϕ(pk11 · · · pkr r ) = (p1 − 1) pk11 −1 · · · (pr − 1) pkr r −1 .
Démonstration. La seconde assertion est une conséquence immédiate de la première,
démontrons donc celle-ci.
D’après la preuve du théorème, quand a et b sont deux entiers positifs, on a un isomorphisme
d’anneaux
Z/abZ ∼ Z/aZ × Z/bZ.
Par cet isomorphisme, les éléments inversibles sont envoyés sur les éléments inversibles, par
conséquent
G(ab) ∼ G(a) × G(b).
En prenant le cardinal de chaque membre, nous obtenons la relation cherchée.
2. Preuve Constructive. —
La demonstration précédente du théorème des restes chinois, ne fournit pas un algorithme
utilisable pour le calcul de x (elle suggère seulement une recherche systèmatique de la solution
parmi l’ensemble des entiers 0, 1, . . . , mn − 1 . . . !).
Voici une autre preuve qui, cette fois, donne un algorithme qui calcule efficacement une solution
entière x du système
(
x≡a
(mod m)
x ≡ b
(mod n)
considéré dans le théorème du reste chinois.
30
Ainsi, soient m et n deux entiers premiers entre eux. L’algorithme d’Euclide fournit deux
entiers u et v tels que
um + vn = 1.
Alors l’entier
x = bum + avn
vérifie
x ≡ avn ≡ a
(mod m)
et
x ≡ bvm ≡ b (mod n),
ainsi c’est une solution du système.
Exemple
Résoudre le système
(
x ≡ 13 (mod 151),
x ≡ 31 (mod 131).
Nous avons vu que 59 · 151 − 68 · 131 = 1, ainsi nous pouvons prendre
x = (31 × 59 × 151 − 13 × 68 × 131) mod(151 × 131) = 2127.
3. Calculs effectifs. —
Soient m1 , . . . , mk des entiers positifs premiers deux à deux, et soit M le produit de ces entiers.
Nous cherchons un algorithme pour calculer l’isomorphisme
∼
ψ : Z/M Z −→
k
Y
(Z/mi Z).
i=1
et son inverse ψ −1 .
Le calcul de ψ est immédiat :
ψ(x) = (x mod m1 , . . . , x mod mk ).
Voici une manière de calculer l’application réciproque. Posons
Mi = M/mi
(ainsi (Mi , mi ) = 1) , pour i = 1, . . . , k.
31
Alors on calcule des entiers e1 , . . . , ek tels que
ei Mi ≡ 1
(mod mi ), pour i = 1, . . . , k.
Puis on vérifie aussitôt que
ψ −1 (a1 , . . . , ak ) = (a1 e1 M1 + . . . + ak ek Mk ) mod M.
Comme nous venons de le voir, les nombres ei peuvent être calculés par l’algorithme d’Euclide
ou grâce au théorème d’Euler.
11. Les nombres premiers. —
Rappelons qu’un entier ≥ 2 est dit premier si ses seuls diviseurs positifs sont 1 ou lui-même.
D’après la définition d’un nombre premier, il est évident que
ϕ(p) = p − 1,
et d’après le précédent paragraphe, Z/pZ est un corps.
Une conséquence fondamentale du théorème 4 est le théorème suivant.
Théorème 9 (Fermat). Soient p un nombre premier et a un entier non divisible par p, alors
ap−1 ≡ 1
(mod p).
Corollaire. Soient p un nombre premier et a un entier, alors
ap ≡ a
(mod p).
Démonstration. En fait : quand p ne divise pas a, c’est une conséquence immédiate du
théorème 9, sinon les deux membre de la relation sont égaux à zero.
Remarque. Le théorème de Fermat donne une condition nécessaire de primalité ; cependant,
cette condition n’est pas suffisante. Il y a des nombres — dits de Carmichael — qui vérifient la
conclusion du théorème de Fermat, mais qui ne sont pas premiers, le plus petit est 561 (noter que
561 est égal à 3 × 11 × 17).
On sait depuis 1993 qu’il existe une infinité de nombres de Carmichael.
Le résultat suivant est bien connu.
Théorème 10. Tout entier ≥ 2 est égal à un produit de facteurs premiers, de plus cette
factorisation est unique — à l’ordre près des facteurs.
32
D’où la proposition suivante.
Corollaire. Si m et n sont deux entiers positifs respectivement de la forme
m = pa1 1 · · · par r et n = pb11 · · · pbrr
où les pi sont des nombres premiers et ai et bi sont des nombres ≥ 0, alors le p.g.c.d. des entiers
m et n est donné par la formule
gcd(m, n) = pc11 · · · pcrr ,
où ci = min{ai , bi }, 1 ≤ i ≤ r ; tandis que le p.p.c.m. de ces deux entiers est égal à
lcm(m, n) = pd11 · · · pdr r ,
où di = max{ai , bi }, 1 ≤ i ≤ r.
© Copyright 2026 Paperzz