Introduction aux codes correcteurs d’erreurs
___________
1. Introduction.
2. Principes généraux des codes linéaires.
3. Exemples.
4. Codes de Hamming.
5. Codes cycliques.
à Patrice Laidet et ses camarades Pierre-Jean Hormière ___________
1. Introduction.
Cette note est une simple introduction pédagogique. Quelques exemples font bien comprendre l’objet des codes correcteurs d’erreur, inventés à la fin des années 1940 par C. Shannon, R. Hamming et M.
J. E. Golay.
Soit un ensemble à deux éléments, notés 0 et 1, appelé alphabet et identifié au corps F2 = Z/2Z.
On désire transmettre le mot de quatre lettres m = t(a, b, c, d) ∈ F2
4. S’il est transmis tel quel et si une erreur se produit, il n’y a nul moyen de la détecter et de la corriger.
Si on répète trois fois chaque lettre, on obtient le mot L(m) = t(a, a, a, b, b, b, c, c, c, d, d, d)∈F2 12. Le destinataire reçoit le mot T(L(m)) = L(m) + ε∈F212 , car des erreurs ont pu se produire lors de la transmission du message. Si une erreur se produit lors de cette transmission, elle est facilement repérable, et l’on retrouve le mot m d’origine. C’est un « code de répétition ».
Voici une autre procédure. Associons au mot m la matrice
d c
b
a ∈
M2(F2), puis complétons cette
matrice à l’aide de ses totaux marginaux ; elle devient
+ + + +
+ ++
d c b a d b c a
d c d c
b a b
a ∈ M3(F2).
Transmettons au destinataire le mot correspondant :
L(m) = t( a, b, a + b, c, d, c + d, a + c, b + d, a + b + c + d ) ∈ F29. Ce mot contient une information redondante.
Le destinataire reçoit le mot T(L(m)) = L(m) + ε∈ F29 , car des erreurs ont pu se produire lors de la transmission du message.
Si T(L(m)) diffère trop de L(m), il n’y a pas de moyen de les rectifier. C’est une situation analogue à celle de la preuve par neuf de l’école primaire.
Mais s’il y a une erreur, alors c’est possible : la matrice 3×3
u t s
y d c
x b a
' '
' '
associée au mot transmis n’est pas de la forme ci-dessus. Toutefois, seules une ligne et une colonne ne vérifient pas la condition x = a’ + b’, etc. L’erreur s’est sûrement produite à l’intersection de cette ligne et de cette colonne. On peut alors retrouver le mot d’origine.
Ainsi, s’il y a au plus une erreur, on est sûr de retrouver le message d’origine m = t(a, b, c, d).
Tout ceci se généralise sans peine à la transmission d’un mot m de longueur n2.
En résumé, les codes correcteurs d’erreurs consistent à ajouter de la redondance aux messages transmis, afin de permettre à leur destinataire de reconstituer le message originel. Il s’agit de se
protéger contre les erreurs aléatoires de transmission, et non d’assurer le secret de ces transmissions comme en cryptographie. Bref, on trouve des codes pour tous les goûts…
La sonde Voyager 2 utilise le code Reed Solomon pour transmettre les informations
2. Principes généraux des codes linéaires.
Limitons-nous ici aux codes correcteurs linéaires binaires. Ce dernier terme signifie que les messages sont des mots à éléments dans {0, 1}, identifié au corps F2 = Z/2Z, corps que nous noterons K dans toute la suite. 1
Le principe de la transmission d’un message est simple :
message bruit décodage
source → émetteur → récepteur --→ destinataire m ∈ Kk → L(m) ∈ Kn → m* = T(L(m)) = L(m) + ε ∈ Kn . Décodage : A-t-on m* ∈ C = Im L ?
• Si oui, on convient que m^ = L−1(m*) ;
• Si non, on choisit un meilleur approximant de m* dans C pour la distance de Hamming, et on pose m^ = L−1(PC(m*)).
Définitions et concepts : • Codes linéaires, encodages.
L’application L, qui doit évidemment être injective, est ici supposée linéaire. Elle est appelée application d’encodage. C = Im L est un sous-espace vectoriel de Kn, appelé code linéaire.
• Longueur, dimension, rendement, redondance.
k, longueur des messages d’origine, est appelée dimension du code.
n, longueur des messages transmis, est appelée longueur du code.
r = n
k est le rendement du code ; r 1 =
k
n est sa redondance. On a n ≥ k et r ∈ ]0, 1]
1 La théorie se généralise sans peine aux corps finis Fp = Z/pZ (p premier), voire aux corps finis plus généraux F (mais cela nécessite la théorie de Galois). On parle alors de code linéaire q-aire.
• Matrices génératrices.
On appelle matrice génératrice du code C la matrice G ∈ M(n, k) de l’application L relative aux bases canoniques.
Plus généralement, on appelle ainsi toute matrice G ∈ M(n, k) dont les colonnes forment une base de C. Ce sont donc les matrices G.P, où P ∈ Gl(k), où G est la matrice de L.
Le mot m appartient au code C ss’il est combinaison linéaire des colonnes g1, …, gk de G, ou encore ssi c ∈ Im G.
Appelons pseudo-inverse de G toute matrice G+ ∈ M(k, n) telle que G+.G = Ik, autrement dit toute inverse à gauche de G. L’injectivité de L assure l’existence de G+.
• Matrices de contrôle.
On appelle matrice de contrôle 2 de C toute matrice H ∈ M(n−k, n) telle que : x ∈ C ⇔ x ∈ Ker H ⇔ H.x = 0 ;
L’existence d’une telle matrice, nécessairement de rang n−k, est assurée par la théorie de la dualité : si on note h1,…, hn−k les lignes de H, on a : H.x = 0 ⇔ (∀j) hj.x = 0 .
Ce sont n−k équations linéaires indépendantes définissant C, appelées équations de parité. 3 Si x est un vecteur de Kn , H.x est appelé le syndrome de x.
Si l’on note c1, …, cn les colonnes de H, alors H.x =
∑
∈S(x) i
ci , où S(x) = { i ; xi ≠ 0 } est le support du vecteur x.
Si H est une matrice de contrôle, les autres sont de la forme Q.H, où Q décrit Gl(n−k).
La transposée de H, tH ∈ M(n, n−k) est la matrice génératrice d’un code de dimension n−k appelé code dual ou orthogonal de C, et noté C⊥.
Exemples : a) Si G =
O
Ik ∈ M(n, k), alors on peut prendre G+ =
[ ]
Ik O ∈M(k, n) et H =[
O In−k]
∈M(n−k, n).Cas sans intérêt pratique, car l’encodage n’apporte aucune information nouvelle. Mais dans le cas général, G est équivalente (au sens du cours d’algèbre) à
O
Ik . Trouver G+ et H.
b) Si G =
P
Ik ∈ M(n, k), on peut prendre G+ =
[ ]
Ik O ∈ M(k, n) et H =[
−P In−k]
∈ M(n−k, n).Le code C est dit présenté sous forme systématique ou canonique si G est de la forme
P Ik , autrement dit si le message d’origine figure en toutes lettres dans le message transmis, au début de celui-ci (ou, parfois, à la fin).
• Equivalence de codes.
Deux codes linéaires C et C’ de longueur n et de dimension k sont dits équivalents s’il existe une permutation σ de [1, n] telle que C’ = σ.C. Si l’on confond σ et la matrice de la permutation associée, il vient : G’ = σ.G et H’ = H.σ−1 .
Tout code linéaire est équivalent à un code mis sous forme systématique.
2 On dit aussi matrice de parité ; en anglais « parity-check matrix ». Et H.x s’appelle syndrome du vecteur x.
3 Pour rester cohérent avec le cours d’algèbre linéaire, j’ai choisi une fois pour toutes de représenter les mots par des vecteurs, c’est-à-dire des matrices-colonnes, et les formes linéaires par des matrices-lignes. Les livres sur les codes correcteurs n’adoptent pas toujours ces conventions.
• Distance de Hamming.
Si x = (x1, ..., xn) et y = (y1, ..., yn) sont deux éléments de Kn , leur distance de Hamming est d(x, y) = card { i ∈ [1, n] ; xi≠ yi }. w(x) = d(x, 0) est aussi appelé poids du mot x.
Proposition 1 : d est une distance sur Kn , à valeurs dans {0, 1, …, n}, et compatible avec l’addition en ce sens que d(x + z, y + z) = d(x, y). On en déduit d(x, y) = w(x − y).
Preuve : Il est clair que d(x, y) = 0 ⇔ x = y et que d(x, y) = d(y, x).
De plus { i ∈ [1, n] ; xi ≠ zi } ⊂ { i ∈ [1, n] ; xi ≠ yi } ∪ { i ∈ [1, n] ; yi ≠ zi }.
En passant aux cardinaux, il vient : d(x, z) ≤ d(x, y) + d(y, z). Le reste est facile.
La boule fermée de centre x et de rayon r est B’(x, r) = { y ; d(x, y) ≤ r }.
B’(x, 1) contient n + 1 éléments.
Plus généralement, si r est entier, card B’(x, r) = 1 + n + Cn2 + … + Cnr . Exercice : Si x ∗ y est le produit bit à bit des mots x et y, montrer que : w(x + y) = w(x) + w(y) − 2.w(x ∗ y) ≤ w(x) + w(y).
• Distance minimale d’un code.
L’entier dC = min { d(x, y) ; (x, y)∈C2, x ≠ y } = min { w(x) ; x ∈ C, x ≠ 0 } est appelé distance minimale ou poids du code C ; dC/n s’appelle le taux de correction.
Proposition 2 : i) Si H est une matrice de contrôle du code C, de colonnes c1, …, cn , la distance minimale dC est le cardinal minimum d’un ensemble non vide J ⊂ [1, n] tel que
∑
∈J j
cj = 0 .
ii) C est de distance minimale d ssi d − 1 colonnes quelconques de H sont libres, et s’il existe d colonnes de H liées.
Corollaire : ( Borne de Singleton ) La distance minimale de C vérifie dC≤ n − k + 1.
Preuve : On sait que la matrice H est de rang n – k. Or il découle de la proposition précédente que rg H ≥ d − 1. Donc d – 1 ≤ n − k. Cqfd.
Les paramètres du code sont les entiers n, k et dC. C est un code linéaire de type [ n, k, dC ].
Soit PC une application qui à un mot de Kn associe un de ses meilleurs approximants pour la distance de Hamming. PC ressemble un peu à une orthoprojection, mais elle n’est pas toujours unique, ni linéaire.
• Correction.
Si le code C a pour distance minimale dC, et si le nombre d’erreurs est ≤ 2
−1 dC
, il est possible de retrouver le message émis à partir du message reçu.
Le code C est dit :
a) t-correcteur si ∀x ∈ Kn ∃y ∈ C d(x, y) ≤ t . b) vérifiant la condition de décodage d’ordre t si :
pour tout x ∈ Kn , il existe au plus un y ∈ C tel que d(x, y) ≤ t . c) parfait t-correcteur si ∀x ∈ Kn ∃ ! y ∈ C d(x, y) ≤ t .
C est t-correcteur ssi les boules B’(y, t), où y décrit C, forment un recouvrement de Kn .
C vérifie la condition de décodage d’ordre t ssi les boules B’(y, t), où y décrit C, sont 2 à 2 disjointes.
C est parfait t-correcteur ssi les boules B’(y, t), où y décrit C, forment une partition de Kn . • Aspects probabilistes.
Supposons que la probabilité d’erreur soit égale p lors de la transmission de chaque lettre (0 < p <
½ ). Soit q = 1 – p. La fonction erreur est une variable aléatoire qui suit une loi binomiale BBBB(n, p).
Une erreur e de poids ≤ t a alors une probabilité P( w(e) ≤ t ) =
∑
=
− t
i
i n i nip q C
0
.
. .
Qu’est-ce qu’un bon code ? Le code idéal est un code ayant :
• un bon rendement, et donc une faible redondance ; • un taux de correction dC/n élevé ;
• des méthodes de codage et de décodage efficaces.
En réalité, ces qualités sont contradictoires :
• si la transmission est hasardeuse, et si l’on veut corriger un grand nombre d’erreurs, il faut augmenter la redondance et la capacité de correction.
• si les erreurs sont rares, la rapidité est prioritaire.
• enfin, la nécessité d’algorithmes de codages et de décodages efficaces et facilement implémen- tables conduit parfois à choisir des codes de qualité moyenne.
Problèmes de théorie des codes.
1) A n et k donnés, un code est d’autant plus performant qu’il possède une grande distance mini- male. Un des problèmes fondamentaux, non résolu, de la théorie des codes est de déterminer la plus grande distance minimale d(n, k) d’un code de longueur n et de dimension k.
2) Le problème du décodage peut se formuler comme un problème de décision : Etant données une matrice H ∈ M(r, n), un vecteur s et un entier w
Existe-t-il un vecteur e de poids w(e) s, tel que H.e = s ? Ce problème est NP-complet.
3. Exemples.
3.1. Revenons au code de répétition de l’exemple 1.
L’application d’encodage est :
L : m = t( a, b, c, d ) ∈ K4 → L(m) = t( a, a, a, b, b, b, c, c, c, d, d, d ) ∈ K12 . Le code C est de longueur 12, de dimension 4, de rendement 1/3, de redondance 3.
La distance minimale de C est dC = 3. Le taux de correction est donc 1/4.
C a pour matrice génératrice G =
1 0 0 0
1 0 0 0
1 0 0 0
0 1 0 0
0 1 0 0
0 1 0 0
0 0 1 0
0 0 1 0
0 0 1 0
0 0 0 1
0 0 0 1
0 0 0 1
∈ M(12, 4) ,
et pour matrice de contrôle H =
1 1 0 0 0 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0 0 0
0 0 0 0 1 1 0 0 0 0 0 0
0 0 0 0 0 0 1 1 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0
0 0 0 0 0 0 0 0 0 1 1 0
0 0 0 0 0 0 0 0 0 0 1 1
∈ M(8, 12).
3.2. Revenons à l’exemple des totaux marginaux traité en 1) L’application d’encodage est :
L : m = t(a, b, c, d) ∈ K4 → L(m) = t(a, b, a + b, c, d, c + d, a + c, b + d, a + b + c + d) ∈ K9 . Le code C est de longueur 9, de dimension 4, de rendement 4/9, de redondance 9/4.
La distance minimale de C est dC = 4. Le taux de correction est donc 4/9.
C a pour matrice génératrice G =
1 1 1 1
1 0 1 0
0 1 0 1
1 1 0 0
1 0 0 0
0 1 0 0
0 0 1 1
0 0 1 0
0 0 0 1
∈ M(9, 4),
et pour matrice de contrôle H =
1 0 0 0 1 1 0 1 1
0 1 0 0 1 0 0 1 0
0 0 1 0 0 1 0 0 1
0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 1 1 1
∈ M(5, 9).
Notons m* le mot transmis.
Si H.m* = 0, m* ∈ C et on décode en m^ = L−1(m*) = (m*1, m*2, m*4, m*5).
Si H.m* ≠ 0, m* ∉ C.
Remarque : Si l’on reste dans le cadre matriciel, l’application d’encodage est donnée par :
+ + + +
+ ++
d c b a d b c a
d c d c
b a b a
=
1 1
1 0
0 1
d c
b
a
1 1 0
1 0 1 .
et M =
u t s
y d c
x b a
' '
' '
appartient au code ssi M.
11
1 =
00
0 et
[ ]
111.M =[
0 00]
.3.3. Un code de Hamming de longueur 7.
Considérons le code C de longueur 7 et de dimension 4, de matrice génératrice G =
1 0 0 0
0 1 0 0
1 0 1 0
1 1 0 1
0 1 1 0
0 0 1 1
0 0 0 1
.
Les vecteurs colonnes de G se déduisent du premier par permutations circulaires.
Les éléments de C sont les vecteurs G.t(a, b, c, d) = t( a, a + b, b + c, a + c + d, b + d, c, d ).
Une matrice de contrôle est H =
1 0 1 0 0 1 1
1 1 0 1 0 0 1
0 1 0 0 1 1
1 ∈ M(3, 7).
Si x = (x1, …, x7) ∈ C , i.e. si H.x = 0, alors x = G.m, où m = G+.x , avec G+ =
− −
−
0 0 0 1 1 1 0
0 0 0 0 1 1 1
0 0 0 0 0 1 1
0 0 0 0 0 0 1
La distance minimale de C est 3, donc C est un code de type (7, 4, 3)
Ce code est cyclique, car tout mot de C est invariant par la permutation circulaire S de SSSS7.
4. Codes de Hamming.
Soit n un entier de la forme 2m – 1, c’est-à-dire formé de m fois 1 en base 2 (ou « repunit »).
A tout vecteur x = t(x1, …, xm) ∈ Km associons l’entier Nm(x) =
∑
= m − i
i i
x
1
2 1
. dont les xi sont les chiffres du développement binaire. Nm est une bijection Km → { 0, 1, …, n = 2m – 1 }.
Notons Mm la bijection réciproque.
Définition : Soit Hm ∈ M(m, n), la matrice Hm = (hij) définie par Mm(j) = ( h1j , h2j , …, hmj ).
On appelle code de Hamming de longueur n = 2m – 1 le code Cm = { x ∈ Kn ; Hm.x = 0 }.
Proposition 1 : Le code de Hamming Cm est de longueur n, de dimension n−m, et de distance minimale 3, donc de paramètres [ n = 2m – 1, n − m, 3 ]. Hm est une matrice de contrôle de ce code.
Preuve : Il y a deux façons de montrer que rg(Hm) = m.
i) Soit l’on observe que la matrice est échelonnée en lignes, au sens précis que lui donne Pierre Gabriel. Car chaque fois qu’apparaît un 1 sur une ligne nouvelle, il n’y a que des zéros au-dessus (cela correspond au développement binaire de 2, 4, 8, …)
ii) Soit l’on observe que les colonnes de Hm contiennent la base canonique, autrement dit que Im est une sous-matrice de Hm.
En vertu de la théorie de la dualité, Cm est de dimension n−m, et a pour matrice de contrôle Hm . Deux colonnes quelconques de Hm sont distinctes, donc libres, et il existe trois colonnes liées : la 3ème est somme des deux premières. On en conclut que la distance minimale du code est 3.
Proposition 2 : Le code de Hamming Cm est parfait 1-correcteur.
Preuve : Il faut montrer que les boules fermées de rayon 1 centrées en les points de Cm forment une partition de Kn.
Tout d’abord, comme la distance minimale du code est 3, ces boules sont deux à deux disjointes.
De plus, le code Cm contient 2n−m points, et la somme des cardinaux de ces boules est
n−m
2 (n + 1) = 2n. Elle recouvrent Kn. Ainsi, tout élément x de Kn est :
− soit élément de Cm, lorsque Hm.x = 0 ;
− soit à une distance 1 de Cm ; son meilleur approximant est unique ; on le trouve en faisant varier i de 1 à n jusqu’à ce que y = x – ei vérifie Hm.y = 0.
Exemples : 1) m = 2, n = 3. Alors H2 =
1 1 0
1 0
1 ∈ M(2, 3). C2 est de type [3, 1, 3].
C2 = { (a, a, a) ; x ∈ K3 } est un simple code de répétition.
2) m = 3, n = 7. Alors H3 =
1 1 1 1 0 0 0
1 1 0 0 1 1 0
1 0 1 0 1 0
1 ∈ M(3, 7). C3 est de type [7, 4, 3].
Exercice : Trouver une matrice génératrice de ce code.
Avec Maple :
> with(linalg);
> h:=proc(i,j)
> local L,l;
> L:=convert(j,base,2);
> l:=nops(L);
> if i > l then 0 else L[i];fi;end;
> Hamming:=proc(m)
> local n,i,j,H,N,G;
> n:=2^m-1;
> H:=matrix(m,n,(i,j)->h(i,j));print(H);
> N:=Nullspace(H) mod 2;G:=transpose(matrix([op(N)]));print(G);
> end;
> Hamming(2);
> Hamming(3);
> Hamming(4);
> Ham1:=proc(m)
> local n,i,j,H,N,G;
> n:=2^m-1;
> matrix(m,n,(i,j)->h(i,j) mod 2);
> end;
> delt:=proc(i,j) if i=j then 1 else 0;fi;end;
> e:=proc(n,k)
> local h,v; for h from 1 to n do v[h]:=delt(h,k);od;convert(v,array);end;
> e(6,5);
[0 0 0 0 1 0, , , , , ]
> f:=x->irem(x,2);mvect:=proc(v) map(f,v);end;v:=[1,7,8];mvect(v);
> decode:=proc(m) local x,n,k,w,xdecode;
> n:=2^m-1:
> x:=randvector(n,entries=rand(0..1));print(x);
w:=mvect(multiply(Ham1(m),x));
> if iszero(w) then xdecode:=x;
1 0 1 0 1 1
1 1 1
1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 0 1 1 1 1
1 1 0 1
1 0 1 1
1 0 0 0
0 1 1 1
0 1 0 0
0 0 1 0
0 0 0 1
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
1 1 0 0 1 1 1 1 0 0 1 1 0 1 1 0 1 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 1 0 1 1 1 1 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1
> else for k from 1 to n do w:=matadd(x,e(n,k));if iszero(mvect(multiply(Ham1(m),w))) then
xdecode:=mvect(w);fi;od;fi;print(xdecode);end;
:=
f x → irem ,(x 2) :=
mvect procprocprocproc( )v map ,(f v)end procend procend procend proc :=
v [1 7 8, , ] [1 1 0, , ]
> decode(3);
[0 0 0 1 1 1 1, , , , , , ] [0 0 0 1 1 1 1, , , , , , ]
> decode(3);
[1 0 1 1 1 1 1, , , , , , ] [1 1 1 1 1 1 1, , , , , , ]
> decode(3);
[1 1 1 0 0 1 1, , , , , , ] [0 1 1 0 0 1 1, , , , , , ]
> decode(3);
[1 1 0 1 0 0 1, , , , , , ] [1 1 0 1 0 0 1, , , , , , ]
> decode(4);
[0 1 1 0 1 1 0 1 0 0 1 1 0 0 0, , , , , , , , , , , , , , ] [0 1 1 0 1 1 0 1 0 0 1 1 1 0 0, , , , , , , , , , , , , , ]
> decode(4);
[1 0 1 0 1 1 1 1 1 1 0 1 0 1 1, , , , , , , , , , , , , , ] [1 0 1 0 1 1 1 1 1 1 0 1 0 1 1, , , , , , , , , , , , , , ]
> decode(4);
[0 1 1 0 1 1 0 0 0 0 1 1 0 0 0, , , , , , , , , , , , , , ] [0 1 1 0 0 1 0 0 0 0 1 1 0 0 0, , , , , , , , , , , , , , ]
> decode(4);
[0 1 1 0 1 0 1 1 0 0 0 0 0 1 0, , , , , , , , , , , , , , ] [0 1 1 0 0 0 1 1 0 0 0 0 0 1 0, , , , , , , , , , , , , , ]
5. Codes cycliques.
5.1. Représentation polynomiale d’un code de longueur n.
Notons toujours K = F2, et identifions Kn et Kn−1[X] via l’application : c = t( c0, c1, …, cn−1 ) → c(z) = c0 + c1.z + … + cn−1.zn−1 .
Rappelons que l’anneau K[z]/(zn− 1) des classes des polynômes modulo zn− 1 est une K-algèbre, ayant pour base BBBB = ( 1, ζ, … , ζn−1 ). La table de multiplication dans cette base est
ζp.ζq = ζr , où r = p + q si p + q ≤ n − 1 , r = p + q − n si p + q > n.
On a une identification naturelle K[z]/(zn − 1) ↔ Kn−1[X], tout polynôme f ∈ K[X] étant congru modulo zn− 1 à un unique polynôme de degré ≤ n − 1, à savoir son reste euclidien.
Par suite, Kn s’identifie à K[z]/(zn− 1), via :
θ : c = t( c0, c1, …, cn−1 ) → χ(z) = c0 + c1.ζ + … + cn−1.ζn−1 . χ(z) s’appelle représentation polynomiale de c.
5.2. Codes cycliques.
Définition : Un code linéaire C de longueur n est dit cyclique s’il est invariant par l’opérateur de permutation circulaire S : c = t(c0, c1, …, cn−1) → S(c) = t(cn−1, c0, c1, …, cn−2) .
S s’appelle aussi décalage, ou shift.
Exercice : Notons aussi S =
0 1 ...
0
...
...
...
0 ...
0 1
1 ...
0 0
la matrice de S dans la base canonique. Soient C un code de longueur n et de dimension k, G une matrice génératrice, H une matrice de contrôle de C.
Montrer l’équivalence des propriétés suivantes : i) C est un code cyclique ;
ii) ∃P ∈ Gl(k) S.G = G.P ; iii) ∃Q ∈ Gl(n − k) H.S = Q.H.
Lemme : Soit m : f → z. f l’endomorphisme de multiplication par z dans K[z]/(zn − 1), on a ∀c ∈ Kn ( m o θ )(c) = (θo S)(c).
Proposition : Soit C un code linéaire, θ(C) = C sa représentation polynomiale.
C est un code cyclique si et seulement si C est un idéal de K[z]/(zn− 1).
Cette proposition ramène la recherche des codes cycliques à celle des idéaux d’un anneau quotient.
Théorème : Les idéaux de K[z]/(zn − 1) sont en bijection avec les diviseurs unitaires de zn − 1 dans K[z]. Plus précisément, si g est un diviseur unitaire de zn − 1 dans K[z] de degré t,
ℑg = { f .g ; f ∈ K[z] } est un code cyclique de dimension k = n − t.
g →ℑg est la bijection annoncée. De plus g | g’ ⇔ℑg’⊂ℑg .
Définition : Soit Cg le code cyclique associé à l’idéal ℑg. g s’appelle polynôme générateur de Cg. Notons ce polynôme g(z) = g0 + g1.z + … + gt−1.zt−1 + gt.zt , où gt = 1.
Matrice génératrice du code Cg : G =
t t t
g g g
g g
g g g g
...
0 0
...
0 ...
...
...
0 ...
0 ...
0 ...
0
1 0 1 0 1 0
∈ M(n, k)
5.3. Polynôme et matrice de contrôle du code Cg.
Définition : Le polynôme h tel quezn − 1 = g.h s’appelle polynôme de contrôle du code Cg. Notons ce polynôme h(z) = h0 + h1.z + … + hk−1.zk−1 + hk.zk , où hk = 1.
Proposition : Soit f ∈ K[z]/(zn− 1). On a : f ∈ C ⇔ h. f = 0.
La matrice de la multiplication par z, relativement à la base BBBB est cyclique, et égale à : M = h0.I + h1.Ω + … + hk−1.Ωk−1 + hk.Ωk ,
où Ω est la matrice de la multiplication par ζ. Du coup c ∈ C ⇔ c ∈ Ker M ⇔ M.c = 0.
La matrice M est carrée de format n×n, mais de rang n−k. Or les n−k dernières lignes de M sont libres ; elles engendrent donc les autres. Le code C admet donc pour matrice de contrôle la sous- matrice de M formée de ses n−k dernières lignes :
H =
−
−
−
0 1
0 1
0 1
...
...
...
0
...
...
...
...
...
0 ...
0
0 0 ...
h h
h
h h
h
h h
h
k k k k k k
∈ M(n − k, n).
5.4. Exemples de codes cycliques.
1) {0} et Kn sont des codes cycliques, dits triviaux.
{0} a pour polynôme générateur zn − 1, pour matrice génératrice G = t(0, …, 0) et pour matrice de contrôle H = In.
Kn a pour polynôme générateur 1, pour matrice génératrice G = In, et pour matrice de contrôle la matrice H = ∅.
2) C = { c = t(c0, …, c0) ; c0 ∈ K } est un code cyclique de longueur n, de dimension k.
Il admet pour polynôme générateur g = 1 + z + … + zn−1 , pour matrice génératrice G = t(1, …, 1), pour polynôme de contrôle h = z – 1, pour matrice de contrôle : H =
−
− −
1 . 1 ...
0
...
...
...
...
...
0 0 ...
1 1 0
0 0 ...
1 1
∈M(n−1, n).
(Ici –1 = 1, mais peu importe.)
3) C = { c = t(c0 , c1 , ..., cn−1) ; c0 + c1 + … + cn−1 = 0 } est un code cyclique de dimension n−1.
Il admet pour polynôme générateur g = z – 1, pour matrice génératrice G =
−
− −
1 0 . ...
...
1 1
...
...
...
...
1 0
...
1 1
...
0 1
∈ M(n, n−1)
Pour polynôme de contrôle h = 1 + z + … + zn−1 , et pour matrice de contrôle H = (1, 1, …, 1)
4) Considérons dans K9 le code de matrice génératrice G =
1 0 0
0 1 0
0 0 1
1 0 0
0 1 0
0 0 1
1 0 0
0 1 0
0 0 1
.
Il est de longueur 9, de dimension 3. Ses éléments sont les c = t(x, y, z, x, y, z, x, y, z) = G.t(x, y, z).
Il a pour polynôme générateur 1 + z3 + z6, pour polynôme de contrôle z3 – 1, et pour matrice de
contrôle H =
− − −
− −
−
1 0 0 1 0 0 0 0 0
0 0 0 1 0 0 1 0 0
0 1 0 0 1 0 0 0 0
0 0 0 0 1 0 0 1 0
0 0 1 0 0 1 0 0 0
0 0 0 0 0 1 0 0 1
..
5) Soit m un mot de Kn. Le plus petit code cyclique contenant m est : Vect( m, S(m), S2(m), …, Sn−1(m) ).
Le polynôme générateur de ce code est pgcd(zn− 1, µ(z)).
5.5. Classes cyclotomiques.
Déterminer les codes cycliques équivaut à trouver les diviseurs de Xn − 1 dans K[X]
Supposons désormais n impair, et considérons le corps de décomposition R de Xn − 1 dans ΩΩΩΩ2, clôture algébrique de K = F2 . Il est obtenu en adjoignant à K les n racines n-ièmes de l’unité. On sait que R = F2r, où r est l’ordre de 2 dans le groupe multiplicatif (Z/nZ)*, c’est-à-dire le plus petit entier > 0 tel que 2r ≡ 1 (mod n).
Soit α une racine primitive n-ème de l’unité dans R. Alors Xn − 1 =
∏
−= 1 −
0
) (
n
i
X αi .
Tout diviseur de Xn − 1 dans K[X] est de la forme gΣ(X) =
∏
∈Σ −i
X i)
(
α
, où Σ est une partie convenable de Z/nZ.Proposition : Pour que gΣ(X) soit à coefficients dans K, il faut et il suffit que Σ soit stable par multiplication par 2.
____________
Annexe : Algèbre linéaire dans Z/2Z.
Dans cette annexe, K désigne un corps fini commutatif ayant q éléments.
Proposition 1 : Soit E un K-espace vectoriel. E est de dimension finie sur K si et seulement si E est un ensemble fini. Alors, si N = card E et n = dim E, on a N = qn.
On suppose cette condition remplie dans la suite.
Proposition 2 : Soit Lk(E) l’ensemble des familles libres (x1, ..., xk) formées de k vecteurs de E.
Alors : card Lk(E) = ( qn− 1 )( qn− q ) ... ( qn− qk−1 ) . Proposition 3 : L’ordre du groupe linéaire de E est :
card Gl(E) = ( qn− 1 )( qn− q ) ... ( qn− qn−1 ) = qn²
∏
i=n1(1−q1i).Proposition 4 : Soit Gk(E) l’ensemble des s-e-v de dimension k de E ( « grassmannienne » ).
On a : card Gk(E) =
∏
ki=−01 qqkn−−qqii . et card Gk(E) = card Gn−k(E) . Proposition 5 : Soit F un sous-espace vectoriel fixé de dimension k de E.i) F admet qk(n−k) supplémentaires dans E.
ii) Il y a autant de sous-espaces affines de E de direction F.
Exercice : 1) Combien a a-t-il de sous-espaces affines de E de dimension k ?
2) a) Combien y a-t-il d’applications de E dans E ? Parmi elles, combien sont bijectives ? b) Combien y a-t-il d’endomorphismes de E ? Parmi eux combien sont bijectifs ? de dét 1 ? c) Combien y a-t-il de projecteurs dans E, resp. de symétries si K est de caractéristique ≠ 2 ? d) Combien y a-t-il d’applications affines de E dans E ? de bijections affines ?
3) Soient E un K-ev de dimension p, F un K-ev de dimension n.
a) Combien y a-t-il d’applications linéaires de E dans F ? b) Si p ≤ n, combien y a-t-il d’injections linéaires de E dans F ?
c) Si n ≤ p, combien y a-t-il de surjections linéaires de E dans F ?
d) Si 1 ≤ r ≤ min(n, p), combien y a-t-il d’applications linéaires de rang r de E dans F ?
4) Combien y a-t-il de codes binaires de longueur n et de dimension k ? Soit C l’un d’eux.
Combien admet-il de matrices génératrices ? de matrices de contrôle ? d’applications d’encodage ?
Richard W. HAMMING
Richard Wesley Hamming (Chicago 1915 - Monterey 1998) entra à l’université de Chicago, puis reçut son M. A. à celle du Nebraska en 1939. Enfin, en 1942 il reçut son Ph. D. en mathématiques à l’université de l’Illinois. Sa dissertation portait sur Quelques problèmes dans la théorie des valeurs limites des équations différentielles linéaires. En 1945, Hamming rejoignit à Los Alamos le projet Manhattan, qui visait à fabriquer la bombe atomique. Après guerre, Hamming rejoignit les Bell Telephone Laboratories ; il y travailla jusqu’en 1976 lorsqu’il accepta une chaire d’informatique à la Naval Postgraduate School à Monterey, en Californie.
Hamming est surtout connu pour ses travaux sur les détections d’erreurs et les codes correcteurs d’erreurs. Son papier fondamental sur le sujet, paru en 1950, ouvrit un nouveau champ au sein de la théorie de l’information. Les codes de Hamming jouent un grand rôle dans la théorie des codes et sont utilisés en dessin assisté par ordinateur. Ils utilisent les propriétés des matrices sur les corps finis. En 1956, Hamming travailla sur un des premiers ordinateurs, l’IBM 650, et aida à concevoir un langage de programmation. Il travailla aussi en analyse numérique, sur l’intégration des équations différentielles. La fenêtre spectrale de Hamming est très utilisée en calcul pour lisser les données avant d’en faire l’analyse de Fourier. Il publia Numerical methods for scientists and engineers (1962), Introduction to applied numerical analysis (1971), Digital filters (1977), Coding and information theory (1980), Methods of mathematics applied to calculus, probability, and statistics (1985), Introduction to applied numerical analysis (1989), The art of probability for scientists and engineers (1991) et The art of doing science and engineering : learning to earn (1997). Hamming a reçu de nombreuses distinctions.
« The purpose of computing is insight, not numbers.»
« Quelqu'un croît-il que la différence entre les intégrales de Lebesgue et de Riemann peut avoir une signification physique, autrement dit qu'un avion puisse voler ou ne pas voler pourrait dépendre de cette différence ? Si cela était, j'éviterais de voler dans cet avion. »
Richard Hamming
Un des plus anciens codes binaires connus, constitué par les 64 hexagrammes du Yi-King, l’un des cinq classiques de la Chine ancienne.
Il est construit en juxtaposant six symboles binaires (yin : et yang : −−−−−−−−).
Leibniz avait déjà noté que le yin et le yang étaient l’analogue de 0 et 1.
____________
Bibliographie
Gilles Lachaud et Serge Vladut : Les codes correcteurs d’erreurs (La Recherche, juillet 1995) Poli Huguet : Codes correcteurs (Masson, 1989)
Michel Demazure : Cours d’Algèbre (Cassini, 1997) Gilles Zémor : Cours de cryptographie (Cassini, 2000)
Odile Papini, Jacques Wolfmann : Algèbre discrète et codes correcteurs (Springer) John Horton Conway, Neil J. A. Sloane :
Sphere packings, lattices and groups (Springer, 1993)
Codes géométriques algébriques et arithmétiques sur les corps finis, X-UPS, 1993 Robert Rolland : Activités liées aux codes correcteurs…, Bulletin 432 APM, p. 81-94 Jean-Paul Delahaye : Couleurs des chapeaux et codes correcteurs d’erreurs
in Mathématiques pour le plaisir (Belin, 2010) Agrégation de maths 1978 (mathématiques générales) Agrégation de maths 1996 (option informatique) Concours spécial T’ 1987 (maths 2)
Concours ENS 2011 (informatique-mathématiques) Fernando Pessoa : Messages
Wikipedia : Corps finis, codes correcteurs ___________