Calcul Formel
Calcul Formel
Calcul Formel
Introduction
Notes de cours
version 09
Guillermo MORENO-SOCÍAS
Introduction 3
1 Éléments de complexité 10
1.1 Définition de la complexité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.2 Quelques propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.3 Exercices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
2 Entiers 14
2.1 Entiers multiprécision . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2 Algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.3 Addition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.4 Multiplication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4.1 Algorithme naïf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4.2 Algorithme de Karatsuba . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2.5 Exponentiation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.6 Division euclidienne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.7 Plus grand commun diviseur et algorithme de Euclide dans ℤ . . . . . . . . . . . . . . . . . . 27
2.8 Exercices supplémentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
« Calcul formel » est un terme spécifiquement français. En anglais on parle de « Computer Algebra », en
espagnol de « Álgebra computacional », etc.
On peut caractériser le Calcul formel par les trois E :
• E comme exact, par opposition aux calculs utilisant des nombres approchés.
On aura affaire en particulier à des entiers de grande taille.
• E comme effectif, où l’on a une méthode de calcul, par opposition aux théorèmes de pure existence.
On s’intéressera donc aux algorithmes.
• E comme efficace, car si le calcul voulu prend trop de mémoire ou trop de temps il ne sera pas intéressant ;
et s’il y a plusieurs façons de faire, on préférerait la moins chère.
Mesurer ces coûts est le but de la théorie de la complexité.
Exemples 0.0.1
√
1. Est-ce que ( 3)2 = 3 ?
Dans Python 3 on a
>>> from math import sqrt
>>> sqrt(3)
1.7320508075688772
>>> sqrt(3)**2
2.9999999999999996
⎧ représenter ⎫ ⎧ entiers ⎫
{ additionner } { polynômes }
{ } { }
Comment ⎨ multiplier ⎬ des ⎨ matrices
⎬ avec un ordinateur ?
{ diviser } { entiers modulaires }
{ } { }
⎩ … ⎭ ⎩ … ⎭
Pour donner un sens au mot « efficace », il sera nécessaire d’étudier la complexité de fonctions et d’algo-
rithmes. Cela fera l’objet du premier chapitre de ce cours. Nous appliquerons tout de suite ces notions à
des algorithmes simples : par exemple, nous verrons pourquoi l’algorithme de multiplication d’entiers qu’on
apprend à l’école n’est pas terriblement efficace et comment faire beaucoup mieux.
Selon les auteurs, les notations et les définitions peuvent différer, ce qui a des conséquences sur les résultats
(énoncés et démonstrations). On a dû donc faire un choix, en essayant d’avoir une certaine cohérence interne.
À la fin de ces notes on trouvera quelques références (attention aux différences dans les notations et les
définitions).
Commentaires et remarques bienvenus, notamment concernant le signalement d’erreurs (dont des coquilles)
et d’améliorations (sachant que l’auteur de ces notes n’est nullement un spécialiste) : [email protected]
ou [email protected].
Plutôt que de diffuser ces notes, merci de dire aux personnes intéressées de demander à l’auteur la dernière
version disponible.
0.1 Ensembles
On assume ZFC (théorie des ensembles de Zermelo–Fraenkel avec l’axiome du choix).
def
Ensemble vide : ⌀ = { }. Notation à éviter ici : ∅ = ⌀.
Inclusion, égalité, inclusion stricte, ensemble des parties, union, intersection, différence :
def
𝐴 ⊆ 𝐵 ⟺ ∀ 𝑥 ∈ 𝐴, 𝑥 ∈ 𝐵
def
𝐴 = 𝐵 ⟺ (𝐴 ⊆ 𝐵 et 𝐵 ⊆ 𝐴)
def
𝐴 & 𝐵 ⟺ (𝐴 ⊆ 𝐵 et 𝐴 ≠ 𝐵)
def
𝐶 ∈ 𝒫(𝐴) ⟺ 𝐶 ⊆ 𝐴
def
𝑥 ∈ 𝐴 ∪ 𝐵 ⟺ (𝑥 ∈ 𝐴 ou 𝑥 ∈ 𝐵)
def
𝑥 ∈ 𝐴 ∩ 𝐵 ⟺ (𝑥 ∈ 𝐴 et 𝑥 ∈ 𝐵)
def
𝐴 et 𝐵 sont disjoints ⟺ 𝐴 ∩ 𝐵 = ⌀
def
𝑥 ∈ 𝐴 r 𝐵 ⟺ (𝑥 ∈ 𝐴 et 𝑥 ∉ 𝐵)
Notations ambiguës à éviter ici : 𝐴 ⊂ 𝐵 et 𝐴 \ 𝐵 = 𝐴 r 𝐵.
def
Couples : (𝑎, 𝑏) = {{𝑎}, {𝑎, 𝑏}}.
def
Produit cartésien : 𝐴 × 𝐵 = { (𝑎, 𝑏) ∣ 𝑎 ∈ 𝐴, 𝑏 ∈ 𝐵 }.
En particulier : 𝐴 × ⌀ = ⌀ × 𝐵 = ⌀
𝐴 × 𝐵 = 𝐵 × 𝐴 ⟺ (𝐴 = ⌀ ou 𝐵 = ⌀ ou 𝐴 = 𝐵)
0.2 Applications
Une application 𝑓 est la donnée de 3 ensembles 𝐴, 𝐵, 𝐺 où 𝐺 ⊆ 𝐴 × 𝐵 et
∀ 𝑎 ∈ 𝐴, ∃ 𝑏 ∈ 𝐵, (𝑎, 𝑏) ∈ 𝐺
∀ 𝑎 ∈ 𝐴, ∀ 𝑏1 , 𝑏2 ∈ 𝐵, (𝑎, 𝑏1 ), (𝑎, 𝑏2 ) ∈ 𝐺 ⟹ 𝑏1 = 𝑏2
On écrit 𝑓 ∶ 𝐴 ⟶ 𝐵, on dit que 𝑓 est une application de l’ensemble 𝐴 dans l’ensemble 𝐵, et 𝐴 est l’ensemble
de départ de 𝑓, et 𝐵 l’ensemble d’arrivée de 𝑓 et 𝒢𝑓 = 𝐺 le graphe de 𝑓. L’image de 𝑎 ∈ 𝐴 par 𝑓 est 𝑓(𝑎) = 𝑏
tel que (𝑎, 𝑏) ∈ 𝒢𝑓 . Donc 𝑓 ∶ 𝐴 ⟶ 𝐵 est une application si tout élément de 𝐴 possède une unique image qui
appartient à 𝐵.
def
Notation : 𝐵𝐴 = { 𝑓 ∶ 𝐴 ⟶ 𝐵 ∣ 𝑓 est une application }.
Deux applications 𝑓1 ∶ 𝐴1 ⟶ 𝐵1 et 𝑓2 ∶ 𝐴2 ⟶ 𝐵2 sont égales, noté 𝑓1 = 𝑓2 (ou 𝑓1 ≡ 𝑓2 ), si 𝐴1 = 𝐴2 et
𝐵1 = 𝐵2 et ∀ 𝑎 ∈ 𝐴1 = 𝐴2 , 𝑓1 (𝑎) = 𝑓2 (𝑎) (cela peut se résumer à 𝐵1 = 𝐵2 et 𝒢𝑓1 = 𝒢𝑓2 ).
𝑎 ∈ 𝐴 est un antécédent de 𝑏 ∈ 𝐵 pour 𝑓 si 𝑓(𝑎) = 𝑏.
Une relation binaire ≼ sur 𝑋 est une relation d’ordre si elle est
• réflexive : ∀ 𝑥 ∈ 𝑋, 𝑥 ≼ 𝑥 ;
• antisymétrique : ∀ 𝑥, 𝑦 ∈ 𝑋, (𝑥 ≼ 𝑦 et 𝑦 ≼ 𝑥) ⟹ 𝑥 = 𝑦 ;
• transitive : ∀ 𝑥, 𝑦, 𝑧 ∈ 𝑋, (𝑥 ≼ 𝑦 et 𝑦 ≼ 𝑧) ⟹ 𝑥 ≼ 𝑧.
Une relation d’ordre ≼ sur 𝑋 est une relation d’ordre total si ∀ 𝑥, 𝑦 ∈ 𝑋, (𝑥 ≼ 𝑦 ou 𝑦 ≼ 𝑥).
On a une bijection entre les relations d’ordre total sur 𝑋 et les relations d’ordre total strict sur 𝑋, qui à ≼
def
associe ≺ définie par 𝑥 ≺ 𝑦 ⟺ (𝑥 ≼ 𝑦 et 𝑥 ≠ 𝑦).
0.5 Familles
Une famille indexée par un ensemble 𝐼 est une application 𝑓 dont l’ensemble de départ est 𝐼. On l’écrit
(𝑥𝑖 )𝑖∈𝐼 ou ( 𝑥𝑖 ∣ 𝑖 ∈ 𝐼 ), où 𝑥𝑖 = 𝑓(𝑖). Son graphe est donc 𝒢𝑓 = { (𝑖, 𝑥𝑖 ) ∣ 𝑖 ∈ 𝐼 }, et son ensemble d’arrivée
contient l’ensemble { 𝑥𝑖 ∣ 𝑖 ∈ 𝐼 }.
La seule famille indexée par 𝐼 = ⌀ est la famille vide ( ) = ⌀.
La famille ( 𝑥𝑖 ∣ 𝑖 ∈ 𝐼 ) et l’ensemble { 𝑥𝑖 ∣ 𝑖 ∈ 𝐼 } sont différents (sauf si 𝐼 = ⌀).
Si 𝑛 ∈ ℕ, un 𝑛-uplet (𝑥1 , … , 𝑥𝑛 ) est une famille indexée par J1, 𝑛K et correspond à l’ensemble
{(1, 𝑥1 ), … , (𝑛, 𝑥𝑛 )}. En particulier, pour 𝑛 = 0 on a un unique 0-uplet ( ) = ⌀.
def
Si 𝑛 ∈ ℕ, alors 𝐴1 × ⋯ × 𝐴𝑛 = { (𝑎1 , … , 𝑎𝑛 ) ∣ 𝑎𝑖 ∈ 𝐴𝑖 }. En particulier, pour 𝑛 = 0 on trouve {( )} = {⌀}.
def
𝐴×𝑛 = 𝐴1 × ⋯ × 𝐴𝑛 où 𝐴𝑖 = 𝐴. En particulier, 𝐴×0 = {( )} = {⌀}.
Remarque : La notation 𝐴𝑛 est réservée à d’autres fins : 𝐴𝑛 = { 𝑎𝑛 ∣ 𝑎 ∈ 𝐴 }.
Une suite infinie classique (𝑥𝑛 )𝑛∈ℕ est une famille indexée par ℕ ; c’est donc une application 𝑛 ↦ 𝑥𝑛 dont
l’ensemble de départ est ℕ et l’ensemble d’arrivée contient l’ensemble { 𝑥𝑛 ∣ 𝑛 ∈ ℕ }.
En particulier : ⋃ 𝐴𝑖 = ⌀ et ⨉ 𝐴𝑖 = {( )} = {⌀}
𝑖∈⌀ 𝑖∈⌀
En revanche, ⋂ 𝐴𝑖 n’est pas défini en général (ce serait l’ensemble contenant “tout”, qui n’existe pas) ; si
𝑖∈⌀
l’on considère qu’on n’a affaire qu’à des sous-ensembles d’un ensemble 𝐴, on peut adopter la convention
def
⋂ 𝐴𝑖 = 𝐴.
𝑖∈⌀
∃ 𝑖0 ∈ 𝐼, 𝐴𝑖0 = ⌀ ⟹ ⨉ 𝐴𝑖 = ⌀
𝑖∈𝐼
0.6 Cardinaux
def
Cardinal d’un ensemble : card 𝐴 ⩽ card 𝐵 ⟺ ∃ 𝑓 ∶ 𝐴 ⟶ 𝐵 injective.
Autres notations à éviter ici : #𝐴 = |𝐴| = card 𝐴.
Propriétés : Soient 𝐴, 𝐵, 𝐶 des ensembles. Alors :
card 𝐴 ⩾ card 𝐵 ⟺ ∃ 𝑓 ∶ 𝐴 ⟶ 𝐵 surjective
card 𝐴 = card 𝐵 ⟺ ∃ 𝑓 ∶ 𝐴 ⟶ 𝐵 bijective
card 𝐴 ⩽ card 𝐴
(card 𝐴 ⩽ card 𝐵 et card 𝐵 ⩽ card 𝐴) ⟹ card 𝐴 = card 𝐵
(card 𝐴 ⩽ card 𝐵 et card 𝐵 ⩽ card 𝐶) ⟹ card 𝐴 ⩽ card 𝐶
On a soit card 𝐴 < card 𝐵, soit card 𝐴 = card 𝐵, soit card 𝐴 > card 𝐵.
Opérations sur les cardinaux :
𝐴 ∩ 𝐵 = ⌀ ⟹ card(𝐴) + card(𝐵) = card(𝐴 ∪ 𝐵)
card(𝐴) ⋅ card(𝐵) = card(𝐴 × 𝐵)
card(𝐵)card(𝐴) = card(𝐵𝐴 )
def
Un ensemble 𝐴 est infini ⟺ ∃ 𝐵 & 𝐴, card(𝐴) = card(𝐵).
Un ensemble est fini s’il n’est pas infini.
def def
Définitions : ℵ0 = card ℕ (“aleph indice zéro”) et 𝔠 = 2ℵ0 .
Propriétés :
𝐴, 𝐵 finis ⟹ card(𝐴 ∪ 𝐵) = card(𝐴) + card(𝐵) − card(𝐴 ∩ 𝐵)
card(𝒫(𝐴)) = 2card(𝐴) > card(𝐴)
card(𝐴) = 0 ⟺ 𝐴 = ⌀
∀ 𝑛 ∈ ℕ, card(J1, 𝑛K) = 𝑛 < ℵ0
card ℕ = card ℤ = card ℚ = ℵ0 < card(𝒫(ℕ)) = card ℝ = card ℂ = 𝔠 = 2ℵ0
𝐴 est infini ⟺ card 𝐴 ⩾ ℵ0
def
Un ensemble 𝐴 est infini dénombrable ⟺ card(𝐴) = ℵ0 .
Si 𝑓 ∶ 𝐴 ⟶ 𝐵 est une application entre 2 ensembles finis de même cardinal, alors :
𝑓 est injective ⟺ 𝑓 est surjective
Le point de départ de la théorie de la complexité est d’essayer de mesurer le coût d’un calcul, que ce soit en
temps (ou nombre d’opérations élémentaires) ou en mémoire.
En général, on ne veut pas un coût exact, mais une estimation. De plus, on ne s’intéresse pas à ce coût
quand on traite des données de petite taille, mais plutôt à sa valeur pour des données de grande taille.
C’est pourquoi on veut estimer le coût asymptotique (dans l’exemple, ce serait pour 𝑛 → +∞).
DÉMONSTRATION. (1) Si 𝑓 ∈ o(𝑔), alors |𝑓(𝑛)| < 𝜀 |𝑔(𝑛)| pour 𝑛 ≫ 0. En prenant par exemple 𝜀 = 1, on a
pour 𝑐 = 1 que |𝑓(𝑛)| ⩽ 𝑐 |𝑔(𝑛)| pour 𝑛 ≫ 0. D’où 𝑓 ∈ O(𝑔).
(2) Si 𝑓 ∈ o(𝑔) et 𝑔 ∈ o(ℎ), alors |𝑓(𝑛)| < 𝜀1 |𝑔(𝑛)| pour 𝑛 ≫ 0 et |𝑔(𝑛)| < 𝜀2 |ℎ(𝑛)| pour 𝑛 ≫ 0. En prenant
√
𝜀1 = 𝜀2 = 𝜀 on a |𝑓(𝑛)| < 𝜀 |ℎ(𝑛)| pour 𝑛 ≫ 0. D’où 𝑓 ∈ o(ℎ).
La démonstration pour O est similaire et est laissée en exercice.
(3) Pour 𝑐 = 1 on a |𝑓(𝑛)| ⩽ 𝑐 |𝑓(𝑛)| pour tout 𝑛 ⩾ 0, donc 𝑓 ∈ O(𝑓).
Si 𝜀 ∈ ]0, 1[, alors |𝑓(𝑛)| ⩾ 𝜀 |𝑓(𝑛)| pour tout 𝑛 ⩾ 0. Donc 𝑓 ∉ o(𝑓).
(4) Si 𝑓1 ∈ o(𝑔) et 𝑓2 ∈ o(𝑔), alors |𝑓𝑖 (𝑛)| < 𝜀𝑖 |𝑔(𝑛)| pour 𝑛 ≫ 0. En prenant 𝜀1 = 𝜀2 = 𝜀/2 on a
|𝑓1 (𝑛) + 𝑓2 (𝑛)| ⩽ |𝑓1 (𝑛)| + |𝑓2 (𝑛)| < 𝜀 |𝑔(𝑛)| pour 𝑛 ≫ 0.
D’où 𝑓1 + 𝑓2 ∈ o(𝑔).
La démonstration pour O est similaire et est laissée en exercice.
(5) Si 𝑓𝑖 ∈ o(𝑔𝑖 ) alors |𝑓𝑖 (𝑛)| < 𝜀𝑖 |𝑔𝑖 (𝑛)| pour 𝑛 ≫ 0.
√
En prenant 𝜀1 = 𝜀2 = 𝜀 on a |𝑓1 (𝑛)𝑓2 (𝑛)| < 𝜀 |𝑔1 (𝑛)𝑔2 (𝑛)| pour 𝑛 ≫ 0. D’où 𝑓1 𝑓2 ∈ o(𝑔1 𝑔2 ).
La démonstration pour O est similaire et est laissée en exercice.
Dans certaines conditions, on peut aussi reformuler les définitions de o et O en utilisant des limites.
Proposition 1.2.2
Soient 𝑓 et 𝑔 deux applications de ℕ dans ℝ. Supposons que 𝑔(𝑛) ne s’annule pas pour 𝑛 ≫ 0.
|𝑓(𝑛)|
1. On a que 𝑓 ∈ o(𝑔) si et seulement si lim = 0.
𝑛→+∞ |𝑔(𝑛)|
|𝑓(𝑛)|
2. On a que 𝑓 ∈ O(𝑔) si et seulement si lim sup < +∞.
𝑛→+∞ |𝑔(𝑛)|
1. La notation 𝑛 ∈ O(𝑛2 ) est un abus. Il faudrait écrire : soient 𝑓 et 𝑔 les applications définies par 𝑓(𝑛) = 𝑛 et 𝑔(𝑛) = 𝑛2 ;
alors 𝑓 ∈ O(𝑔). Nous ferons constamment ce genre d’abus de notations.
DÉMONSTRATION. Il s’agit d’une preuve par récurrence classique que nous laissons en exercice au lecteur.
Proposition 1.2.5
Soit 𝑓 ∶ ℕ ⟶ ℝ une application telle que 𝑓 ∈ O(𝑛).
𝑛
On définit 𝑔 ∶ ℕ ⟶ ℝ par 𝑔(𝑛) = ∑ 𝑓(𝑖). Alors 𝑔 ∈ O(𝑛2 ).
𝑖=0
DÉMONSTRATION. Soient 𝑐 > 0 et 𝑁 > 0 tels que |𝑓(𝑛)| ⩽ 𝑐𝑛 ∀ 𝑛 ⩾ 𝑁. On suppose 𝑛 > 𝑁. Alors
𝑛 𝑛
|𝑔(𝑛)| = ∣∑ 𝑓(𝑖)∣ ⩽ ∑|𝑓(𝑖)|
𝑖=0 𝑖=0
𝑁−1 𝑛
= ∑ |𝑓(𝑖)| + ∑|𝑓(𝑖)|
𝑖=0 𝑖=𝑁
𝑛 𝑁−1
= 𝑀 + ∑|𝑓(𝑖)| (où 𝑀 = ∑ |𝑓(𝑖)| est une constante)
𝑖=𝑁 𝑖=0
𝑛
⩽ 𝑀 + ∑ 𝑐𝑖 (car 𝑖 ⩾ 𝑁)
𝑖=𝑁
𝑛
= 𝑀 +𝑐∑𝑖
𝑖=𝑁
𝑛
⩽ 𝑀 + 𝑐∑𝑖 (car 𝑖 ⩾ 0 et 𝑁 ⩾ 0)
𝑖=0
𝑛(𝑛 + 1)
=𝑀 +𝑐 (d’après 1.2.4)
2
Le dernier terme de droite est un polynôme de degré 2 en la variable 𝑛 ; il est donc dans O(𝑛2 ). Ainsi,
l’inégalité |𝑔(𝑛)| ⩽ 𝑀 + 𝑐 𝑛(𝑛+1)
2 pour 𝑛 > 𝑁 nous permet de conclure que 𝑔 ∈ O(𝑛2 ).
Exercice 1.3.7
𝑛
Soit 𝑓 ∶ ℕ ⟶ ℝ une application telle que 𝑓 ∈ O(𝑛) et soit 𝑔 ∶ ℕ ⟶ ℝ définie par 𝑔(𝑛) = ∑ 𝑓(𝑖)2 .
𝑖=0
Montrer que 𝑔 ∈ O(𝑛3 ).
𝑛
𝑛(𝑛 + 1)(2𝑛 + 1)
Indication : Démontrer l’égalité ∑ 𝑖2 = , puis imiter la preuve de la Proposition 1.2.5.
𝑖=1
6
Exercice 1.3.8
𝑛
Soit 𝑓 ∶ ℕ ⟶ ℝ une application telle que 𝑓 ∈ O(𝑛) et soit 𝑔 ∶ ℕ ⟶ ℝ définie par 𝑔(𝑛) = ∏ 𝑓(𝑖).
𝑖=0
Montrer qu’il existe un réel 𝑐 > 0 tel que 𝑔 ∈ O(𝑐𝑛 𝑛!).
On utilisera toujours implicitement l’existence et l’unicité de la représentation d’un entier dans une base
𝛽 ⩾ 2 quelconque.
Pour le reste de ce chapitre, on fixe une base 𝛽 ⩾ 2.
Définition 2.1.2 Un entier multiprécision est une suite finie
𝒏 = (𝜎, 𝑚0 , … , 𝑚𝐿−1 ) où 𝜎 ∈ {0, 1}, 𝐿 ∈ ℕ, 𝑚𝑖 ∈ J0, 𝛽 − 1K.
𝐿−1
Alors 𝒏 représente l’entier (−1)𝜎 ∑ 𝑚𝑖 𝛽 𝑖 .
𝑖=0
Réciproquement, tout élément de ℤ peut être représenté par une suite finie comme dans la définition.
Attention : On ne demande pas 𝑚𝐿−1 ≠ 0, ce qui fait qu’un élément de ℤ est représenté par une infinité d’en-
tiers multiprécision : en effet, (𝜎, 𝑚0 , … , 𝑚ℓ−1 ) et (𝜎, 𝑚0 , … , 𝑚ℓ−1 , 0, … , 0) correspondent au même élément
de ℤ. Cela n’est pas grave, car il suffit de supprimer les 0 en fin de suite pour retrouver l’unique écriture en
base 𝛽 (on est en train de dire que 7059(10 = 0007059(10 ).
On définit la longueur de 𝒏 = (𝜎, 𝑚0 , … , 𝑚𝐿−1 ) par 𝜆(𝒏) = max({0} ∪ { 𝑖 + 1 ∣ 𝑚𝑖 ≠ 0 }).
ℓ−1
Si l’écriture en base 𝛽 de 𝑛 ∈ ℤ∗ est 𝑛 = (−1)𝜎 ∑ 𝑛𝑖 𝛽 𝑖 , alors la représentation la plus courte de 𝑛 est
𝑖=0
𝒏 = (𝜎, 𝑛0 , … , 𝑛ℓ−1 ) et 𝜆(𝑛) = ℓ. Pour toute autre représentation 𝒏 = (𝜎, 𝑚0 , … , 𝑚𝐿−1 ) on aura 𝜆(𝑛) ⩽ 𝐿.
Dans la suite on identifiera 𝑛 ∈ ℤ et ses représentations 𝒏 = (𝜎, 𝑚0 , … , 𝑚𝐿−1 ).
seule limite est celle de la mémoire disponible (pour l’espace ; côté temps elle sera celle de la patience de
l’utilisateur…).
Pour représenter 𝑛 = 0 de façon unique on prend 𝜎 = 0 et 𝐿 = 0, son encodage est donc la liste [0].
Exercice 2.1.4
On travaille en base 𝛽 ⩾ 2. Soit 𝑛 ≠ 0 un entier. Montrer que 𝜆(𝑛) = 1 + ⌊log𝛽 |𝑛|⌋.
Remarque 2.1.5
Quand on a 2 entiers multiprécision 𝒙 = (𝜎, 𝑥0 , … , 𝑥𝑚−1 ) et 𝒚 = (𝜎′ , 𝑦0 , … , 𝑦𝑛−1 ), on pourra toujours
supposer 𝑚 = 𝑛, quite à rajouter des 0 à gauche, c’est-à-dire, des 0 à la fin de la suite (comme indiqué, on
n’aura pas l’écriture unique, mais ce n’est pas grave).
Remarque 2.1.6
Ne pas oublier que les entiers machine en base 𝛽 sont des entiers positifs ou nuls (ceux de l’intervalle
J0, 𝛽 − 1K).
2.2 Algorithme
Définition informelle : Un algorithme applique à des données qu’on lui donne (Entrées) une suite finie et
non ambiguë d’instructions et d’opérations, et fournit une série de données (Sortie) censée répondre à une
question.
Il ressemble à une recette de cuisine : On prend des ingrédients (Entrées), on les manipule d’une certaine
façon, et l’on obtient une tarte au citron (Sortie).
Définition : Un algorithme est correct si :
1) Toutes les opérations qu’il effectue se font sans erreur.
2) Il s’arrête au bout d’un temps fini.
3) Il fournit le résultat annoncé.
2.3 Addition
La première opération élémentaire que nous étudierons est l’addition d’entiers multiprécision. Rappelons
qu’on considère que la somme de 2 entiers machine se fait en temps constant, ou O(1).
L’algorithme que nous allons présenter est exactement celui qu’on nous apprend à l’école pour additionner
des entiers ; la seule différence sera la base d’expression des entiers, qui sera 𝛽 au lieu de 10.
Proposition 2.3.2
L’algorithme 2.3.1 est correct (sauf débordement longueur).
Il calcule la somme de deux entiers multiprécision positifs ou nuls 𝑥 et 𝑦 de longueur ⩽ 𝑛 avec un coût en
temps inférieur ou égal à 𝑛 ADD.
DÉMONSTRATION.
Correct : Tous les ADD s’exécutent sans erreur car pour tout 𝑖 on a 𝑥𝑖 , 𝑦𝑖 ∈ J0, 𝛽 − 1K et 𝜌𝑖 ∈ {0, 1}.
En revanche, il peut y avoir un problème au moment de créer 𝒔. En effet, si 𝑛 atteint la longueur maximale
possible, il y aura un débordement (“overflow”). On pourrait par exemple rajouter un test :
BEGIN
[...]
FOR 𝑖 FROM 0 TO 𝑛 − 1 DO
[...]
END FOR
IF 𝑛 = 𝜆max THEN
IF 𝜌𝑛 = 1 THEN
ERROR
ELSE
𝒔 ← (0, 𝑠0 , … , 𝑠𝑛−1 )
END IF
ELSE
𝑠𝑛 ← 𝜌 𝑛
𝒔 ← (0, 𝑠0 , … , 𝑠𝑛 )
END IF
RETURN 𝒔
END
Une autre technique est celle des trappes (par exemple, dans Python 3 on a try: ... except ...:).
L’algorithme s’arrête car la boucle se fait 𝑛 fois.
Voyons qu’il fournit le résultat annoncé. On a 𝜌0 = 0 et ∀ 𝑖 ∈ J0, 𝑛 − 1K, 𝑠𝑖 + 𝜌𝑖+1 𝛽 = 𝑥𝑖 + 𝑦𝑖 + 𝜌𝑖 , d’où
𝑛−1 𝑛−1
𝑥 + 𝑦 = ∑(𝑥𝑖 + 𝑦𝑖 )𝛽 𝑖 = ∑(𝑠𝑖 + 𝜌𝑖+1 𝛽 − 𝜌𝑖 )𝛽 𝑖
𝑖=0 𝑖=0
𝑛−1 𝑛−1 𝑛
= −𝜌0 + ∑ 𝑠𝑖 𝛽 𝑖 + 𝜌𝑛 𝛽 𝑛 = −0 + ∑ 𝑠𝑖 𝛽 𝑖 + 𝑠𝑛 𝛽 𝑛 = ∑ 𝑠𝑖 𝛽 𝑖
𝑖=0 𝑖=0 𝑖=0
=𝑠
Exercice 2.3.3
Dans le processeur, on dispose de la fonction SUB pour soustraire 2 entiers machine 𝑎 et 𝑏 :
(𝑐, 𝜌′ ) ← SUB(𝑎, 𝑏, 𝜌)
où 𝑎 − 𝑏 − 𝜌 = 𝑐 − 𝜌′ 𝛽 avec 𝜌, 𝜌′ ∈ {0, 1} (ce sont les retenues, ancienne et nouvelle). Remarquer que 𝑐 est
un entier machine même si 𝑎 − 𝑏 − 𝜌 < 0.
Écrire un algorithme calculant la différence 𝒙 − 𝒚 de deux entiers multiprécision de longueur ⩽ 𝑛 avec
𝒙 > 𝒚 ⩾ 0 en temps O(𝑛).
2.4 Multiplication
2.4.1 Algorithme naïf
Commençons par étudier l’algorithme de multiplication qu’on apprend à l’école. Rappelons qu’on considère
l’addition et la multiplication d’entiers machine comme des opérations élémentaires effectuées en temps
constant.
Dans le processeur, on dispose de la fonction MUL pour multiplier 2 entiers machine 𝑎 et 𝑏 :
(𝑐0 , 𝑐1 ) ← MUL(𝑎, 𝑏)
où 𝑎 ⋅ 𝑏 = 𝑐0 + 𝑐1 𝛽 avec 𝑐0 , 𝑐1 des entiers machine.
On regarde d’abord le produit d’un entier machine par un entier multiprécision (algorithme 2.4.1).
6 : END FOR
7 : 𝑝𝑛 ← 𝑑𝑛−1 ′
8 : 𝒑 ← (0, 𝑝0 , … , 𝑝𝑛 )
9 : RETURN 𝒑
END
Proposition 2.4.2
L’algorithme 2.4.1 est correct (sauf débordement longueur).
Il calcule le produit d’un entier machine par un entier multiprécision positif ou nul de longueur ⩽ 𝑛 avec un
coût inférieur ou égal à 𝑛 MUL et (2𝑛 − 2) ADD.
DÉMONSTRATION. Exercice.
Il peut y avoir un débordement de la longueur au moment de créer 𝒑.
Proposition 2.4.4
L’algorithme 2.4.3 est correct (sauf débordement longueur).
Il calcule le produit de deux entiers multiprécision positifs ou nuls de longueurs 𝑚 et 𝑛 avec un coût inférieur
ou égal à 𝑚𝑛 MUL et (3𝑚𝑛 − 2𝑚 − 𝑛) ADD.
DÉMONSTRATION.
Correct :
1) Les opérations se font sans erreur : Il peut y avoir des débordements de la longueur maximale dans
• 𝑥𝑖 ⋅ 𝒚
• 𝒘𝑖 + 𝒛𝑖
• 𝒘𝑚 𝛽 𝑚
On suppose donc que cela n’arrive pas ou que c’est géré.
2) L’algorithme s’arrête : C’est clair (boucle finie).
3) L’algorithme fournit le résultat annoncé :
On a 𝑤0 = 0 et ∀ 𝑖 ∈ J0, 𝑚 − 1K, 𝑥𝑖 ⋅ 𝒚 = 𝒛𝑖 = 𝒔𝑖 − 𝒘𝑖 = 𝑝𝑖 + 𝒘𝑖+1 𝛽 − 𝒘𝑖 donc
𝑚−1 𝑚−1 𝑚−1
𝑥 ⋅ 𝑦 = ∑ 𝑥𝑖 𝛽 𝑖 𝒚 = ∑ (𝑝𝑖 + 𝒘𝑖+1 𝛽 − 𝒘𝑖 ) 𝛽 𝑖 = ∑ 𝑝𝑖 𝛽 𝑖 + 𝒘𝑚 𝛽 𝑚 − 𝒘0 = 𝑝
𝑖=0 𝑖=0 𝑖=0
Coût :
Chaque produit 𝑥𝑖 ⋅ 𝒚 coûte 𝑛 MUL et (2𝑛 − 2) ADD.
Il y en a 𝑚, ce qui donne 𝑚𝑛 MUL et 𝑚(2𝑛 − 2) ADD.
D’autre part, les 𝒘𝑖 et 𝒛𝑖 sont de longueur ⩽ 𝑛, donc chaque somme 𝒘𝑖 + 𝒛𝑖 coûte au plus 𝑛 ADD.
Comme 𝑤0 = 0, on peut éviter la première somme, il y en a alors 𝑚 − 1, ce qui fait (𝑚 − 1)𝑛 ADD.
Le calcul de 𝑝𝑖 et 𝒘𝑖+1 a un coût négligeable : si 𝒔𝑖 = (0, 𝑚0 , … , 𝑚𝐿 ), on a 𝑝𝑖 = 𝑚0 et 𝒘𝑖 = (0, 𝑚1 , … , 𝑚𝐿 ).
Pour trouver 𝒑 le coût est aussi négligeable : si 𝒘𝑚 = (0, 𝑚0 , … , 𝑚𝐿 ), alors 𝒑 = (0, 𝑝0 , … , 𝑝𝑚−1 , 𝑚0 , … , 𝑚𝐿 ).
Au total, on a au plus 𝑚𝑛 MUL et (3𝑚𝑛 − 2𝑚 − 𝑛) ADD.
Si 𝑥 et 𝑦 sont de longueur 𝑛, ceci revient à appliquer 𝑦 fois l’algorithme d’addition de la Proposition 2.3.2 à
des entiers de longueur au plus 2𝑛 + 1. Ceci se fait donc en temps O(𝑦) ; comme 𝛽 𝑛−1 ⩽ 𝑦 < 𝛽 𝑛 , on a que
O(𝑦) = O(𝛽 𝑛 ) (voir Exercice 2.4.7).
Comme 𝛽 > 1, cette méthode prend donc un temps exponentiel en 𝑛, ce qui est beaucoup moins efficace
que le temps quadratique en O(𝑛2 ) de la Proposition 2.4.4.
Exercice 2.4.7
Soit 𝛼 > 0 un nombre réel, et soit 𝑓 ∶ ℕ ⟶ ℝ une fonction telle que 𝛽 𝑛−1 ⩽ 𝑓(𝑛) < 𝛽 𝑛 pour tout 𝑛 ∈ ℕ.
Montrer que O(𝑓) = O(𝛽 𝑛 ) (ou, de façon équivalente, que 𝑓 ∈ Θ(𝛽 𝑛 )).
Théorème 2.4.9
L’algorithme 2.4.8 de Karatsuba est correct (sauf débordement longueur).
Il permet de calculer le produit de deux entiers de longueur ⩽ 𝑛 en temps ∈ O(𝑛log2 3 ) (attention : ce 𝑛
majorant la longueur est différent du 𝑛 de l’algorithme, voir démonstration).
DÉMONSTRATION.
Correct :
1) Les opérations se font sans erreur :
On a 𝑛/2 ∈ ℕ car 𝑘 ⩾ 1.
Toutes les autres opérations se font sans erreur, sauf cas de débordement de la longueur. On suppose donc
que cela n’arrive pas ou que c’est géré.
1. L’algorithme doit son nom au mathématicien russe Анато́лий Алексе́евич Карацу́ба, qui l’a découvert en 1960.
Remarque 2.4.11
Comme log2 (3) = 1,58496+ < 2, l’algorithme de Karatsuba a une complexité bien moindre que l’algorithme
naïf de multiplication d’entiers.
2.5 Exponentiation
Étant donné un entier 𝑎 et un entier 𝑘 ⩾ 0, un premier algorithme naïf pour calculer 𝑎𝑘 serait de multiplier
𝑎 avec lui-même 𝑘 fois (algorithme 2.5.1).
Exercice 2.5.4
Montrer que l’algorithme 2.5.3 donne bien la représentation en base 2 de 𝑘. Comment adapter l’algorithme
pour qu’il renvoie la représentation en base 𝛽 de 𝑘 ?
Remarque : Les processeurs utilisant comme base de calcul une puissance de 2, le coût de cet algorithme est
négligeable.
Nous pouvons maintenant écrire un algorithme d’exponentiation rapide.
2. La division par 2 s’effectue rapidement par la plupart des ordinateurs, où les entiers sont représentés dans une base qui est
une puissance de 2.
Proposition 2.5.6
L’algorithme 2.5.5 d’exponentiation rapide est correct.
Il calcule 𝑎𝑘 en effectuant un nombre de multiplications qui est dans O(log2 (𝑘)).
DÉMONSTRATION. La boucle se répète au plus ⌈log2 (𝑘)⌉ + 1 fois, et il y a au plus deux multiplications à
chaque répétition de la boucle. Le nombre de multiplications est donc O(⌈log2 (𝑘)⌉). Pour 𝑘 ⩾ 2 on a
⌈log2 (𝑘)⌉ < log2 𝑘 + 1 ⩽ 2 log2 𝑘
donc ⌈log2 (𝑘)⌉ ∈ O(log2 (𝑘)), ce qui nous permet de conclure.
Exercice 2.5.7 (▾ )
1. Implémenter en SageMath les algorithmes 2.5.1 et 2.5.5 d’exponentiation naïve et rapide.
2. Comparer les temps d’exécution des deux algorithmes pour calculer 1010 pour 𝑖 allant de 0 à 7. (Utile :
𝑖
ajouter %time devant une commande en SageMath permet d’afficher le temps d’exécution.)
ℓ−1
En prenant ℓ = 𝑚 − 𝑛 + 1 on peut donc écrire 𝑞 = ∑ 𝑞𝑘 𝛽 𝑘 avec 𝑞ℓ−1 ≠ 0 ou 𝑞ℓ−2 ≠ 0.
𝑘=0
Cet algorithme est théorique, car il ne dit pas comment calculer les 𝑞𝑘 explicitement. La question est donc
de trouver ces 𝑞𝑘 , sachant que dans le processeur on dispose de la fonction DIV qui effectue la division
euclidienne d’un entier machine double 𝑎0 + 𝑎1 𝛽 par un entier machine 𝑏 :
(𝑞0 , 𝑞1 , 𝑟) ← DIV(𝑎0 , 𝑎1 , 𝑏)
où 𝑏(𝑞0 + 𝑞1 𝛽) + 𝑟 = 𝑎0 + 𝑎1 𝛽 avec 𝑞0 , 𝑞1 , 𝑟 des entiers machine.
On va regarder d’abord la division euclidienne d’un entier multiprécision par un entier machine non nul,
donc pour 𝑛 = 1.
Pour cela, on aura besoin du résultat suivant, qui dit essentiellement que le premier chiffre du quotient est
déterminé par les 2 premiers chiffres du dividende.
Proposition 2.6.5
𝑥 𝑥′
Soient 𝑥 = 𝑥′ 𝛽 + 𝑥0 et 𝑦 = 𝑦′ 𝛽 ≠ 0 avec 0 ⩽ 𝑥0 < 𝛽. Alors ⌊ ⌋ = ⌊ ′ ⌋.
𝑦 𝑦
Algorithme 2.6.6 (Division euclidienne d’un entier multiprécision ⩾ 0 par un entier machine
non nul)
INPUT : (𝒙, 𝑎) où 𝒙 = (0, 𝑥0 , … , 𝑥𝑛−1 ) et 𝑎 ∈ J1, 𝛽 − 1K.
OUTPUT : (𝒒, 𝑟) = QuoRem(𝒙, 𝑎) avec 𝒒 = (0, 𝑞0 , … , 𝑞𝑛−1 ) le quotient et 𝑟 ∈ J0, 𝑎 − 1K le reste de la
division euclidienne de 𝒙 par 𝑎.
BEGIN
1 : 𝑟𝑛 ← 0
2 : 𝑞1,0 ← 0
3 : FOR 𝑖 FROM 𝑛 − 1 DOWN TO 0 DO
4: (𝑞0,𝑖 , 𝑞1,𝑖 , 𝑟𝑖 ) ← DIV(𝑥𝑖 , 𝑟𝑖+1 , 𝑎)
5 : END FOR
6 : 𝒒 ← (0, 𝑞0,0 , … , 𝑞0,𝑛−1 ) ▷ 𝜆(𝒒 ) ⩽ 𝑛
0 0
7: 𝒒 ← (0, 0, 𝑞0,1 , … , 𝑞1,𝑛−2 ) ▷ 𝜆(𝒒 ) ⩽ 𝑛
1 1
8: 𝒒←𝒒 +𝒒
0 1
9: 𝑟 ← 𝑟0
10 : RETURN (𝒒, 𝑟)
END
Proposition 2.6.7
L’algorithme 2.6.6 est correct.
Il calcule la division euclidienne d’un entier multiprécision positif ou nul de longueur ⩽ 𝑛 par un entier
machine non nul avec un coût inférieur ou égal à 𝑛 DIV et 𝑛 ADD.
DÉMONSTRATION. On a 𝑟𝑖 , 𝑞𝑖,0 , 𝑞𝑖,1 ∈ J0, 𝛽 − 1K, ce sont donc bien des entiers machine et les opérations
sont correctes (pas de débordement de la longueur ici).
Dans le premier DIV on a 𝑞1,𝑛−1 = 0 car 𝑟𝑛 = 0 donc Quo(𝑥𝑛−1 + 𝑟𝑛 𝛽, 𝑎) = ⌊ 𝑛−1
𝑥
𝑎 ⌋ ⩽ 𝑥𝑛−1 < 𝛽.
Pour 𝑖 ∈ J0, 𝑛 − 1K on a 𝑥𝑖 = 𝑎(𝑞0,𝑖 + 𝑞1,𝑖 𝛽) + 𝑟𝑖 − 𝑟𝑖+1 𝛽, donc
𝑛−1 𝑛−1
𝒙 = ∑ 𝑥𝑖 𝛽 = ∑(𝑎(𝑞0,𝑖 + 𝑞1,𝑖 𝛽) + 𝑟𝑖 − 𝑟𝑖+1 𝛽)𝛽 𝑖
𝑖
𝑖=0 𝑖=0
𝑛−1 𝑛−1
= 𝑎 ∑ 𝑞0,𝑖 𝛽 𝑖 + 𝑎 ∑ 𝑞1,𝑖 𝛽 𝑖+1 + 𝑟0 − 𝑟𝑛 𝛽 𝑛 (somme télescopique)
𝑖=0 𝑖=0
𝑛
= 𝑎 𝒒 + 𝑎 ∑ 𝑞1,𝑖−1 𝛽 𝑖 + 𝑟 − 0
0
𝑖=1
𝑛−1
= 𝑎 𝒒 + ∑ 𝑞1,𝑖−1 𝛽 𝑖 + 𝑟 (car 𝑞1,𝑛−1 = 0)
0
𝑖=1
= 𝑎(𝒒 + 𝒒 ) + 𝑟
0 1
= 𝑎𝒒 + 𝑟
et l’on a bien 𝒙 = 𝑎 𝒒 + 𝑟 avec 0 ⩽ 𝑟 < 𝑎.
Dans le cas général (division par un entier multiprécision > 0), les choses se compliquent car on doit parfois
tâtonner pour trouver le bon 𝑞𝑘 . Cela devient assez technique, nous nous contenterons ici de donner le
résultat suivant sans démonstration.
Théorème 2.6.8
Pour 𝑥, 𝑦 ∈ ℤ tels que 𝜆(𝑥) ⩾ 𝜆(𝑦) ⩾ 1, l’algorithme classique (ou naïf) peut effectuer la division euclidienne
de 𝑥 par 𝑦 en temps O(ℓ2 ), où ℓ = 𝜆(𝑥).
On a donc un coût quadratique en la longueur de 𝑥.
L’algorithme de Euclide itère la Proposition 2.7.1 pour trouver le pgcd de deux entiers.
Corollaire 2.7.3
L’algorithme de Euclide 2.7.2 est correct.
DÉMONSTRATION. Il suffit d’appliquer la Proposition 2.7.1 et une récurrence.
Corollaire 2.7.7
La complexité (exprimée en fonction du nombre de divisions euclidiennes) de l’algorithme de Euclide appliqué
√
aux entiers 𝑥, 𝑦 > 0 est O(log𝜑 min{𝑥, 𝑦}), où 𝜑 = 1+ 5
2 est le nombre d’or.
DÉMONSTRATION. Soient 𝑥 et 𝑦 deux entiers positifs. Quitte à ajouter une étape à l’algorithme de Euclide
(ce qui ne changera pas sa complexité asymptotique), on peut supposer que 𝑥 > 𝑦.
Soit 𝑛 le nombre d’étapes nécessaires pour appliquer l’algorithme de Euclide.
En plus de calculer le pgcd, on peut aussi vouloir calculer les coefficients de Bézout.
Proposition 2.7.8 (identité de Bézout)
Si 𝑑 = Gcd(𝑥, 𝑦), alors il existe des entiers 𝛼 et 𝛽 (appelés coefficients de Bézout) tels que 𝛼𝑥 + 𝛽𝑦 = 𝑑.
Enfin, notons que le calcul du plus petit commun multiple (ppcm) canonique de deux entiers est équivalent
en complexité au calcul de leur pgcd, grâce à la propriété suivante (que nous ne démontrerons pas ici).
Proposition 2.7.12
Soient 𝑥 et 𝑦 deux entiers positifs qui ne sont pas tous les deux nuls. Alors 𝑥𝑦 = Gcd(𝑥, 𝑦) Lcm(𝑥, 𝑦).
Exercice 2.7.13
▾ Implémenter l’algorithme de Euclide et l’algorithme de Euclide étendu en SageMath.
Exercice 2.7.14
Vérifier que l’Algorithme 2.7.10 renvoie bien le pgcd canonique de 𝑥 et 𝑦 ainsi que des coefficients de Bézout.
1. Écrire une fonction qui, étant donné 𝑛, renvoie le 𝑛-ième nombre de Fermat.
1. ▾ Implémenter cet algorithme et le tester sur les couples (34, 21), (136, 51), (481, 325) et (8771, 3206).
2. Montrer que cet algorithme est correct.
3. Montrer son coût est O(𝑛2 ) opérations élémentaires, avec 𝑛 majorant la longueur de 𝑎 et 𝑏.
4. ▾ Modifier cet algorithme pour obtenir un Bézout de 𝑎, 𝑏.
Exercice 2.8.6
La suite (𝐹𝑛 )𝑛⩾0 des nombres de Fibonacci est définie par récurrence de la façon suivante :
𝐹0 = 𝐹 1 = 1 et 𝐹𝑛 = 𝐹𝑛−1 + 𝐹𝑛−2 (𝑛 ⩾ 2).
Dans cet exercice, on fixe un entier 𝛽 ⩾ 2.
1. Montrer que le nombre 𝐹𝑛 est de longueur au plus 𝑛 pour tout 𝑛 ⩾ 1. Indication : Si 𝑥 et 𝑦 sont de
longueur au plus 𝑛, alors 𝑥 + 𝑦 est de longueur au plus...
2. Considérons l’algorithme suivant.
INPUT : Un entier 𝑛 ⩾ 0.
OUTPUT : Le 𝑛-ième nombre de Fibonacci 𝐹𝑛 .
BEGIN
1 : IF 𝑛 = 0 ou 𝑛 = 1 THEN
2: RETURN 1
3 : END IF
4 : (𝑓0 , 𝑓1 ) ← (1, 1)
5 : FOR 𝑖 FROM 0 TO 𝑛 − 2 DO
6: (𝑓0 , 𝑓1 ) ← (𝑓1 , 𝑓0 + 𝑓1 )
7 : END FOR
8 : RETURN 𝑓1
END
Exercice 2.8.8
Pour 𝑎0 ∈ ℤ, 𝑛 ∈ ℕ et 𝑎1 , 𝑎2 , … , 𝑎𝑛 ∈ ℕ∗ , on définit [𝑎0 ; 𝑎1 , 𝑎2 , … , 𝑎𝑛 ] comme suit :
1 1 1
[𝑎0 ] = 𝑎0 [𝑎0 ; 𝑎1 ] = 𝑎0 + [𝑎0 ; 𝑎1 , 𝑎2 ] = 𝑎0 + [𝑎0 ; 𝑎1 , 𝑎2 , 𝑎3 ] = 𝑎0 +
𝑎1 1 1
𝑎1 + 𝑎1 +
𝑎2 1
𝑎2 +
𝑎3
etc. Ce sont des fractions continues finies.
Il est clair que toute fraction continue finie est un nombre rationnel.
1. Réciproquement, on va démontrer constructivement que tout nombre rationnel est égal à une fraction
continue finie. Soit 𝑎𝑏 ∈ ℚ avec 𝑎 ∈ ℤ, 𝑏 ∈ ℕ∗ .
Soit (𝑟−1 , 𝑟0 ) = (𝑎, 𝑏). La division euclidienne de 𝑟−1 par 𝑟0 ≠ 0 donne 𝑟−1 = 𝑟0 𝑞0 + 𝑟1 . On prend 𝑎0 = 𝑞0 .
Si 𝑟1 = 0 on s’arrête avec 𝑛 = 0.
Sinon, la division euclidienne de 𝑟0 par 𝑟1 ≠ 0 donne 𝑟0 = 𝑟1 𝑞1 + 𝑟2 . On prend 𝑎1 = 𝑞1 .
Si 𝑟2 = 0 on s’arrête avec 𝑛 = 1. Sinon, on continue tant qu’on a un reste non nul. On a ainsi
𝑟−1 = 𝑟0 𝑞0 + 𝑟1
⋮
𝑟𝑛−2 = 𝑟𝑛−1 𝑞𝑛−1 + 𝑟𝑛 avec 𝑟𝑛 ≠ 0
𝑟𝑛−1 = 𝑟𝑛 𝑞𝑛 + 𝑟𝑛+1 avec 𝑟𝑛+1 = 0
ce qui donne [𝑎0 ; 𝑎1 , … , 𝑎𝑛 ] avec 𝑎𝑖 = 𝑞𝑖 .
Produit direct de groupes abéliens : Si 𝑛 ∈ ℕ et (𝐺1 , ⋆1 ), … , (𝐺𝑛 , ⋆𝑛 ) sont des groupes abéliens, alors
(𝐺1 × ⋯ × 𝐺𝑛 , ⋆) est un groupe abélien pour la loi (𝑥1 , … , 𝑥𝑛 ) ⋆ (𝑦1 , … , 𝑦𝑛 ) = (𝑥1 ⋆1 𝑦1 , … , 𝑥𝑛 ⋆𝑛 𝑦𝑛 ). Son
neutre est 𝑒 = (𝑒1 , … , 𝑒𝑛 ).
Soit (𝐺, ⋆) un groupe de neutre 𝑒. Pour 𝑚 ∈ ℤ et 𝑔 ∈ 𝐺 on définit une opération binaire ∶ ℤ × 𝐺 ⟶ 𝐺 par
⎧𝑒 si 𝑚 = 0
{ 𝑚 fois
def
{
𝑚 𝑔 = ⎨𝑔⏞ ⋆⋯⋆𝑔 si 𝑚 > 0
{ −𝑚 fois
{⏞′⏞⏞⏞⏞′
⎩𝑔 ⋆ ⋯ ⋆ 𝑔 si 𝑚 < 0
Propriétés : Pour 𝑚, 𝑚1 , 𝑚2 ∈ ℤ et 𝑔 ∈ 𝐺 on a
𝑚1 (𝑚2 𝑔) = (𝑚1 𝑚2 ) 𝑔.
(𝑚1 + 𝑚2 ) 𝑔 = (𝑚1 𝑔) ⋆ (𝑚2 𝑔).
1 𝑔 = 𝑔.
𝑚 𝑒 = 𝑒.
(−1) 𝑔 = 𝑔′ .
𝑚 (𝑔1 ⋆ 𝑔2 ) = (𝑚 𝑔1 ) ⋆ (𝑚 𝑔2 )
Notation additive : 𝑎𝑔 = 𝑚 𝑔 (ce n’est pas une multiplication en général, car 𝑚 ∈ ℤ et 𝑔 ∈ 𝐺).
Notation multiplicative : 𝑔𝑚 = 𝑚 𝑔 (ce n’est pas une puissance en général, car 𝑚 ∈ ℤ et 𝑔 ∈ 𝐺).
Définition : L’ordre d’un groupe (𝐺, ⋆) est le cardinal de 𝐺. Si 𝐺 n’est pas fini, on dit que le groupe est
d’ordre infini.
Un groupe abélien (𝐺, ⋆) est monogène s’il existe 𝑔 ∈ 𝐺 tel que 𝐺 = ⟨𝑔⟩.
Un groupe abélien (𝐺, ⋆) est cyclique s’il est monogène et d’ordre fini.
Définition : Soit 𝑔 ∈ 𝐺. Si ⟨𝑔⟩ est fini, l’ordre de l’élément 𝑔 est o(𝑔) = card⟨𝑔⟩. Sinon, 𝑔 est d’ordre infini.
o(𝑔) = min({ 𝑛 ∈ ℕ∗ ∣ 𝑛 𝑔 = 𝑒 } ∪ {+∞}).
𝑚 𝑔 = 𝑒 ⟹ o(𝑔) \ 𝑚.
En notation multiplicative :
o(𝑔) = min({ 𝑛 ∈ ℕ∗ ∣ 𝑔𝑛 = 𝑒 } ∪ {+∞}).
𝑔𝑚 = 𝑒 ⟹ o(𝑔) \ 𝑚.
Théorème 3.1.1 (Lagrange)
Si 𝐺 est un groupe abélien fini, alors l’ordre de tout sous-groupe de 𝐺 divise l’ordre de 𝐺.
En particulier : ∀ 𝑔 ∈ 𝐺, o(𝑔) \ card 𝐺.
Soient (𝐺1 , ⋆1 ) et (𝐺2 , ⋆2 ) deux groupes abéliens de neutres respectifs 𝑒1 et 𝑒2 . Une application 𝑓 ∶ 𝐺1 ⟶ 𝐺2
est un homomorphisme de groupes si ∀ 𝑥, 𝑦 ∈ 𝐺1 , 𝑓(𝑥 ⋆1 𝑦) = 𝑓(𝑥) ⋆2 𝑓(𝑦).
Le noyau de 𝑓 est ker 𝑓 = { 𝑔1 ∈ 𝐺1 ∣ 𝑓(𝑔1 ) = 𝑒2 }.
On a pour 𝑔1 ∈ 𝐺 et 𝑚 ∈ ℤ :
𝑓(𝑒1 ) = 𝑒2
𝑓(𝑔1′ ) = 𝑓(𝑔1 )′
o(𝑓(𝑔1 )) ⩽ o(𝑔1 )
o(𝑔1 ) ∈ ℕ∗ ⟹ o(𝑓(𝑔1 )) \ o(𝑔1 )
𝑓 injectif ⟹ o(𝑓(𝑔1 )) = o(𝑔1 )
𝑓(𝑚 1 𝑔1 ) = 𝑚 2 𝑓(𝑔1 )
def
Si 𝐻 un sous-groupe de (𝐺, ⋆), la relation 𝑥 ℛ 𝑦 ⟺ 𝑥 ⋆ 𝐻 = 𝑦 ⋆ 𝐻 ⟺ 𝑥 ⋆ 𝑦′ ∈ 𝐻 est une relation
d’équivalence sur 𝐺. Alors le groupe quotient 𝐺 sur 𝐻 est (𝐺/𝐻, ⋆) où 𝐺/𝐻 = 𝐺/ℛ = { [𝑔]𝐻 ∣ 𝑔 ∈ 𝐺 } avec
[𝑔]𝐻 = 𝑔 ⋆ 𝐻 = { 𝑔 ⋆ ℎ ∣ ℎ ∈ 𝐻 } et [𝑔1 ]𝐻 ⋆ [𝑔2 ]𝐻 = [𝑔1 ⋆ 𝑔2 ]𝐻 .
Si 𝐻 un sous-groupe de (𝐺, ⋆), alors (𝐺/𝐻, ⋆) est un groupe abélien, et l’application 𝜋 ∶ 𝐺 ⟶ 𝐺/𝐻 avec
𝜋(𝑔) = [𝑔]𝐻 est un homomorphisme de groupes surjectif, avec ker 𝜋 = 𝐻.
Produit direct : Si 𝑛 ∈ ℕ et (𝐴1 , +1 , ⋅1 ), … , (𝐴𝑛 , +𝑛 , ⋅𝑛 ) sont des anneaux unitaires commutatifs, alors
(𝐴1 × ⋯ × 𝐴𝑛 , +, ⋅) est un anneau unitaire commutatif pour les lois
def
(𝑎1 , … , 𝑎𝑛 ) + (𝑏1 , … , 𝑏𝑛 ) = (𝑎1 +1 𝑏1 , … , 𝑎𝑛 +𝑛 𝑏𝑛 ) (élément neutre (0𝐴1 , … , 0𝐴𝑛 ))
def
(𝑎1 , … , 𝑎𝑛 ) ⋅ (𝑏1 , … , 𝑏𝑛 ) = (𝑎1 ⋅1 𝑏1 , … , 𝑎𝑛 ⋅𝑛 𝑏𝑛 ) (élément neutre (1𝐴1 , … , 1𝐴𝑛 ))
Soient (𝐴1 , +1 , ⋅1 ) et (𝐴2 , +2 , ⋅2 ) deux anneaux unitaires commutatifs. Une application 𝑓 ∶ 𝐴1 ⟶ 𝐴2 est un
homomorphisme d’anneaux si • ∀ 𝑎, 𝑏 ∈ 𝐴1 , 𝑓(𝑎 +1 𝑏) = 𝑓(𝑎) +2 𝑓(𝑏)
• ∀ 𝑎, 𝑏 ∈ 𝐴1 , 𝑓(𝑎 ⋅1 𝑏) = 𝑓(𝑎) ⋅2 𝑓(𝑏)
• 𝑓(1𝐴1 ) = 1𝐴2
Le noyau de 𝑓 est ker 𝑓 = { 𝑎 ∈ 𝐴1 ∣ 𝑓(𝑎) = 0𝐴2 }.
Un isomorphisme d’anneaux est un homomorphisme d’anneaux bijectif.
def
Notation : 𝐴1 ≃ 𝐴2 ⟺ ∃ 𝑓 ∶ 𝐴1 ⟶ 𝐴2 homomorphisme d’anneaux bijectif. On dit que 𝐴1 est isomorphe
ann
à 𝐴2 en tant qu’anneau. “Être isomorphe en tant qu’anneau” est une relation d’équivalence.
Si 𝑓 ∶ 𝐴1 ⟶ 𝐴2 est un homomorphisme d’anneaux injectif, on a un isomorphisme d’anneaux 𝐴1 ≃ im 𝑓,
ann
ce qui permet de les identifier, et de considérer 𝐴1 comme un sous-anneau de 𝐴2 .
Notations :
def
Homann (𝐴1 , 𝐴2 ) = { 𝑓 ∶ 𝐴1 ⟶ 𝐴2 ∣ 𝑓 est un homomorphisme d’anneaux }.
def
L’ensemble des endomorphismes de 𝐴 est Endann (𝐴) = Homann (𝐴, 𝐴).
def
L’ensemble des automorphismes de 𝐴 est Autann (𝐴) = { 𝑓 ∈ Endann (𝐴) ∣ 𝑓 est bijectif }.
def min{ 𝑛 ∈ ℕ∗ ∣ ∀ 𝑎 ∈ 𝐴, 𝑛 𝑎 = 0𝐴 } s’il existe
La charactéristique d’un anneau (𝐴, +, ⋅) est char 𝐴 = {
0 sinon.
𝑛 fois
(rappel : 𝑛 𝑎 = 𝑎
⏞⏞+⏞⋯⏞ +⏞𝑎).
Si 1𝐴 est d’ordre fini dans le groupe additif (𝐴, +), alors char 𝐴 est égal à cet ordre ; sinon, char 𝐴 = 0.
3.3 Idéaux
Soit (𝐴, +, ⋅) un anneau unitaire commutatif.
𝐼 est un idéal de 𝐴 si • 𝐼 est un sous-groupe de (𝐴, +)
• ∀ 𝑖 ∈ 𝐼, ∀ 𝑎 ∈ 𝐴, 𝑖 ⋅ 𝑎 ∈ 𝐼 (absorption)
𝐼 est un idéal de 𝐴 ⟺ (∀ 𝑖1 , 𝑖2 ∈ 𝐼, 𝑖1 + 𝑖2 ∈ 𝐼 et ∀ 𝑖 ∈ 𝐼, ∀ 𝑎 ∈ 𝐴, 𝑖 ⋅ 𝑎 ∈ 𝐼)
Intersection : L’intersection d’une famille non vide d’idéaux de 𝐴 est un idéal de 𝐴.
On peut rajouter la convention que l’intersection de la famille vide d’idéaux de 𝐴 est égale à 𝐴.
Théorème 3.3.1 (Premier théorème d’isomorphisme pour les anneaux unitaires commutatifs)
Si 𝑓 ∶ 𝐴1 ⟶ 𝐴2 est un homomorphisme d’anneaux unitaires commutatifs, on a un isomorphisme d’anneaux
𝑓 ∶ (𝐴1 / ker 𝑓) ⟶ im 𝑓 avec 𝑓([𝑎]ker 𝑓 ) = 𝑓(𝑎).
Dans un anneau 𝐴 :
𝔭 est un idéal premier de 𝐴 si 𝔭 est un idéal de 𝐴, 𝔭 ≠ 𝐴
∀ 𝑎, 𝑏 ∈ 𝐴, 𝑎𝑏 ∈ 𝔭 ⟹ (𝑎 ∈ 𝑝 ou 𝑏 ∈ 𝑝).
𝔪 est un idéal maximal de 𝐴 si
𝔪 est un idéal de 𝐴, 𝔪 ≠ 𝐴
pour tout 𝐼 idéal de 𝐴 on a 𝔪 ⊆ 𝐼 ≠ 𝐴 ⟹ 𝔪 = 𝐼.
𝔪 idéal maximal de 𝐴 ⟹ 𝔪 idéal premier de 𝐴.
On dit que 𝑎 est une unité ou inversible de 𝐴 si 𝑎 \ 1𝐴 , c’est-à-dire, s’il existe 𝑏 ∈ 𝐴 tel que 𝑎 ⋅ 𝑏 = 1𝐴 .
L’ensemble des inversibles de 𝐴 est noté 𝐴× .
Si (𝐴, +, ⋅) est un anneau unitaire commutatif, on a que (𝐴× , ⋅) est un groupe abélien de neutre 1𝐴 .
Notation à éviter : 𝐴∗ = 𝐴× (ici 𝐴∗ = 𝐴 r {0𝐴 }).
Un diviseur de zéro n’est pas une unité et vice-versa.
Définition : 𝑎 et 𝑏 sont associés dans 𝐴, noté 𝑎 ∼ 𝑏, si 𝑎, 𝑏 ∈ 𝐴 et 𝑎 \ 𝑏 et 𝑏 \ 𝑎 dans 𝐴.
“Être associé” est une relation d’équivalence dans 𝐴.
∃ 𝑢 ∈ 𝐴× , 𝑎 = 𝑢 ⋅ 𝑏 ⟹ 𝑎 ∼ 𝑏.
𝑎⋅𝑏 =𝑎⋅𝑐 ⎫
}
Pour 𝑎, 𝑏, 𝑐 ∈ 𝐴 on a 𝑎≠0
⎬ ⟹ 𝑏=𝑐
𝑎 n’est pas un diviseur de zéro }
⎭
𝑎\𝑏 ⎫
}
Pour 𝑎, 𝑏 ∈ 𝐴 on a 𝑎≠0 ⟹ ∃! 𝑐 ∈ 𝐴, 𝑎 ⋅ 𝑐 = 𝑏
⎬
𝑎 n’est pas un diviseur de zéro }
⎭
Définitions :
𝑝 est un premier de 𝐴 si 𝑝 ∈ 𝐴, 𝑝 ≠ 0𝐴 , 𝑝 ∉ 𝐴×
∀ 𝑎, 𝑏 ∈ 𝐴, 𝑝 \ 𝑎𝑏 ⟹ (𝑝 \ 𝑎 ou 𝑝 \ 𝑏)
𝑝 est un irréductible de 𝐴 si 𝑝 ∈ 𝐴, 𝑝 ≠ 0𝐴 , 𝑝 ∉ 𝐴×
∀ 𝑎 ∈ 𝐴, 𝑎 \ 𝑝 ⟹ (𝑎 ∼ 1𝐴 ou 𝑎 ∼ 𝑝)
Soit 𝑝 ∈ 𝐴. Alors 𝑝 est un premier de 𝐴 ⟺ ⟨𝑝⟩ est un idéal premier de 𝐴.
Proposition 3.5.1
Si 𝐴 est intègre, alors 𝑝 premier de 𝐴 ⟹ 𝑝 irréductible de 𝐴.
DÉMONSTRATION. On a 𝑎 \ 𝑝 ⟹ 𝑝 = 𝑎𝑏 ⟹ 𝑝 \ 𝑎𝑏 ⟹ (𝑝 \ 𝑎 ou 𝑝 \ 𝑏).
Si 𝑝 \ 𝑎, alors 𝑎 ∼ 𝑝.
Si 𝑝 \| 𝑎, alors 𝑝 \ 𝑏 ⟹ 𝑏 = 𝑝𝑐 ⟹ 𝑝(1𝐴 − 𝑎𝑐) = 0𝐴 . Or 𝐴 est intègre et 𝑝 ≠ 0𝐴 donc 1𝐴 − 𝑎𝑐 = 0𝐴 ⟹
𝑎𝑐 = 1𝐴 ⟹ 𝑎 ∼ 1𝐴 .
DÉMONSTRATION. Exercice.
Notation et définition : 𝐴[𝑋] = 𝑆(𝐴) est l’anneau de polynômes à 1 variable à coefficients dans 𝐴. Comme
indiqué, on le voit comme un sur-anneau de 𝐴.
𝑑
Ceci permet d’écrire 𝐴[𝑋] = { ∑ 𝑎𝑖 ⋅ 𝑋 𝑖 𝑑 ∈ ℕ, 𝑎𝑖 ∈ 𝐴 } (rappel : 𝑋 0 = 1𝐴[𝑋] = (1𝐴 , 0𝐴 , 0𝐴 , 0𝐴 , …)).
𝑖=0
𝑑
Composition : Si 𝑃 (𝑋), 𝑄(𝑋) ∈ 𝐴[𝑋] avec 𝑃 (𝑋) = ∑ 𝑎𝑛 ⋅ 𝑋 𝑛 et 𝑄(𝑋) = ∑ 𝑏𝑖 ⋅ 𝑋 𝑖 , on définit
𝑛∈ℕ 𝑖=0
𝑑
𝑄(𝑃 (𝑋)) = ∑ 𝑏𝑖 ⋅ (𝑃 (𝑋))𝑖 (avec (𝑃 (𝑋))0 = 1𝐴 ).
𝑖=0
Définitions :
def
• Le coefficient dominant de 𝑃 (𝑋) est lc(𝑃 (𝑋)) = 𝑎𝑑 .
def
• Le monôme dominant de 𝑃 (𝑋) est lm(𝑃 (𝑋)) = 𝑋 𝑑 .
def
• Le terme dominant de 𝑃 (𝑋) est lt(𝑃 (𝑋)) = 𝑎𝑑 𝑋 𝑑 .
Attention : lc(0(𝑋)), lm(0(𝑋)) et lt(0(𝑋)) ne sont pas définis.
Un polynôme 𝑃 (𝑋) ∈ 𝐴[𝑋] est unitaire s’il est non nul et lc(𝑃 (𝑋)) = 1.
∀ 𝑎(𝑋), 𝑏(𝑋) ∈ 𝐴[𝑋] on a
deg(𝑎(𝑋) + 𝑏(𝑋)) ⩽ max{deg 𝑎(𝑋), deg 𝑏(𝑋)}
deg 𝑎(𝑋) ≠ deg 𝑏(𝑋) ⟹ deg(𝑎(𝑋) + 𝑏(𝑋)) = max{deg 𝑎(𝑋), deg 𝑏(𝑋)}
deg(𝑎(𝑋) ⋅ 𝑏(𝑋)) ⩽ deg 𝑎(𝑋) + deg 𝑏(𝑋)
lc(𝑎(𝑋)) défini et non diviseur de zéro ⟹ deg(𝑎(𝑋) ⋅ 𝑏(𝑋)) = deg 𝑎(𝑋) + deg 𝑏(𝑋)
Si 𝐴 est un anneau intègre, alors
∀ 𝑎(𝑋), 𝑏(𝑋) ∈ 𝐴[𝑋], deg(𝑎(𝑋) ⋅ 𝑏(𝑋)) = deg 𝑎(𝑋) + deg 𝑏(𝑋).
𝐴[𝑋] est un anneau intègre.
(𝐴[𝑋])× = 𝐴× (donc pas de nouveaux inversibles).
Évaluation polynomiale :
Pour 𝑃 (𝑋) ∈ 𝐴[𝑋] avec 𝑃 (𝑋) = ∑ 𝑐𝑛 ⋅ 𝑋 𝑛 on définit l’application 𝑃 ∶ 𝐴 ⟶ 𝐴 par 𝑃 (𝑎) = ∑ 𝑐𝑛 ⋅ 𝑎𝑛 .
𝑛∈ℕ 𝑛∈ℕ
Pour 𝑎 ∈ 𝐴 on définit l’évaluation ev𝑎 ∶ 𝐴[𝑋] ⟶ 𝐴 par ev𝑎 (𝑃 (𝑋)) = 𝑃 (𝑎).
Quel que soit 𝑎 ∈ 𝐴, on a que ev𝑎 est un homomorphisme d’anneaux surjectif vérifiant ∀ 𝑏 ∈ 𝐴, ev𝑎 (𝑏) = 𝑏.
def
Définition : 𝑎 est une racine de 𝑃 (𝑋) ∈ 𝐴[𝑋] dans 𝐴 ⟺ (𝑎 ∈ 𝐴 et 𝑃 (𝑎) = 0𝐴 ).
DÉMONSTRATION. Soient 𝑎(𝑋), 𝑏(𝑋) ∈ 𝐴[𝑋]∗ , et soient 𝑑 = deg 𝑎(𝑋) ∈ ℕ, 𝑒 = deg 𝑏(𝑋) ∈ ℕ. On écrit
𝑑 𝑒
𝑎(𝑋) = ∑ 𝑎𝑖 𝑋 𝑖 et 𝑏(𝑋) = ∑ 𝑏𝑗 𝑋 𝑗 , on a lc(𝑎(𝑋)) = 𝑎𝑑 et lc(𝑏(𝑋)) = 𝑏𝑒 .
𝑖=0 𝑗=0
Contraposée : Si 𝑎(𝑋)𝑏(𝑋) = 0(𝑋), alors 𝑎𝑑 𝑏𝑒 = 0𝐴 .
DÉMONSTRATION.
Existence : Preuve algorithmique.
𝛿
Soit 𝛿 = deg 𝑏(𝑋) ∈ ℕ. Alors 𝑏(𝑋) s’écrit 𝑏(𝑋) = ∑ 𝑏𝑖 𝑋 𝑖 avec lc(𝑏(𝑋)) = 𝑏𝛿 ∈ 𝐴× . Soit 𝑢 = 𝑏𝛿−1 .
𝑖=0
Condition d’arrêt : Si 𝑑0 < 𝛿, on prend 𝑞0 (𝑋) = 0(𝑋) et 𝑟(𝑋) = 𝑎(𝑋).
Si 𝑑 ⩾ 𝛿, on prend 𝑎
̃(𝑋) = 𝑎(𝑋) − 𝑢 lc(𝑎(𝑋))𝑋 𝑑−𝛿 𝑏(𝑋) ∈ 𝐴[𝑋].
Comme lm(𝑎(𝑋)) = lm(𝑢 lc(𝑎(𝑋))𝑋 𝑑−𝛿 𝑏(𝑋)), on a deg 𝑎 ̃(𝑋) < deg 𝑎(𝑋), et l’on recommence avec 𝑎
̃(𝑋).
On a ainsi, en notant 𝑑𝑖 = deg 𝑎̃𝑖 (𝑋) :
𝑎
̃0 (𝑋) = 𝑎(𝑋)
𝑎 ̃0 (𝑋) − 𝑢 lc(̃
̃1 (𝑋) = 𝑎 𝑎0 (𝑋))𝑋 𝑑0 −𝛿 𝑏(𝑋)
⋮
𝑎 ̃𝑖 (𝑋) − 𝑢 lc(̃
̃𝑖+1 (𝑋) = 𝑎 𝑎𝑖 (𝑋))𝑋 𝑑𝑖 −𝛿 𝑏(𝑋)
⋮
𝑎 ̃𝑠 (𝑋) − 𝑢 lc(̃
̃𝑠+1 (𝑋) = 𝑎 𝑎𝑠 (𝑋))𝑋 𝑑𝑠 −𝛿 𝑏(𝑋)
avec et 𝑑0 > 𝑑1 > ⋯ > 𝑑𝑠 > 𝛿 et 𝑑𝑠+1 ⩽ 𝛿 (arrêt).
𝑠
En remontant, cela donne 𝑎 ̃0 (𝑋) − 𝑢 ∑ lc(̃
̃𝑠+1 (𝑋) = 𝑎 𝑎𝑖 (𝑋))𝑋 𝑑𝑖 −𝛿 𝑏(𝑋).
𝑖=0
𝑠
En prenant 𝑞(𝑋) = 𝑢 ∑ lc(̃
𝑎𝑖 (𝑋))𝑋 𝑑𝑖 −𝛿
et 𝑟(𝑋) = 𝑎
̃𝑠+1 on a bien 𝑎(𝑋) = 𝑏(𝑋)𝑞(𝑋) avec 𝑞(𝑋), 𝑟(𝑋) ∈ 𝐴[𝑋]
𝑖=0
et deg 𝑟(𝑋) < deg 𝑏(𝑋).
Unicité :
Si 𝑎(𝑋) = 𝑏(𝑋)𝑞1 (𝑋) + 𝑟1 (𝑋) = 𝑏(𝑋)𝑞2 (𝑋) + 𝑟2 (𝑋) avec deg 𝑟𝑖 (𝑋) < deg 𝑏(𝑋), alors
𝑟1 (𝑋) − 𝑟2 (𝑋) = 𝑏(𝑋)(𝑞2 (𝑋) − 𝑞1 (𝑋)) avec deg(𝑟1 (𝑋) − 𝑟2 (𝑋)) ⩽ max{deg 𝑟1 (𝑋), deg 𝑟2 (𝑋)} < deg 𝑏(𝑋).
On a donc deg 𝑏(𝑋) > deg(𝑟1 (𝑋) − 𝑟2 (𝑋)) = deg(𝑏(𝑋)(𝑞2 (𝑋) − 𝑞1 (𝑋))) = deg 𝑏(𝑋) + deg(𝑞2 (𝑋) − 𝑞1 (𝑋))
(car lc(𝑏(𝑋)) n’est pas un diviseur de zéro).
Or si 𝑞1 (𝑋) ≠ 𝑞2 (𝑋) alors deg(𝑞2 (𝑋) − 𝑞1 (𝑋)) ⩾ 0, ce qui donne deg 𝑏(𝑋) > deg 𝑏(𝑋), impossible.
Ainsi, 𝑞1 (𝑋) = 𝑞2 (𝑋) et 𝑟1 (𝑋) = 𝑎(𝑋) − 𝑏(𝑋)𝑞1 (𝑋) = 𝑎(𝑋) − 𝑏(𝑋)𝑞2 (𝑋) = 𝑟2 (𝑋).
Proposition 3.7.3 Soit 𝐴 un anneau non nul, unitaire, commutatif, et soient 𝑓(𝑋) ∈ 𝐴[𝑋]∗ et 𝑎 ∈ 𝐴.
Alors 𝑓(𝑎) = 0𝐴 ⟺ (𝑋 − 𝑎) \ 𝑓(𝑋) dans 𝐴[𝑋].
DÉMONSTRATION. Puisque 𝑋 − 𝑎 ∈ 𝐴[𝑋] est unitaire, on peut faire la division euclidienne de 𝑓(𝑋) par
𝑋 − 𝑎, on trouve 𝑓(𝑋) = (𝑋 − 𝑎)𝑞(𝑋) + 𝑟(𝑋) avec deg 𝑟(𝑋) < deg(𝑋 − 𝑎) = 1 donc 𝑟(𝑋) = 𝑏 ∈ 𝐴,
c’est-à-dire, 𝑓(𝑋) = (𝑋 − 𝑎)𝑞(𝑋) + 𝑏 avec 𝑏 ∈ 𝐴.
Alors 𝑓(𝑎) = 0 ⟺ 𝑏 = 0 ⟺ (𝑋 − 𝑎) \ 𝑓(𝑋) dans 𝐴[𝑋].
Soit 𝑓(𝑋) ∈ 𝐴[𝑋]∗ . Si 𝑎 est une racine de 𝑓(𝑋) dans 𝐴 on dit que
la multiplicité de 𝑎 comme racine de 𝑓(𝑋) est max{ 𝑚 ∈ ℕ∗ ∣ (𝑋 − 𝑎)𝑚 \ 𝑓(𝑋) }.
Ceci est bien défini : Soit 𝐸 = { 𝑚 ∈ ℕ∗ ∣ (𝑋 − 𝑎)𝑚 \ 𝑓(𝑋) }. Alors 1 ∈ 𝐸 donc 𝐸 ≠ ⌀. Comme 𝑓(𝑎) = 0𝐴 ,
on a 𝑓(𝑋) = (𝑋 − 𝑎)𝑓1 (𝑋) dans 𝐴[𝑋]. Si 𝑓1 (𝑋) ≠ 0𝐴 , alors 𝐸 = {1} et c’est fini.
Sinon, on a 𝑓1 (𝑋) = (𝑋 − 𝑎)𝑓2 (𝑋), etc. Comme deg 𝑓𝑖 (𝑋) = deg(𝑓(𝑋)) − 𝑖 (car 𝑋 − 𝑎 est unitaire), ce
processus s’arrête au bout d’au plus 𝑛 étapes.
Une racine simple est une racine de multiplicité 1.
Une racine multiple est une racine de multiplicité > 1.
Une racine double est une racine de multiplicité 2.
Une racine triple est une racine de multiplicité 3, etc.
DÉMONSTRATION. Exercice.
En particulier, ℤ× = {−1, 1} et 𝑎 ∼ 𝑏 ⟺ |𝑎| = |𝑏|.
Proposition 3.9.2 Dans ℤ on a (𝑎𝑏 = 𝑎𝑐 et 𝑎 ≠ 0) ⟹ 𝑏 = 𝑐.
DÉMONSTRATION. Admis.
Plus grand commun diviseur canonique : Pour 𝑎, 𝑏 ∈ ℤ, on définit Gcd(𝑎, 𝑏) = 𝑑 où 𝑑 ∈ ℕ et 𝑎ℤ + 𝑏ℤ = 𝑑ℤ.
On a donc Gcd(±1, 𝑎) = 1, Gcd(0, 𝑎) = |𝑎| et en particulier Gcd(0, 0) = 0.
Définitions : Pour 𝑎, 𝑏 ∈ ℤ, 𝑎, 𝑏 sont premiers entre eux ou 𝑎 est premier à 𝑏 si Gcd(𝑎, 𝑏) = 1.
Généralisation : Pour 𝑛 ∈ ℕ et 𝑎1 , … , 𝑎𝑛 ∈ ℤ, on définit Gcd(𝑎1 , … , 𝑎𝑛 ) = 𝑑 où 𝑑 ∈ ℕ et 𝑎1 ℤ+⋯+𝑎𝑛 ℤ = 𝑑ℤ.
En particulier, Gcd(𝑎) = |𝑎| et Gcd( ) = Gcd(0) = Gcd(0, … , 0) = 0.
def
Définition : 𝑎1 , … , 𝑎𝑛 ∈ ℤ sont 2 à 2 premiers entre eux ⟺ (∀ 𝑖, 𝑗 ∈ J1, 𝑟K, 𝑖 ≠ 𝑗 ⟹ Gcd(𝑎𝑖 , 𝑎𝑗 ) = 1).
DÉMONSTRATION. D’après Bézout on a 𝑢, 𝑣 ∈ ℤ tels que 𝑎𝑢 + 𝑏𝑣 = 1, donc 𝑎𝑢𝑐 + 𝑏𝑣𝑐 = 𝑐. Comme 𝑎 \ 𝑎𝑢𝑐
et 𝑎 \ 𝑏𝑐𝑣, on a que 𝑎 \ 𝑐.
L’élément neutre pour + est 0. L’élément neutre pour ⋅ est 1. L’ensemble des inversibles est ℤ× = {±1}.
On a :
Un nombre 𝑝 est un premier de ℤ ssi 𝑝 ∈ ℤ r {0, ±1} et ∀ 𝑎, 𝑏 ∈ ℤ, 𝑝 \ 𝑎𝑏 ⟹ (𝑝 \ 𝑎 ou 𝑝 \ 𝑏).
Un nombre 𝑝 est un irréductible de ℤ ssi 𝑝 ∈ ℤ r {0, ±1} et ∀ 𝑎 ∈ ℤ, 𝑎 \ 𝑝 ⟹ 𝑎 ∈ {±1, ±𝑝}.
Proposition 3.9.7 On a que 𝑝 est un premier de ℤ ssi 𝑝 est un irréductible de ℤ.
DÉMONSTRATION. Admis.
Cela donne la classification suivante des éléments de ℤ :
• Le neutre pour l’addition : le nombre 0.
• Les unités ou inversibles : ±1.
• Les nombres premiers : ±2, ±3, ±5, ±7, ±11, ±13, etc.
• Les nombres composés : tout le reste : ±4, ±6, ±8, ±9, ±10, ±12, etc.
DÉMONSTRATION. Admis.
Attention : Le nombre 0 n’a pas de factorisation.
Proposition 3.9.9 (Idéaux premiers et maximaux de ℤ)
On a :
1) Les idéaux premiers de ℤ sont ⟨0⟩ et ⟨𝑝⟩ avec 𝑝 ∈ ℙ.
2) Les idéaux maximaux de ℤ sont ⟨𝑝⟩ avec 𝑝 ∈ ℙ.
DÉMONSTRATION. Exercice.
DÉMONSTRATION. Admis.
Soit 𝑛 ∈ ℕ. Puisque ⟨𝑛⟩ = 𝑛ℤ est un sous-groupe de (ℤ, +) qui est un groupe abélien, on a le groupe quotient
(ℤ/𝑛ℤ, +) avec
def
ℤ/𝑛ℤ = { [𝑎]𝑛 ∣ 𝑎 ∈ ℤ }
def
[𝑎]𝑛 = 𝑎 + 𝑛ℤ = { 𝑎 + 𝑛𝑘 ∣ 𝑘 ∈ ℤ }
def
[𝑎]𝑛 + [𝑏]𝑛 = [𝑎 + 𝑏]𝑛 = (𝑎 + 𝑏) + 𝑛ℤ
𝜋 ∶ ℤ ⟶ ℤ/𝑛ℤ défini par 𝜋(𝑎) = [𝑎]𝑛 est un homomorphisme de groupes surjectif.
DÉMONSTRATION. Admis.
3.9.4 Divers
DÉMONSTRATION. Admis.
DÉMONSTRATION. Admis.
Maintenant on regarde les groupes cycliques.
Lemme 3.10.3 Soit (𝐺, ⋅) un groupe quelconque, et soit 𝑔 ∈ 𝐺 d’ordre fini 𝑛.
1) ∀ 𝑘 ∈ ℤ, o(𝑔𝑘 ) = 𝑛/ Gcd(𝑛, 𝑘).
2) ∀ 𝑎, 𝑏 ∈ ℤ, (𝑔𝑎 = 𝑔𝑏 ⟺ 𝑛 \ (𝑎 − 𝑏) ⟺ 𝑎 ≡ 𝑏 [𝑛]).
DÉMONSTRATION. Admis.
4) On a une bijection entre 𝐷(𝑛) et l’ensemble des sous-groupes de (𝐺, ⋅), donnée par 𝑑 ↦ ⟨𝑔0𝑑 ⟩.
5) Tous les groupes cycliques d’un même ordre 𝑛 sont isomorphes. En particulier, 𝜙 ∶ ℤ/𝑛ℤ ⟶ 𝐺 avec
𝜙(𝑎) = 𝑔0𝑎 est un isomorphisme entre les groupes (ℤ/𝑛ℤ, +) et (𝐺, ⋅).
DÉMONSTRATION. Admis.
DÉMONSTRATION. Comme 𝑏(𝑋) ≠ 0(𝑋), lc(𝑏(𝑋)) est défini et lc(𝑏(𝑋)) ≠ 0 donc lc(𝑏(𝑋)) ∈ 𝕜× . Alors
3.7.2 donne l’existence et l’unicité.
Dans les conditions du théorème, pour (𝑎(𝑋), 𝑏(𝑋)) ∈ 𝕜[𝑋] × 𝕜[𝑋]∗ on définit Quo(𝑎(𝑋), 𝑏(𝑋)) = 𝑞(𝑋) et
Rem(𝑎(𝑋), 𝑏(𝑋)) = 𝑟(𝑋) et QuoRem(𝑎(𝑋), 𝑏(𝑋)) = (𝑞(𝑋), 𝑟(𝑋)).
Théorème 3.11.2 L’anneau 𝕜[𝑋] est principal.
DÉMONSTRATION. Admis.
DÉMONSTRATION. Admis.
Plus grand commun diviseur canonique : Pour 𝑟 ∈ ℕ et 𝑝1 (𝑋), … , 𝑝𝑟 (𝑋) ∈ 𝕜[𝑋], on définit
Gcd(𝑝1 (𝑋), … , 𝑝𝑟 (𝑋)) = 𝑑(𝑋) où ⟨𝑝1 (𝑋)⟩ + ⋯ + ⟨𝑝𝑟 (𝑋)⟩ = ⟨𝑑(𝑋)⟩ avec 𝑑(𝑋) ∈ 𝕜[𝑋] nul ou unitaire.
On a donc Gcd(0, 𝑝(𝑋)) = Gcd(𝑝(𝑋)) = normal(𝑝(𝑋))
𝜆 ∈ 𝕜∗ ⟹ Gcd(𝜆, 𝑝(𝑋)) = 1
Gcd( ) = Gcd(0(𝑋)) = Gcd(0(𝑋), … , 0(𝑋)) = 0(𝑋)
Définition : Pour 𝑎(𝑋), 𝑏(𝑋) ∈ 𝕜[𝑋], 𝑎(𝑋), 𝑏(𝑋) sont premiers entre eux ou 𝑎(𝑋) est premier à 𝑏(𝑋) si
Gcd(𝑎(𝑋), 𝑏(𝑋)) = 1.
Définition : 𝑝1 (𝑋), … , 𝑝𝑟 (𝑋) ∈ 𝕜[𝑋] sont 2 à 2 premiers entre eux
def
⟺ (∀ 𝑖, 𝑗 ∈ J1, 𝑟K, 𝑖 ≠ 𝑗 ⟹ Gcd(𝑝𝑖 (𝑋), 𝑝𝑗 (𝑋)) = 1).
Proposition 3.11.4 (Bézout dans 𝕜[𝑋]) ∀ 𝑎(𝑋), 𝑏(𝑋) ∈ 𝕜[𝑋], ∃ 𝑢(𝑋), 𝑣(𝑋) ∈ 𝕜[𝑋] tels que
𝑎(𝑋)𝑢(𝑋) + 𝑏(𝑋)𝑣(𝑋) = Gcd(𝑎(𝑋), 𝑏(𝑋)).
En particulier, si 𝑎(𝑋), 𝑏(𝑋) ∈ 𝕜[𝑋] sont premiers entre eux, alors
∃ 𝑢(𝑋), 𝑣(𝑋) ∈ 𝕜[𝑋], 𝑎(𝑋)𝑢(𝑋) + 𝑏(𝑋)𝑣(𝑋) = 1.
DÉMONSTRATION. Admis.
Attention : 𝑢(𝑋), 𝑣(𝑋) ne sont pas uniques.
Proposition 3.11.5 (Lemme de Gauß dans 𝕜[𝑋])
Dans 𝕜[𝑋] on a : Si 𝑎(𝑋) \ 𝑏(𝑋)𝑐(𝑋) et 𝑎(𝑋) est premier à 𝑏(𝑋), alors 𝑎(𝑋) \ 𝑐(𝑋).
DÉMONSTRATION. Admis.
DÉMONSTRATION. Admis.
Remarque : Dans ℤ on utilise plutôt le terme “premier”, alors que dans 𝕜[𝑋] c’est plutôt “irréductible”.
Corollaire 3.11.7 Soit 𝑓(𝑋) ∈ 𝕜[𝑋]. Alors 𝑓(𝑋) est irréductible dans 𝕜[𝑋] ssi
deg 𝑓(𝑋) ⩾ 1 et ∀ 𝑎(𝑋), 𝑏(𝑋) ∈ 𝕜[𝑋], (𝑓(𝑋) = 𝑎(𝑋)𝑏(𝑋) ⟹ (𝑎(𝑋) ∈ 𝕜∗ ou 𝑏(𝑋) ∈ 𝕜∗ )).
DÉMONSTRATION. Facile.
DÉMONSTRATION. Exercice.
Proposition 3.11.10 Soit 𝑓(𝑋) ∈ 𝕜[𝑋]∗ . Le nombre de racines de 𝑓(𝑋) dans 𝕜 est ⩽ deg 𝑓(𝑋).
On a (𝕜[𝑋])× = 𝕜∗ . Donc 𝑓(𝑋) ∈ 𝕜[𝑋] est une unité ssi deg 𝑓(𝑋) = 0.
Proposition 3.11.11 (Factorisation dans 𝕜[𝑋])
Tout 𝑓(𝑋) ∈ 𝕜[𝑋]∗ admet une écriture
𝑓(𝑋) = 𝑢 𝑃1 (𝑋)𝑒1 ⋯ 𝑃𝑟 (𝑋)𝑒𝑟
avec
𝑢 ∈ 𝕜∗ 𝑟∈ℕ 𝑃𝑖 (𝑋) ∈ 𝕜[𝑋] unitaires irréductibles 2 à 2 distincts 𝑒𝑖 ∈ ℕ∗ .
Cette écriture est unique à l’ordre des (𝑃𝑖 (𝑋), 𝑒𝑖 ) près.
DÉMONSTRATION. Admis.
DÉMONSTRATION. Admis.
On étudiera donc l’anneau ℤ/𝑛ℤ pour 𝑛 ∈ ℕ∗ .
Proposition 3.12.2 (Idéaux de ℤ/𝑛ℤ)
Soit 𝑛 ∈ ℕ∗ .
1) Tout sous-groupe de (ℤ/𝑛ℤ, +) est un idéal de l’anneau ℤ/𝑛ℤ.
2) Tous les idéaux de ℤ/𝑛ℤ sont ⟨[𝑑]𝑛 ⟩ avec 𝑑 ∈ 𝐷(𝑛).
3) Tous les idéaux sont principaux, donc ℤ/𝑛ℤ est un anneau principal.
4) Si 𝑑1 , 𝑑2 ∈ 𝐷(𝑛), alors ⟨[𝑑1 ]𝑛 ⟩ ⊆ ⟨[𝑑2 ]𝑛 ⟩ ⟺ 𝑑2 \ 𝑑1 . On a donc une bijection entre 𝐷(𝑛) et l’ensemble
des idéaux de ℤ/𝑛ℤ, donnée par 𝑑 ↦ ⟨[𝑑]𝑛 ⟩.
DÉMONSTRATION. Admis.
Remarque : L’idéal nul de ℤ/𝑛ℤ s’obtient ici pour 𝑑 = 𝑛 (et non 𝑑 = 0 qui n’appartient pas à 𝐷(𝑛)).
def
Notation : Si 𝑑 ∈ 𝐷(𝑛), on note 𝑑ℤ/𝑛ℤ = ⟨[𝑑]𝑛 ⟩ = { [𝑑𝑘]𝑛 ∣ 𝑘 ∈ ℤ } = { 𝑑𝑘 + 𝑛ℓ ∣ 𝑘, ℓ ∈ ℤ }.
Proposition 3.12.3 Soit 𝑛 ∈ ℕ∗ . On se place dans ℤ/𝑛ℤ. Pour 𝑎 ∈ ℤ, sont équivalentes :
(a) 𝑎 est premier à 𝑛.
(b) [𝑎]𝑛 engendre le groupe cyclique (ℤ/𝑛ℤ, +).
(c) [𝑎]𝑛 est une unité de l’anneau ℤ/𝑛ℤ, c’est-à-dire, [𝑎]𝑛 ∈ 𝒰𝑛 .
DÉMONSTRATION.
(a) ⟹ (c) : On a un Bézout 𝑎𝑢 + 𝑛𝑣 = 1, et modulo 𝑛 cela donne [𝑎]𝑛 [𝑢]𝑛 = [1]𝑛 , donc [𝑎]𝑛 ∈ 𝒰𝑛 .
(c) ⟹ (b) : On a [𝑎]𝑛 ∈ 𝒰𝑛 ⟹ ∃ 𝑏 ∈ ℤ, [𝑎]𝑛 [𝑏]𝑛 = [1]𝑛 , donc 𝑏 [𝑎]𝑛 = [1]𝑛 donc [1]𝑛 appartient au
sous-groupe de (ℤ/𝑛ℤ, +) engendré par [𝑎]𝑛 , donc ce sous-groupe est ℤ/𝑛ℤ.
(b) ⟹ (a) : [1]𝑛 appartient au sous-groupe engendré par [𝑎]𝑛 , donc il existe 𝑏 ∈ ℤ tel que 𝑏 [𝑎]𝑛 = [1]𝑛 ,
c’est-à-dire, [𝑎𝑏]𝑛 = [1]𝑛 donc 𝑛 \ (𝑎𝑏 − 1) donc il existe 𝑐 ∈ ℤ tel que 𝑎𝑏 − 1 = 𝑐𝑛.
Or 𝑎𝑏 − 𝑐𝑛 = 1 ⟹ Gcd(𝑎, 𝑛) \ 1 ⟹ Gcd(𝑎, 𝑛) = 1.
DÉMONSTRATION.
Si 𝑛 = 0 alors ℤ/0ℤ ≃ ℤ qui n’est pas un corps.
ann
Si 𝑛 = 1 alors ℤ/1ℤ n’est pas non nul.
Si 𝑝 ∈ ℙ alors ℤ/𝑝ℤ n’est pas l’anneau nul et 𝑈 (𝑝) = J1, 𝑝 − 1K donc 𝒰𝑝 = (ℤ/𝑝ℤ)∗ .
DÉMONSTRATION. Exercice.
DÉMONSTRATION. Ceci est une conséquence du théorème de Lagrange (dans un groupe fini, l’ordre de tout
élément divise l’ordre du groupe).
DÉMONSTRATION. Admis.
DÉMONSTRATION. Admis.
𝑟
Corollaire 3.12.13 Si la factorisation de 𝑛 ∈ ℕ est 𝑛 = ∏ 𝑝𝑖 𝑖 , alors
∗ 𝑒
𝑖=1
𝑟 𝑟
𝑒 −1 1
𝜙(𝑛) = ∏ 𝑝𝑖 𝑖 (𝑝𝑖 − 1) = 𝑛 ∏(1 − )
𝑖=1 𝑖=1
𝑝𝑖
DÉMONSTRATION. Admis.
À suivre...