Code Correcteur
Code Correcteur
Melvyn EL KAMELMEYRIGNE
2 Code de Hamming 10
3 Codes cycliques 13
3.1 Fonctionnement des codes cycliques . . . . . . . . . . . . . . . 13
3.2 Recherche des codes cycliques . . . . . . . . . . . . . . . . . . 15
3.3 Algorithme de décodage . . . . . . . . . . . . . . . . . . . . . 19
4 Annexes 24
4.1 Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.2 Code SAGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1
Introduction
Lorsque deux personnes communiquent entre elles, il arrive souvent que
le message reçu dière de celui émis ; que ce soit à cause de fautes d'ortho-
graphes, d'une diction trop rapide ou bien de bruits perturbateurs. Toutefois,
il n'est pas toujours nécessaire d'obtenir l'intégralité du message pour en de-
viner le sens. Ainsi, même si on mélange l'ordre des lettres dans un mot
tout en laissant les lettres aux extrémités à leur place, on puet qnaud mmêe
cmopnrde la prshae.
On constate que le transfert d'informations numériques est très important
dans de nombreux domaines, par exemple pour les sondes spatiales qui re-
çoivent des signaux parcourant une énorme distance. Il est donc primordial de
s'assurer que la perte d'informations soit minimale : c'est là qu'interviennent
les codes correcteurs.
L'objectif est de rajouter une couche d'informations au message initial
qui ne rajoute pas de sens mais qui permettront de détecter les erreurs et de
les corriger. Bien évidemment, l'ajout d'informations a un prix : l'ecacité
d'un code sera donc déterminée par la quantité d'informations ajoutée et par
sa capacité à conserver l'information d'un message. Nous allons nous pencher
sur les principaux codes correcteurs binaires et voir comment se déroule le
codage et la correction d'erreurs, notamment pour les codes cycliques.
2
1 Théorie des codes correcteurs
1.1 Dénition
On appellera une lettre la plus petite information transmissible et un mot
comme un ensemble de lettres. L'ensemble des lettres est l'alphabet, noté Ω ;
nous travaillerons avec Ω = {0, 1}.
Ainsi, on considérera qu'un mot m est une suite de lettres appartenant
au corps ni à deux éléments que l'on notera F2 (ou encore 2Z Z
ou GF (2)).
Un mot de longueur n appartient donc à F2 . n
U := {xi 6= zi },
S := {(xi 6= zi ) ∧ (xi = yi )},
T := {(xi =6 zi ) ∧ (xi 6= yi )}.
3
1.2 Codes binaires
Dénition 1.2.1. Un code binaire de longueur n et de dimension k est
une partie C de dimension k de Fn2 ; on dit que C est un code de paramètres
(n, k).
En associant à l'action d'encoder une application injective ϕ (l'injectivité
assure que le décodage soit possible), on a C = Im(ϕ).
Un exemple particulièrement simple est le bit de parité : on ajoute à la
n du message un bit correspondant à la parité de la somme des éléments du
message. Si la somme est paire, le bit vaut 0 sinon il vaut 1. Pour un mot de
longueur k , le code associé a donc pour paramètres (k + 1, k). Exemple :
0011010 → 00110101
010 → 000111000
On constate que le dernier trio de bits n'est pas composé de lettres iden-
tiques, donc l'erreur provient probablement de la lettre diérentes des deux
autres. Malheureusement, ce code reste lui aussi assez limité : s'il y a deux
erreurs dans le même trio de bits, cela donnera lieu à une mauvaise correc-
tion ; s'il y en a 3, on ne peut même pas détecter l'erreur. On constate qu'en
répétant chaque bit n fois, le code permet de retrouver le bon mot tant qu'il
y a au plus b n−12
c erreurs (b·c désignant la partie entière). Cela peut sembler
correct, mais la quantité d'informations ajoutée est particulièrement élevée.
4
Dénition 1.2.2. La distance minimale dC d'un code C est dénie comme,
dC = min{d(x, y)|x ∈ C, y ∈ C, x 6= y}.
5
Désormais, nous inclurons la distance minimale du code dans ses para-
mètres ; un code C a pour paramètres (n, k, dC ). Comment déterminer la
distance minimale d'un code ? On pourrait calculer le poids de tous les élé-
ments mais ce serait laborieux. Il est possible d'obtenir une majoration de
dC en fonction de n et de k .
1.4 Codage
Soit C un code linéaire de paramètres (n, k, dC ). Il existe ϕ une appli-
cation linéaire injective de F2k dans F2n telle que Im(ϕ) = C . On peut le
représenter matriciellement par ϕ(x) = xG; G étant la transposée de la ma-
trice représentative de ϕ par rapport aux bases canoniques de F2k et de F2n .
Les mots sont donc considérés comme des vecteurs lignes. On dit que G est
la matrice génératrice de C et que C est le code engendré par G.
1 0 0 1
Exemple : x = (101) , G = 0 1 0 1
0 0 1 1
1 0 0 1
ϕ(x) = 1 0 1 *0 1 0 1 = (1010)
0 0 1 1
Il s'agit du codage par bit de parité vu précédemment.
6
Travailler avec un code systématique nous simpliera quelques calculs par
la suite.
1.5 Décodage
Dénition 1.5.1. On appelle matrice de contrôle d'un code linéaire C de
paramètres (n, k, dC ) la matrice H ∈ Mn−k,n à coecients dans F2 telle que
ker(H) = C . Ainsi, ∀m ∈ C, H t m = 0 et H t G = 0.
Proposition 1.5.2. : S'il existe dans C un mot de poids r, il existe r co-
lonnes de H linéairement dépendantes.
Démonstration. Soit m = m0 m1 ...mn−1 un mot du code de poids r, on note
Ci la i-ème colonne de H et mi1 , mi2 , ...mir les composantes non nulles de m.
0 0
.. ..
n−1 . r . r
0 = H tm = H mip Cip donc il existe bien r
P P P
mi = H mip =
i=0 . p=1 .
.. .. p=1
0 0
colonnes de H étant linéairement dépendantes.
Proposition 1.5.3. S'il existe r colonnes linéairement dépendantes de H ,
alors il existe un mot du code de poids r0 ≤ r.
r
Démonstration. Il existe r scalaires non tous nuls tels que mip Cip = 0.
P
p
Soit m ∈ F2n dont les composantes de rang i1 , i2 , ...ir sont mi1 , mi2 , ...mir et
les autres sont nulles. On a w(m) ≤ r.
On en déduit que la distance minimale dC (c'est-à-dire le poids minimal)
est égale au nombre minimum de colonnes linéairement dépendantes de H .
7
Proposition 1.5.5. Chaque syndrome s est associé à un unique mot m ∈ F2n
dont le poids w(m) vérie w(m) ≤ eC .
Démonstration. Supposons qu'il existe m0 ∈ F2n tel que w(m0 ) ≤ eC et
H t m = H t m0 donc H t (m − m0 ) = 0 et donc m − m0 est un mot du code.
w(m − m0 ) ≤ w(m) + w(m0 ) ≤2eC ≤ dC − 1. Le seul mot du code x qui vérie
w(x) ≤ dC − 1 est le mot nul donc m − m = 0 et m = m0 .
Il sut maintenant de dresser une liste des syndromes de chaque élément
de F2n pour pouvoir retrouver l'erreur et à fortiori le mot codé.
Démonstration. H t G =t B −t B = 0.
1 0 1 0
Exemple : Prenons G = .
0 1 1 1
1 1 1 0
Ainsi, H = .
0 1 0 1
1 0 1 0
Codons le mot m = (01), w = (01) = (0111).
0 1 1 1
Ajoutons lui d'abord une erreur en troisième position : z = (0101).
0
1 1 1 0 1
= 1 .
Calculons le syndrome de z : s = H z =
t
0 1 0 1 0 0
1
Cela correspond à la troisième colonne de H , l'erreur provient donc du
troisième bit.
8
Démonstration. Pour tout i ∈ {0, 1, ..., r}, il existe Cni mots y ∈ F2n tels que
d(x, y) = i.
ec
Proposition 1.6.2. Inégalité de Hamming : Cni ≤ 2n−k .
P
i=0
9
2 Code de Hamming
Créons un code qui satisfait l'égalité de Hamming et qui soit capable
de corriger une erreur ; on prend donc la distance minimale la plus petite
possible, dC = 3.
Posons r = n − k .
1
Cni = 2n−k ⇒ 1 + n = 2k
P
i=0
n = 2r − 1 et k = 2r − r − 1.
Les codes parfaits ayant une capacité de correction 1 sont donc nécessai-
rement des codes de Hamming. Pour r = 2, le code parfait de paramètres
(3, 1, 3) est le code de répétition.
0 0 0 1 1 1 1
Essayons d'encoder un mot, de modier un de ses bits et de le décoder. Pre-
nons m = (1010)
.
1 0 0 0 1 1 0
0 1 0 0 1 0 1
mG = (1010) 0 0 1 0 0 1 1 = (1010101).
0 0 0 1 1 1 1
Modions le 4ème bit (1010101) −→ (1011101) Puisque le code est sys-
tématique,
on peut rapidement
trouver la matrice de contrôle H .
1 1 0 1 1 0 0
H = 1 0 1 1 0 1 0 On a bien H t G = 0.
0 1 1 1 0 0 1
10
Calculons le syndrome du message erroné :
1 1 0
1 0 1
0 1 1
= (111).
(1011101)t H = (1011101) 1 1 1
1 0 0
0 1 0
0 0 1
On obtient trois 1, il y a donc une erreur sur les trois bits de parité ; l'er-
reur provient donc du bit qui intervient dans la construction des trois bits
de parité : le quatrième. On aurait bien sûr reprendre l'algorithme vu précé-
demment et retrouver le même résultat.
Ainsi, ce code est plus ecace qu'un simple code linéaire. Voilà une com-
paraison en image (avec un taux d'erreur de 0.01) :
11
ment nommé Sage) et sont disponibles dans l'annexe. J'ai utilisé le Jupi-
ter Notebook et le kernel le plus récent (SageMath Dev). Cocalc permet de
travailler facilement avec plusieurs types de codes correcteurs (linéaires, de
Hamming, cycliques) et permet de simuler l'apparition d'erreurs.
12
3 Codes cycliques
3.1 Fonctionnement des codes cycliques
Dénition 3.1.1. Un code linéaire est dit cyclique s'il est stable par déca-
lage circulaire.
Plus formellement, soit C un code de paramètres (n, k, dC ) et m ∈ F2n ,
m = m0 m1 ...mn−1 . On note σ(m) = mn−1 m0 ...mn−2 .
Alors, C est cyclique si ∀m ∈ C, σ(m) ∈ C .
Ainsi, ∀k ∈ N , σ k (m) ∈ C et σ n (m) = m.
Exemple Le code C = {000, 110, 011, 101} est cyclique.
Dénition 3.1.2. Soit m = m0 m1 ...mn−1 un mot, m(X) = m0 + m1 X +
... + mn−1 X n−1 est la représentation polynomiale associée à m. On notera PC
la représentation polynômiale d'un code (on pourra aussi utiliser C s'il n'y a
pas de risque de confusion).
En reprenant le code précédent, on a PC = {0, 1 + X, X + X 2 , 1 + X 2 }.
13
Dénition 3.1.5. Le polynôme générateur g(X) d'un code cyclique C est
le polynôme non nul unitaire de plus bas degré de C .
Proposition 3.1.6. Le polynôme générateur est unique.
Démonstration. Supposons que g1 et g2 soient deux polynômes générateurs
distincts et diérents de 0 de C . Alors, g1 - g2 est un polynôme de C de degré
strictement inférieur à celui de g1 et g2 , ce qui entraîne une contradiction.
Proposition 3.1.7. Tout mot du code est un multiple de g.
Démonstration. Soit m ∈ C . Par division euclidienne, on a :
m(X) = q(X)g(X)+r(X) avec q(X), r(X) ∈ F2 [X] et deg(r(X)) < deg(g(X)).
r(X) = q(X)g(X) − m(X) donc r est un mot du code d'après les proprié-
tés précédentes (multiple de g(X) et linéarité). Si r(X) 6= 0, cela contre-
dit l'hypothèse que g(X) soit le polynôme générateur. Donc, r(X) = 0 et
m(X) = q(X)g(X).
Proposition 3.1.8. g(X) divise X n − 1.
Démonstration. On sait que X k g(X) = g k (X) où g k (X) est le polynôme
obtenu en décalant les composantes de g(X)k fois vers la droite, c'est donc un
mot du code. Ce qui implique qu'il existe a(X) tel que X k g(X) = a(X)g(X)
et donc (X k + a(X))g(X) = X n − 1.
Dénition 3.1.9. Un idéal I de A est dit principal s'il existe i ∈ I tel que
I = {i ∗ a|a ∈ A}.
F 2 [X ] F2 [X]
C est donc un idéal principal de Xn −1 et C = {m(X)g(X)|m(X) ∈ Xn −1 }.
14
n − k.
h(X)m(X) = h(X)g(X)q(X)
= (X n − 1)q(X)
F 2 [X ]
= 0 dans X n
−1
.
h(X) remplit bien un rôle similaire à celui de la matrice de contrôle ; on
considérera d'ailleurs
la matrice de contrôle H associée. Si h(X) = b0 +b1 X +
hk hk−1 · · · h0 0 · · · 0
0 hk · · · h1 h0 · · · 0
... + bk X , H = ..
k
.. ∈ Mn−k,n (F2 ).
. .
0 0 · · · 0 hk · · · h0
On a bien H t G = 0.
15
Si g(X) est un polynôme générateur, il est de la forme g(X) = (X −αi )
Q
i∈Σ
où Σ est une partie convenable de Fn .
16
α étant une racine primitive 7-ième de l'unité.
g1 = (X − α)(X − α2 )(X − α4 )
= X 3 +X 2 ( α+α2 +α4 )+X(α3 +α5 +α6 )
= X 3 + X + 1.
Code nul.
C0 = hX 7 + 1i
C1 = hX + 1i
C2 = hX 3 + X + 1i
C3 = hX 3 + X 2 + 1i
C4 = h(X 3 + X + 1)(X + 1)i = hX 4 + X 3 + X 2 + 1i
C5 = h(X 3 + X 2 + 1)(X + 1)i = hX 4 + X 2 + X + 1i
C = h(X 3 + X + 1)(X 3 + X 2 + 1)i = hX 6 + X 5 + X 4 + X 3 + X 2 + X + 1i
6
Ne change pas le mot.
C7 = h1i
Les code C2 et C3 ont pour paramètres (7, 4, 1), ce sont des codes de
Hamming. Le code C6 correspond au bit de répétition.
17
n−1
Démonstration. On sait que X n − 1 = (X − αi ). De plus, {1, ...n} =
Q
i=0
{k ∈ {1, ...n}|k ∧ n = d}.
F
d|n
n
n d
n k
(X − αkd )
Q Q Q Q
X −1= (X − α ) =
d|n k=1 d|n k=1
k∧n=1 k∧( n
d
)=1
d nk
=
Q Q Q
(X − α d ) = Φd (X).
d|n k=1 d|n
k∧d=1
La dernière égalité venant du fait que si α est une racine primitive n-ième
n
de l'unité, α d est une racine primitive d-ième de l'unité.
Proposition 3.2.5. Les polynômes cyclotomiques sont à coecients dans Z.
Démonstration. On montre qu'ils sont à coecients entier par récurrence.
C'est vrai pour φ1 (X) = Q
X − 1. On suppose que c'est vrai jusqu'au rang
n − 1. On a X − 1 =
n
φd (X) = φn (X)h(X) dans C[X] où h(X) est
d|n
un polynôme à coecients entier par hypothèse de récurrence. En faisant
la division euclidienne dans Z[X] de X n − 1 par h(X) on a : X n − 1 =
g(X)h(X) + r(X) avec deg(r) < deg(h) et g(X) dans Z[X]. Par unicité de
la division euclidienne dans C[X], on a φn = g et donc φn est à coecient
entier.
Le calcul des polynômes cyclotomiques permet donc aussi de retrouver
les polynômes générateurs.
Proposition 3.2.6. S'il existe des entiers a et s > 0 tels que contienne
P
a + 1, a + 2, ..., a + s, la distance minimale du code construit est ≥ s + 1.
Démonstration. Il faut montrer qu'un polynôme R ∈ F2 [X] de degré < n qui
a au plus s coecients non nuls (et donc de poids < s + 1) est identiquement
nul. Cela revient donc à montrer le lemme suivant :
Lemme Soient d1 , ...ds des entiers avec 0 P
≤ d1 < · · · < ds < n, et
λ1 , ..., λs des éléments de F2 . Posons R(X) = dj i
λj X . Si R(α ) = 0 pour
i = a + 1,...,a + s, alors tous les λj sont nuls.
18
Démonstration. Le déterminant des αidj est un déterminant de Vandermonde.
Mais comme α est une racine primitive n-ième de l'unité, les αdj sont deux
à deux distincts.
19
et deg(Xbs(X) − gb(X)) < n − k − 1. Comme Xbs(X) = X(X) − X n−k et
gb(X) = g(X) − X , le syndrome de w(X) vaut bien Xs(X) − g(X).
n−k
20
Modions deux de ses composantes, disons la quatrième et la huitième et
notons ce nouveau polynôme z(X) = 1 + X + X 3 + X 5 + X 6 + X 7 + X 8 +
X 10 + X 11 .
Par division euclidienne, on obtient z(X) = (X 3 + X)(1 + X 4 + X 6 + X 7 +
X 8 ) + X 7 + X 6 + 1.
Le syndrome est donc s(X) = X 7 + X 6 + 1 de poids 3 > 2.
s1 (X) = X 8 + X 7 + X − (X 8 + X 7 + X 6 + X 4 + 1) = X 6 + X 4 + X + 1.
s2 (X) = X(X 6 + X 4 + X + 1) = X 7 + X 5 + X 2 + X .
s3 (X) = X 8 +X 6 +X 3 +X 2 −(X 8 +X 7 +X 6 +X 4 +1) = X 7 +X 4 +X 3 +X 2 +1.
..
.
..
.
s10 (X) = X 7 + X 6 + X 5 .
s11 (X) = X 8 + X 7 + X 6 − (X 8 + X 7 + X 6 + X 4 + 1) = X 4 + 1.
Un code est dit λ-burst-correcteur s'il peut corriger toutes les erreurs de
burst< λ.
Proposition 3.3.4. Tout code cyclique peut détecter les erreurs "burst" de
longueur ≤ deg(g(X)).
Démonstration. Montrons qu'il n'existe pas d'erreur "burst" de longueur ≤
deg(g(X)) appartenant au code.
21
Par dénition, ce "burst" est de la forme e(X) = X i β(X) avec deg(β(X)) ≤
deg(g(X)) et β(X) 6= 0. Le coecient constant de g(X) est 1 donc g(X) - X i .
Si e(X) est un mot du code alors g(X) - X i β(X) donc g(X) | β(X) mais
deg(β(X)) ≤ deg(g(X)) d'où la contradiction.
22
Conclusion
Nous avons pu voir quels étaient les mécanismes qui régissaient le codage
et le décodage d'informations binaires, mais ce n'était qu'un bref aperçu
du monde des codes correcteurs d'erreurs : les codes BCH , Reed-Solomon,
de Golay sont tous d'autres codes fréquemment utilisés. De plus, nous ne
sommes pas penchés sur le cas de l'eacement d'un bit qui aurait ajouté une
nouvelle dimension à notre sujet.
La protection de l'information reste un secteur en pleine expansion dont
l'avancement ore des possibilités insoupçonnées dans de multiples domaines
et qui continue de donner naissance à de nouvelles théories.
23
4 Annexes
4.1 Bibliographie
Ce travail se base principalement sur le livre de Michel Demazure, Cassini,
Cours d'algèbre. Primalité. Divisibilité. Codes.
Et quelques cours disponibles en ligne :
1. Massoud Malek , Linear Cyclic Codes, http://www.mcs.csueastbay.
edu/~malek/Class/Cyclic.pdf
2. A.A. Pantchichkine, Mathématiques des codes correcteurs d'erreurs
https://www-fourier.ujf-grenoble.fr/~panchish/04cc
3. Pierre Abbrugati, Introduction aux codes correcteurs d'erreurs, http:
//www.lirmm.fr/~chaumont/download/cours/codescorrecteur/Cours_
Pierre_Abbrugiati.pdf
4. Pierre Wassef, Cours d'arithmétique http://www.edu.upmc.fr/maths/
wassef_LM220/documents/arithmetique.pdf
24
4.2 Code SAGE
Hamming :
In [3]: im = Image.open('Mario.png')
In [7]: data[4]=[0]*90000
In [8]: data4=np.unpackbits(data3)
In [10]: data5=list(data4)
In [26]: len(data5)
Out[26]: 2160000
In [2]: C=codes.HammingCode(GF(2),7); C
In [12]: Z=GF(2)^120
Y=GF(2)^127
In [11]: datac=[0]*2160000*7
25
Ensuite, on crée un code de Hamming de paramètres (120,127) à l'aide du
logiciel ; on encodera donc les bits par groupe de 120 (2160000/120=18000) et
on obtiendra des mots de longueur 127. On prépare un tableau qui contiendra
des vecteurs à 127 éléments qui appartiennent à F2 .
In [13]: p=0.01;
Chan=channels.QarySymmetricChannel(GF(2)^127,p);
In [15]: datae=[0]*2160000*7
In [17]: datam=[0]*2160000
In [19]: datap=np.array(datam,dtype=np.uint8)
In [20]: datar=np.packbits(datap)
In [21]: datar=datar.reshape(90000,3)
26
In [22]: datah=tuple(map(tuple,datar))
In [24]: imf.putdata(datah)
In [25]: imf
Out[25]:
27
Code linéaire aléatoire :
In [2]: C=codes.random_linear_code(GF(2),127,120); C
In [3]: im = Image.open('Mario.png')
In [6]: data[4]=[0]*90000
data4=np.unpackbits(data3)
In [7]: data5=list(data4)
datac=[0]*2160000*7
datae=[0]*2160000*7
datam=[0]*2160000
In [8]: Z=GF(2)^120
Y=GF(2)^127
In [9]: p=0.01;
Chan=channels.QarySymmetricChannel(GF(2)^127,p);
Chan
28
In [11]: for i in range(0,17999):
U=Y(datac[127*i:127*(i+1)])
K=Chan.transmit(U)
datae[127*i:127*(i+1)]=K
In [12]: for i in range(0,17999):
P=Y(datae[127*i:127*(i+1)])
X=C.decode_to_message(P)
datam[120*i:120*(i+1)]=X
In [13]: datap=np.array(datam,dtype=np.uint8)
datar=np.packbits(datap)
datar=datar.reshape(90000,3)
In [ ]: datah=tuple(map(tuple,datar))
In [15]: imf = Image.new("RGB",(300,300),"white")
imf.putdata(datah)
In [16]: imf
Out[16]:
29
On obtient une image qui bien que reconnaissable est d'une très mauvaise
qualité.
30