Introduction aux codes correcteurs
d’erreurs
Pierre Abbrugiati
23 janvier 2006
II
Table des matières
1 Introduction
2 Les trois principaux paramètres d’un code
2.1 Dimension et longueur d’un code . . . . . . . . . . . . . . . . . .
2.2 L’algorithme de décodage na¨ıf . . . . . . . . . . . . . . . . . . . .
2.3 Distance minimale d’un code . . . . . . . . . . . . . . . . . . . .
3 Généralités sur les codes linéaires
3.1 Définitions d’un code linéaire . . . . . . . . . . . . . . . . . . . .
3.2 Distance minimale d’un code linéaire . . . . . . . . . . . . . . . .
3.3 Matrice de contôle d’un code linéaire . . . . . . . . . . . . . . . .
3.4 Décodage d’un code linéaire . . . . . . . . . . . . . . . . . . . . .
4 Codes parfaits
4.1 Plusieurs définitions équivalentes . . . . . . . . . . . . . . . . . .
4.2 Caractérisation des codes parfaits linéaires . . . . . . . . . . . . .
5 Généralités sur les codes cycliques
(R)appels sur les polynômes . . . . . . . . . . . . . . . . . . . . .
5.1
5.2 Définitions d’un code cyclique . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . .
5.3 Codes cycliques vs codes systématiques
6 Codes BCH
6.1 Détermination des codes cycliques de longueur impaire . . . . . .
6.2 Les codes BCH primitifs stricts . . . . . . . . . . . . . . . . . . .
6.3 Un algorithme de décodage des codes BCH . . . . . . . . . . . .
1
3
3
4
6
9
9
10
11
13
17
17
18
21
21
22
25
27
27
29
30
III
Chapitre 1
Introduction
Par codes, on peut entendre plusieurs concepts bien distincts : cryptogra-
phie (RSA,...) ; codes de compression (Huffman,...) ; codes correcteurs d’erreurs.
Dans ce cours, on s’intéresse aux codes correcteurs d’erreur ; plus précisément à
la famille des codes en bloc.
Lorsqu’on envoie un message à travers un canal de transmission des données
(par exemple : en téléchargeant ce cours sur internet), des erreurs de trans-
mission peuvent se produire. Le but est d’arriver à détecter, voire corriger des
erreurs.
Notre modèle est le suivant :
– On considère que le message est une suite de bits...
– ... regroupés en blocs de k bits (k = 1, ou 4, ou 8, ou 256, etc.)
– ... et chaque bit a une probabilité p (cid:28) 1
2 donnée d’être inversé.
On se propose de ”coder” chaque bloc du message initial en un bloc plus gros
(avec des redondances d’information).
Exemple 1.1 Code par adjonction d’un bit de parité (8, 9)
On découpe notre message initial en blocs de 8 bits.
On transforme ensuite chaque bloc en un bloc de 9 bits en ajoutant un bit à la
fin de chaque bloc de telle sorte que la somme des bits des nouveaux blocs soit
toujours paire.
Si une erreur se produit, on peut la détecter, mais pas la localiser : on ne
peut pas corriger notre bloc, il faut recommencer la transmission. Si d’avantage
d’erreurs se produisent, on n’est même pas sûr de détecter le problème.
1
2
CHAPITRE 1. INTRODUCTION
Et donc... qu’attend-on d’un bon code ?
1. L’information ne doit pas être trop diluée.
2. On doit pouvoir détecter et corriger un nombre raisonnable d’erreurs.
3. L’algorithme de codage doit être suffisamment rapide.
4. L’algorithme de décodage (corrections incluses) doit être suffisamment
rapide.
Chapitre 2
Les trois principaux
paramètres d’un code
2.1 Dimension et longueur d’un code
Terminologie et notations préliminaires :
Un bloc de k bits sera indifféremment appelé bloc, mot ou vecteur.
L’ensemble des mots de k bits sera noté {0, 1}k.
On parlera indifféremment de bits ou de lettres.
Un mot m de k bits sera noté m1m2...mk, ou éventuellement
Remarque préliminaire :
Il y a 2k mots de k bits.
.
m1
...
mk
Le principe du codage est le suivant : après avoir découpé notre message en
blocs de k bits, on va appliquer un même algorithme sur chaque bloc :
a) ou bien en rajoutant des bits de contrôle à la fin de chaque bloc
b) ou bien en modifiant complêtement les blocs, mais en évitant que deux blocs
différents soient transformés en un même bloc.
D’où la définition suivante :
Définition 2.1 (codes (k, n))
Un code est une application injective φ : {0, 1}k → {0, 1}n
Le paramêtre k est appelé la dimension du code φ et le paramêtre n est appelé
la longueur du code : on dit que φ est un code de paramètres (k, n).
Si de plus pour tout mot m de {0, 1}k, m est un préfixe de φ(m) (c’est à dire
si l’application de φ consiste seulement à rajouter des bits de contrôle), on dira
que φ est un code systématique.
3
4 CHAPITRE 2. LES TROIS PRINCIPAUX PARAM ÈTRES D’UN CODE
Sauf mention contraire, tous les codes étudiés par la suite seront systématiques.
Définition 2.2 (image d’un code)
L’ensemble C = {φ(m), m ∈ {0, 1}k} est appelé l’image du code φ.
Les éléments de C sont appelés les mots de code de φ (en opposition aux
éléments ”originels” de {0, 1}k qui sont appelés mots de source).
Deux codes ayant la même image sont dits équivalents.
Exemple 2.3
a) Le code parité présenté dans l’introduction est un code de paramètres (8, 9).
On peut aussi former des codes de parité de paramètres (k, k + 1) pour tout
entier strictement positif k.
b) Exemple de code de paramètres (1, 3) : l’application
ment appelé code de répétition pure (1, 3))
(cid:26) 0 7→ 000
1 7→ 111
(logique-
2.2 L’algorithme de décodage na¨ıf
Attardons-nous sur le code de répétition pure (1, 3).
Que peuvent devenir les mots de code après erreur ?
P as d0erreur :
000
000
111
111
U ne erreur :
000
010
111
101
100
011
001
<yyyyyyyy
"EEEEEEEE
011
<yyyyyyyy
"EEEEEEEE
110
<yyyyyyyy
"EEEEEEEE
100
<yyyyyyyy
"EEEEEEEE
Deux erreurs :
000
101
111
010
110
001
T rois erreurs :
000
111
111
000
/
/
/
/
<
/
/
"
<
/
/
"
<
/
/
"
<
/
/
"
/
/
/
/
2.2. L’ALGORITHME DE D ÉCODAGE NAÏF
5
Si une, ou même deux erreurs se produisent, le mot reçu n’est pas un mot
de code, l’erreur est donc détectée.
Comment corriger ? Si le mot reçu n’est pas un mot de code, la probabilité qu’il
se soit produit une erreur est plus importante que la probabilité que deux er-
reurs aient eu lieu. Il est donc plus raisonnable de corriger par le mot de code
le plus ”proche”. On peut alors corriger une erreur, mais pas deux :
une erreur
001
<yyyyyyyy
"EEEEEEEE
000
010
100
011
110
<yyyyyyyy
"EEEEEEEE
000
101
correction /
000
000
000
111
111
echec
de la
correction /
111
une erreur
110
<yyyyyyyy
"EEEEEEEE
111
101
011
Publicité
100
001
<yyyyyyyy
"EEEEEEEE
111
010
correction /
111
111
111
000
000
echec
de la
correction /
000
deux erreur
une erreur
3 erreurs
000
111
3 erreurs
111
000
(erreurs non detectees)
En résumé, le code de répétition pure (1, 3) est tres satisfaisant vis a vis
des points 2 et 3, et satisfaisant vis a vis du point 4, mais inacceptable vis a
vis du point 1. Généralisons maintenant l’algorithme de décodage qu’on a mis
en oeuvre. On est amené à définir proprement cette notion de ”proximité” et
d´”éloignement”.
Définition 2.4 (Poids et distance de Hamming)
Soient m et m0 deux mots de {0, 1}k.
On appelle distance de Hamming entre m et m0, et on note d(m, m0) le
nombre de lettres distinctes de m et m0.
On appelle poids de m, et on note w(n) le nombre de lettres non nulles de m
(donc le nombre de bits de m égux à 1).
Anecdotiquement, on a les deux relations suivantes : d(m, m0) = w(m + m0) et
donc w(m) = d(m, 00...0), ou + désigne l’addition bit a bit (avec 1 + 1 = 0 . . .)
/
/
<
/
/
"
/
/
<
/
/
"
/
/
/
/
/
/
/
/
/
/
<
/
/
"
/
/
<
/
/
"
/
/
/
/
/
/
/
/
6 CHAPITRE 2. LES TROIS PRINCIPAUX PARAM ÈTRES D’UN CODE
Algorithme général de décodage (na¨ıf ) :
Etant donné le mot reçu r, on cherche le mot de code m qui réalise le minimum
de d(r, m), et on décode r par m
Cet algorithme souleve deux problemes :
a) Sa complexité est en O(n.2k). C’est acceptable si k est petit comme dans
le cas du code de répétition pure (1, 3), mais c’est impraticable dès que k est
grand. Or, pour satisfaire le point 1, il est clair que k doit être grand.
b) A priori, rien ne garantit que le mot de code qui réalise le minimum de d(r, m)
soit unique. C’est le cas du code de répétition pure (1, 3), mais les codes ayant
cette propriété (codes parfaits) sont très rares.
Dans les prochains cours, on élaborera donc des stratégies afin d’obtenir des
codes pour lesquels on a des algorithmes de décodage plus rapides.
2.3 Distance minimale d’un code
Définition 2.5
Soit φ un code d’image C.
On appelle capacité de détection de φ le plus grand entier ed tel qu’on soit tou-
jours capable de détecter ed erreurs ou moins.
On appelle capacité de correction de φ le plus grand entier ec tel qu’on soit tou-
jours capable de corriger ec erreurs ou moins.
On appelle distance minimale de φ et on note dφ (ou dC) la plus petite distance
non nulle entre deux mots de code.
On a ec = dφ − 1 et ec = b dφ−1
2 c
Notation :
La distance minimale d’un code quantifie donc sa qualité vis à vis du point 1.
C’est un paramètre important. En abrégé, ”un code de dimension k, de longueur
n et de distance minimale d” se dira ”un code de paramètres (k, n, d)” ou même
”un code (k, n, d)”.
Exemple 2.6 (code de répétition pure (1, 3))
Prenons l’exemple où φ est le code de répétition pure (1, 3).
Son image est C = {000, 111} donc sa distance minimale dφ est d(000, 111) = 3
On retrouve bien ed = dφ − 1 = 2 et ec = b dφ−1
2 c = 1 comme attendu.
2.3. DISTANCE MINIMALE D’UN CODE
7
Exemple 2.7 (code par bit de parité (8, 9))
Prenons maintenant l’exemple où φ est le code par bit de parité (8, 9).
Son image C a 28 = 256 éléments. Il est donc exclu de comparer tous les mots
de code distincts : il nous faudrait faire 9 ∗ C 2
Néanmoins, on peut établir que sa distance minimale dφ est 2.
256 = 293760 comparaisons !
Démonstration :
· 000000000 et 000000011 appartiennent à C (ce sont les deux premiers mots de
code) donc la distance minimale dφ vérifie dφ ≤ d(000000000, 000000011) = 2.
· Prenons deux mots de code distincts. Ils s’écrivent a1...a8p et a0
8p0 avec
p = a1 + ... + a8 et p0 = a0
– ou bien d(a1...a8, a0
– ou bien d(a1...a8, a0
8. Alors de deux choses l’une :
8p0) ≥ 2
8) ≥ 2 et alors a fortiori d(a1...a8p, a0
8) = 1, c’est à dire qu’il y a exactement une lettre
8, et donc que p = a1 +...+a8 6=
8p0) = 2
1...a0
de différence entre les mots a1...a8 eta0
1 + ... + a0
a0
8 = p0 ; il s’ensuit alors que d(a1...a8p, a0
1 + ... + a0
1...a0
1...a0
Cette analyse montre que dans tous les cas on a d(a1...a8p, a0
donc que la distance minimale dφ vérifie dφ ≥ 2.
· En conclusion, dφ = 2.
On retouve alors comme prévu ed = dφ − 1 = 1 et ec = b dφ−1
8p0) ≥ 2, et
1...a0
1...a0
1...a0
1...a0
2 c = 0
8 CHAPITRE 2. LES TROIS PRINCIPAUX PARAM ÈTRES D’UN CODE
Chapitre 3
Généralités sur les codes
linéaires
3.1 Définitions d’un code linéaire
Définition 3.1 (code linéaire)
Un code φ de paramètres (k, n) est dit linéaire s’il existe une matrice G ∈
Mn,k(F2) (c’est a dire avec n lignes, k colonnes, a coefficients dans {0, 1}), de
rang k, telle que ∀m ∈ {0, 1}k, φ(m) = G × m.
La multiplication matricielle est a comprendre dans F2 (c’est a dire modulo
2) et le mot m est ici considéré comme un vecteur colonne. La condition sur le
rang traduit l’injectivité de φ.
La matrice G est appelée matrice génératrice de φ.
Enfin, dire que le code φ est systématique, c’est dire que la matrice G est le
la forme
, où Ik est la matrice identité d’ordre k.
(cid:19)
(cid:18) Ik
G0
Exemple 3.2
a) Considérons φ, code linéaire de matrice génératrice
1
0
1
1
0
1
0
1
C’est un code de dimension 2, de longueur 4, donné par le tableau :
φ(x)
x
00 0000
01 0101
10 1011
11 1110
b) Tous les codes rencontrés jusqu’à présent, exception faite du code du td 1,
exercice 3, sont linéaires.
9
(cid:19)
I8
1 . . . 1
1
1
1
10
CHAPITRE 3. G ÉN ÉRALIT ÉS SUR LES CODES LIN ÉAIRES
(cid:5) Pour le code de bit de parité (8, 9), la matrice génératrice est
(cid:18)
(cid:5) Pour le code de répétition pure (1, 3), la matrice génératrice est
(cid:5) Pour le code du td 1, exercice 4, la matrice génératrice est
0
0
1
0
1
1
Le caractère systématique de ces codes se lit sur la matrice génératrice.
1
0
0
1
0
1
0
Publicité
1
0
1
1
0
c) Un code de Hamming systématique de paramètres (4, 7) est le code
linéaire a1a2a3a4 7→ a1a2a3a4b5b6b7 avec b5 = a1 + a2 + a3, b6 = a1 + a2 + a4,
b4 = a1 + a3 + a4. Comme on le verra par la suite, il y a d’autres codes de Ham-
ming systématiques de parametres (4, 7) : un tel code consite en fait a rajouter à
a1a2a3a4 trois bits de parité correspondant à trois choix distincts de 3 éléments
parmi a1, a2, a3, a4. La matrice génératrice de celui-ci est :
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1
1 1 1 0
1 1 0 1
1 0 1 1
On peut déjà remarquer que les codes linéaires se comportent de façon satis-
faisante (mais sans plus) vis à vis du point 3 : l’algorithme de codage est en
effet une multiplication matricielle, dont le coût est en O(n × k), et même en
O((n − k) × k) dans le cas d’un code systématique.
3.2 Distance minimale d’un code linéaire
Les codes linéaires sont également intéressants car on dispose d’informations
sur leur distance minimale. Tout d’abord, par définition, dire qu’un code φ de
paramêtres (k, n) est linéaire, c’est exactement dire que φ est une application
linéaire injective de {0, 1}k dans {0, 1}n. D’où la propriété suivante :
Remarque 3.3
Soit φ un code linéaire. Alors son image C est un sous-espace vectoriel de {0, 1}n
Autrement dit
−→
0 ∈ C et ∀m, m0 ∈ C, m + m0 ∈ C.
On en déduit le sympatique corollaire suivant :
3.3. MATRICE DE CONT ÔLE D’UN CODE LIN ÉAIRE
11
Proposition 3.4 (distance minimale d’un code lináire)
Soit φ un code linéaire d’image C.
Alors la distance minimale de φ dφ est égale au plus petit poids non nul d’un
mot de C.
Démonstration : La distance minimale est le plus petit élément non nul de
l’ensemble des distances entre deux mots de code. Il suffit donc de montrer que
cet ensemble co¨ıncide avec l’ensemble des poids des mots de code. Tout d’abord,
tout poids est une distance car w(m) = d(m, 0...0). Ensuite, toute distance est
un poids car d(m, m0) = w(m + m0) et si m, m0 ∈ C on a aussi m + m0 ∈ C.
Dans le cas d’un code de dimension 3 ou 4, ce critère permet de calculer beau-
coup plus facilement la distance minimale. Par exemple, on peut voir que le
code de Hamming proposé précédemment est de distance minimale 3, donc 1-
correcteur. Mais ce calcul reste coûteux en général.
On dispose d’autres critères sur la distance minimale des codes linéaires. Celui
qui suit donne la limite de ce qu’on peut espérer :
Définition 3.5 (borne de Singleton)
La distance minimale d d’un code linéaire de dimension k et de longueur n
vérifie d ≤ n + 1 − k.
Un code pour lequel on a égalité est dit MDS (Maximum Distance Separable).
Démonstration : (un peu technique, n’est pas à comprendre)
D’après 3.4, il suffit d’exhiber dans C un vecteur non nul de poids inférieur ou
égal à n + 1 − k. Par exemple, s’il existe dans C un mot non nul dont les k − 1
dernières composantes sont nulles, le résultat est acquis.
Mais justement ! Considérons l’ensemble E des mots dont les k − 1 dernières
composantes sont nulles : c’est un sous-espace vectoriel de dimension n − k − 1
de {0, 1}n. Pour sa part, C est un sous-espace vectoriel de dimension k. On a
donc dim(C) + dim(E) = n + 1 > n et donc C ∩ E contient au moins un élément
non nul.
On peut encore avoir un autre critère sur la distance minimale d’un code
linéaire : il est donné par la matrice de contrôle du code.
3.3 Matrice de contôle d’un code linéaire
L’intérêt principal de ne considérer que des codes linéaires est qu’ils disposent de
meilleurs algorithmes de décodage. On utilise pour cela les matrices de contrôle.
12
CHAPITRE 3. G ÉN ÉRALIT ÉS SUR LES CODES LIN ÉAIRES
Définition 3.6 (Matrice de contrôle)
Soit φ un code linéaire (k, n) de matrice génératrice G.
On appelle matrice de contrôle de φ toute matrice H ∈ Mn−k,n (c’est à dire
avec n colonnes et n − k lignes) telle que H.m =
−→
0 ⇔ m ∈ C.
L’existence de matrices de contrôle pour n’importe quel code linéaire φ n’étonnera
pas les spécialistes de l’algèbre linéaire : H n’est rien d’autre qu’une matrice dont
le noyau est l’image de G. Il est clair que de telles matrices existent toujours.
Au passage, comme le noyau de H est C, H contient assez d’information pour
reconstituer φ a équivalence pres.
En revanche, on remarque que H n’est pas unique en général (par exemple, en
permutant deux lignes d’une matrice de contrôle, on obtient encore une matrice
de contrôle).
Etant donné la matrice génératrice G d’un code φ, se donner une matrice de
contrôle H, c’est se donner une base de l’orthogonal de C dans {0, 1}n, ce qui
n’est pas évident.
L’opération inverse est plus facile : étant donné une matrice de contrôle H,
se donner la matrice génératrice G d’un code φ correspondant revient à se don-
ner une base du noyau de H.
Le théoreme suivant donne un critere très simple pour déterminer une ma-
trice de contrôle d’un code systématique.
Théorème 3.7 (matrice de contrôle d’un code systématique)
Soit φ un code systématique de matrice génératrice
Alors la matrice H = (cid:0) G0
In−k
(cid:1) est une matrice de contrôle de G.
(cid:18) Ik
G0
(cid:19)
.
Exemple 3.8
a) Une matrice de contrôle du code de bit de parité (8, 9) est (cid:0) 1
b) Une matrice de contrôle du code de répétition pure (1, 3) est
1
1
1
1 (cid:1).
1
1
(cid:18) 1
0
1
0
1
1
1
1
(cid:19)
a la premiere section est
c) Une matrice de contrôle du code du code de Hamming systématique présenté
0
1
1
cette matrice consiste simplement à écrire en colonne tous les mots de 3 bits.
Une autre énumétation aurait correspondu à un autre code de Hamming (7, 4).
. On pourra remarquer que
0
1
0
1
1
1
1
0
1
0
0
1
1
0
0
1
1
0
3.4. D ÉCODAGE D’UN CODE LIN ÉAIRE
13
Proposition 3.9 (distance minimale et matrice de contrôle)
Soit φ un code linéaire de matrice de contrôle H.
Alors dφ est le nombre minimal de colonnes de H linéairement dépendantes.
Par exemple :
– Si H a une colonne nulle, on a dφ = 1
– Sinon, et si H a deux colonnes identiques, on a dφ = 2
– Sinon, et si une colonne de H est égale à la somme de deux autres, on a
dφ = 3, etc.
Démonstration : Il suffit de se rappeler que les colonnes de H forment une
base de son image, donc de ker(G) = C, et d’invoquer 3.4.
Remarquons qu’avec ce lemme on peut retrouver que le code de Hamming
présenté plus haut a bien pour distance minimale 3.
3.4 Décodage d’un code linéaire
Définition 3.10 (Mot erreur et syndrome)
Soit φ un code de paramètres (k, n), de matrice génératrice G et de matrice de
contrôle H. On se fixe un mot de source X (mot de longueur k). Le mot de
code correspondant sera φ(X) = Y . Il y a éventuellement des erreurs durant la
transmission et on reçoit le mot Z.
On appelle mot erreur associé à Z le mot E = Z + Y .
On appelle syndrome de Z le mot H × Z.
On note Ei le mot ne contenant que des 0, sauf en position i.
Quelques commentaires sur cette définition :
Comme E = Y + Z, on a Z = Y + E, et donc E quantifie bien les erreurs surve-
nues sur Y : par exemple, w(E) est le nombre d’erreurs survenues. Le problème
du décodage peut se reformuler : ”trouver E”, car alors on déduit Y .
Bien sûr, ce ”trouver E” est à comprendre dans le sens ”trouver E le plus pro-
bable”, c’est à dire ”trouver E de poids minimal”.
Dire que le syndrome de Z est nul, c’est dire que Z est un mot du code : dans
ce cas le mot erreur le plus probable est le mot nul.
Remarque 3.11
Soit Z un mot de syndrome S.
Alors E est aussi de syndrome S car H × E = H × (Z + Y ) = H × Z + H × Y
et Y est un mot du code.
L’ensemble des mots de syndrome S est appellé classe lattérale de Z.
Le problème de décodage se reformule donc : ”trouver le mot de plus petit poids
dans la classe lattérale de Z”.
... s’il existe !
14
CHAPITRE 3. G ÉN ÉRALIT ÉS SUR LES CODES LIN ÉAIRES
Par exemple :
(cid:5) Dire que le mot nul est dans la classe lattérale de Z, c’est dire que le syn-
drome S = H × Z est nul. Dans ce cas, le mot de poids minimal dans la classe
lattérale de Z est le mot nul, il faudra donc corriger Z par φ−1(Z).
(cid:5) Supposons donc que le syndrome de S = H × Z est non nul. Dire qu’il existe
un mot de poids 1 dans la classe lattérale de Z, c’est dire que le syndrome S
est égal à une colonne Ci de H. Dans ce cas, s’il existe une seule colonne Ci de
H égale au syndrome, le mot de poids minimal dans la classe lattérale de Z est
Ei, il faudra donc corriger Z par φ−1(Z + Ei), où Ei est le mot ne contenant
que des zéros, sauf en position i.
(cid:5) Supposons donc que le syndrome de S = H × Z est non nul, et distinct
de toutes les colonnes de H. Dire qu’il existe un mot de poids 2 dans la classe
lattérale de Z, c’est dire que le syndrome de Z est égal à la somme de deux
colonnes Ci1 + Ci2 de H. Dans ce cas, et si c’est la seule façon d’obtenir le syn-
drome comme somme de deux colonnes de H, le mot de poids minimal dans la
classe lattérale de Z est Ei1 + Ei2, il faudra donc corriger Z par φ−1(Ei1 + Ei2).
... un algorithme prend forme !
Dans ce qui précède, le point délicat est l’unicité ”du” mot de poids minimal
Publicité
dans la classe lattérale de Z. Par exemple, si deux colonnes Ci et Cj de H sont
égales a S = H ×Z, on ne sait pas corriger. Pour commencer, faisons l’hypothese
que ce cas de figure ne se produira jamais. Il suffit pour cela de renoncer à corri-
ger au delà de la capacité de correction, car un mot de poids p ≤ ec peut s’écrire
au plus d’une seule façon comme somme de colonnes de H.
Algorithme de décodage des codes linéaires, 1ere version :
C’est un algorithme de décodage en deçà de la capacité de correction,
donc non optimal (sauf si le code est parfait).
Etape 1) : on calcule S = H × Z
Etape 2) : si S =
−→
0 , on décode Z par φ−1(Z), sinon, on initialise p à 1
Etape 3) : (cid:5) Si il existe p colonnes de H Ci1, Ci1,
Ci1 + Ci1 + . . . + Cip, on décode par φ−1(Z + Ei1 + Ei1 + . . . + Eip)
(cid:5) Sinon, et qu’on a p < ec, on incrémente p et on recommence l’étape 3)
(cid:5) Sinon, et donc qu’on a p = ec, on passe à l’étape 4)
. . . , Cip telles que S =
Etape 4) : échec du décodage
3.4. D ÉCODAGE D’UN CODE LIN ÉAIRE
15
Remarque : Les étapes 2) et 3) peuvent fusionner (on initialise p à 0).
L’étape 1) a un coût en O(n × (n − k)).
L’étape 2) a un coût en O(n).
A p fixé, l’étape 3) a un coût en O(C n
p ×p×(n−k)), donc en O(p×(n−k)×np).
Finalement, la complexité de cet algorithme est en O(ec × nec+1 × (n − k)),
ce qui est loin d’être terrible, même si c’est déjà beaucoup mieux que la com-
plexité exponentielle de l’algorithme na¨ıf (si k est grand).
Comment souvent, on peut faire mieux en convertissant une partie de la com-
plexité temporelle en complexité spatiale. En effet, on peut une bonne fois pour
toutes calculer, pour tout p ≤ ec, toutes les sommes possibles de p colonnes de
H, les trier par ordre lexicographique et leur associer le mot erreur E corres-
pondant. Le calcul de toutes les sommes dans l’étape 3) est alors remplacé par
une recherche dichotomique, de coût O(p).
Algorithme de décodage des codes linéaires, 2eme version :
Le même, mais avec un prétraitement consitant à calculer pour tout p ≤ ec
toutes les sommes possibles de p colonnes de H, à les trier par ordre lexicogra-
phique et leur associer le mot erreur E correspondant (par exemple à la somme
de C1 et C3 est associé E = 10100...).
Le coût du prétraitement est en O(ec × nec+1 × (n − k)).
L’algorithme a de plus une complexité en espace en O(ec × nec+1 × (n − k))
La complexité temporelle de l’algorithme lui-même est en O(n × (n − k))
Le défaut non réglé est le caractère non optimal de ces algorithmes. Une
troisieme version, dont la complexité en espace est en O(2n−k), regle ce problème.
16
CHAPITRE 3. G ÉN ÉRALIT ÉS SUR LES CODES LIN ÉAIRES
Algorithme de décodage des codes linéaires, 3eme version :
Précalcul : pour tous les syndromes possibles (les 2n−k mots de longueur n − k),
on calcule le mot de poids minimal de la classe lattérale associée, ce qui nous
donne un tableau de taille (2n−k) (le ie élément est le mot de poids minimal
de la classe lattérale dont le syndrome est i écrit en base 2, s’il existe ; et un
symbole d’échec sinon).
Etape 1) : on calcule S = H × Z et i dont S est l’écriture en base 2
Etape 2) : on selectionne le ie élément E du tableau
Etape 4) : on corrige par φ−1(Z + E)
Le coût de cet algorithme est en O(n × (n − k)), mais la complexité en espace
est très importante, et surtout le précalcul n’est pas réalisable si n est vraiment
grand, car il est en O(n.2n).
Cet algorithme peut être optimisé, en proposant par exemple que s’il y a
plusieurs mots de poids minimal dans une classe lattérale, on choisisse celui, s’il
existe, pour lequel les erreurs sont le mieux groupées.
Chapitre 4
Codes parfaits
4.1 Plusieurs définitions équivalentes
Définition 4.1 (Sphères, boules)
Soit m ∈ {0, 1}n et k ∈ N.
On appelle sphère de centre m et de rayon k, et on note S(m, k), l’ensemble
des mots de {0, 1}n à distance k de m : S(m, k) := {r ∈ {0, 1}n, d(r, m) = k}.
On appelle boule de centre m et de rayon k, et on note B(m, k), l’ensemble
des mots de {0, 1}n a distance inférieure ou égale a k de m :
B(m, k) := {r ∈ {0, 1}n, d(r, m) ≤ k}.
Proposition 4.2 (Cardinal d’une sphère, d’une boule)
Le nombre d’éléments d’une sphère et d’une boule sont donnés par les formules
|S(m, k)| = C k
n
et
|B(m, k)| =
k
X
i=0
C i
n
Remarque : Soit φ un code de capacité de correction ec
(cid:5) Les boules centrées en les mots du code, de rayon ec, sont disjointes
(cid:5) ec est par définition le plus grand entier tel que les boules centrées en les mots
du code de rayon ec soient disjointes, ou autrement dit : des boules centrées en
les mots du code de rayon k sont disjointes si et seulement si k ≤ ec.
Proposition 4.3 (Inégalité de Hamming)
Soit φ un code de paramètres (k, n), d’image C, de capacité de correction ec.
Alors on a :
ecX
C i
n ≤ 2n−k
i=0
17
18
CHAPITRE 4. CODES PARFAITS
Et on appelle cette propriété l’inégalité de Hamming.
Démonstration : On utilise la remarque précédente. L’union des boules de rayon
ec centrées en des mots de code est incluse dans {0, 1}n , et cette réunion
est disjointe, d’où P
m∈C |B(m, ec)| ≤ |{0, 1}n|, enfin, toutes les 2k boules on
n, ce qui donne 2k Pec
le même nombre d’éléments Pec
n ≤ 2n, d’où
l’inégalité cherchée.
i=0 C i
i=0 C i
Définition 4.4 (Codes parfaits)
Soit φ un code de paramètres (k, n), de capacité de correction ec. On dit que φ
est un code parfait s’il vérifie une des trois caractérisations équivalentes sui-
vantes :
(cid:5) Les boules de rayon ec de centre les mots du code forment une partition de
{0, 1}n
(cid:5) φ vérifie le cas d’égalité de l’inégalité de Hamming Pec
que φ vérifie l’égalité de Hamming)
(cid:5) Pour tout mot r ∈ {0, 1}n, il existe un unique mot de code m qui réalise le
minimum de d(r, m)
n = 2n−k (on dit
i=0 C i
4.2 Caractérisation des codes parfaits linéaires
Comme promis, montrons que les codes parfaits sont rares.
Commençons par un exemple.
Définition 4.5 (Codes de Hamming)
Soit m ≤ 2 un entier.
Un code de Hamming est un code de paramètres (2m − m − 1, 2m − 1) dont
une matrice de contrôle est obtenu par n’importe quelle énumération en colonne
de tous les mots de m bits non nuls.
Je sais que vous allez rigoler, mais le minitel (vous savez, ce vieux truc qu’utili-
saient nos trisa¨ıeuls) code ses données avec un code de Hamming étendu par bit
de parité de paramètres (27 − 7 − 1, 27 − 1 + 1) = (120, 128) (on code 15 octets
a l’aide d’un octet supplementaire).
Proposition 4.6 (Distance minimale d’une code de Hamming)
Un code de Hamming a toujours pour distance minimale 3.
Démonstration : Par définition, la matrice de contrôle d’un tel code n’a pas de
colonne nulle donc d ≥ 2 et n’a pas deux colonnes identiques donc d ≥ 3 ; enfin
en faisant la somme de deux colonnes contenant exactement un seul 1 on obtient
un vecteur contenant exactement deux 1, donc une autre colonne, d’où d = 3
4.2. CARACT ÉRISATION DES CODES PARFAITS LIN ÉAIRES
19
Remarque : Un code linéaire de paramètres (2m − 1, 2m − m − 1, 3) est
nécessairement un code de Hamming. En effet, une matrice de contrôle H d’un
tel code doit avoir 2m lignes et m − 1 colonnes, donc contient en colonne des
vecteurs de Fm
2 . Comme d > 1, aucun vecteur colonne de H n’est nul, comme
d > 2, aucun vecteur colonne n’apparaˆıt deux fois. Finalement, il nous faut
placer en colonne m − 1 vecteurs non nuls et distincts de Fm
2 . Comme il y en a
précisément m − 1, il faut tous les mettre et le code considéré est un code de
Hamming.
Posons-nous maintenant la question de trouver tous les codes parfaits de
capacité de correction 1.
Comme les codes parfaits vérifient l’égalité de Hamming, les paramètres d’un
code parfait de capacité de correction 1 doivent vérifier P1
n = 2n−k c’est à
dire 1 + n = 2n−k. Posons m := n − k, on a alors 1 + n = 2m, donc n = 2m − 1
et k = n − m = 2m − m − 1.
i=0 C i
En définitive un code parfait de capacité de correction 1 a nécessairement
les paramètres d’un code de Hamming ; et un code parfait linéaire de capacité
de correction 1 est toujours un code de Hamming (selon la remarque).
Terminons enfin ce chapitre avec un théoreme (a admettre...) qui clos le
débat sur les codes parfaits.
Théorème 4.7 (Codes parfaits linéaires)
Les seuls codes parfaits linéaires (binaires) sont :
– les codes de répétition pure (1, 2ec + 1)
– les codes de Hamming
– le code de Golay G23
Le code de Golay est un code de paramètres (12, 23, 7) sur lequel nous re-
viendrons.
(Véridique : il est tombé à l’examen).
20
CHAPITRE 4. CODES PARFAITS
Chapitre 5
Généralités sur les codes
cycliques
5.1 (R)appels sur les polynômes
Définition 5.1 (Polynômes à coefficients dans F2)
Un polynôme à coefficients dans F2 est une fonction de la forme P (X) =
a0 + a1X + a2X 2 + ... + anX n avec ∀i ∈ {0, ..n}, ai ∈ F2
Si an 6= 0, l’entier n est appelé le degré du polynôme P et noté deg(P ) ; les
entiers ai sont appelés les coefficients de P ; par convention le polynôme nul est
considéré comme étant de degré −∞.
Remarque : (identité remarquable des maternelles)
Le fait de travailler dans F2 nous simplifie grandement la vie.
Par exemple, on a toujours (a + b)2 = a2 + b2
Proposition 5.2
Soit P un polynôme à coefficients dans F2.
Alors P (X 2) = P (X)2
Définition 5.3 (racines)
Soit P un polynôme à coefficients dans F2 et a ∈ F2.
On dit que a est une racine de P lorsque P (a) = 0
Exemple 5.4
(cid:5) Le polynôme X 2 + X a pour racines 0 et 1
(cid:5) Le polynôme X 8 + 1 a pour racine 1 et peut se réécrire (X + 1)8
(cid:5) Le polynôme X 2 + X + 1 n’a pas de racine dans F2. Si l’on veut à tout prix
qu’il ait des racines, il faudra ”imaginer” de nouveaux éléments qui ne sont pas
21
22
CHAPITRE 5. G ÉN ÉRALIT ÉS SUR LES CODES CYCLIQUES
dans F2, de la même façon qu’on construit le corps des nombres complexes en
”imaginant” un nouveau nombre i tel que i2 = −1
Définition 5.5 (factorisation, irreductibilité)
Soit P un polynôme à coefficients dans F2.
(cid:5) S’il existe deux polynômes P1 et P2 tels que P = P1P2, on dira que P1 et P2
divisent P , ou encore que P1 et P2 sont des diviseurs de P . Dans ce cas on
a nécessairement deg(P1) + deg(P2) = deg(P )
(cid:5) S’il existe deux polynômes P1 et P2 tels que deg(P1) ≥ 1, deg(P2) ≥ 1 et
P = P1P2 alors on dit que P1P2 est une factorisation de P .
(cid:5) Si P n’a pas de factorisation, P est dit irréductible
Proposition 5.6 (division euclidienne)
Soient P1 et P2 deux polynômes à coefficients dans F2.
Alors il existe deux polynômes à coefficients dans F2 Q et R, uniques, tels que
P1 = P2 × Q + R et deg(R) < deg(P2)
Q est appelé le qutient de la division euclidienne de P1 par P2 et R le reste.
5.2 Définitions d’un code cyclique
Attention ! A partir de maintenant, les codes considérés ne seront plus nécessairement
systématiques (même si on s’efforcera de repérer et d’étudier ceux qui le sont).
De plus, on considerera désormais les codes ”a équivalence pres”, c’est a dire
qu’on identifiera deux codes qui ont la même image, c’est à dire qu’on identifiera
un code à son image.
Définition 5.7 (code cyclique)
Soit C l’image d’un code de paramètres (k, n).
Le code est dit cyclique si l’ensemble des mots du code est stable par décalage
circulaire.
En d’autres termes, notons σ(m1m2...mn−2mn−1mn) = mnm1m2...mn−2mn−1.
Un code (d’image) C est cyclique si ∀m ∈ C, σ(m) ∈ C.
Exemple 5.8 (Fort heureusement...)
La plupart des principaux codes étudiés jusqu’à présent sont cycliques.
Explicitement :
(cid:5) Les codes de répétition pure (k, n) sont cycliques.
(cid:5) Le code par bit de parité est cyclique.
(cid:5) Le code de Hamming systématique (7, 4) du chapitre 3 est cyclique.
(cid:5...