Table des matières 1 Algorithme de Berkekamp 1.1 Principe de l’algorithme . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.1 Première étape . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.1.2 Seconde étape . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Démonstrations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Elimination des facteurs multiples (première étape) . . . . . . . 1.2.2 Seconde étape (algorithme de Berlekamp) . . . . . . . . . . . . 1.2.3 Application : recherche de polynômes irréductibles de degré fixé 1.3 Factorisation de polynômes à coefficients entiers . . . . . . . . . . . . . 1.3.1 Théorème de Landau-Mignotte . . . . . . . . . . . . . . . . . . 1.3.2 Première méthode . . . . . . . . . . . . . . . . . . . . . . . . . 1.3.3 Seconde méthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 2 3 4 4 5 6 7 7 9 10 2 Cryptographie et codes correcteurs 2.1 Cryptographie à clé publique . . . . . . . . . . 2.1.1 Deux exemples de codes à clé publique 2.1.2 Le système RSA . . . . . . . . . . . . . 2.1.3 Sécurité de RSA . . . . . . . . . . . . . 2.1.4 Recherche de nombres premiers . . . . . 2.2 Codes correcteurs . . . . . . . . . . . . . . . . . 2.2.1 Vocabulaire de la théorie des codes . . . 2.2.2 Codes linéaires . . . . . . . . . . . . . . 2.2.3 Code cycliques . . . . . . . . . . . . . . 2.2.4 Un exemple : le code de Hamming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 12 12 13 14 14 17 18 19 20 21 3 Elimination 3.1 Résultants à une indéterminée . . . . . . . . . . . . . . . 3.1.1 Définition et propriété principale . . . . . . . . . 3.1.2 Résultant et relations coefficients-racines . . . . . 3.1.3 Applications à l’arithmétique . . . . . . . . . . . 3.2 Elimination . . . . . . . . . . . . . . . . . . . . . . . . . 3.2.1 Résultants de deux polynômes à n indéterminées 3.2.2 Théorème de Bézout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 24 24 25 27 28 28 29 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . Chapitre 1 Algorithme de Berkekamp 1.1 Principe de l’algorithme Soit p un nombre premier et soit n ∈ N∗ . On pose q = pn . On cherche à factoriser un polynôme P non constant de Fq [X] en facteurs irréductibles. Comme Fq (le corps à q éléments) est un corps, Fq [X] est euclidien, donc factoriel, par suite cette décomposition est essentiellement unique. On peut utiliser un algorithme "naïf" : diviser le polynôme considéré par tous les polynômes de degré 1, puis de degré 2, . . ., puis les polynômes de degré deg(P ) − 1. Ces polynômes étant en nombre fini, cet algorithme se termine en un nombre fini d’étapes. On est assuré que le premier diviseur trouvé est irréductible. L’inconvénient est que cet algorithme est très lent. On va présenter dans ce chapitre un algorithme plus performant, l’algorithme de Berlekamp. Nous commençons par la description de l’algorithme. Remarque. Sur un corps quelconque, il n’existe pas d’algorithme (même très lent) permettant de factoriser les polynômes. Par exemple, factoriser un polynôme de C[X] revient à calculer ces racines et les travaux de Galois ont montré que ce n’était pas possible en toute généralité. 1.1.1 Première étape Elle consiste à se ramener au cas d’un polynôme sans facteur multiple. Tout d’abord, on vérifie si P ∈ Fq [X p ], c’est-à-dire si P = Q0 (X p ). Dans ce cas, Frobenius nous assure l’existence d’un polynôme Q1 ∈ Fq [X] tel que P = Q1 (X)p . En réitérant éventuellement le procédé (si k Q1 ∈ Fq [X p ] . . .), on est finalement ramené à P (X) = P1 (X)p 1 , avec P1 ∈ / Fq [X p ]. Remarques. 1. Si q = p, Q1 = Q0 . 2. Le degré de Q1 est le degré de P divisé par p, donc est inférieur strictement au degré de P . Par suite, cette étape se termine en un nombre fini de passages pour trouver P1 . On travaille ensuite sur P1 . On calcule Q1 = P1 ∧ P10 et on pose P1 = Q1 R1 . Alors R1 n’a que des facteurs simples. Si Q1 n’est pas constant, on réitère l’ensemble de cette première étape sur Q1 . Remarques. 1. Comme P1 ∈ / Fq [X p ], P10 6= 0 et donc le degré de Q1 est strictement inférieur au degré de P1 . 2. En conséquence, cette étape se termine en un nombre fini de passages. 2 A la fin de cette première étape, on a décomposé P sous la forme : k1 P = R1p kl . . . Rlp , où les Ri ∈ Fq [X] sont sans facteurs multiples. 1.1.2 Seconde étape On est ainsi ramené à factoriser des polynômes sans facteur multiple, les Ri . On suppose donc maintenant que P n’a que des facteurs simples. Son degré est noté N . L’idée est de chercher un polynôme non constant H de degré < N tel que P divise H q − H. Pour tout 0 ≤ j ≤ N − 1, on calcule le reste de la division euclidienne de (X qj ) par P . On le N −1 X note bi,j X i . Ces coefficients sont regroupés dans une matrice B = (bi,j )0≤i,j≤N −1 ∈ MN (Fq ). i=0 Le résultat suivant permet de déterminer un polynôme H convenable : Proposition 1 Soit H = N −1 X hi X i ∈ Fq [X], de degré < N . Alors P divise H q − H si, et i=0 seulement si : h0 .. . (B − IN ) = 0, hN −1 ce qui revient à dire que le vecteur colonne des coefficients hi est dans le noyau de B − IN . Par suite, une résolution d’un système linéaire permet de déterminer un H convenable. On utilise ensuite le résultat suivant : Proposition 2 Soit P ∈ Fq [X], unitaire, et soit H ∈ Fq [X], tel que P divise H q −H. Alors : Y P = P ∧ (H − λ), λ∈Fq L’algorithme de Berlekamp procède alors de la manière suivante : si B −IN est de rang N −1, alors P est irréductible . Sinon, on choisit un polynôme H non constant tel que P divise H n − H grâce au calcul du noyau de B − IN et la proposition précédente donne une factorisation de P en facteurs non tous triviaux (ils sont tous de degré strictement inférieur au degré de p mais il est possible que certains soient constants). En réitérant l’algorithme de Berlekamp sur les facteurs trouvés, on finit par obtenir une décomposition en facteurs irréductibles de P . Nous allons aussi montrer le résultat suivant : Proposition 3 Si P n’a pas de facteurs carrés, le nombre de facteurs irréductibles de P est N − rang(B − IN ). Cette dernière proposition n’a pas d’intérêt lorsque l’on souhaite programmer Berlekamp, mais servira souvent en pratique ! Remarques. 1. Lorsque k = N − rang(B − IN ) ≥ 3, on peut appliquer la proposition 3 avec k − 1 polynômes non constants et linéairement indépendants plutôt que de réappliquer l’algorithme immédiatement aux facteurs trouvés. Ceci augmente les chances de trouver tous les facteurs irréductibles en le minimum de calculs. 2. L’algorithme nécessite (entre autre) le calcul de q PGCD. Il n’est donc performant que lorsque le cardinal du corps de base est petit. 3 1.2 Démonstrations Nous allons maintenant démontrer la validité du procédé. 1.2.1 Elimination des facteurs multiples (première étape) Nous allons utiliser le morphisme de Frobenius. Proposition 4 Soit A un anneau unitaire commutatif de caractéristique p. L’application suivante est un endomorphisme d’anneau : A −→ A F : x −→ xp Il est appelé endomorphisme de Frobenius. Preuve. Il est immédiat que F (1) = 1 et F (xy) = F (x)F (y) pour tous x, y ∈ A, car A est commutatif. Soient x, y ∈ A. Alors, par la formule du binôme : p F (x + y) = x + p−1 X p k=1 k y k xp−k + y p . Si 1 ≤ k ≤ p − 1 : p k!(p − k)! = p!. k Donc p | k!(p − k)! kp . D’autre part, comme 1 ≤ k ≤ p − 1, les facteurs de k! et de (p − k)! p sont tous < p. Par Gauss, p ne divise pas k!(p − k)!. Toujours par Gauss, p divise k . Comme car(A) = p, kp = 0 dans A et donc F (x + y) = F (x) + F (y). 2 Remarque. Le fait que p | théorèmes de Sylow. Proposition 5 p k si 1 ≤ k ≤ p − 1 joue un rôle important dans la preuve des 1. Si A = Fq , alors l’endomorphisme de Frobenius est un automorphisme. 2. Si A = Fp , alors l’automorphisme de Frobenius est l’identité. 3. Si A = Fpn , alors F n = Id. Preuve. 1. Considérons Ker(F ). Il s’agit d’un idéal non nul de Fq (car F (1) = 1 6= 0), donc est nul car Fq est un corps. Donc F est injectif. Comme Fq est fini, cette injection de Fq dans lui-même est une bijection. 2. Il s’agit du petit théorème de Fermat. n 3. Si x ∈ Fq , alors F n (x) = xp = xq . On sait que le corps fini Fq est l’ensemble des racines de X q − X, donc F n (x) = x. Par suite, F n = Id. 2 Proposition 6 On considère A = Fq [X]. Alors l’endomorphisme de Frobenius de A est injectif et son image est Fq [X p ]. En conséquence, si Q ∈ Fq [X p ], il existe un unique P ∈ Fq [X] tel que Q(X) = P (X)p . Preuve. Soit P (X) = a0 + . . . + ak X k ∈ Fq [X]. Alors : F (P ) = ap0 + ap1 X p + . . . + apk X kp . Supposons F (P ) = 0. Alors en identifiant les coefficients, ap0 = . . . = apk = 0 dans Fq , donc a0 = . . . = ak = 0 : P = 0. Il est évident que Im(F ) ⊆ Fq [X p ]. Réciproquement, si Q(X) = 4 b0 + b1 X p . . . + bk X kp ∈ Fq [X p ], d’après la proposition 5, il existe ai ∈ Fq tel que bi = api pour tout i, et alors Q = F (P ) ∈ Im(F ). 2 Remarque. Il n’est pas immédiat de trouver l’unique Q tel que tel que P = Qp si P ∈ Fq [X p ] : le problème est de trouver une racine p-ième des coefficients de P dans Fq . Le seul cas où cela est évident est si n = 1. D’après le second point de la proposition 5, P (X p ) = P (X)p . Voir le TD pour un exemple. Ainsi, la première partie de l’étape 1 fonctionne et on est ramené à un polynôme ne vérifiant pas Frobenius. Proposition 7 Soit P ∈ / Fq [X p ]. Posons P = (P ∧ P 0 )Q. Alors Q n’a que des facteurs simples. Preuve. Comme P ∈ / Fq [X p ], P 0 6= 0 et est de degré strictement inférieur au degré de P , donc 0 P ∧ P 6= P et en conséquence, Q n’est pas constant. Par factorialité, on pose P = P1α1 . . . Pkαk la décomposition en facteurs irréductibles de P . On obtient : P0 = = k X αi Pi0 P1α1 . . . Piαi −1 . . . Pkαk i=1 k Y ! αi −1 P1 i=1 | k X ! αi P1 . . . Pi−1 Pi0 Pi+1 . . . Pk . i=1 {z Q0 (X) } Il est clair que Q0 (X) divise P et P 0 donc divise P ∧P 0 : posons P ∧P 0 = Q0 R0 . Alors P = Q0 R0 Q. Par suite, en divisant par Q0 , on obtient P1 . . . Pk = R0 Q, donc Q divise P1 . . . Pk . Par factorialité, Q n’a que des facteurs simples. 2 Remarque. Si αi est divisible par p, dans l’expression de P 0 on peut factoriser Pi (X) et donc Q0 n’est pas nécessairement le PGCD de P et P 0 , contrairement à ce que l’on a en caractéristique nulle. Par exemple, si P (X) = X p (X −1), P 0 (X) = X p et donc P ∧P 0 = X p alors que Q0 = X p−1 . 1.2.2 Seconde étape (algorithme de Berlekamp) Nous allons ici démontrer les propositions 1, 2 et 3. Soit A = Fq [X]/hP (X)i. Il s’agit d’une Fq -algèbre de dimension N , dont une base est donnée N −1 ). par B = (1, X, . . . , X On considère l’endomorphisme de Frobenius F de A et on pose φ = F n . Si x, y ∈ A, φ(x+y) = φ(x) + φ(y). Si a ∈ Fq et x ∈ A, alors φ(ax) = F n (a)φ(x) = aφ(x), car a ∈ Fq (proposition 5-3). Donc φ est Fq -linéaire. Sa matrice dans la base B est par définition la matrice B. En conséquence, si H = h0 + . . . + hN −1 X N −1 ∈ Fq [X] : q P | H q − H ⇐⇒ H − H = 0 dans A ⇐⇒ (φ − Id)(H) = 0 dans A h0 ⇐⇒ (B − IN ) ... = 0, hN −1 ce qui démontre la proposition 1. 5 q YMontrons maintenant la proposition 2. Soit H tel que P divise H − H. On pose Q = P ∧ (H − λ). Si λ 6= µ, (H − λ) − (H − µ) = µ − λ est une constante non nulle, donc par λ∈Fq Bezout les polynômes H − λ sont deux-à-deux premiers entre eux. Il en est donc de même de leurs diviseurs P ∧ (H − λ). Par suite, Q est le PPCM des P ∧ (H − λ). Comme pour tout λ, P ∧ (H − λ) divise P , il en est de même de leur PPCM, donc Q divise P . On sait que : Y (X − λ) = X q − X, λ∈Fq donc en substituant X = H, on obtient H q −H = Y (H −λ). Soit P = P1a1 . . . Pkak la décompo- λ∈Fq sition de P en facteurs irréductibles. Comme P divise H q − H et que les H − λ sont deux-à-deux premiers entre eux, pour tout i il existe un unique λ(i) tel que Piai divise H − λ(i). Alors Piai divise P ∧ (H − λ(i)), donc divise Q. Par suite, le PPCM des Piai , c’est-à-dire P car les Pi sont deux-à-deux premiers entre eux, divise Q. Comme P et Q sont unitaires, P = Q. Montrons maintenant la proposition 3. Posons P = P1 . . . Pk la décomposition en facteurs irréductibles (tous simples, par hypothèse) de P . Par le théorème des restes chinois : A≈ Fq [X] Fq [X] × ... × = K1 × . . . × Kk , hP1 i hPk i où les Ki sont des corps finis extension de Fq , car les Pi sont irréductibles. Par suite, pour trouver le Fq –sous-espace vectoriel E de A des éléments tels que xq = x, on est amené à chercher dans chaque Ki le sous-espace Ei des éléments tels que xq = x, puis à prendre la somme directe de ces sous-espaces. Comme Ki est une extension de Fq de degré fini, il s’agit d’un corps fini de la forme Fql . Dans ce corps fini, X q − X possède exactement q racines, et ce sont les éléments de Fq , donc Ei est de dimension 1. Par suite, E est de dimension k. D’après la proposition 1, dim(Ker(B − IN )) = k et donc d’après le théorème du rang, N − rang(B − IN ) = k, ce qui prouve la proposition 3. 1.2.3 Application : recherche de polynômes irréductibles de degré fixé On recherche un (ou tous...) les polynômes irréductibles unitaires de degré fixé d dans Fp [X]. On utilise la formule suivante : Proposition 8 Pour tout N ≥ 1, on note IN (q) l’ensemble des polynômes irréductibles unitaires de degré N dans Fq [X]. Alors : N Xq − X = Y Y P (X). d|N P (X)∈Id (q) Preuve. Soit P (X) un polynôme irréductible unitaire de degré d | N dans Fq [X]. Soit α une racine de P (X) dans une extension de Fq . Alors P (X) = IrrFq (α, X) et donc [Fq (α) : Fq ] = d. d Donc Fq (α) est un (le) corps à q d éléments. Donc αq = α. Posons N = dd0 . Alors : d α = αq = αq 2d = . . . = αq N dd0 N = αq . Par suite, P (X) | X q − X car P (X) = IrrFq (α, X). En prenant le PPCM (les polynômes considérés étant deux-à-deux premiers entre eux), on obtient : Y Y N P (X) | X q − X. d|N P (X)∈IN (q) 6 N N N D’autre part, (X q − X)0 = −1 donc X q − X et (X q − X)0 sont premiers entre eux : N q X − X est à facteurs simples. Soit P (X) un diviseur irréductible unitaire de ce polynôme. Soit α une racine de P (X) dans une extension de Fq . Alors [Fq (α) : Fq ] = deg(P ). Comme P (X) N divise X q − X, α est une racine de ce second polynôme, donc est dans le corps à q N éléments. On en déduit que : deg(P ) = [Fq (α) : Fq ] | [FqN : Fq ] = N. N Comme X q − X est à facteurs simples : N Xq − X | Y Y P (X). d|N P (X)∈IN (q) Ces deux polynômes sont donc associés. Comme ils sont unitaires, ils sont égaux. 2 Remarques. 1. Pour N = 1, on retrouve : Y Xq − X = Y P (X) = (X − λ). λ∈Fq P (X)∈I1 (q) N 2. En conséquence, il suffit d’appliquer l’algorithme de Berlekamp à X q − X pour trouver tous les polynômes irréductibles unitaires de degré (divisant) N . 1.3 1.3.1 Factorisation de polynômes à coefficients entiers Théorème de Landau-Mignotte On tente maintenant de factoriser des polynômes à coefficients dans Z, en réduisant modulo p bien choisi. On munit d’abord C[X] d’un norme : si P = a0 + . . . + ak X k , on pose : ||P || = k X !1/2 |ai |2 . i=0 Soit P (X) ∈ Z[X]. On commence par limiter les coefficients des diviseurs de P grâce au résultat suivant : Théorème 9 (Landau-Mignotte) Soient P et Q ∈ Z[X] tels que P | Q. Posons Q = 1/2 b0 + . . . + bm X m . Alors pour tout 0 ≤ i ≤ m, |bi | ≤ mi ||P ||. De plus, ||Q|| ≤ 2m ||P ||. m Lemme 10 Soit a ∈ C et considérons P (X) = n X aj X i ∈ C[X]. Alors : i=0 ||(aX − 1)P (X)|| = ||(X − a)P (X)||. Preuve. Cette formule est évidente si a = 0. Si a 6= 0, on a : (aX − 1)P (X) = −a0 + n X (aaj−1 − aj )X j + aan X n+1 j=1 et (X − a)P (X) = −aa0 + n X j=1 7 (aj−1 − aaj )X j + an X n+1 . Calculons : ||(aX − 1) P (X)||2 − ||(X − a) P (X)||2 n n X X j n+1 2 = || − a0 + || − || − aa0 − (aaj−1 − aj ) X + aan X (aj−1 − aaj ) X j − an X n+1 ||2 = |a0 |2 + = |a0 |2 + j=1 n X j=1 n X |aaj−1 − aj |2 + |aan |2 − |aa0 |2 − j=1 n X |aj−1 − aaj |2 − |an |2 j=1 (|aaj−1 |2 − aaj−1 aj − aaj−1 aj + |aj |2 ) + |aan |2 j=1 −| − aa0 |2 − n X (|aj−1 |2 − aaj−1 aj − aaj−1 aj + |aaj |2 ) − |an |2 j=1 = |a0 |2 + n−1 X |aaj |2 − j=0 2 −|aa0 | − n−1 X j=0 n X n X (aaj−1 aj + aaj−1 aj ) + j=1 j=1 2 |aj | + |aj |2 + |aan |2 n X (aaj−1 aj + aaj−1 aj ) − n X |aaj |2 − |an |2 j=1 j=1 = 0. 2 On peut maintenant démontrer le théorème 9. Preuve. Posons P = a0 + . . . + an X n . Soient d1 , . . . , ds les racines de P de module > 1, ordonnées de sorte que |d1 | ≥ . . . ≥ |ds | > 1. Soient c1 , . . . , cn−s−k les racines non nulles de P de module ≤ 1. Alors : n−s−k s Y Y P (X) = an X k (X − ci ) (X − dj ). i=1 j=1 On en déduit : ||P ||2 = |an |2 || n−s−k Y i=1 = |an |2 || s Y (X − ci ) (X − dj )||2 j=1 n−s−k Y (ci X − 1) s Y (X − dj )||2 j=1 i=1 = |an |2 |c1 . . . cn−s−k |2 || 2 2 ≥ |an | |c1 . . . cn−s−k | n−s−k Y (X − ci −1 ) s Y (X − dj )||2 i=1 j=1 −1 −1 |c1 . . . cn−s−k d1 . . . ds |2 ≥ |an |2 |d1 . . . ds |2 . Pour l’inégalité, on a utilisé le fait que ||Q|| ≥ |Q(0)|. On en déduit : |d1 . . . ds | ≤ ||P || . |an | Soient maintenant α1 , . . . , αm les racines de Q, rangées par ordre décroissant de module. Alors si j ≤ s, |αj | ≤ |dj | et si j > s, |αj | ≤ 1. Par les relations coefficients-racines, pour tout j : bj = (−1)m−j bm σm−j (α1 , . . . , αm ), 8 où σm−j est le (m − j)-ième polynôme symétrique en X1 , . . . , Xm . De manière immédiate : m |σm−j (α1 , . . . , αm )| ≤ |α1 . . . αm−j |, m−j m monômes où chaque αi apparaît au plus une fois. Donc : car σm−j est la somme de m−j m m m ||P || |bj | ≤ |bm | |α1 . . . αm−j | ≤ |bm | |d1 . . . ds | ≤ |bm | . j j j |an | De plus, bm divise an , donc |bm |an | , ce qui donne le résultat demandé. Enfin : ||Q||2 = m X |bj |2 ≤ j=0 m 2 X m j=0 j ||P ||2 . 2 On conclut avec la formule de Vandermonde qui suit. m 2 X m 2m Lemme 11 (Formule de Vandermonde) Soit n ≥ 0. Alors = . j m j=0 Preuve. En développant de deux manières différentes (1 + x)m (1 + x)m = (1 + x)2m et en considérant le coefficient de degré m : X m m 2 X m m m 2m = = . j m−j j m j=0 j=0 2 1.3.2 Première méthode On choisit un nombre premier p > 2M avec : s M= max 1≤m≤n/2 2m ||P ||. m Comme l’ensemble des nombres premiers est infini , un tel p existe. De plus, p > ||P || donc p ne divise pas le coefficient directeur de P et donc P a le même degré que P . L’idée est la suivante : si P n’est pas irréductible dans Z[X], il possède un diviseur Q non constant de degré ≤ n/2. A l’aide de l’algorithme de Berlekamp, on obtient la décomposition de P sous la forme an P1 . . . Pk , les Pi étant des éléments irréductibles unitaires non nécessairement distincts de Fp [X]. Dans ce cas, Q est de la forme bP i1 . . . P il : on peut donc déterminer Q. Comme d’après le théorème de Landau-Mignotte, les coefficients de Q sont tous entre −M/2 et M/2, on peut reconstruire Q à partir de Q. L’algorithme est donc le suivant : 1. On choisit p > 2M et on applique Berlekamp sur P ∈ Fp [X]. On obtient la décomposition P1 . . . Pk de P en irréductible. 2. Pour toute partie I = {i1 , . . . , ij } ⊆ {1, . . . , k}, pour tout 1 ≤ b ≤ p − 1, on construit bP I = bP i1 . . . P ij et Pb,I ∈ Z[X] tel que la classe de Pb,I modulo p soit bP I et les coefficients de Pb,I soient tous entre −p/2 et p/2. Ceci détermine uniquement Pb,I . Attention, Pb,I 6= bPi1 . . . Pij en général. 3. On teste si Pb,I divise P par ordre croissant du cardinal de I, en se limitant à ceux de degré ≤ n/2. Si aucun ne divise P , P est irréductible. Sinon, le premier PI trouvé est un diviseur irréductible de P (s’il n’était pas irréductible, il existerait un diviseur Pc,J de Pb,I et donc de P avec J ( I, qui aurait dû être testé avant). On applique alors l’algorithme au quotient de P par ce Pb,I . 9 Remarques. 1. Le problème se pose donc de trouver un nombre premier arbitrairement grand. Ce problème sera étudié dans le chapitre suivant. 2. Plus le nombre premier choisi est grand, plus il sera long d’effectuer Berlekamp et de calculer les Pb,I . La majoration des coefficients des diviseurs de P donnée étant grossière, cette méthode peut être assez peu efficace. 3. Si P est unitaire, ses diviseurs irréductibles le sont aussi. On peut donc se limiter aux P1,I , ce qui améliore beaucoup l’efficacité de l’algorithme. 1.3.3 Seconde méthode On fixe un nombre premier p et on décompose P dans Fp [X]. Puis on en déduit par récurrence une décomposition de P dans Z/pn Z[X] par récurrence sur n par le lemme de Hensel jusqu’à ce que pn ≥ 2M et on applique un raisonnement semblable à celui de la première méthode. Théorème 12 (Hensel) Soient P, Q, R trois polynômes unitaires et soient p un nombre premier, k ∈ N∗ tel que P = QR modulo pk , avec de plus Q et R étant premiers entre eux modulo p, avec deg(P ) = deg(Q) + deg(R). Alors il existe Q̃ et R̃ dans Z[X], unitaires, avec Q̃ ≡ Q[pk ], R̃ ≡ R[pk ] et P ≡ Q̃R̃[pk+1 ]. De plus, P̃ et Q̃ sont premiers entre eux modulo p et deg(P ) = deg(P̃ ) + deg(Q̃). Preuve. On cherche Q̃ et R̃ sous la forme Q + pk U et R + pk V , où U ∈ Z[X], de degré strictement inférieur au degré de Q, V ∈ Z[X], de degré strictement inférieur au degré de R. Ainsi, Q̃ et R̃ sont unitaires et les conditions de congruence modulo pk sont vérifiées, ainsi que les conditions sur les degrés. De plus, dans Z[X] : P − QR P − Q̃R̃ = P − QR − pk (U R + V Q) + p2k U V = pk −(U R + V Q) + pk+1 (pk−1 U V ). k p | {z } ∈Z[X] Par suite : P ≡ Q̃R̃[pk+1 ] ⇐⇒ U R + V Q ≡ P − QR [p]. pk Comme P et Q sont premiers entre eux modulo p, il existe U0 et V0 ∈ Z[X] tels que QV0 +RU0 = 1 modulo p (Bezout dans Fp [X]). En multipliant, on obtient U1 et V1 tel que QV1 + RU1 = P −QR pk modulo p. Pour respecter la condition sur le degré de U et V , on effectue la division euclidienne U1 = QS + U2 de U1 par Q (possible, car Q est unitaire). Alors deg(U2 ) < deg(Q). En posant modulo p. Comme RU2 est de degré < deg(P ) V2 = V1 + RS, on obtient QV2 + RU2 = P −QR pk et que P −QR est de degré < deg(P ), il en est de même de QV2 et donc V2 est de degré < pk dep(P ) − deg(Q) = deg(R). Enfin, comme Q̃ = Q et R̃ = R modulo pk , ces égalités restent vraies modulo p, donc Q̃ et R̃ sont premiers entre eux modulo p. 2 Remarques. 1. Cette méthode évite de devoir choisir un grand nombre premier. 2. Z/pk Z n’est pas intègre si k ≥ 2. Il ne s’agit donc pas d’un anneau factoriel. Par suite, on ne peut pas parler de "la" décomposition dans Z/pk Z[X]. 3. Cette méthode ne fonctionne (à cause des hypothèses du théorème de Hensel) que lorsque P est à facteurs simples (on peut s’y ramener par division par P ∧ P 0 ) et si P est unitaire (ce qui est gênant, Z n’étant pas un corps). 10 Chapitre 2 Cryptographie et codes correcteurs Lorsque l’on veut transmettre de l’information à un tiers, plusieurs problèmes se posent : 1. Si les données sont volumineuses, comment réduire leur taille sans (trop) de perte d’informations ? (Problème de compression de données). 2. Si l’information est secrète, comment la transmettre sans que quelqu’un interceptant le message ne puisse s’en servir ? 3. Comment "signer" le message pour que le destinataire soit sûr de l’expéditeur ? 4. Comment être sûr que la transmission n’a pas été modifiée par un intermédiaire ? 5. Si certains problèmes ont affectés la transmission, comment le savoir et comment y remédier ? La théorie de l’échange d’information répond à toutes ces questions. En pratique, l’envoi d’informations entre Bob et Alice se déroule ainsi : 1. Si les données à transmettre sont trop volumineuses, Bob peut les compresser avant de les envoyer. Voici quelques exemples de format de compression : – Pour les données générales, zip, rar, tar, 7z. – Pour les images, jpeg. – Pour les sons, mp3. – Pour les vidéos, divx, mp4. Il existe deux types de compression, avec ou sans perte. Si la compression choisie est avec perte, il faut absolument compresser le message avant de le crypter, sous peine de décryptage impossible par Alice. 2. Une fois la compression achevée, Bob en déduit une suite de caractère appelée signature du message. Cette signature est obtenue à l’aide d’un algorithme spécifique souvent appelé fonction de hachage sécurisée. Les plus connus sont MD5 et SHA-1. 3. Bob crypte son message à l’aide d’un algorithme à clé privée (très rapide et sûr), par exemple DES ou AES. 4. Bob soumet le message crypté à un algorithme de code correcteur, qui permettra à Alice de savoir si le message a été transmis correctement et le cas échéant de corriger les erreurs. Le message est maintenant prêt pour la transmission. 5. Bob et Alice s’échangent la clé privée et la signature du message grâce à un système à clé publique, par exemple RSA ou El-Gamal. Un double cryptage permet de s’assurer de l’identité de l’envoyeur et du receveur. 6. Bob envoie le message crypté à Alice. 7. Alice soumet le message reçu à l’algorithme de code correcteur, ce qui détecte les erreurs éventuelles et les corrige. 8. Elle le décrypte et vérifie la signature. Cela lui assure que personne n’a modifié le message pendant l’envoi. 11 9. Elle décompresse le message et retrouve les informations de Bob. Remarque. L’ordre des étapes est important. En particulier, compresser les données après le cryptage peut rendre le message indéchiffrable pour Alice. Dans ce cours, nous allons étudier les systèmes à clés publiques et les codes correcteurs. Les autres algorithmes utilisent d’autres mathématiques (logique pour AES, transformée de Fourier pour la compression de données) que ceux évoqués dans ce cours. 2.1 Cryptographie à clé publique On peut grossièrement classer les cryptosystèmes en deux catégories : – Les codes à clé privée : seuls l’expéditeur et l’envoyeur connaissent cette clé. Par exemple, AES et DES. Ces systèmes sont très rapides et peuvent donc être utilisés pour des gros messages. Mais il faut transmettre la clé privée entre les deux utilisateurs. – Les codes à clé publique : une partie des informations concernant la clé sont accessibles à tous. Par exemple, El-Gamal ou RSA. Il sont assez lents, mais ne sont utilisés que pour crypter des clés privées (en général, 56, 128, 256 bits) ou des signatures (en général, 160 bits, au maximum 512 bits), qui sont des messages courts. Le temps de calcul pour ce type de message est inférieur à la seconde, mais ces systèmes ne peuvent pas coder de gros messages. Ce type de code utilise des fonctions dites à sens unique, c’est-à-dire des fonctions f : E −→ F bijectives, telles que le temps de calcul de f (x) où x ∈ E est très inférieur au temps de calcul de f −1 (y) où y ∈ F , pour presque tous x ∈ E, y ∈ F . Jusqu’à l’arrivée des codes informatiques (fin des années 70), on ne connaissait que des systèmes à clé privée. Le problème n’était pas la sûreté des codes (l’arrivée de l’informatique les a rendu plus performants et complexes que jamais), mais la sécurité de la clé privée. Comment la transmettre sans risquer l’interception ? C’est de ce problème que sont nés les codes à clé publique : une partie des informations est publique et suffit pour que les personnes concernées puissent crypter ou décrypter les messages, mais personne d’autre. Remarque. L’expression "rendre publique" une donnée signifie simplement qu’elle est communiquée sans cryptage au correspondant, et donc que toute personne interceptant le message y a accès. 2.1.1 Deux exemples de codes à clé publique Le système de Diffie-Hellman (1976) est un système permettant d’échanger une clé privée pour un système de cryptage. Supposons que Bob et Alice souhaitent s’échanger une clé privée pour utiliser ensuite un système de cryptage. L’un d’eux commence par publier un grand nombre premier (1000 bits environ) et un élément primitif g de Fp , c’est-à-dire un générateur du groupe multiplicatif F∗p . Bob choisit un entier b compris entre 2 et p − 2, calcule y = g b et publie y, b restant secret. Alice choisit un entier a compris entre 2 et p − 2, calcule x = g a , publie x, a restant secret. Autrement dit : tout le monde connaît p, g, x et y. Seul Bob connaît b, seule Alice connait a. La clé privée est alors g ab = y a = xb , qui est donc calculable par Alice et Bob. Sur quoi repose la sécurité du système ? Tout le monde peut calculer a à partir de x et en déduire la clé à partir de y : il s’agit du problème de logarithme discret. Pour résoudre ce problème, on peut citer l’algorithme de Pohlig-Hellman, BSGS, Index Calculus, mais leur temps de calcul est prohibitif. C’est un exemple de fonction à sens unique : on considère la fonction : {1, . . . , p − 1} −→ F∗p f: x −→ g x . 12 C’est une bijection. Le calcul d’une valeur particulière de f , via l’exponentiation rapide, est de l’ordre de O(ln x(ln p)2 ), alors que la résolution de l’équation y = g x se fait au mieux en temps sous-exponentiel. Remarque. Ce système possède (au moins) deux faiblesses : 1. Un intercepteur peut récupérer x et y et transmettre à Alice et Bob deux autre valeurs. Dans ce cas, l’intercepteur connaît la clé privée que vont utiliser Alice et Bob. 2. Ce système ne fonctionne pas pour les clés des systèmes DES et AES, pour des problèmes de taille de clé. Le système El-Gamal (1985) est, lui, un vrai système de cryptage. Bob et Alice choisissent un grand nombre premier et un élément primitif g de Fp . Bob désire envoyer un message m crypté à Alice. Il procède ainsi : 1. Il demande à Alice de choisir un nombre a entre 2 et p − 2 qu’elle garde secret, de calculer x = g a et de rendre publique x. 2. Bob choisit lui aussi un nombre b entre 2 et p − 2, calcule y = g b , m0 = mxb , puis publie y et m0 . 3. Alice calcule y a , puis son inverse dans F∗p par l’algorithme d’Euclide et en déduit m = m0 y −a (en effet, y a = g ab = xb ). Ici aussi, la sécurité est assurée par le problème du logarithme discret (voir TD). Le problème d’interception est réglé : si le message est intercepté, Alice et Bob auront deux clés différentes et s’en rendront compte à l’envoi du premier message (Alice ne parviendra pas à décrypter le message). D’autre part, l’intercepteur n’aura pas non plus la bonne clé et ne pourra pas décrypter le message envoyé. Remarque. Ces deux systèmes nécessitent d’obtenir un grand nombre premier (on verra comment procéder avec RSA) et surtout d’obtenir un élément primitif de F∗p , ce qui n’a rien d’évident. Il est indispensable de prendre g primitif, x et y étant des éléments du sous-groupe engendré par g, il est nécessaire que ce sous-groupe soit le plus gros possible pour assurer la sécurité de système. 2.1.2 Le système RSA Dans le système El-Gamal, les informations publiées ne permettent à personne d’autre qu’Alice et Bob de crypter ou décrypter. D’autre part, c’est la même clé, à savoir g ab connue seulement d’Alice et Bob, qui effectue le cryptage et le décryptage : c’est un système à clé symétrique. Le système RSA est un système à clé disymétrique : la clé de cryptage est publique et donc tout le monde peut crypter, mais seul les personnes connaissant la clé de décryptage peuvent décrypter. Bob veut envoyer un message confidentiel à Alice, codé par le système RSA afin que personne d’autre qu’eux ne puisse le lire. 1. Alice choisit deux grand nombres premiers (environ 1000 bits, donc de l’ordre de 21000 ≈ 10301 ). Elle calcule n = pq. 2. Alice choisit un entier e premier avec (p − 1)(q − 1). Par Bezout, elle calcule d tel que de ≡ 1[(p − 1)(q − 1)]. 3. Alice a donc cinq entiers : p, q, n, e, d. Les entiers p et q servent à calculer les trois autres, ils ne servent plus maintenant et Alice peut les oublier. Alice publie n et e qui servent à crypter et garde secret d, qui sert à décrypter. On a donc : – Une clé publique, constituée de n et e, connue de tous, servant à crypter. – Une clé privée, d, servant à décrypter, connue d’Alice seule. 13 4. Bob choisit un message, c’est-à-dire un entier m compris entre 0 et n − 1. Il envoie à Alice m0 ≡ me [n]. 5. Alice calcule m ≡ m0d [n]. Vérifions qu’Alice récupère bien m. En effet, m0d = med [n]. Par définition de d, il existe k ∈ Z tel que ed = 1 − k(p − 1)(q − 1). Si m ≡ 0[p], alors med ≡ 0[p]. Sinon, par Fermat, mp−1 ≡ 1[p] et donc : med ≡ m1−k(q−1) ≡ m[p]. Dans tous les cas, m0d ≡ m[p]. De même, m0d ≡ m[q]. Par le théorème des restes chinois, m0d = m[n] et donc m0 = m car 0 ≤ m, m0 ≤ n − 1. 2.1.3 Sécurité de RSA Pourquoi ce système est-il sûr ? Le calcul de d en utilisant n et e nécessite de connaître (p − 1)(q − 1), ce qui revient à obtenir p et q, les deux facteurs premiers de n. La méthode la plus √ sûre est le crible d’Eratosthène, consistant à diviser n par tous les entiers compris entre 1 et n jusqu’à trouver le plus petit de p et q : ceci demande un temps exponentiel. D’autres méthodes plus rapides existent : p − 1 ou ρ de Pollard, crible quadratique, Elliptic Curve Method, Number Field Sieve, au mieux sous-exponentielles, donc encore très lentes. Le code peut donc être cassé, mais au prix d’une très grande puissance de calcul. Cependant, quelques failles existent et doivent être considérées dans le choix de p et q : 1. L’accroissement de la puissance des machines rend obligatoire l’augmentation exponentielle de la taille des clés. En 2000, la taille d’une clé RSA était de 952 bits, elle est passée à 2000 bits actuellement. 2. Envoyer le même message m à différentes personnes, avec des clés possédant le même n mais des e différents peut être dangereux. De même, envoyer le même message avec différentes clés, avec des n différents mais le même e (petit), est dangereux (voir TD). Pour éviter ce problème, on évite de prendre de trop petits e, souvent on prend e = 65537 = 216 + 1, rapide à utiliser avec l’exponentiation rapide. Un problème plus général avec l’utilisation des systèmes à clés publiques et l’identité du crypteur. Tout le monde pouvant crypter, comment Alice peut-elle s’assurer que le message vient bien de Bob ? Pour cela, Alice et Bob se choisissent tous deux des clés RSA : Clés publiques Clés privées Bob nb et eb db Alice na et ea da Bob veut envoyer un message m à Alice, de sorte qu’Alice soit sûre de l’identité de Bob. Bob calcule d’abord m0 = mdb [nb ] puis m00 = m0ea [na ]. Il envoie m00 à Alice. Alice est la seule à pouvoir calculer m0 = m00da [na ] car elle est la seule à connaître da . Elle calcule ensuite m = m0eb [nb ] grâce à la clé publique de Bob et elle est sûre que le message vient de Bob, car lui seul a pu calculer mdb [nb ]. 2.1.4 Recherche de nombres premiers Les trois systèmes nécessitent de trouver de grands nombres premiers. Comment procéder ? On ne connaît pas d’algorithme permettant d’assurer qu’un nombre est premier en temps polynomial. Mais on connaît des algorithmes dits probabilistes qui donnent une certaine probabilité au nombre testé d’être premier. Le plus connu est l’algorithme de Rabin-Miller, qui utilise les résultats suivants : – Si p est premier, alors pour tout n non multiple de p, np−1 ≡ 1[p] (petit théorème de Fermat). 14 – Si p est premier et impair, x2 ≡ 1[p] si, et seulement si, x ≡ ±1[p] (car Z/pZ est un corps). Soit n ∈ N∗ . Voici comment procède l’algorithme de Rabin-Miller : 1. On factorise n − 1 en 2k q, q impair. 2. On choisit 2 ≤ x ≤ n − 2 (x est appelé base). 3. On calcule x0 = xq [n]. 4. Si x0 = ±1, on ne peut pas conclure. Sinon, on pose j = 1. 5. On calcule xj = x2j−1 [n]. 6. – Si xj = 1, n n’est pas premier (contredit le deuxième point exposé ci-dessus). – Si xj = −1, on ne peut pas conclure. – Si xj = 6 ±1, on remplace j par j + 1 et on repart à l’étape 5 tant que j < k. 7. Si j atteint k + 1, alors n n’est pas premier (car alors xn−1 6= 1[n]). En termes plus algorithmiques : q ←− n − 1 k ←− 0 tant que 2 | q faire q ←− q/2 k ←− k + 1 x ←− xk [n] si x = ±1 alors on ne peut pas conclure et fin du programme j ←− 1 tant que j < k faire x ←− x2 [n] si x = 1[n] alors n n’est pas premier et fin du programme si x = −1[n] alors on ne peut pas conclure et fin du programme j ←− j + 1 n n’est pas premier Cet algorithme se termine en un temps fini (au plus k − 1 passages dans la boucle). C’est en fait un test de non primalité : la seule réponse sûre donnée par l’algorithme est lorsque n n’est pas premier. Lemme 13 Soit p un nombre premier impair. Alors U (Z/pα Z) est un groupe cyclique. Soit d ≥ 1. Le nombre d’éléments x de Z/pα Z tels que xd = 1 est d ∧ pα−1 (p − 1). Preuve. Nous allons admettre que U (Z/pα Z) est cyclique. Il est d’ordre ϕ(pα ) = pα−1 (p−1), où ϕ est l’indicatrice d’Euler. Soit y un générateur de ce groupe. Si xd = ±1, alors x ∈ U (Z/pα Z). On considère donc y l dans ce groupe, avec 1 ≤ l ≤ ϕ(pα ) = pα−1 (p − 1). On pose ϕ(pα ) = d0 (ϕ(pα ) ∧ d). y dl = 1 ⇐⇒ pα−1 (p − 1) | dl ⇐⇒ d0 | l. 2 Il y a donc ϕ(pα )/d0 = d ∧ pα−1 (p − 1) choix pour l. Lemme 14 Soit n un nombre impair non premier plus grand que 10. On écrit n − 1 = 2k m, i avec m impair. Les entiers a de l’ensemble {1, . . . , n−1} qui vérifient am ≡ 1[n] ou a2 m ≡ −1[n] pour un entier i ≤ k − 1 sont en nombre au plus égal à ϕ(n)/4. Preuve. Première étape. On pose : A = {a ∈ Z/nZ | am ≡ 1[n]}, Bj = {a ∈ Z/nZ | a2 jm ≡ −1[n]}. On cherche à majorer |Ω| = |A ∪ B1 ∪ . . . ∪ Bk−1 |. Ces ensembles sont disjoints, donc : |Ω| = |A| + |B1 | + . . . + |Bk−1 | 15 Soit n = p1α1 . . . pαr r la décomposition de n en nombres premiers. Par le théorème des restes i α chinois, am ≡ 1[n] si, et seulement si, am ≡ 1[pj j ] pour tout j et a2 m ≡ −1[n] si, et seulement i α si, a2 m ≡ −1[pj j ] pour tout j. En conséquence, en posant : (i) A(i) = {a ∈ Z/pαi i Z | am ≡ 1[pα1 i ]}, (1) Bj = {a ∈ Z/pα1 i Z | a2 jm ≡ −1[pαi i ]}, (r) on obtient |A| = |A1 | . . . |Ar |, Bj = |Bj | . . . |Bj |. D’après le lemme précédent : |Ai | = m ∧ pαi i −1 (pi − 1) = m ∧ (pi − 1) = m ∧ 2k1 mi = m ∧ mi , car pi divise n et donc ne divise pas n − 1 ni m, et m est impair. Deuxième étape. On pose ni = pαi i . Soit y un générateur du groupe cyclique U (Z/ni Z). Alors = 1. Posons z = y ϕ(ni )/2 . Alors z 2 − 1 = 0, donc pαi i divise (z − 1)(z + 1). De plus, (z − 1) ∧ (z + 1) divise (z + 1) − (z − 1) = 2, donc vaut 1 ou 2. Comme pi est un nombre premier impair, ce n’est pas un facteur commun de z − 1 et z + 1 et ni divise z + 1 ou z − 1 : z = ±1. Comme y n’est pas d’ordre ϕ(ni )/2, z = −1. En conséquence : y ϕ(ni ) (y l )2 jm = −1 ⇐⇒ ϕ(ni ) | 2j ml − ϕ(ni )/2 ⇐⇒ pαi i −1 2ki mi | 2j ml − pαi i −1 2ki −1 mi . (i) Si j ≥ ki , ceci est impossible (on aurait 2ki | 2ki −1 et donc dans ce cas Bj = ∅. Si j < ki , alors : (y l )2 jm ⇐⇒ pαi i −1 2ki −j mi | ml − pαi i −1 2ki −1−j mi . (i) Comme on se limite à 0 ≤ l < ϕ(n), il y a 2j (m ∧ mi ) valeurs possibles pour l, donc |Bj | = 2j (m ∧ mi ). En conclusion : X |Ω| = (m ∧ m1 ) . . . (m ∧ mk ) + 2jr (m1 ∧ m) . . . (mr ∧ m) j<min ki 2r min ki − 1 = (m1 ∧ m) . . . (mr ∧ m) 1 + 2r − 1 . Troisième étape.D’autre part : ϕ(n) = pα1 1 −1 . . . pαr r −1 (p1 − 1) . . . (pr − 1) = pα1 1 −1 . . . pαr r −1 2k1 +...+kr m1 . . . mr . En conséquence : |Ω| ≤ m1 . . . mr 2r(min ki −1)+1 + 1 ≤ m1 . . . mr 2r(k1 +...+kr ) 2−r+1 ≤ ϕ(n) 2r−1 pα1 1 −1 . . . pαr r −1 . Supposons d’abord r ≥ 3. Alors l’inégalité annoncée est vérifiée car 2r−1 ≥ 4. Supposons ensuite r = 1. Alors, comme m1 = m et k1 = k : |Ω| = m2k = ϕ(n)/pα1 1 −1 . Comme n n’est pas premier, α1 ≥ 1. Comme n ≥ 10, pα1 1 −1 ≥ 4 et l’inégalité annoncée est vraie. Reste le cas r = 2. Si α1 ou α2 ≥ 2, alors 2r−1 pα1 1 −1 . . . pαr r −1 ≥ 4 et l’inégalité annoncée est vraie. Reste le cas où n = p1 p2 . Alors : ! 4min(k1 ,k2 ) − 1 , ϕ(n) = 2k1 +k2 m1 m2 . |Ω| = (m ∧ m1 )(m ∧ m2 ) 1 + 3 16 Donc : |Ω| m ∧ m1 m ∧ m2 4min(k1 ,k2 ) + 2 . ≤ ϕ(n) m1 m2 3.2k1 +k2 Le seul cas problématique est m1 | m, m2 | m et k1 = k2 . Dans ce cas : n − 1 = 2k m = (2k1 m1 + 1)(2k2 m2 + 1) − 1 = 2k1 +k2 m1 m2 + 2k1 m1 + 2k2 m2 , donc m1 divise m2 et m2 divise m1 : m1 = m2 et donc p1 = p2 , ce qui est exclu. 2 Autrement dit, en choisissant un entier "au hasard" (le sens serait à préciser), si l’algorithme ne conclut pas pour une base donnée, la probabilité que n ne soit pas premier est inférieure à 1/4. De plus, les tests effectués avec des bases différentes sont supposés indépendants ( ?). Autrement dit, si un entier n passe l’algorithme de Rabin-Miller sans conclusion avec k bases différentes, la probabilité qu’il soit effectivement premier est de 1 − 1/4k : on parle d’entiers pseudo-premiers. On n’est tout de même pas entièrement sûr que cet entier soit vraiment premier, ce qui est problématique pour RSA, puisque le cryptage/décryptage repose sur le fait que p et q soient premiers. Voici quelques algorithmes rapides de recherche de grands nombres premiers. On note Lr la liste des r premiers nombres premiers. 1. Pour rechercher un grand nombre premier quelconque : – On choisit n impair, de la taille souhaitée. – On vérifie si n est divisible par un des éléments de Lr . Si c’est le cas, on remplace n par n + 2 et on recommence. – On vérifie la pseudo-primalité de n en base 2, 3, 5, 7. Si c’est le cas, n est très probablement premier. Sinon, on remplace n par n + 2 et on recommence. Il est recommandé de limiter le nombre de passages dans la boucle. Si le nombre de passages devient trop important, on recommence en changeant de n0 . 2. Pour construire un nombre premier p tel que 2p + 1 soit premier : – On choisit n0 impair. – On fait varier k à partir de 0. – On élimine les k tels que n0 + 2k et 2n0 + 4k + 1 soient divisibles par un élément de Lr . – On teste la pseudo-primalité de n0 + 2k et 2n0 + 4k + 1. Là aussi, il est conseillé de limiter la plage dans laquelle k se déplace. 3. Pour obtenir un nombre premier p tel que p − 1 ait un grand facteur premier (nombre premier n on friable) : – On cherche un nombre premier p avec le deuxième algorithme. – On fait varier k à partir de 0. – On vérifie que 2kp + 1 n’est divisible par aucun élément de Lr . – On teste la pseudo-primalité de 2kp + 1. L’intérêt est que les nombres premiers construits avec cet algorithme permettent à RSA de résister à l’attaque p − 1 de Pollard (voir TD). Les théorèmes (difficiles) de répartition des nombres premiers assurent que ces algorithmes focntionnent en un temps raisonnable. 2.2 Codes correcteurs On s’intéresse maintenant au moyen de savoir si le message transmis n’a pas été entaché d’erreurs et éventuellement de corriger ces erreurs. C’est l’objet de la théorie des codes. 17 L’idée est la suivante : le message M est découpé en blocs de k bits chacun (quitte à compléter le dernier bloc). On s’intéresse alors maintenant à la transmission d’un seul bloc m de taille k. On code ce message en un bloc m0 de taille n ≥ k (autrement dit, on ajoute de l’information). Le bloc m s’appelle le message et le bloc m0 le mot de code. On transmet le mot de code m0 . Il peut se produire une erreur, ce qui fait que le message reçu est de la forme m00 = m0 + e. Le but est de pouvoir, si l’erreur n’est pas trop importante, de récupérer m0 puis m. Il y a donc deux étapes : l’élimination de e puis le décodage de m0 en m. 2.2.1 Vocabulaire de la théorie des codes Les blocs envoyés étant formés de bits, on peut les voir comme des éléments de Fn2 (on parle de codes binaires). En travaillant en réunissant les bits en octets, on peut les voir comme des éléments de Fn28 . On trouve aussi des codes ternaires, c’est-à-dire travaillant dans Fn3 . Définition 15 Un code est une application f : Fkq −→ Fnq , injective. L’image de f est notée C (et donc f : Fkq −→ C est bijective). Le quotient k/n est appelé taux d’information du codage, le quotient (n − k)/n est appelé taux de correction du codage. Remarque. Comme f est injective, q k = |Fqk | ≤ |Fqn | = q n , donc k ≤ n. Par suite, le taux d’information et le taux de correction sont ≤ 1. Proposition 16 On définit une application : n Fq −→ N x −→ |x| = le nombre de composantes non nulles de x. Elle vérifie les propriétés suivantes : pour tous x, y ∈ Fnq , 1. |x| = 0 si, et seulement si, x = 0. 2. |x + y| ≤ |x| + |y|. 3. |λx| = |x| pour tout élément λ ∈ Fq − {0}. En conséquence, l’application suivante est une distance sur Fnq : ω: Fnq × Fnq −→ N (x, y) −→ |x − y|. Elle est appelée distance de Hamming. 2 Preuve. Immédiat. Remarques. 1. Autrement dit, ω(x, y) est le nombre de composantes qui diffèrent entre x et y. 2. Si m0 est le message transmis et m00 le message reçu, alors ω(m0 , m00 ) est donc le nombre d’erreurs de transmission. Proposition 17 Soit f : Fkq −→ C ⊆ Fnq un code. Soit m00 ∈ Fnq . Alors m00 ∈ C si, et seulement si, ω(m00 , C) = min ω(m00 , x) = 0. x∈C Preuve. Comme Fnq est fini, il en est de même pour C, et donc le minimum définissant d(m00 , C) est atteint. Le résultat est alors évident. 2 Remarque. Cette proposition donne donc un moyen de savoir si le message transmis m00 est entaché d’erreur, à condition qu’il n’y ait pas trop d’erreurs. 18 Définition 18 1. Soit t ∈ N. On dit que le code f : Fkq −→ C ⊆ Fnq est t-correcteur si les boules fermées de centre un élément de C et de rayon t sont deux-à-deux disjointes. 2. La distance minimale du code est la plus petite distance entre deux éléments distincts de C. Remarques. 1. Si le code est t-correcteur, alors il peut détecter au plus t erreurs : si le message reçu m00 = m0 + e est entaché d’au plus t erreurs, il est dans la boule fermée de centre m0 et de rayon t. Comme les boules de centre un élément de C et de rayon t sont disjointes, ceci détermine parfaitement m0 . Il suffit donc de remplacer m00 par le centre de l’unique boule fermée de centre un élément de C et de rayon t dans laquelle il se trouve. 2. Si le code est t correcteur, sa distance minimale est ≥ 2t + 1. 3. Réciproquement, si la distance minimale du code est d, alors le code est E d−1 2 -correcteur. On a vu comment corriger un message entaché d’au plus t erreurs lorsque le code est tcorrecteur. Lorsque le nombre d’erreurs est trop important, il se peut que le message reçu m00 ne se trouve dans aucune boule fermée de centre un élément de C et de rayon t : on ne peut pas le corriger. Ceci ne se produit jamais dans le cas suivant : Définition 19 On dit que le code t-correcteur est parfait si l’ensemble des boules fermées de centre un élément de C et de rayon t forme une partition de Fnq . Remarque. En général, on suppose que le nombre d’erreurs se produisant sur l’envoi d’un message de longueur n suit une loi binomiale B(n, p), avec 0 < p < 1. Autrement dit, la pro n k babilité que k erreurs surviennent est k p (1 − p)n−k . Plus le matériel est performant, plus le nombre p est petit ; il est en général fourni par le constructeur. Le choix de t dépend de cette probabilité p. 2.2.2 Codes linéaires On cherche à construire maintenant des codes. On se limite aux codes linéaires, c’est-à-dire lorsque f est Fq -linéaire (et alors C est un sous-espace de dimension k de Fnq ). Dans ce cas, la construction de la bijection réciproque f −1 : C −→ Fkp permettant de retrouver le message m à partir du message transmis et corrigé m0 est facile : il s’agit essentiellement d’inverser une matrice k × k. On parle de codes de type (n, k, d), où d est la distance minimale de C. Définition 20 Soit un code de type (n, k, d), d’application linéaire f . Pour tout i, on note i = f (ei ) ∈ C, où ei est le i-ième vecteur de la base canonique de Fkq . La matrice génératrice du code est G = (1 , . . . , k ). Autrement dit, il s’agit de la matrice de f dans les bases canoniques de Fkq et Fnq . Remarque. La matrice génératrice permet de déterminer entièrement le code. Elle permet en outre de déterminer m en fonction de m0 , par résolution du système Gm0 = m (par exemple à l’aide de la méthode du pivot de Gauss). Comment détecter les erreurs ? Définition 21 Soit C un code linéaire de type (n, k, d). Une matrice H ∈ Mn−k,n (Fq ) est une matrice de parité du code si pour tout m ∈ Fq , m ∈ C si, et seulement si, H t m = 0. Pour tout m ∈ Fnq , s(m) = H t m est appelé syndrôme de m. 19 Remarque. La matrice de parité n’est pas unique. Elle détermine C, mais pas f , donc ne détermine pas entièrement le code, à la différence de la matrice génératrice du code. Comment construire une matrice de parité ? Il s’agit simplement de décrire C, donné par une base (les éléments εi ), par un système d’équations. Voici une méthode utilisant les formes quadratiques. On munit Fnq de la forme bilinéaire symétrique non dégénérée : 0 hm, m i = n X mi m0i . j=1 Elle est symétrique et non dégénérée (sa matrice dans la base canonique de Fnq est la matrice identité). Alors C ⊥ est donné par le système d’équations hm, εi i = 0 pour tout 1 ≤ i ≤ k. On détermine une base (f1 , . . . , fn−k ) de C ⊥ à l’aide de ces équations. Les lignes d’une matrice de parité H du code sont alors les vecteurs lignes f1 , . . . , fn−k . En effet, H t m = 0 si, et seulement si, m ∈ C ⊥⊥ = C. Pour finir, comment corriger les erreurs pour un code linéaire de type (n, k, d) ? Soit m00 le message reçu et soit s(m00 ) son syndrôme. Deux cas se présentent : 1. Soit s(m00 ) = 0 et on considère dans ce cas qu’il n’y a eu aucune erreur de transmission. 2. Soit s(m00 ) 6= 0. Donc m00 ∈ / C. L’erreur vérifie alors s(e) = s(m00 ) (car m00 = m0 + e, 0 s(m ) = 0 et s est linéaire) et de plus si il y a vraiment eu moins de d−1 2 erreurs de d−1 transmission, |e| ≤ 2 . On résoud alors : s(e) = s(m00 ), |e| ≤ d−1 , 2 qui possède au plus une solution car la distance minimale du code est d. On en déduit e puis m0 = m00 − e. Voir l’exemple du code de Hamming pour voir un exemple de résolution. On en déduit enfin m à l’aide de la matrice génératrice du code. 2.2.3 Code cycliques On n’a toujours pas créé de code. Pour y arriver, on va munir Fnq d’une structure supplémentaire Fq -algèbre. Pour cela, on constate que Fq [X]/hX n − 1i est une Fq -algèbre de dimension n, n−1 ). On l’identifie à Fnq de la manière suivante : de base (1, . . . , X ( ψ: Fnq −→ Fq [X]/hX n − 1i n−1 (a0 , . . . , an−1 ) −→ a0 + . . . + an−1 X . Par transport de structure, Fnq devient une Fq -algèbre. On va s’intéresser aux codes tels que C soit un idéal de Fnq , autrement dit aux codes tels que ψ(C) soit un idéal de Fq [X]/hX n − 1i. Définition 22 Soit f un code linéaire de type (n, k, d). On dira qu’il est cyclique si pour tout m = (m0 , . . . , mn−1 ) ∈ C, σ.m = (mn−1 , m0 , . . . , mn−2 ) ∈ C. Il est facile de voir que ψ(σ.m) = Xψ(m). Il est facile d’en déduire que ψ(C) est un idéal de Fq [X]/hX n − 1i si, et seulement si, le code est cyclique (voir TD). Comment construire un code cyclique ? 20 Théorème 23 Soient deux entiers k et n vérifiant 0 ≤ k ≤ n. Soit P (X) = a0 + . . . + an−k−1 X n−k−1 + X n−k un diviseur unitaire de X n − 1 dans Fq [X] de degré n − k. On considère les k éléments suivants de Fnq : m = (a0 , . . . , an−k , 0, . . . , 0), σ.m = (0, a0 , . . . , an−k , 0, . . . , 0), .. . σ k−1 .m = (0, . . . , 0, a0 , . . . , an−k ). Ces éléments forment une base du sous-espace C attaché à un code cyclique. Réciproquement, si on a un code cyclique, il existe un unique polynôme unitaire P divisant X n − 1, tel que la construction précédente fournisse une base du sous-espace C attaché à ce code. Ce polynôme P est appelé polynôme générateur du code cyclique. Preuve. Comme an−k = 1, la famille (m, . . . , σ k−1 .m) est échelonnée, donc est libre. Le sous-espace engendré C est donc de dimension k. Montrons d’abord que σ k .m ∈ C. Posons X n − 1 = P (X)Q(X), Q(X) unitaire de degré k : posons Q(X) = b0 + . . . + bk−1 X k−1 + X k . Via la bijection ψ : k ψ(σ k .m) = X ψ(m) k = X P (X) k = (X − Q(X))P (X) + Q(X)P (X) k = (X − Q(X))P (X) = b0 P (X) + . . . + bk−1 X k−1 = b0 ψ(m) + . . . + bk−1 ψ(σ P (X) k−1 .m). Comme ψ est bijective, σ k .m = b0 m+. . .+bk−1 σ k−1 .m ∈ C. Par une récurrence simple, σ l .m ∈ C pour tout l ≥ 0. En conséquence, si x ∈ C, σ l .x ∈ C pour tout l ≥ 1. Donc le code est cyclique. Réciproquement, soit C (l’espace associé à) un code cyclique de dimension k. Alors ψ(C) est un idéal de Fq [X]/hX n − 1i, donc il existe un unique polynôme P (X) unitaire divisant X n − 1, tel que ψ(C) = hP (X)i (idéaux d’un quotient d’un anneau principal). De plus, par le deuxième théorème d’isomorphisme : Fq [X] hX n −1i hP (X)i ≈ Fq [X] , hP (X)i et cet espace est de dimension deg(P ). L’espace quotientant étant ψ(C), il est dimension k, donc k−1 n−k = deg(P ), donc P est de degré n−k. De plus, une base de ψ(C) est (P (X), . . . , X P (X)) : ces éléments sont dans ψ(C) qui est un idéal, sont linéairement indépendants car échelonnés en degré, et la dimension de ψ(C) est k. Via la bijection ψ, (m, . . . , σ k−1 .m) est une base de C. Donc C est bien le code associé à P dans le théorème. 2 Remarque. Pour obtenir tous les codes cycliques de type (n, k, d) avec n et k fixés, il suffit donc de trouver tous les diviseurs unitaires de X n − 1 de degré n − k. Cela de déduit de la factorisation de X n −1 en polynômes irréductibles obtenue à l’aide de l’algorithme de Berlekamp. 2.2.4 Un exemple : le code de Hamming Ce code est de type (7, 4, 3). Il code donc des mots de longueur 4 par des mots de longueur 7 et il est 1-correcteur. C’est le code binaire engendré par X 3 + X + 1. En effet, X 7 − 1 = 21 (X 3 + X + 1)(X 4 + X 2 + X + 1) dans F2 [X]. 1 1 0 G= 1 0 0 0 Sa matrice génératrice est : 0 0 0 1 0 0 1 1 0 0 1 1 . 1 0 1 0 1 0 0 0 1 Pour coder un message a = (a0 , a1 , a2 , a3 ), on calcule Gt a =t (a0 , a0 +a1 , a1 +a2 , a0 +a2 +a3 , a1 + a3 , a2 , a3 ). Par exemple, (1001) est codé par (1100101). Le décodage du mot (b0 , b1 , b2 , b3 , b4 , b5 , b6 ) est donné par exemple par (b0 , b0 + b1 , b5 , b6 ). Ce n’est pas la seule possibilité : on peut prendre aussi (b0 , b2 + b5 , b5 , b6 ). Soit d la distance minimale de C. Comme C est un sous-espace vectoriel de Fnq : d= min m0 6=m00 ∈C |m0 − m00 | = min m0 ∈C−{0} |m0 |. Comme C est un F2 -espace de dimension 4, il contient 24 = 16 éléments, qui sont les sommes de vecteurs colonnes de G (car le corps de base est F2 ). En calculant les 15 éléments non nuls de C, on obtient : d = min(3, 4, 7) = 3. Par suite, ce code est 1-correcteur. Chacune des boules fermées de rayon 1 contient 1 + 7 = 8 éléments. Par suite, l’union disjointe des 16 boules de rayon 1 centrée en un élément de C contient 16 × 8 = 27 élements. Par suite, cette union est égale à F72 : le code de Hamming est 1-correcteur parfait. Enfin, cherchons une matrice de x1 + x2 + x4 x2 + x3 + x5 x + x4 + x6 3 x4 + x5 + x7 parité du code de Hamming. On est amené à résoudre : = 0, x1 = x5 + x6 , = 0, x2 = x6 + x7 , ⇐⇒ = 0, x = x5 + x6 + x7 , 3 = 0 x4 = x5 + x7 . Une base de l’orthogonal de C est donc 1 0 1 1 1 0 0 donnée par : 1 1 1 , 0 , 0 1 0 On prend donc comme matrice de parité 1 1 H= 0 0 1 1 1 0 0 1 . : 0 1 1 1 0 0 1 1 0 0 1 0 . 1 1 1 0 0 1 Quand on reçoit un message m00 (en ligne), on calcule H t m00 . Si le résultat est nul, on pose m0 = m00 . Sinon, ce vecteur est l’une (et l’une seule des colonnes) de H, mettons le j-ième. Alors H t m00 = Hej , si ej est le j-ième vecteur de la base canonique de Fnq . Comme |ej | = 1 ≤ d−1 2 , il s’agit donc de l’erreur de transmission. Le message corrigé est alors m0 = m00 − ej = m00 + ej . Voici donc en résumé le maniement du code de Hamming. 22 1. Bob prend m ∈ F42 et calcule m0 = Gt m. Il envoie m0 . 2. Alice reçoit m00 . Elle calcule H t m00 . Si c’est nul, elle pose m0 = m00 . Sinon, soit j le numéro de la colonne de H donnant H t m00 . Alice pose m0 = m + ej . 3. Alice résoud Gm0 = m et trouve m. Si il n’y pas eu plus d’une erreur de transmission, alors Alice a récupéré le message m de Bob. 23 Chapitre 3 Elimination Notations. Dans tout ce chapitre, k et K sont deux corps commutatifs de caractéristique différente de 2. 3.1 3.1.1 Résultants à une indéterminée Définition et propriété principale Définition 24 Soient P et Q deux polynômes non nuls dans K[T ]. On pose : P = a0 + a1 T + . . . + ap T p , ap 6= 0, q bq 6= 0. Q = b0 + b1 T + . . . + bq T , Le résultant de P et Q est le déterminant de taille a0 . . .. . . . . a0 . . .. R(P, Q) = .. . .. a . p . . . . .. a p p + q suivant : b0 .. . .. . .. . .. bq .. . . b0 .. . .. .. . . bq . (Il y a q colonnes de ai et p colonnes de bj ). Théorème 25 Soient P et Q deux polynômes non nuls, de degrés respectifs p et q. Les conditions suivantes sont équivalentes : 1. P et Q ont une racine commune (dans "la" clôture algébrique de K). 2. P ∧ Q 6= 1. 3. Il existe A ∈ K[T ], de degré < q, non nul, et B ∈ K[T ], de degré < p, non nul, tel que AP + BQ = 0. 4. La famille (P, T P, . . . , T q−1 P, Q, T Q, . . . , T p−1 Q) du K-espace vectoriel K[T ] est liée. 5. R(P, Q) = 0. Preuve.1 =⇒ 2. Si α est une racine commune de P et Q, alors IrrK (α, T ) divise P et Q, et donc divise leur PGCD qui n’est en conséquence pas constant. 2 =⇒ 1. Comme R = P ∧ Q n’est pas constant, il possède une racine α dans K, qui est donc une racine commune à P et Q. 24 2 =⇒ 3. Posons A = Q/P ∧ Q et B = −P/P ∧ Q. Alors A et B sont non nuls, de degrés respectifs < q et < p. De plus, AP + BQ = P Q/P ∧ Q − P Q/P ∧ Q = 0. 3 =⇒ 2. Par contraposée. Si P ∧ Q = 1, soient A, B ∈ K[T ] tels que AP + BQ = 0. Alors P divise BQ. Par le lemme de Gauss, P divise B, donc B est nul ou de degré ≥ p. De même, A est nul ou de degré ≥ q. Donc 3 n’est pas vérifiée si 2 n’est pas vérifiée. 3 =⇒ 4. Posons A = λ0 + . . . + λq1 T q−1 et B = µ0 + . . . + µp−1 T p−1 . Les coefficients λi et les coefficients µj ne sont pas tous nuls. De plus : AP + BQ = λ0 P + . . . + λQ−1 T q−1 P + µ0 Q + . . . + µp−1 T p−1 Q = 0, donc la famille (P, T P, . . . , T q−1 P, Q, T Q, . . . , T p−1 Q) est liée. 4 =⇒ 3. Alors il existe des coefficients λi , µj , non tous nuls, tels que : λ0 P + . . . + λQ−1 T q−1 P + µ0 Q + . . . + µp−1 T p−1 Q = 0. Posons A = λ0 + . . . + λq1 T q−1 et B = µ0 + . . . + µp−1 T p−1 . Alors AP + BQ = 0 et A ou B est non nul. De plus, AP = −BQ. Si B est nul, alors comme K[T ] est intègre et P non nul, A = 0 : impossible, A ou B est non nul. Donc B est non nul. De même, A est non nul. 4 ⇐⇒ 5. Remarquons que (P, T P, . . . , T q−1 P, Q, T Q, . . . , T p−1 Q) est une famille d’éléments de Kp+q−1 [T ]. Cet espace est de dimension finie p + q, et une base est donnée par la famille (1, T, . . . , T p+q−1 ). Le déterminant donnant R(P, Q) est le déterminant de la famille considérée dans cette base. Elle est donc liée si, et seulement si, R(P, Q) = 0. 2 Remarque. L’assertion car(K) 6= 2 est nécessaire pour pouvoir utiliser le déterminant. 3.1.2 Résultant et relations coefficients-racines Lemme 26 Soient P, Q ∈ K[T ] et a, b ∈ K, tous non nuls. Alors : R(aP, bQ) = adeg(Q) bdeg(P ) R(P, Q). Preuve. Il suffit d’utiliser la multilinéarité du déterminant par rapport aux colonnes : a se met en facteur sur les q premières colonnes et b sur les p autres colonnes. 2 Proposition 27 On se place sur le corps K = k(X1 , . . . , Xp , Y1 , . . . , Yq ). Soient les polynômes P = (T − X1 ) . . . (T − Xp ) et Q = (T − Y1 ) . . . (T − Yq ). Alors : R(P, Q) = p Y q Y (Yj − Xi ). i=1 j=1 (j) Preuve.On note Σi est la i-ième fonction symétrique élémentaire en j indéterminées, avec (j) (p) la convention Σ0 = 1. Alors ai = (−1)p−i Σp−i (X1 , . . . , Xp ) pour tout i et, de même, bj = (q) (−1)q−j Σq−j (Y1 , . . . , Yq ) pour tout j. En notant mi,j les coefficients de la matrice donnant le résultant : p+q X Y R(P, Q) = ε(σ) mi,σ(i) . σ∈Sp+q i=1 Il est clair que R(P, Q) ∈ k[X1 , . . . , Xp , Y1 , . . . , Yq ]. On travaille dans K[Y1 , . . . , Yq ][X1 , . . . , Xp ]. Si i ≤ q, le degré partiel en X de mi,σ(i) est ≤ p, avec égalité si, et seulement si, σ(i) = i. Si q + 1 ≤ j ≤ p + q, le degré partiel en X de mj,σ(j) est 0. Donc les termes de cette somme sont 25 tous de degré partiel en X inférieur à pq. Les termes de degré partiel en X égal à pq sont ceux pour lesquels σ(i) = i si i ≤ p, donc leur somme donne : bq ∗ q .. aq0 = a0 1 = (−1)pq (X1 . . . Xp )q . . 0 bq Donc R(P, Q) est de degré partiel en X égal à pq et le coefficient du monôme X1q . . . Xpq dans ce polynôme est (−1)pq . On évalue Xi en Yj . Alors P (X1 , . . . , Yj , . . . , Xp , T ) et Q(Y1 , . . . , Yq , T ) ont une racine commune en T : Yj . Donc R(P, Q) évalué en Xi = Yj est nul. Comme Xi − Yj est unitaire dans K[X1 , . . . , Xi−1 , Xi+1 , . . . , Xp , Y1 , . . . , Yq ], par division pseudo-euclidienne : R(P, Q) = (Xi − Yj )R + S, avec degXi (S) ≤ 0. En évaluant en Xi = Yj , on obtient 0 = 0 + S, donc S = 0 et Xi − Yj divise R(P, Q) dans K[X1 , . . . , Xp , Y1 , . . . , Yq ]. Pour tout i, j, Xi − Yj est degré total 1, donc est irréductible. Les Xi − Yj sont deux-à-deux non associés, donc le PPCM des Xi − Yj est leur produit (l’anneau K[X1 , . . . , Xp , Y1 , . . . , Yq ] étant factoriel). On obtient donc : p Y q Y (Xi − Yj ) | R(P, Q). i=1 j=1 On note R le quotient. Alors degX (R) + pq = pq d’après les remarques précédentes, donc R ∈ K[Y1 , . . . , Yq ]. En considérant le coefficient de X1q . . . Xpq , on obtient R = (−1)pq . Par suite : pq R(P, Q) = (−1) p Y q Y (Xi − Yj ) = i=1 j=1 p Y q Y (Yj − Xi ), i=1 j=1 2 ce qui termine la preuve. Corollaire 28 Soient P et Q deux polynômes de k[T ], non nuls. On pose : 1. deg(P ) = p, a le coefficient dominant de P , α1 , . . . , αp les racines de P dans K (non nécessairement distinctes). 2. deg(Q) = q, b le coefficient dominant de Q, β1 , . . . , βq les racines de Q dans K (non nécessairement distinctes). Alors : p Y q q p Y Y Y q p p pq q (βj − αi ) = b P (βj ) = (−1) a Q(αi ). R(P, Q) = a b i=1 j=1 j=1 i=1 Preuve. On pose P̃ = P/a et Q̃ = Q/b. En évaluant (X − X1 ) . . . (X − Xp ) en X1 = α1 , . . . , Xp = αp , par les relations coefficients-racines on obtient P̃ . De même, en évaluant (Y − Y1 ) . . . (Y − Yp ) en Y1 = β1 , . . . , Yq = βq , on obtient Q̃. Par suite, en évaluant dans la proposition 27 : p Y q Y R(P̃ , Q̃) = (βj − αi ). i=1 j=1 Par le lemme 26 , R(P, Q) = aq bp R(P̃ , Q̃), ce qui donne la première formule. D’autre part, P = a(T − α1 ) . . . (T − αp ) et (−1)q Q = b(β1 − T ) . . . (βq − T ), ce qui implique facilement les deux autres formules. 2 Corollaire 29 Soient P, Q, P1 , Q1 , P2 , Q2 ∈ k[T ]. Alors : 1. R(P, Q) = (−1)deg(P )deg(Q) R(Q, P ). 2. R(P1 P2 , Q) = R(P1 , Q)R(P2 , Q) et R(P, Q1 Q2 ) = R(P, Q1 )R(P, Q2 ). 2 Preuve. En exercice. 26 3.1.3 Applications à l’arithmétique Définition 30 (Polynôme résultant) On se place sur l’anneau A = Z[X0 , . . . , Xp , Y0 , . . . , Yq ]. Le polynôme résultant Rp,q est le résutant des polynômes P = X0 + X1 T + . . . + Xp T p et Q = Y0 + Y1 T + . . . + Yq T q de A[T ]. Il s’agit d’un élément de A. Remarque. Autrement dit, on traite les coefficients de P et Q comme des indéterminées. Théorème 31 Avec les mêmes notations, il existe U, V ∈ A[T ], tels que deg(U ) < p et deg(V ) < q et : UP + VQ = Rp,q . Preuve. On a immédiatement : X0 . P .. . .. . . q−1 . T P t . = .. Q X .. p . p−1 T Q .. . Y0 .. . .. . X0 .. . Yq .. . . .. . .. Xp .. . .. .. . . Y0 .. . .. .. . . Yq 1 T .. . p+q−1 T . Soit C le vecteur colonne apparaissant à gauche, C1 , . . . , Cm+n les vecteurs colonnes de la matrice, de sorte que : C = C1 + T C2 + . . . + T p+q−1 Cp+q . Comme le déterminant est multilinéaire et alterné : det(C, C2 , . . . , Cp+q ) = det(C1 , . . . , Cp+q ) = Rp,q . Le déterminant apparaissant dans le premier membre P ∗ ... . .. .. . q−1 . T P .. .. Q . .. .. . . p−1 T Q ∗ ... est de la forme : ∗ .. . .. . .. , . .. . ∗ où les ∗ sont des éléments de A. En développant par rapport à la dernière colonne, on obtient l’égalité annoncée, avec la condition sur les degrés. 2 Corollaire 32 Soient P, Q ∈ Z[T ]. Il existe U, V ∈ Z[T ], tels que deg(U ) < deg(Q) et deg(V ) < deg(P ) et : P U + QV = R(P, Q). Preuve. Soient a0 , . . . , ap les coefficients de P et b0 , . . . , bq les coefficients de Q. Soit φ : A[T ] −→ Z[T ], envoyant T sur T , Xi sur ai pour tout i et Yj sur bj pour tout j. Alors φ(P) = P , φ(Q) = Q et φ(Rp,q ) = R(P, Q). On obtient alors le résultat en posant U = φ(U) et V = φ(V). 2 27 3.2 Elimination On veut maintenant résoudre des systèmes d’équations polynomiales : P1 (x1 , . . . , xn ) = 0, .. . Pm (x1 , . . . , xn ) = 0. 3.2.1 Résultants de deux polynômes à n indéterminées Définition 33 Soient P, Q ∈ k[X1 , . . . , Xn ], non nuls. On peut les considérer comme des polynômes de K(X1 , . . . , Xi−1 , Xi+1 , . . . , Xn )[Xi ]. Leur résultant sur ce corps de base est noté RXi (P, Q). Remarque. En formant le déterminant donnant ce résultant, on constate que ses coefficients sont des éléments de K[X1 , . . . , Xi−1 , Xi+1 , . . . , Xn ]. Donc RXi (P, Q) est un élément de K[X1 , . . . , Xi−1 , Xi+1 , . . . , Xn ] : on dit qu’on a éliminé Xi entre P et Q. Proposition 34 Soient P, Q ∈ K[X1 , . . . , Xn ] deux polynômes non constants. Si (x1 , . . . , xn ) ∈ K est un zéro commun de P et Q, alors (x1 , . . . , xi−1 , xi+1 , . . . , xn ) est un zéro de RXi (P, Q). n Preuve. Pour simplifier l’écriture de la preuve, on va choisir i = n (ce qui est sans importance). On pose alors P = A0 + . . . + Ap Xnp , Q = B0 + . . . + BQ Xnq , avec A0 , . . . , Ap , B0 , . . . , Bq ∈ K[X1 , . . . , Xn−1 ], Ap , Bq 6= 0. Alors : A0 B0 . .. . . . .. . . . . . . .. . . B0 .. . . . .. B RXn (P, Q) = .. B0 . q .. .. .. A . . . p .. .. .. .. . . . . Ap Bq On évalue en X1 = x1 , . . . , Xn−1 = xn−1 . Les polynômes P (x1 , . . . , xn−1 , T ) et Q(x1 , . . . , xn−1 , T ) ont une racine commune, xn , donc leur résultant est nul. Cependant, ce résultant n’est pas donné par RXn (P, Q) évalué en X1 = x1 , . . . , Xn−1 = xn−1 car le degré de P ou Q peut chuter lorsqu’on les évalue. Premier cas. Si P (x1 , . . . , xn−1 , T ) = 0, alors A0 (x1 , . . . , xn−1 ) = . . . = Ap (x1 , . . . , xn−1 ) = 0. En évaluant RXn (P, Q), les q premières colonnes deviennent nulles, et on obtient bien 0. Deuxième cas. Si Q(x1 , . . . , xn−1 , T ) = 0, de même, après évalutation les p dernières colonnes RXn (P, Q) deviennent nulles et on obtient bien 0. Troisième cas. Si P (x1 , . . . , xn−1 , T ) 6= 0, et Q(x1 , . . . , xn−1 , T ) 6= 0, soit p0 le degré de P (x1 , . . . , xn−1 , T ). Alors p0 ≤ p et Ap (x1 , . . . , xn−1 ) = . . . = Ap0 +1 (x1 , . . . , xn−1 ) = 0. On évalue RXn (P, Q) en X1 = x1 , . . . , Xn−1 = xn−1 . Si p0 < p, on constate que seul le coefficient Bq (x1 , . . . , xn−1 ) est éventuellement non nul sur la dernière ligne. On développe par rapport à cette dernière ligne et on itère le procédé jusqu’à éliminer toutes les lignes contenant des coefficient Aj (x1 , . . . , xn−1 ) avec j > p0 . On traite de même les coefficients de Q qui s’annulent et on obtient que : RXn (P, Q)|X1 =x1 ,...,Xn−1 =xn−1 = ±produit de Ai (x1 , . . . xn−1 ) et de Bj (x1 , . . . , xn−1 ) R(P (x1 , . . . , xn−1 , T ), Q(x1 , . . . , xn−1 , T )). 28 Le résultant du membre de droite est nul car P (x1 , . . . , xn−1 , T ) et Q(x1 , . . . , xn−1 , T ) ont une racine commune. 2 Remarque. On a donc une méthode pour résoudre un système polynomial (S). 1. En procédant à différentes éliminations, on obtient un polynôme P ∈ K[T ] tel que si (x1 , . . . , xn ) est une solution de (S), alors x1 est racine de P . 2. On en déduit ( ?) les valeurs possibles de x1 , puis en remontant les calculs, par substitution, les valeurs possibles pour x2 , . . . , xn . 3. On obtient un nombre fini de valeurs possibles pour (x1 , . . . , xn ). Comme on ne peut pas travailler par équivalence, il reste à vérifier parmi ces valeurs lesquelles sont vraiment des solutions. 3.2.2 Théorème de Bézout Théorème 35 (Bézout) Soit P, Q ∈ K[X, Y ], non nuls, de degrés respectifs p et q, tels que P ∧ Q = 1. Le nombre de zéros communs de P et Q est fini (et inférieur à ≤ (pq)2 ). Preuve. On pose : P (X, Y ) = A0 + . . . + Ap X p , Q(X, Y ) = B0 + . . . + Bq X q , où A0 , . . . , Ap , B0 , . . . , Bq ∈ K[Y ]. Comme le degré de P vaut p, le degré de Ai est inférieur à p−i pour tout i. De même, le degré de Bj est inférieur à q − j pour tout j. Considérons RX (P, Q) : RX (P, Q) = A0 .. . .. . .. . Ap .. B0 .. . .. . . B0 .. . Bq .. . .. .. . . Ap .. . .. .. . . B0 .. . .. .. . . Bq . On note mi,j les coefficients de ce déterminant. Alors : deg(mi,j ) ≤ p − i + j si 1 ≤ j ≤ q, deg(mi,j ) ≤ q − i + j − q = j − i si q + 1 ≤ j ≤ p + q. D’autre part : X RX (P, Q) = ε(σ) p+q Y mσ(j),j . i=1 σ∈Sp+q Le degré de p+q Y mi,σ(i) est donc inférieur à : i=1 q X j=1 (p − σ(j) + j) + p+q X (j − σ(j)) = j=q+1 p+q X j− j=1 p+q X j=1 Donc RX (P, Q) ∈ K[Y ], de degré ≤ pq. 29 σ(j) + pq = p+q X j=1 j− p+q X j 0 =1 j 0 + pq = pq. Supposons RX (P, Q) = 0. Alors le PGCD de P et Q dans K(Y )[X] est non constant : il existe R ∈ K(Y )[X], irréductible, divisant P et Q dans K(Y )[X]. Posons par exemple P = RS, avec S ∈ K(X)[Y ]. En réduisant au même dénominateur les coefficients de R et de S puis en factorisant les contenus, on peut écrire R2 (Y )S2 (Y )P (X, Y ) = R1 (X)R̃(X, Y )S1 (X)S̃(X, Y ) dans K[X, Y ], avec R̃ et S̃ primitifs. De plus, R̃ est associé à R dans K(Y )[X], donc est irréductible dans K(Y )[X]. En conséquence, R̃ est irréductible dans K[X, Y ]. Par le lemme de Gauss, R̃ divise R2 , S2 ou P . Si il divise R2 ou S2 , alors il est dans K[Y ], donc R est constant dans K(Y )[X] : absurde, il est irréductible. Donc R̃ divise P dans K[X, Y ]. De même, R̃ divise Q dans K[X, Y ], donc P ∧ Q 6= 1 : contredit l’hypothèse. Donc RX (P, Q) 6= 0. Nous avons démontré que RX (P, Q) est un élément non nul de K[Y ], de degré ≤ pq. Soient y1 , . . . , yk ses racines, avec k ≤ pq. De même, on démontre que RY (P, Q) est non nul, de degré ≤ pq. Soient x1 , . . . , xl ses racines, avec k ≤ pq. Si (x, y) est un zéro commun de P et Q, alors x est l’un des xi et y est l’un des yj , dont le nombre de zéro commun de P et Q est inférieur à (pq)2 . 2 Remarque. En fait, on peut montrer que le nombre de zéros communs à P et Q est inférieur à pq. En voici une preuve pour le cas où P est de degré 1. Proposition 36 On suppose K infini. Soit P, Q ∈ K[X, Y ], non nuls, de degrés respectifs 1 et q, tels que P ∧ Q = 1. Le nombre de zéros communs de P et Q est ≤ q. Preuve. On sait déjà que le nombre de zéros communs de P et Q est fini. Comme P est de degré 1, les zéros de P forment une droite. Il existe donc (a, b) ∈ K 2 − {(0, 0)}, (a0 , b0 ) ∈ K 2 tel que l’ensemble des zéros de P soit : Z(P ) = {(a0 + at, b0 + bt) | t ∈ K}. Alors, pour tout (x, y) ∈ K 2 : (x, y) zéro commun de P et Q ⇐⇒ ∃t ∈ K, (x, y) = (a0 + at, b0 + bt) et Q(x, y) = 0 ⇐⇒ ∃t ∈ K, (x, y) = (a0 + at, b0 + bt) et Q(a0 + at, b0 + bt) = 0. Cette dernière équation polynomiale en t ne peut posséder qu’un nombre fini de racines (car le nombre de zéros communs à P et Q est fini) et est de degré ≤ q. Donc Q(a0 +aT, b0 +bT ) est non nul, donc possède un nombre k ≤ deg(Q) ≤ q racines. Par suite, le nombre de zéros communs à P et Q est inférieur à q. 2 30