Académique Documents
Professionnel Documents
Culture Documents
Chapitre 10
Arithmétique dans Z
Sommaire
10.1 Divisibilité et division euclidienne . . . . . . . . . . . . . . . . . . . . . . . . 231
10.1.1 Divisibilité dans Z, diviseurs, multiples . . . . . . . . . . . . . . . . . . . . . . . 231
10.1.2 Théorème de la division euclidienne . . . . . . . . . . . . . . . . . . . . . . . . 232
10.2 Pgcd et algorithme d’Euclide . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
10.2.1 Pgcd de a, b dans N (avec a 6= 0 ou b 6= 0) . . . . . . . . . . . . . . . . . . . . . 233
10.2.2 Algorithme d’Euclide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
10.2.3 Un peu de programmation Python . . . . . . . . . . . . . . . . . . . . . . . . . 236
10.2.4 Quelques propriétés du pgcd . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
10.2.5 Relation de Bézout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
10.2.6 Ppcm de deux entiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
10.3 Entiers premiers entre eux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
10.3.1 Couples d’entiers premiers entre eux . . . . . . . . . . . . . . . . . . . . . . . . 242
10.3.2 Le théorème de Bézout et ses conséquences . . . . . . . . . . . . . . . . . . . . 242
10.3.3 Pgcd de plusieurs entiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
10.3.4 Entiers premiers entre eux dans leur ensemble . . . . . . . . . . . . . . . . . . . 244
10.4 Nombres premiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
10.4.1 Définition et « premières » propriétés . . . . . . . . . . . . . . . . . . . . . . . . 245
10.4.2 Décomposition en produit de facteurs premiers . . . . . . . . . . . . . . . . . . 247
10.4.3 Un peu de programmation Python . . . . . . . . . . . . . . . . . . . . . . . . . 249
10.5 Congruences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
10.5.1 Congruence modulo un entier sur Z . . . . . . . . . . . . . . . . . . . . . . . . 252
10.5.2 Opérations sur les congruences . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
10.1 Divisibilité et division euclidienne Chapitre 10 : Arithmétique dans Z
Définition 10.1.1
Soient a et b deux entiers relatifs.
On dit que b divise a, ou encore b est un diviseur de a, ou encore a est divisible par b, ou encore a est
un multiple de b, s’il existe q dans Z tel que a = qb. On note alors b | a.
Définition 10.1.2
Pour tout n de Z, on note nZ = {qn, q ∈ Z} l’ensemble des multiples de n.
On note D(n) l’ensemble des diviseurs de n dans Z.
L’ensemble D(n) ∩ N est donc l’ensemble des diviseurs positifs ou nuls de n.
Pour tous a, b dans Z, on a les équivalences : b | a ⇔ a ∈ bZ ⇔ b ∈ D(a).
Définition 10.2.1 (pgcd de deux entiers naturels dont l’un au moins est non nul)
Soit a et b deux entiers naturels, dont l’un au moins est non nul.
Soit D(a) ∩ D(b) ∩ N l’ensemble des diviseurs communs de a et b dans N.
Cet ensemble, fini et inclus dans N∗ , possède un maximum n > 1 (pour l’ordre naturel).
Cet entier strictement positif n est appelé pgcd de a et de b. Il est noté n = pgcd(a, b), ou n = a ∧ b.
Premières propriétés
Il est clair que a ∧ b = b ∧ a. De même, si a > 0, la définition donne a ∧ 0 = a.
Pour tout a de N, on a : D(a) ∩ D(1) ∩ N = {1} donc a ∧ 1 = 1.
Par définition, l’entier a ∧ b est un diviseur commun aux entiers a et b.
Les diviseurs de a ∧ b sont donc également des diviseurs communs à a et b.
On verra que la réciproque est vraie : les diviseurs communs à a et b sont aussi des diviseurs de a ∧ b.
On a l’égalité a ∧ b = a si et seulement si a est un diviseur de b.
Proposition 10.2.1
Soit a, b et q trois entiers relatifs. Alors D(a) ∩ D(b) = D(b) ∩ D(a − qb)
Autrement dit, les diviseurs communs de a et b sont exactement ceux de b et a − qb.
Exemples
– Voici les huit divisions successives qui aboutissent à 14938 ∧ 9471 = 77 :
14938 = 1 · 9471 + 5467 9471 = 1 · 5467 + 4004 5467 = 1 · 4004 + 1463 4004 = 2 · 1463 + 1078
1463 = 1 · 1078 + 385 1078 = 2 · 385 + 308 385 = 1 · 308 + 77 308 = 4 · 77
– Le nombre de divisions est parfois bien moindre : tout dépend bien sûr des quotients successifs : la
méthode est d’autant plus rapide que les quotients sont très supérieurs à 1...)
Voici par exemple le pcgd de a = 267914296 et de b = 317811 en seulement trois divisions :
267914296 = 842 ∗ 317811 + 317434 317811 = 1 ∗ 317434 + 377 317434 = 842 ∗ 377 + 0
Avec un petit effort de programmation, on modifie la fonction précédente de façon à ce qu’elle renvoie
non seulement le pcgd, mais aussi la description des étapes de l’algorithme d’Euclide :
def pgcd2(a, b):
e = []
while b:
(q, r) = (a // b, a % b)
e.append(’{}={}*{}+{}’.format(a, q, b, r))
(a, b) = (b, r)
return (a, e)
Voici ce que renvoie la fonction pgcd2, toujours sur les exemples précédents :
>>> pgcd2(14938,9471)
(77,[’14938=1*9471+5467’, ’9471=1*5467+4004’, ’5467=1*4004+1463’, ’4004=2*1463+1078’
,’1463=1*1078+385’, ’1078=2*385+308’, ’385=1*308+77’, ’308=4*77+0’])
>>> pgcd2(267914296,317811)
(377, [’267914296=842*317811+317434’, ’317811=1*317434+377’, ’317434=842*377+0’])
>>> pgcd2(2**30-1,2**24-1)
(63, [’1073741823=64*16777215+63’, ’16777215=266305*63+0’])
L’algorithme d’Euclide est par nature récursif (calculer le pgcd de a et b, c’est calculer celui de b et r,
à moins que b soit nul auquel cas c’est fini). Voici une fonction Python qui utilise la récursivité :
def pgcd3(a, b):
if b: return pgcd3(b, a % b)
else: return a
On peut même écrire une version encore plus compacte (avec lambda et le « if ternaire ») :
Voici maintenant une fonction Python qui renvoie l’ensemble des diviseurs d’un entier n > 0.
On initialise l’ensemble d = D(n) à la valeur d = ∅.
√
On utilise un compteur k qu’on incrémente à partir de 1, sans jamais atteindre n.
√
À chaque diviseur k de n, on ajoute à la fois k et n/k à l’ensemble d (on a 1 6 k < n < n/k 6 n).
√
À la sortie de la boucle, il faut vérifier si la dernière valeur de k vaut exactement n (ce qui se produit
si n est un carré parfait) car alors n/k et k sont égaux (et il suffit d’ajouter k à l’ensemble d).
def diviseurs(n):
d = set(); k = 1
while k*k < n:
if n % k == 0: d |= {k, n//k}
k += 1
if k*k == n: d.add(k)
return sorted(d)
Voici par exemple la liste des diviseurs de l’entier 210
>>> diviseurs(210)
[1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210]
Interprétation et exemple
Soit a et b deux entiers naturels, dont l’un au moins est non nul. Soit n = a ∧ b.
– d’une part n est le maximum de D(a) ∩ D(b) au sens de la relation 6 sur N.
– d’autre part n est le maximum de D(a) ∩ D(b) au sens de la relation de divisibilité | sur N.
>>> diviseurs(210)
[1, 2, 3, 5, 6, 7, 10, 14, 15, 21, 30, 35, 42, 70, 105, 210]
>>> diviseurs(330)
[1, 2, 3, 5, 6, 10, 11, 15, 22, 30, 33, 55, 66, 110, 165, 330]
>>> pgcd1(210,330)
30
>>> set(diviseurs(210)) & set(diviseurs(330))
{1, 2, 3, 5, 6, 10, 15, 30}
>>> diviseurs(30)
[1, 2, 3, 5, 6, 10, 15, 30]
La proposition suivant montre qu’il est possible d’effectuer une mise en facteur (ou de diviser par un
facteur commun) dans un calcul de pgcd.
>>> iterbezout(14938,9471)
(26, -41)
Premières propriétés
Il est clair qu’on a les égalités a ∨ b = b ∨ a, et a ∨ 1 = a.
Par définition, l’entier a ∨ b est un multiple commun aux entiers a et b.
On verra que la réciproque est vraie : les multiples communs à a et b sont aussi des multiples de a ∨ b.
On a l’égalité a ∨ b = a si et seulement si a est un multiple de b.
Un exemple
On forme la liste m12 des cinquante premiers multiples de l’entier 12 dans N∗ .
On crée ensuite la liste m15 des cinquante premiers multiples de l’entier 15 dans N∗ .
On forme enfin l’intersection ordonnée de ces deux listes. On obtient alors une liste de dix entiers
strictement positifs, qui sont donc les dix premiers multiples communs de 12 et 15 dans N∗ .
On constate que le plus petit d’entre eux est l’entier 60 (donc 12 ∨ 15 = 60), et qu’il est effectivement
un diviseur de tous les entiers de cette liste.
La proposition suivante est admise pour l’instant. Elle sera démontrée après la proposition 10.3.3.
ab
Il suffit donc de calculer a ∧ b (par l’algorithme d’Euclide) pour obtenir le ppcm par : a ∨ b = .
a∧b
Voici comment faire avec Python :
def pgcd(a, b): def ppcm(a,b):
return pgcd(b, a % b) if b else a return a*b // pgcd(a,b)
Et un exemple d’utilisation :
>>> ppcm(240,350)
8400
Définition 10.3.1
Soit a et b deux entiers relatifs.
On dit que a et b sont premiers entre eux (ou encore étrangers) si a ∧ b = 1.
Proposition 10.3.1 (les quotients de deux entiers par leur pgcd sont premiers entre eux)
Soit a et b deux entiers relatifs (non tous deux nuls), et d leur pgcd (donc d > 0).
Les deux entiers a0 et b0 tels que a = da0 et b = db0 sont premiers entre eux.
Plus généralement si les entiers a1 , a2 , . . ., an sont premiers entre eux deux à deux, et si l’entier c est
divisible par chacun des ak , alors il est divisible par leur produit.
L’associativité (et la commutativité) du pgcd et du ppcm ont pour conséquence que si on se donne n
entiers relatifs a1 , a2 , . . ., an , alors les notations a1 ∧ a2 ∧ · · · ∧ an et a1 ∨ a2 ∨ · · · ∨ an ont un sens,
indépendamment de l’ordre des facteurs ak et de celui dans lequel on effectue les calculs.
On peut alors poser la définition suivante :
Définition 10.3.2
Soit a1 , a2 , . . ., an , une famille de n entiers relatifs, avec n > 2.
L’entier a1 ∧ a2 ∧ · · · ∧ an est appelé le pgcd des entiers a1 , a2 , . . ., an .
L’entier a1 ∨ a2 ∨ · · · ∨ an est appelé le ppcm des entiers a1 , a2 , . . ., an .
Autrement dit, les diviseurs communs aux entiers a1 , a2 , . . ., an sont les diviseurs de leur pcgd.
– L’entier m = a1 ∨ a2 ∨ · · · ∨ an est l’unique entier naturel tel que a1 Z ∩ a2 Z ∩ · · · ∩ an Z = mZ.
Autrement dit, les multiples communs aux entiers a1 , a2 , . . ., an sont les multiples de leur ppcm.
Remarques
– On ne confondra pas « premiers entre eux deux à deux » et « premiers entre eux dans leur ensemble ».
Plus précisément : si deux au moins des entiers a1 , . . . , an sont premiers entre eux, et a fortiori si les
entiers a1 , . . . , an sont premiers entre eux deux à deux, alors ils le sont dans leur ensemble.
Dès que n > 3, la réciproque est fausse comme le montre l’exemple de 6, 10, 15.
On a en effet 6 ∧ 10 ∧ 15 = 1 (car 6 + 10 − 15 = 1), mais 6 ∧ 10 = 2, 6 ∧ 15 = 3, 10 ∧ 15 = 5.
– Soit d un diviseur strictement positif commun aux entiers a1 , . . . , an .
ak
Alors d = a1 ∧ a2 ∧ . . . ∧ an si et seulement si les entiers sont premiers entre eux dans leur ensemble.
d
– Si a1 , . . . , an sont premiers entre eux deux à deux, alors a1 ∨ a2 ∨ · · · ∨ an = a1 a2 · · · an .
– Attention : l’égalité (a ∧ b)(a ∨ b) = ab ne se généralise pas à plus de deux entiers.
Par exemple, avec a = 6, b = 10, c = 15, on a : a ∧ b ∧ c = 1, a ∨ b ∨ c = 30 et abc = 900.
Définition 10.4.1
Soit p un entier naturel.
On dit que p est premier si p > 2 et si ses seuls diviseurs dans N sont 1 et p.
Proposition 10.4.1
Soit p un nombre premier, et a un entier relatif.
Si p ne divise pas a, alors p est premier avec a.
En particulier, un entier premier p est premier avec tous les entiers de {1, . . . , p − 1}.
Une autre conséquence est que deux nombres premiers distincts sont premiers entre eux.
Proposition 10.4.4
L’ensemble des nombres premiers est infini.
Crible d’Erathosthène
Une méthode artisanale bien connue. 1 2 3 4 5 6 7 8 9 10
Ici on se restreint à l’intervalle J1, 100K. 11 12 13 14 15 16 17 18 19 20
On barre l’entier 1, qui n’est pas premier. 21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
Ensuite on barre les entiers pairs (sauf 2 lui-même).
41 42 43 44 45 46 47 48 49 50
Puis on barre les multiples de 3 qui ne sont pas déjà 51 52 53 54 55 56 57 58 59 60
barrés (donc les multiples impairs de 3), sauf 3 lui-même, 61 62 63 64 65 66 67 68 69 70
puis les multiples non barrés de 5, puis ceux de 7. 71 72 73 74 75 76 77 78 79 80
L’entier premier 11 vérifie 112 > 100 donc c’est fini. 81 82 83 84 85 86 87 88 89 90
À ce stade, il ne reste plus que des entiers premiers. 91 92 93 94 95 96 97 98 99 100
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20 11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30 21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40 31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50 41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60 51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80 71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90 81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100 91 92 93 94 95 96 97 98 99 100
(après avoir barré les entiers pairs > 2) (on a barré les multiples impairs de 3)
1 2 3 4 5 6 7 8 9 10 1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20 11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30 21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40 31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50 41 42 43 44 45 46 47 48 49 50
51 52 53 54 55 56 57 58 59 60 51 52 53 54 55 56 57 58 59 60
61 62 63 64 65 66 67 68 69 70 61 62 63 64 65 66 67 68 69 70
71 72 73 74 75 76 77 78 79 80 71 72 73 74 75 76 77 78 79 80
81 82 83 84 85 86 87 88 89 90 81 82 83 84 85 86 87 88 89 90
91 92 93 94 95 96 97 98 99 100 91 92 93 94 95 96 97 98 99 100
(après avoir barré les multiples de 5) (puis ceux de 7)
Voici une fonction Python qui renvoie la liste des tous les entiers premiers strictement inférieurs à n2 ,
où n est l’entier passé en argument :
def crible(n):
return [p for p in range(2, n*n)
if p not in
set(j for i in range(2, n) for j in range(i*i, n*n, i))]
>>> crible(10)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
Sinon, voici une autre solution : la fonction premiers renvoie le tableau des entiers premiers compris
entre 2 et n. L’intérêt repose dans l’utilisation d’un tableau Numpy de booléens (8 fois moins de taille
que des int) et surtout dans le « fancy indexing » qui permet de barrer tous les multiples d’un nombre
premier sans créer pour cela une boucle (on utilise une coupe du tableau pour l’affectation : on sait que
ça ne nécessite aucune mémoire supplémentaire, car les calculs se font sur place).
def premiers(n):
import numpy as np
a = np.ones(n,’bool’) # n fois 1
a[0] = a[1] = False # on barre 0 et 1
for i in range(2,int(n**0.5)): # de i=2 à sqrt(n)
if a[i]: a[i*i: n: i] = False # si i non barré, barrer ses suivants
return np.nonzero(a)[0] # renvoyer les entiers premiers
Dire que vp (n) est nul, c’est dire que n n’est pas divisible avec p (donc est premier avec p).
Dire que vp (n) vaut 1, c’est dire que n est divisible par p, mais pas par p2 .
Pour tout n de Z∗ , on a vp (n) = vp (−n), ce qui permet de se limiter à n > 0.
pαp , alors on peut dire que −n = − pαp est la factorisation de −n (peu utilisé en fait).
Y Y
Si n =
p∈P p∈P
αp
Y
Le produit p a un sens parce qu’il contient un nombre fini de facteurs distincts de 1.
p∈P
Dans cette écriture de n, les entiers p pour lesquels αp > 1 sont les diviseurs premiers de n.
Pour l’entier n = 1, tout les exposants αp sont nuls.
Pour prendre un exemple, la décomposition de n = 4200 est n = 23 · 3 · 52 · 7.
On écrit maintenant une deuxième fonction de factorisation. C’est juste une variation sur l’idée précé-
dente. Mais on utilise un dictionnaire plutôt qu’une liste : dans ce dictionnaires les clefs sont les diviseurs
premiers de n, et les valeurs associées à ces clefs sont les valuations p-adiques correspondantes.
La toute dernière instruction sert à renvoyer un résultat sous forme d’une liste de couples (p, vp (n)),
triée suivant les valeurs croissantes de p.
Voici maintenant une fonction (très compacte) renvoyant le n-ème nombre premier :
def nthprime(n):
c = 1 # un compteur de nombres premiers
p = 1 # initialise le futur n-ième nombre premier
while c < n: # tant qu’on n’a pas atteint n nombres premiers
p += 2 # on passe au candidat suivant
j = 3 # diviseur potentiel de p
ok = True # initialise condition de primalité
while ok and j*j <= p: # tant qu’on ne dépasse pas sqrt(p)
ok = p%j # on continue si j ne divise pas p
j += 2 # et on passe au diviseur potentiel suivant
if ok: c += 1 # si on est sorti avec ok=True, p était premier
return max(p, 2) # max utile uniquement si n=1 donc si p=1
Enfin, la fonction suivante renvoie la liste ordonnées de n plus petits entiers premiers :
def nprimes(N):
primes = [2] # initialise la liste des nombres premiers
def primable(k):
for j in primes: # pour chaque nombre premier de la liste
if k % j == 0: # si j divise k
return 0 # alors k n’est pas premier!
if j*j > k: # si on dépasse sqrt(k)
return 1 # alors k est "primable"
n = 1 # initialise le compteur de nombres premiers
k = 3 # 3 est le plus petit entier premier impair
while n < N: # tant qu’on n’a pas obtenu N nombres premiers
if primable(k): # si k est "primable" (donc premier!)
n += 1 # alors on incrémente le compteur n
primes.append(k) # et on ajoute k à la liste "primes"
k += 2 # on passe à l’entier impair suivant
return primes # renvoie la liste des n plus petits premiers
Voici par exmple la liste des 100 plus petits nombres premiers :
>>> nprimes(100)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79,
83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167,
173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257,
263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353,
359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449,
457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541]
10.5 Congruences
10.5.1 Congruence modulo un entier sur Z
Définition 10.5.1
Soit n un entier strictement positif. Soit a, b deux entiers relatifs quelconques.
On note a ≡ b [n] si la différence b − a est dans nZ (c’est-à-dire est un multiple de n).
On exprime cette situation en disant que a et b sont congrus modulo n.
On définit ainsi une relation sur Z, appelée relation de congruence modulo n.
Définitions équivalentes
– On a l’équivalence : a ≡ b [n] ⇔ (∃ k ∈ Z, a = b + kn).
– De même : a ≡ b [n] équivaut à « a et b ont le même reste dans la division par n ».
Proposition 10.5.1
Soit n un entier strictement positif.
La relation de congruence modulo n est une relation d’équivalence sur Z.
Classes d’équivalences
Soit n un entier strictement positif fixé.
On note souvent a la classe d’équivalence de a pour la relation de congruence modulo n, c’est-à-dire
l’ensemble des b de Z tels que b ≡ a [n], c’est-à-dire l’ensemble {a + kn, k ∈ Z}.
Avec ces notations, 0 = n est l’ensemble de tous les multiples de n dans Z.
Tout entier relatif a est congru, modulo n, à un unique entier r de {0, . . . , n − 1}, l’entier r étant le
reste dans la division de a par n.
Il y a donc exactement n classes d’équivalences, et on note souvent Z/nZ = {0, 1, . . . , n − 1}.
Proposition 10.5.2
Soit n un entier strictement positif.
a ≡ b [n] a + a0 ≡ b + b0 [n]
Pour tous entiers relatifs a, b, c, d, on a les implications 0 ⇒
a ≡ b0 [n] aa0 ≡ bb0 [n]