Cours (Intro)
Cours (Intro)
i i
i i
ii
Table des matières
i i
i i
Chapitre 1
I NTRODUCTION À LA TH ÉORIE ALG ÉBRIQUE DES CODES
CORRECTEURS D ’ ERREURS
a théorie des codes correcteurs d’erreurs a été introduite dans les années 1940 par Richard
L Hamming qui a proposé la notion de codes correcteurs d’erreurs, puis par Claude Shannon
qui a formalisé mathématiquement la théorie de l’information.
La théorie des codes a pour but, lors d’un envoi d’informations sur un canal sous forme
digitale (une suite de bits), de protéger cette information contre des dégradations extérieures
liées au canal. Plus précisément, si lors d’une transmission des bits sont modifiés, on souhaite
être capable de les retrouver et de les corriger, cette dernière opération étant appelée décodage.
Les applications sont très nombreuses puisque les codes correcteurs sont présents dans toute
utilisation nécessitant la sécurisation d’informations contre une dégradation extérieure ; on peut
citer par exemple les communications satellites, les modems, les CD ou DVD (rayures), la
télévision haute définition, etc. Mais les codes correcteurs sont aussi liés à d’autres parties des
mathématiques comme la combinatoire, la théorie des groupes ou la théorie des réseaux. Ainsi
il s’agit d’un champs disciplinaire ayant beaucoup de connexions avec des domaines très variés,
allant du plus théorique au plus pratique.
Concrètement, on procède par le schéma général (simplifié) suivant :
Une information (un message M) est considérée comme une suite de k bits {0, 1} à laquelle
on va ajouter une redondance de r bits (encodage) pour former un mot du code. L’idée est que
l’ajout de redondance permet de pallier des erreur (des bits à 1 qui 2.#$%&'()
se transforment en 0 ou
!"#$%&'()
34343) lors de
inversement) du !"
34343
l’envoi du mot /,",0)
code sur le canal.33!433) 5%.6&' !((&'()
*&++,-&) *&++,-&) *&++,-&)
Un exemple !"#$%&'()
*&++,-&) simple de code détecteur
&"#$%.)
/,",0)
d’erreurs est le code
(&1')de 2.#$%&'()
()%7&((&'(8)
parité : à une séquence de bits,
%.#$%.)
on ajoute un bit de redondance de sorte que la somme soit paire. De cette façon, si un bit est
modifié, on est capable de le voir puisque la somme des bits n’est plus paire. On dit qu’il s’agit
d’un code 1-détecteur d’erreurs car33333) 3"33") simplement 1 erreur au plus :
on est capable de détecter
343) !"#$%&'() 44444) /,",0) 444!4) 2.#$%&'() 343)
33333" 33"33"
2.#$%&'()
34343) !"#$%&'() 34343!" /,",0) 3!3433) 5%.6&'() !((&'()
4)3)!) 4)3)3)
43) %7&((&'(8) 43)
!"#$%&'() 3)3)#) /,",0) 3)"#4) 2.#$%&'() 33)
33) 3)4)4))))))))))))"
!)#)4))))))))))))"
Dans ce cas, on est capable de deviner qu’il y a une erreur dans le message reçu, mais on ne
33333) 3"33")
peut pas 343)
savoir à quel!"#$%&'()
endroit. Il est44444)
possible, comme /,",0) on va le voir, de2.#$%&'()
444!4) faire mieux et de
343)corriger
les erreurs. 33333" 33"33"
Il existe divers types de canaux sur lesquels on peut envoyer une information. En fonction
du contexte et du canal, on pourra modéliser
4)3)!) le type d’erreurs
4)3)3) de manière différente. Le canal le
plus simple 43)est le canal binaire symétrique, où l’on considère 43)
p fixe de
!"#$%&'() 3)3)#) /,",0) 3)"#4)une probabilité
2.#$%&'()d’erreur33)
33) donc" 1 − p la probabilité "
3)4)4))))))))))))qu’un
transformation de 0 en 1 ou de 1 en 0, !)#et
)4)))))))))))) bit ne soit pas modifié.
On considère toujours une probabilité d’erreur p < 0, 5.
En pratique, p sera petit et le taux d’erreur que l’on voudra corriger dépendra des applications
considérées. Par exemple, pour la transmission de la voix humaine, on tolérera un taux d’erreur
i i
i i
de 10−4 (une erreur tous les 10 000 bits). Pour beaucoup d’applications, on demande un taux
d’erreurs de l’ordre de 10−6 , mais cela peut descendre à 10−9 ou moins pour des applications
très précises : par exemple, si l’on envoie un texte chiffré, on veut que la probabilité d’erreur soit
Partie . TABLE DES MATIÈRES
très faible pour être capable de le déchiffrer. Inversement, dans des contextes liés à des attaques
cryptographiques, on peut chercher à décoder des taux d’erreurs proches de 0, 5.
Remarque. En pratique, le canal binaire est rarement utilisé car il est peu réaliste. On utilise
souvent une modélisation dite canal à bruit blanc additif gaussien (BBAG) (avec le même type de
codes), dont l’exposition dépasse ce cours. Il existe aussi d’autres types de canaux correspondant
à diverses modélisations comme le canal à effacement, qui modélise le fait que, sur Internet, il
arrive que des paquets se perdent et donc que l’on obtienne des mots non plus avec des erreurs,
mais avec des effacements (les parties manquantes), ou encore le canal à évanouissement, où les
*&++,-&)
erreurs sur une coordonnée sont liées aux coordonnées adjacentes.
*&++,-&) *&++,-&) *&++,-&)
7) !"#$%&'() .$%/)
.,",0) 1(,"+23+)
4/#$%&'() 5&6')
8(,"+2&9(&)
Exemple 1.1. Supposons une probabilité d’erreur de 0, 1 sur un canal binaire symétrique ; la
probabilité d’envoyer 4 bits sans erreur est alors 0, 94 ≈ 0, 65, ce qui montre que la probabilité
de ne pas avoir d’erreur sur un message décroît rapidement.
On peut remarquer que le problème de la correction d’erreurs peut être très facilement résolu
:;:;:)
par la répétition !"#$%&'()
: ainsi d’un!"message
chaque bit :;:;: .,",0)
va être::!;::) 4/#$%&'()
répété k fois !((&'()un bit en
et l’on décodera
prenant simplement la valeur qui apparaît le plus souvent (décodage à la majorité) :
:::::) :"::")
:;:) !"#$%&'() ;;;;;) .,",0) ;;;!;) 4/#$%&'() :;:)
:::::" ::"::"
*&++,-&)
*&++,-&) *&++,-&) *&++,-&)
De cette 7) manière,!"#$%&'()
quitte à augmenter .,",0) répétitions, 4/#$%&'()
.$%/) le nombre de1(,"+23+) on peut arriver5&6')
à gérer to-
8(,"+2&9(&)
talement l’erreur. Mais cette solution est désavantageuse en termes de coût de communication
(nombre de bits à envoyer pour un message donné). Soient m le nombre de bits du message et
r la taille de la redondance en bits. La longueur du mot de code envoyé est alors n = k + r.
La théorie des codes consiste alors à trouver des codes tels que le nombre d’erreurs qui peut
être corrigé !"#$%&'()
:;:;:)est le plus !" à .,",0)
:;:;:avec
grand possible la fois un::!;::) 4/#$%&'() k/n !((&'()
taux de transmission le plus élevé
possible.
Voyons comment généraliser le principe du code de parité de façon à obtenir un code correc-
:::::) :"::")
teur. On suppose que l’on a 4 bits ;;;;;)
à envoyer auxquels on va ajouter 4 bits de parité (deux en
:;:) !"#$%&'() .,",0) ;;;!;) 4/#$%&'() :;:)
horizontal et deux en vertical) : :::::" ::"::"
;):)!) ;):):)
;:) ;:)
!"#$%&'() :):)#) .,",0) :)"#;) 4/#$%&'() ::)
::) :););))))))))))))"
!)#);))))))))))))"
S’il y a une erreur (et une seule) dans la transmission, on peut retrouver sa position en
calculant les bits de parité horizontaux et verticaux du message transmis. Ici, on mesure une
erreur sur le second bit de parité horizontal et sur le second bit de parité vertical ; on en déduit
que c’est (probablement) le quatrième bit du message originel qui a été transmis avec une erreur,
et on le corrige donc.
On obtient ainsi un code de longueur 8 qui est capable de corriger une erreur. Pour ce code, on
k
a k = 4, r = 4 et un taux de transmission de k+r = 1/2.
i i
i i
d3
p1 p2
d4
d2 d1
p3
Supposons que l’information soit représentée par les bits d1 , d2 , d3 , d4 ; on ajoute les bits de
parité p1 , p2 , p3 tels que les sommes p1 + d2 + d3 + d4 , d1 + p2 + d3 + d4 et d1 + d2 + p3 + d4
soient paires.
Test 1.2.
Montrer que ce code peut corriger une erreur.
i i
i i
Définition 1.4. (Matrice génératrice) Une matrice génératrice d’un code linéaire C est une
matrice dont les vecteurs lignes forment une base de l’espace vectoriel C.
Bien entendu, un code admet autant de matrices génératrices que de bases.
Remarque.
1. En théorie des codes, les vecteurs générateurs de la base sont notés en ligne (et non en
colonne).
2. Pour les codes binaires (c’est-à-dire définis sur F2 ), on note simplement [n, k], plutôt que
[n, k]2 , un code de longueur n et de dimension k.
I.2. Encodage
Soit C un code [n, k]q . Un message x est considéré comme un élément de Fkq . L’encodage est
donné par une application linéaire de Fkq dans Fn
q . L’image de x par cette application est un mot
du code C, l’encodage de x.
Étant donné une matrice génératrice G du code C, l’encodage de x est donné par le produit
matrice-vecteur x.G (où x est noté en ligne et, par construction, les lignes de G forment une
base de C).
L’encodage de x dépend du choix de la matrice génératrice utilisée. Nous verrons plus loin
comment l’on peut toujours faire en sorte que les k premières colonnes de la matrice génératrice
G forment la matrice identité k × k.
Exemple 1.5. Le code de parité binaire de longueur n est l’ensemble des mots de Fn 2 de
somme paire, donc comportant un nombre pair de 1. On vérifie aisément que c’est bien un
espace vectoriel.
En longueur 3, ce code a pour dimension 2. En effet, on connaît deux mots, linéairement
indépendants, ayant un nombre pair de 1 : 110 et 011. Ils engendrent un code contenu dans le
code de parité ; mais comme ce dernier ne peut être de dimension 3 (il n’est pas égal à F32 ), nos
deux mots forment une base du code de parité. Cela dit, le code de parité peut avoir d’autres
matrices génératrices comme
» – » –
1 1 0 0 1 1
ou .
1 0 1 1 1 0
i i
i i
Test 1.4. haut est un code linéaire [7, 4]. Donner une ma-
trice génératrice de ce code.
Montrer que le code de Hamming défini plus
X
n
x.y = xi yi .
i=1
Définition 1.8. (Code dual) Soit C un code [n, k]q . On définit le dual C ⊥ de C par
C ⊥ = {y ∈ Fn
q |x.y = 0, ∀x ∈ C}.
Définition 1.9. (Code autodual) Un code C est dit auto-orthogonal quand C ⊂ C ⊥ ; il est dit
autodual quand C = C⊥ .
Définition 1.10. (Matrice de parité) Soit C un code [n, k]q de matrice génératrice G. On
dit qu’une matrice H est une matrice de parité (ou matrice de contrôle de parité, ou matrice
duale) de C si H est une matrice génératrice du dual C ⊥ .
Comme le code dual est un espace vectoriel, il peut bien sûr avoir plusieurs matrices généra-
trices. Pour trouver le code dual, il suffit de résoudre le système G.xt = 0 pour x = (x1 , · · · , xn ).
L’ensemble des x solutions forme le code dual.
Pour encoder un message, il peut être très intéressant d’avoir une forme particulière pour la
matrice génératrice.
Définition 1.11. (Matrice génératrice sous forme systématique) On dit qu’une matrice
génératrice G d’un code est sous forme systématique quand G = [Ik , A], où Ik désigne la matrice
identité k × k et A est une matrice k × n − k.
Par abus de langage, on dit qu’un code est mis sous forme systématique s’il est donné par une
matrice génératrice qui est sous forme systématique.
Proposition 1.12. Quitte à permuter des colonnes, tout code C peut être mis sous forme
systématique.
Preuve. Une matrice génératrice d’un code [n, k] étant une base du code, en tant qu’espace
vectoriel, il existe nécessairement une sous-matrice k×k inversible dans cette matrice génératrice.
Puisque des combinaisons linéaires des lignes de la matrice génératrice ne modifient pas le code,
il existe donc une matrice génératrice du code comportant une sous-matrice identité k × k. On
peut alors se ramener à une forme systématique par permutation des colonnes. n
i i
i i
Proposition 1.13. Si C est un code [n, k]q de matrice génératrice G = [Ik , A], alors sa
matrice de parité est H = [−At , In−k ].
Partie . TABLE DES MATIÈRES
Pour x, y ∈ Fn
2 , on définit le produit terme à terme par
déf
x ∗ y = (x1 y1 , · · · , xn yn ).
dH (x, y) = wH (x − y).
i i
i i
Définition 1.19. (Distance minimale) La distance minimale d d’un code C est définie par
La notion de distance de Hamming est la notion fondamentale associée aux codes correcteurs ;
c’est elle qui dote l’espace ambiant d’une structure d’espace métrique.
Au-delà de la simple égalité de deux codes, on peut se poser la question de transformations qui
conservent cette notion de distance entre deux mots de l’espace. Remarquant que la permutation
de coordonnées est une telle transformation, on peut introduire une notion d’équivalence liée aux
permutations sur les n coordonnées d’un code. Cette notion d’équivalence est bien sûr moins
fine que l’égalité entre deux codes, mais elle est pertinente dans la mesure où elle conserve
globalement la distance entre deux mots de l’espace, et donc donne les mêmes capacités de
décodage pour un code donné.
Définition 1.22. (Codes équivalents) Deux codes binaires C1 et C2 sont dits équivalents
quand il existe une permutation P des coordonnées telle que tout mot de C1 permuté par P est
un mot de C2 .
Comme la permutation des coordonnées d’un mot ne change pas son poids de Hamming, et
que le polynôme énumérateur d’un code ne dépend que du poids des mots, on en déduit que deux
codes équivalents ont le même polynôme énumérateur des poids. En revanche, la réciproque est
fausse : deux codes peuvent avoir le même énumérateur des poids, mais être non équivalents.
Tout code est équivalent à un code qui peut être mis sous forme systématique. La notion
d’équivalence peut être généralisée en ajoutant le fait de pouvoir multiplier les colonnes d’un
code par un élément de Fq non nul.
Définition 1.23. On appelle permutations monomiales l’ensemble des transformations obtenues
en permutant les colonnes du code puis en multipliant les colonnes par des éléments non nuls du
corps.
Deux codes C1 et C2 sont dits monomialement équivalents quand il existe une permutation
monomiale permettant de transformer C1 en C2 .
Définition 1.24. Le groupe d’automorphismes monomiaux d’un code C est l’ensemble des per-
mutations monomiales laissant le code invariant.
Dans le cas d’un code binaire, on parle simplement de groupe d’automorphismes et l’ensemble
des permutations monomiales se limite aux permutations.
i i
i i
8
» –
Test 1.10. 0 1 1 0
sont distincts mais équiva-
1 0 0 1
Montrer que les
» codes de matrices généra- lents. Montrer que le groupe d’automorphismes
Partie . TABLE DES MATIÈRES
–
1 1 0 0 de C1 est le groupe de permutations engendré par
trices C1 = et C2 =
0 0 1 1 les trois permutations (1, 2), (3, 4) et (1, 3)(2, 4).
Théorème 1.26. Soit C un code [n, k, d]q ; il permet de corriger, par décodage à maximum
de vraisemblance, au plus t = b d−1
2
c erreurs de manière univoque.
i i
i i
Test 1.11. Montrer que ce résultat est aussi vrai pour des
codes non linéaires.
Proposition 1.29.
1. Deux mots sont dans le même translaté si et seulement si ils ont le même syndrome.
2. Tous les translatés d’un code C ont le même nombre d’éléments |C|.
3. Deux translatés sont soit disjoints soit égaux.
Définition 1.30. (Représentant principal) À tout translaté, on peut associer un mot de plus
petit poids contenu dans le translaté. Ce mot est appelé représentant principal. Lorsqu’il existe
plusieurs choix pour ce mot, on en prend un quelconque parmi les mots de même poids possibles.
On peut alors créer une table de syndromes qui associe à chaque syndrome possible de Fn−k
q
un représentant principal pour le translaté correspondant.
Exemple 1.31. Par exemple, si l’on prend le code C de matrice génératrice
» –
1 0 1 1 1
G=
0 1 0 0 1
et de matrice de parité 2 3
1 0 1 0 0
H=4 1 0 0 1 0 5,
1 1 0 0 1
on peut construire la table de décodage par syndrome
i i
i i
10
10000 00111,11001,01110
(001)t 01000 11111,00001,10110
(100)t 00100 10011,01101,11010
(110)t 11000 01111,10001,00110
(011)t 10100 00011,11101,01010
(101)t 01100 11011,00101,10010
(010)t 00010 10101,01011,11100
Pour un code de matrice de parité H, le décodage par syndrome consiste à décoder tout
mot reçu y en y − cl(y), où cl(y) désigne le représentant principal associé au syndrome
Hyt de y.
Lemme 1.33. Le code C peut corriger jusqu’à t erreurs si et seulement si tous les mots de
poids au plus t sont des représentants principaux. En particulier, si C est un code [n, k, d]q , le
décodage par syndrome permet de décoder au maximum de vraisemblance de manière univoque
jusqu’à t = b d−1
2
c erreurs.
Preuve. Dans ce cas, le décodage par syndrome permet de retrouver de manière univoque tout
mot du code auquel on ajoute une erreur de poids au plus t. Le cas où plusieurs représentants
principaux (de même poids donc) sont possibles correspond au cas où l’on ne peut pas décoder
de manière univoque et donc où l’on ne décode pas. On a vu précédemment que si t ≤ b d−1 2
c,
il existait un mot de code unique le plus proche à distance t et donc un unique représentant
principal pour ce translaté. n
Exemple 1.34. Reprenons le code de l’exemple précédent pour lequel on a construit une
table des syndromes. Si l’on reçoit le mot y = 00111, on calcule le syndrome s = (111)t ; on va
voir dans la table le représentant principal (10000) et l’on décode y en y + (10000) = 10111.
Dans ce cas, on décode de manière univoque car il n’y a qu’un seul représentant principal
possible. Si, par exemple, on avait obtenu comme syndrome (011)t , il y aurait eu deux repré-
sentants principaux possibles et l’on aurait pu mal décoder. On remarque que pour ce code, la
distance minimale est 2 et donc que le code ne décode pas nécessairement de manière univoque
une erreur. Le théorème précédent montre en fait que dans le cas où le nombre d’erreurs à
corriger est inférieur ou égal à b d−1
2
c, il n’y a qu’un seul représentant principal pour les trans-
latés correspondant aux erreurs de poids inférieur ou égal à b d−1 2
c. Pour le cas où le nombre
d’erreurs est strictement plus grand que b d−1 2
c, il peut y avoir un ou plusieurs représentants
principaux.
i i
i i
11
Le décodage par syndrome est donc un algorithme qui permet de décoder au maximum de
vraisemblance et de manière univoque jusqu’à t = b d−1 2
c erreurs. Cette méthode donne une
solution au problème du décodage, mais elle nécessite un nombre exponentiel d’opérations (de
l’ordre de O(2n )) : il faut écrire la table des syndromes, ce qui est lourd dès que les paramètres
grandissent.
La problématique de la théorie des codes correcteurs peut finalement être résumée à ce qui
suit.
1. Construire de bons codes : des codes tels qu’à la fois le taux k/n et d soient les plus
grands possibles. Avoir k/n grand assure une redondance relativement faible ; avoir d
grand assure un pouvoir de correction important.
Mais ces deux conditions sont antinomiques, car un taux k/n très grand correspond
intuitivement à un distance petite (ainsi pour k = n, on obtient d = 1 qui ne corrige
rien). Inversement, si l’on veut un code avec un d très grand, on peut prendre le code
à répétition [111111...1] qui effectivement corrige très bien, mais correspond à une
redondance trop importante.
2. Être capable de les décoder efficacement : idéalement en temps polynomial en n (la
longueur du code) et pas simplement par décodage par syndrome qui est exponentiel
en n.
déf
X
n+1
C^ = {(x1 , · · · , xn , xn+1 ) | (x1 , · · · , xn ) ∈ C et xi = 0}.
i=1
i i
i i
12
Dans le cas binaire, si d est impair, le code étendu a pour distance minimale d + 1.
Partie . TABLE DES MATIÈRES
déf
C1 ⊕ C2 = {(c1 |c2 ) | c1 ∈ C1 , c2 ∈ C2 },
où (c1 |c2 ) désigne la concaténation des deux mots c1 et c2 . Ce nouveau code est de longueur
n1 + n2 . Il est engendré (comme espace vectoriel) par les mots de la forme (b|0), b ∈ C1 et
(0| b), b ∈ C2 , et il est donc de dimension k1 + k2 .
Une matrice génératrice de la somme directe des codes est la somme directe de deux matrices
génératrices Gi des Ci , c’est-à-dire une matrice (n1 + n2 ) × (n1 + n2 ) diagonale par blocs avec
les Gi sur la diagonale.
La somme directe de deux codes satisfait la propriété intéressante suivante.
Lemme 1.36. Le polynôme énumérateur des poids d’une somme directe de codes C1 ⊕ C2
vérifie
WC1 ⊕C2 (x, y) = WC1 (x, y) ∗ WC2 (x, y).
Test 1.14.
Démontrer ce lemme.
Cette construction est particulièrement intéressante pour le cas d’un code binaire. On peut
montrer par exemple que si C1 est le code de parité (vu dans la sous-section I.2) de longueur 4
(encore noté 14 ⊥ ) et C2 le mot tout à un de longueur 4, alors le code obtenu par cette construc-
tion est équivalent au premier code de Hamming étendu binaire [8, 4, 4] vu dans l’introduction.
Plus généralement, on a le résultat suivant pour les codes binaires.
Proposition 1.37. Soient C1 [n, k1 , d1 ] et C2 [n, k2 , d2 ] deux codes binaires de même lon-
gueur. La construction de Plotkin produit un code C[2n, k1 + k2 , min(2d1 , d2 )].
i i
i i
13
puisque wH (c1 ) − wH (c1 ∗ c2 ) ≥ 0. Donc, pour tout c ∈ C non nul, wH (c) ≥ wH (c2 ) ≥
min(2d1 , d2 ) et donc d ≥ min(2d1 , d2 ), ce qui montre le résultat. n
Preuve. Si C a une distance minimale d, alors il existe un mot c de poids d tel que Hct = 0,
que l’on peut aussi voir comme une relation de dépendance entre d colonnes de H puisque c est
de poids d.
Réciproquement, s’il n’existe aucun ensemble d’au plus d − 1 colonnes indépendantes, il n’existe
pas de vecteur x de poids au plus d − 1 tel que Hxt = 0 et donc, de fait, pas de mot de poids
inférieur ou égal à d − 1 dans le code. n
Lemme 1.40. Un code de Hamming binaire d’ordre r a pour paramètres [2r − 1, 2r − r − 1, 3].
La famille des codes de Hamming constitue le premier exemple de famille infinie pouvant
corriger une erreur puisque d = 3 implique [(3 − 1)/2] = 1 d’après le théorème 1.26.
i i
i i
14
Test 1.15. tous les mots non nuls de F2 3 , on prend tous les
mots non nuls, mais à une constante multiplica-
Essayons de généraliser la construction de Ham- tive près. Par exemple, pour (10) et (20), on ne
Partie . TABLE DES MATIÈRES
ming sur F3 . On considère le corps F3 et m = 2. prendra qu’un seul représentant. Montrer que
Plutôt que de prendre comme colonnes du code l’on obtient alors un code [4, 2, 3]3 .
Définition 1.41. (Code de Golay G24 ) Soit à la matrice définie ci-dessus. Le code G24 de
déf
matrice génératrice G = [I24 |Ã] est appelé code de Golay binaire étendu G24 .
Théorème 1.42. Le code de Golay binaire étendu G24 a pour paramètres [24, 12, 8].
On obtient le code de Golay [23, 12, 7] en poinçonnant une colonne du code précédent.
Preuve. La preuve se déroule en plusieurs étapes. Tout d’abord, on vérifie facilement que le
code G24 est autodual. En effet, on commence par remarquer que le produit de la première ligne
de G avec une ligne quelconque de G est nul, puis que le produit de la seconde ligne de G avec
toutes les autres est nul et donc que, par cyclicité, le produit de deux lignes quelconques de G
est nul. La remarque précédente montre que le code G24 est inclus dans son dual. Comme la
dimension de G24 est 12 et que la dimension du dual est n − k = 24 − 12 = 12, le code est bien
égal à son dual, donc il est autodual.
Maintenant, comme le poids de chaque ligne de G est un multiple de 4 et que le code est au-
todual, on en déduit par le test 1.7 que tous les mots de G24 ont un poids multiple de 4. Étant
donné qu’il existe un mot de poids 8 (par exemple la deuxième ligne de G), la distance minimale
du code est soit 4 soit 8.
déf
La matrice à est symétrique donc, par la proposition 1.13, le code dual de G24 admet G 0 =
[Ã|I24 ] pour matrice génératrice. Ainsi, comme G24 est autodual, il peut s’écrire avec les deux
matrices génératrices G ou G 0 . On va maintenant montrer que le code ne peut contenir de mot
i i
i i
15
Si l’on poinçonne G24 sur une colonne quelconque, les matrices génératrices G et G 0 montrent
que nécessairement on va amputer une coordonnée non nulle d’un mot de poids 8 et que l’on va
obtenir un code [23, 12, 7]. n
Le code [23, 12, 7] construit ci-dessus est appelé code de Golay binaire.
II.2.3. L’hexacode
2 3
1 0 0 1 1 1
2 5
4 0 1 0 1 ω ω .
0 0 1 1 ω2 ω
Test 1.17.
Montrer que H6 est un code [6, 3, 4]4 .
Les codes de Reed-Muller ont été introduits à l’origine par D. E. Muller en 1954, puis Irving
S. Reed a donné une méthode de décodage la même année. Ces codes, de longueurs une puissance
de deux, ont été la première famille de codes pour lesquels on a pu décoder un nombre infini
d’erreurs. Ils ont été utilisé pour la sonde Mariner entre 1969 et 1973 pour transmettre des
photos de la planète Mars. Là encore, plusieurs constructions sont possibles. Nous donnons ici
une construction matricielle simple basée sur la construction de Plotkin vue ci-dessus.
Soit m un entier positif. Les codes de Reed-Muller sont des codes binaires de longueur 2m ,
indicés par un paramètre 0 ≤ r ≤ m. On note R(r, m) le code de Reed-Muller de longueur 2m
et d’indice r.
i i
i i
16
Définition 1.43. (Codes de Reed-Muller) Les codes de Reed-Muller R(r, m) sont définis
par récurrence comme
Partie . TABLE DES MATIÈRES
Test 1.18.
Montrer que le code R(1, 3) est un code [8, 4, 4].
Preuve. Le premier point se montre par une récurrence immédiate à partir de la construction.
Le point 2) s’obtient aussi par récurrence à partir ´de la
`nconstruction et de la propriété sur les
coefficients binomiaux du triangle de Pascal : n+1
` ´ ` n ´
k+1
= k
+ k+1
.
Pour le point 3), on utilise le résultat sur la distance liée à la construction de Plotkin (proposition
1.37). La propriété est vraie pour m = 1. Supposons qu’elle soit vraie jusqu’à m − 1 pour tout r.
Soit le code R(r, m) ; ce code est obtenu par la construction de Plotkin à partir de deux codes
R(r, m − 1) et R(r − 1, m − 1) de distance minimale respective 2m−1−r et 2m−1−(r−1) = 2m−r
par hypothèse de récurrence. Nous avons vu à la proposition 1.37 que la distance minimale du
nouveau code était min(2.2m−1−r , 2m−r ) = 2m−r , ce qui montre le résultat.
n
Remarque. Pour la sonde Mariner, c’est le code R(1, 5) [32, 6, 16] qui corrige 7 erreurs qui a
été utilisé.
i i
i i
17
II.3. Bornes
Il existe plusieurs type de bornes pour les codes ; nous présentons ici les bornes principales.
Preuve. Soit un code C de longueur n et de distance d avec Aq (n, d) mots. Les boules B(c, t)
centrées sur les mots c du code et de rayon t sont disjointes (car sinon il existerait deux mots à
distance strictement inférieure à d) et donc la réunion de toutes les boules disjointes B(c, t) est
un ensemble d’éléments de l’espace contenu dans Fn q . Les éléments d’une boule sont composés
des mots à distance 0 du centre, ainsi que des mots à distance 1, jusqu’à la distance ` ´ t. Le
nombre de mots à distance 0 est 1, le nombre de mots à distance 1 est n(q − 1) = n 1
(q − 1).
Plus généralement, le nombre de mots à distance i vaut ni (q − 1)i , le nombre de choix pour
` ´
l’emplacement de l’erreur fois le nombre de possibilités pour l’erreur en une coordonnée donnée.
On obtient donc! Aq (n, d) boules disjointes avec le même nombre d’éléments, ce qui donne
Xt
n
Aq (n, d) (q − 1)i ≤ qn . De plus, on a trivialement Bq (n, d) ≤ Aq (n, d), ce qui donne
i=0
i
le résultat. n
Définition 1.47. (Code parfait) Un code qui vérifie l’égalité dans le théorème précédent est
appelé un code parfait.
Le fait qu’un code soit parfait correspond au fait que, pour un tel code, tous les mots de
l’espace sont décodables de manière univoque, c’est-à-dire que tous les mots de l’espace sont
contenus dans la réunion des boules de rayon t = b d−1
2
c centrées sur les mots du code (ce qui
n’est pas du tout le cas en général).
27
Exemple 1.48. Le code de Hamming binaire [7, 4, 3] est parfait car 24 = . On en
1+(7
1)
déduit que A2 (7, 3) = 16 car il y a une borne sur le nombre de mots maximum et un code qui
l’atteint.
Plus généralement, on appelle rayon d’empilement rp (C) d’un code C le plus grand rayon
tel que toutes les boules de rayon rp (C) centrées sur des mots de codes sont disjointes. Pour un
code linéaire [n, k, d]q , on a rp = b d−1
2
c.
On peut alors aussi définir naturellement le problème dual.
Définition 1.49. (Rayon de recouvrement) Le rayon de recouvrement rc (C) d’un code est
le plus petit rayon r tel que la réunion des boules B(c, r) (pour c parcourant tous les mots du
code) recouvre tout l’espace.
i i
i i
18
Théorème 1.50. (Borne de Singleton) Soit C un code [n, k, d]q . La distance minimale d
du code C vérifie la majoration d ≤ n − k + 1.
Preuve. À permutation près, le code C peut s’écrire sous la forme systématique G = [Ik |A],
où A est une matrice k × n − k. En notant a1 la première ligne de A, le poids de la première
ligne de G est donc 1 + wH (a1 ) ≤ 1 + (n − k). Par définition, on a d ≤ wH (c) pour tout mot
du code, d’où le résultat. n
Définition 1.51. (Codes MDS) Les codes satisfaisant l’égalité dans le théorème précédent
sont dits codes à distance maximum séparable (MDS).
On peut citer comme exemple non trivial, l’hexacode [6, 3, 4]4 sur F4 vu dans la section
précédente. Un autre exemple de codes MDS est la famille des codes de Reed-Solomon que l’on
verra plus tard.
Lemme 1.52. Soit C un code linéaire de longueur n, de distance minimale d et tel que C
contient Aq (n, d) mots. Le rayon de recouvrement de C est alors au plus d − 1.
Preuve. Supposons que rc (C) ≥ d, alors il existe un mot x de l’espace Fq − C dont la distance
à chaque mots de C est au moins d (sinon on aurait rc (C) < d). On peut alors construire le code
C 0 = C ∪ x}. Ce code a une distance minimale au moins de d en raison de la condition sur le
rayon de recouvrement et contient |C| = Aq (n, d) + 1 mots. Or, comme Aq (n, d) est maximal,
ce n’est pas possible, donc on a rc (C) ≤ d − 1. n
i i
i i
19
Ce théorème n’est pas constructif. En pratique, les meilleurs codes connus dans le cas binaire
sont des codes réalisent, à peu de chose près, l’égalité pour cette borne. En particulier, on peut
prouver, mais cela dépasse l’objet de ce cours, que des codes aléatoires binaires (des codes définis
par une matrice génératrice dont tous les coefficients sont pris soit à 0 soit à 1 avec la même
probabilité 1/2) satisfont cette borne inférieure, asymptotiquement, presque tout le temps.
P
la ´formule de Stirling et le fait que dans la somme d−1
`n´
Remarque. En utilisant
` n i=0 i
le terme
dominant correspond à d−1 , on peut obtenir une bonne approximation asymptotique de la
P
somme d−1
`n´
i=0 i
en
!
n d
≈ nH2 ( n ) ,
d
pour H2 (x) = −xlog2 (x) − (1 − x)log2 (1 − x). Cette approximation permet d’avoir une idée des
paramètres d’un code binaire linéaire [n, k, d] satisfaisant la borne de Gilbert-Varshamov. Pour
un tel code C, on a
d
nH2 ( n ) .2k ≈ 2n
et donc
k
d ≈ nH−1
2 ( ).
n
Cela montre donc que, pour un taux k/n fixé, les codes satisfaisant la borne de Gilbert-
Varshamov (dont on sait qu’il en existe, même si la borne n’est pas constructive) ont une
distance qui augmente linéairement avec n. Par exemple, pour un code de taux 1/2, la borne
prouve l’existence de codes binaires [n, n/2, δn] avec δ = H−1
2 (1/2) ≈ 0, 11.
Plus généralement, on dit qu’une famille de codes dont les paramètres sont de la forme [n, Rn, δn],
pour n tendant vers l’infini, est asymptotiquement bonne. Cela signifie que, pour un taux k/n
fixé, la distance croîtlinéairement par rapport à la longueur, ce qui est le mieux que l’on puisse
obtenir.
i i
i i
20
Dans cette section, nous rappelons des notions sur les corps finis nécessaires pour considérer
les codes cycliques que l’on verra à la section suivante. On pourra consulter le chapitre 4 du
tome Mathématiques L2 pour une introduction aux corps finis et le tome Algèbre L3, chez le
même éditeur, pour des approfondissements et les preuves de ce que nous présentons ci-dessous.
Il existe deux types de corps finis : les corps avec p éléments où p est premier (ces corps sont
construits en considérant le quotient Z/pZ), et les corps sur des extensions qui sont construits
comme quotients Fq [x]/(f(x)) de Fq [x] par (l’idéal engendré par) un polynôme f(x) irréductible
de degré r de Fq [x]. Ici, Fq désigne un corps fini donné, qui peut être de la forme Fp (pour p
premier) ou bien construit lui-même en tant qu’extension de Fp . Dans tous les cas, le cardinal
q du corps est une puissance d’un nombre premier p.
Par exemple, si l’on prend F2 le corps à deux éléments {0, 1} et x2 + x + 1 irréductible de degré 2
déf
sur F2 [x], le corps F4 = {0, 1, w, w2 } peut s’obtenir comme F2 [x]/(x2 +x+1) ; on peut identifier
x à w, où la somme et la multiplication se font modulo x2 + x + 1. Tout élément de F4 peut
s’écrire comme un polynôme α + βw de degré 1 avec α et β dans F2 . Ainsi, modulo x2 + x + 1,
on obtient w2 = 1 + w et w.(1 + w) = w + w2 = 1.
Théorème 1.54. Tout corps fini Fq admet un élément primitif β, c’est à dire un élément β
tel que
Fq = {0, 1 = β0 , β, β2 , · · · , βq−2 }.
Une notion importante pour un élément α de Fq est la notion de polynôme minimal mα (x),
c’est-à-dire le polynôme unitaire de plus petit degré dont α est racine. On a le théorème suivant.
Théorème 1.55. Soient Fqr un corps fini et α un élément de ce corps de polynôme minimal
mα (x) ∈ Fq [x] sur Fq , alors :
1. mα (x) est irréductible dans Fq [x] ;
2. si α est une racine d’un polynôme g(x) de Fq [x], alors mα (x) divise g(x) ;
r
3. mα (x) divise xq − x ;
4. le degré de mα (x) est au plus r.
Une autre notion utilisée pour la suite est la notion de classe cyclotomique. On remarque
tout d’abord que si α est une racine d’un polynôme f(x) sur Fqr , puisque (x + y)q = xq + yq ,
alors f(αq ) = f(α)q = 0. Plus généralement, si α est un zéro d’un polynôme f(x) à coefficients
2
dans Fq , alors {αq , αq , . . .} sont aussi des zéros de f(x).
où m est la plus petite valeur non nulle telle que a ≡ aqm (mod qr − 1).
Soit β un élément primitif du corps Fqr . Une classe cyclotomique Ca rassemble tous les éléments
βj , pour j ∈ Ca , ayant le même polynôme minimal sur Fq .
Lemme 1.57. Pour un corps Fqr , le cardinal d’une classe cyclotomique Ca divise r.
i i
i i
21
Exemple 1.58. Sur F24 , les 2-classes cyclotomiques modulo 15 sont C0 = {0}, C1 =
{1, 2, 4, 8}, C3 = {3, 6, 12, 9}, C5 = {5, 10} et C7 = {7, 14, 13, 11}.
On vérifie que le cardinal de chaque classe cyclotomique (1, 2 ou 4) divise 4.
Soient Fqr un corps et α un élément de ce corps. On dit que α est une racine n-ième de
l’unité si la plus petite valeur de m telle que αm = 1 est n.
Voyons comment construire, pour tout corps fini Fq , une extension de ce corps qui contient
une racine n-ième.
Définition 1.59. Soient Fq un corps et 1 ≤ n ≤ q − 1. On appelle ordre de n sur q, noté
ordq (n), la plus petite valeur de m telle que n divise qm − 1.
La définition précédente assure que pour n fixé et un corps Fq fixé, on peut trouver une ex-
tension Fqordq (n) qui admet une racine n-ième. Précisément, si l’on note β une racine primitive
qordq (n) −1
de Fqordq (n) , α = β n est une racine n-ième dans cette extension.
Nous avons construit la notion de q-classe cyclotomique modulo qr − 1 ; voyons comment
généraliser cette construction modulo des n quelconques. Une q-classe cyclotomique Ca modulo
n est l’ensemble Ca = {a, aq, aq2 , · · · , aqm−1 }, où m est la plus petite valeur non nulle telle
que aqm ≡ a (mod n).
On a alors le théorème suivant qui sera largement utilisé dans le chapitre suivant.
Théorème 1.60. Soient α une racine n-ième de l’unité avec α ∈ Fqordq (n) et mαi (x) le
polynôme minimal associé à αi , alors
Définition 1.62. Soient α une racine n-ième de l’unité dans une extension Fqordq (n) de Fq
et g(x) ∈ Fq [x] un polynôme qui divise xn − 1. L’ensemble Z des zéros de g(x) est l’ensemble
des i tels que αi est racine de g(x).
L’ensemble des zéros correspond à {αi } pour i dans la réunion des q-classes cyclotomiques
associées à la décomposition de g(x) dans le théorème précédent.
i i
i i
22
Test 1.25.
Construire le corps F8 comme une extension de
F2 de degré 3.
Calculer ord2 (9). Calculer les 2-classes cycloto-
Définition 1.63. (Code cyclique) Un code C est dit cyclique si, pour tout mot c =
(c0 , c1 , · · · , cn−1 ) de C, le mot c 0 = (cn−1 , c0 , c1 , · · · , cn−2 ) appartient aussi au code C.
Bien qu’il soit possible qu’un code soit cyclique et non linéaire, on ne considère dans la suite
que le cas des codes cycliques linéaires.
Si l’on prend un mot quelconque et que l’on regarde le code linéaire engendré par ses permu-
tations circulaires, on obtient en général tout l’espace ou le code des mots de poids pair, dans le
cas d’un mot binaire de poids pair ; mais, dans certains cas, on obtient des codes de dimensions
bien plus petites. Par exemple, le code linéaire engendré par les permutations circulaires du mot
(1, 1, 0, 1, 0, 0, 0) est un code linéaire cyclique de dimension strictement inférieure à 7.
On peut mieux appréhender les codes cycliques en se plaçant d’un point de vue polynomial.
On associe au mot a = (a0 , a1 , · · · , an−1 ) de longueur n sur Fq le polynôme a(x) = a0 + a1 x +
· · · + an−1 xn−1 ; dans la suite, on identifiera un mot a à sa représentation polynomiale a(x).
Dans ce contexte, on peut exprimer le fait qu’un code soit cyclique par le fait que, représenté
polynomialement, il soit stable par multiplication par x dans l’anneau quotient Fq [x]/(xn − 1) ;
en effet, si c = (c0 , c1 , · · · , cn−1 ) = c(x) = c0 + c1 x + · · · + cn−1 xn−1 , alors
déf
c̃ = (cn−1 , c0 , c1 , · · · , cn−2 ) = cn−1 + c0 x + c1 x2 + · · · + cn−2 xn−1 = xc(x) − cn−1 (xn − 1).
En d’autres termes, les codes cycliques linéaires sont des idéaux de Fq [x]/(xn − 1). On a alors
le théorème suivant.
i i
i i
23
Le théorème précédent montre que le bon contexte pour étudier les codes cycliques est
l’anneau Fq [x]/(xn − 1), comme le montre la proposition suivante.
Proposition 1.65. Les codes cycliques sont exactement les idéaux de l’anneau Fq [x]/(xn −1).
Preuve. Dans l’anneau Fq [x] = Fq [x]/(xn − 1), la permutation circulaire, à droite, d’un mot
du code est égale à la multiplication par x. En effet, le théorème précédent montre qu’un code
cyclique est un idéal de Fq [x]/(xn − 1). Réciproquement, les idéaux de Fq [x]/(xn − 1) sont
engendrés par les diviseurs de (xn − 1) et chacun des diviseurs de (xn − 1) engendre un code
cyclique. n
En d’autres termes, l’étude des codes cycliques se ramène à l’étude des diviseurs de xn −1 qui
sont en bijection avec l’ensemble des codes cycliques. Pour éviter le cas des diviseurs multiples,
on se place par la suite dans le cas où la caractéristique du corps et la longueur du code sont
premiers entre eux.
i i
i i
24
Une autre façon de caractériser les codes cycliques peut se faire à partir des zéros du polynôme
générateur, que l’on peut aussi définir à partir de l’ensemble de définition.
Définition 1.68. (Ensemble de définition) Pour α une racine n-ième de l’unité dans une
extension Fqordq (n) de Fq et g(x) un polynôme générateur d’un code cyclique C (donc qui divise
xn − 1), l’ensemble de définition T du code C est l’ensemble des i tels que αi est une racine de
g(x).
L’ensemble T correspond à la réunion des q-classes cyclotomiques associées à la décomposi-
tion de g(x) dans le théorème 1.64.
Le code dual est lui aussi cyclique.
Proposition 1.69. Si C est un code cyclique de longueur n sur Fq , alors le code dual C ⊥ est
aussi cyclique.
Preuve. Dire que C est cyclique équivaut à dire que le groupe d’automorphisme de C contient
la permutation circulaire (1, 2, 3, · · · , n). En notant H une matrice de parité de C, on a, pour
tout c ∈ C, H.ct = 0. Puisque le code est cyclique, pour toute permutation circulaire P, on a
H.(c.P)t = 0 = H.Pt .ct = H.P−1 .ct et donc tout élément de C est orthogonal à HP−1 . Mais
comme P−1 est aussi une permutation circulaire, le code engendré par HP−1 est égal à C ⊥ . Le
code dual C ⊥ étant stable par P−1 , il est bien cyclique. n
Pour tout g(x) = g0 + g1 x + · · · + gn−k−1 xn−k−1 + xn−k polynôme générateur d’un code
cyclique C de longueur n, il existe h(x) = h0 +h1 x+· · ·+hk−1 xk−1 +xk tel que g(x)h(x) = xn −1.
Si l’on se place dans Fq [x] = Fq [x]/(xn − 1), on obtient g(x)h(x) = 0 et donc, en écrivant le
fait que chacun des coefficients pour un degré donné est nul dans g(x)h(x) (ainsi que pour les
produits de g(x) avec les permutés circulaires de h(x)), on obtient le théorème suivant.
Théorème 1.70. Si C[n, k]q est un code cyclique de polynôme générateur g(x), alors C ⊥ est
−1
xn −1
aussi un code cyclique de polynôme générateur g⊥ (x) = xn−k h(xh0 )
, où h(x) = g(x)
.
Preuve. Le résultat est obtenu directment à partir du calcul de g(x)h(x) = 0 dans Fq [x] =
Fq [x]/(Xn − 1) en notant que les coefficients de g⊥ (x) sont exactement ceux de h(x), mais en
sens inverse. n
Remarque. Lorsque l’on choisit une racine n-ième de l’unité pour un code cyclique de longueur
n, il peut y avoir plusieurs choix possibles. En effet, à partir d’une telle racine α, tous les αi avec
pgcd(i, n) = 1 sont aussi des racines n-ièmes. Le fait de prendre des racines n-ièmes différentes
peut mener à des codes distincts, mais toujours équivalents. Deux codes équivalents ayant les
i i
i i
25
Soient x1 , x2 , · · · , xn des éléments d’un anneau. Leur matrice de Vandermonde V est définie
par
2 3
1 1 ··· 1
6 x1
6 x2 ··· xn 7
2 2 2
7
V = 6 x1
6 x2 ··· xn 7.
7
4 ··· 5
xn−1
1 xn−1
2 · · · xn−1
n
En particulier, cela signifie que det(V) est non nul si et seulement si les xi sont tous distincts.
Soit C un code cyclique ; on rappelle que l’on nomme ensemble de définition T du code
C l’ensemble des i tels que αi est un zéro de C. On dira que T contient un ensemble de s
éléments consécutifs s’il existe un ensemble {b, b + 1, · · · , b + s − 1} d’entiers consécutifs tels que
{b, b + 1, · · · , b + s − 1} (mod n) ⊂ T.
Théorème 1.71. Soit C un code cyclique de longueur n sur Fq avec un ensemble de définition
T . Si l’on note d la distance minimale du code C et si T contient δ − 1 éléments consécutifs,
alors δ 6 d.
Preuve. Par hypothèse, il existe b tel que les éléments αb , · · · , αb+δ−2 sont des zéros du
code C. Soit c(x) un mot non nul du code de poids w 6 δ − 1. Le mot c(x) est non nul sur w
Xw
coordonnées et s’écrit c(x) = cij xij . Supposons que w < δ. Comme c(αi ) = 0 pour tout
j=1
b ≤ i ≤ b + δ − 2, on a alors M.ut = 0 pour
αi1 b αi2 b αiw b
2 3
···
6 αi1 (b+1) αi2 (b+1)
··· αiw (b+1) 7
M=6 7,
4 ··· ··· 5
αi1 (b+w−1) αi2 (b+w−1) ··· αiw (b+w−1)
i i
i i
26
avec u = (ci1 , · · · , ciw ). Mais, comme w 6 δ − 1, on peut écrire det(M) = αb(i1 +···+iw ) det(V),
où V est la matrice de Vandermonde
Partie . TABLE DES MATIÈRES
2 3
1 1 ··· 1
i1 i2
6 α α ··· αiw 7
V =6 7
4 ··· ··· 5
αi1 w−1) αi2 (w−1) ··· αiw (w−1)
de déterminant non nul, puisque les αik sont distincts pour 1 6 k 6 w. On en déduit que la
matrice M est inversible et donc que la solution de M.ut = 0 est u = 0 ; or u 6= 0, soit une
contradiction et donc w > δ. n
Remarque. On parle pour δ de distance construite du code. La valeur δ constitue une minora-
tion de la vraie distance minimale d du code. En pratique, il y a souvent très peu de différence
entre d et δ.
T = Cb ∪ Cb+1 ∪ · · · ∪ Cb+δ−2 ,
Théorème 1.73. Soit C un code BCH [n, k]q , de distance construite δ, alors :
1. k ≥ n − ordq (n).(δ − 1) ;
2. si q = 2 et si C est un code BCH au sens strict, alors on peut restreindre δ au cas où δ
est impair ; de plus, si l’on écrit δ = 2w + 1, alors k ≥ n − ordq (n).w.
Exemple 1.74.
Prenons en longueur 15 sur F2 , des codes BCH au sens strict qui sont primitifs.
- δ = 3 donne T = C1 ∪ C2 = C1 = {1, 2, 4, 8}, soit [15, 11, d ≥ 3] ;
i i
i i
27
Un premier algorithme de décodage a été proposé en 1960 par G. Peterson pour les BCH
binaires, puis généralisé par G. Peterson, D. Gorenstein et N. Zierler la même année. En 1968,
E. Berlekamp et J. Massey ont proposé un algorithme qui a permis d’améliorer les algorithmes
précédents sur la partie de l’obtention du polynôme localisateur d’erreurs, que l’on verra par la
suite et qui est une étape importante du décodage. Enfin, en 1974, a été proposé un décodage par
l’algorithme d’Euclide étendu, d’une complexité asymptotique similaire à celle de Berlekamp-
Massey, mais conceptuellement plus simple. C’est ce dernier algorithme que nous présentons
dans cette section.
i i
i i
28
au plus t = b δ−1 2
c erreurs. On suppose que l’ensemble de définition T du code contient un
ensemble de δ − 1 zéros consécutifs et que, sans perte de généralité, on peut prendre un code au
sens strict, c’est-à-dire que {1, 2, · · · , δ − 1} ⊂ T . On considère une racine primitive α d’ordre n
de Fqm avec m = ordq (n).
On reçoit le vecteur r(x) = c(x) + e(x) avec e un vecteur d’erreurs de poids wH (e) ≤ t et
où c(x) correspond au vecteur envoyé. On note e(x) = ek1 xk1 + · · · + ekν xkν ; le problème du
décodage est de retrouver e(x). Puisque c(x) ∈ C, on a c(αi ) = 0, ∀i ∈ T . En particulier, on a
Dans ce système, les Ei et les Xi sont des inconnues, seuls les Si sont connus ; le système est
donc non linéaire et est compliqué à résoudre directement. On va alors introduire un polynôme
localisateur d’erreurs qui permettra de trouver les Xi et ainsi de se ramener à la résolution d’un
système linéaire en les Ei .
Définition 1.77. (Polynôme localisateur d’erreurs) Pour Xj , 1 ≤ j ≤ ν, les emplacements
des erreurs pour le mot reçu v, on appelle polynôme localisateur d’erreurs le polynôme σ(x) défini
par
déf
X
ν
σ(x) = (1 − xX1 )(1 − xX2 ) · · · (1 − xXν ) = 1 + σi xi ,
i=1
σ(X−1 −1
j ) = 1 + σ1 Xj + · · · + σν X−ν
j = 0 pour 1 ≤ j ≤ ν.
En multipliant les équations précédentes par Ej Xi+ν
j , il vient
Ej Xi+ν
j + σ1 Ej Xji+ν−1 + · · · + σν Ej Xij = 0, pour tout i.
i i
i i
29
i i
i i
30
Remarque. Dans le cas d’un code binaire, l’étape 5 n’est pas nécessaire.
α2 α4 α11
„ «„ « „ «
σ2
= .
α4 α11 σ1 α8
La solution est σ1 = α2 et σ2 = α14 et l’on obtient, pour le polynôme localisateur d’erreurs,
σ(x) = 1 + α2 x + α14 x2 , qui s’annule pour α11 et α5 , d’où X1 = α4 et X2 = α10 . Et donc le
mot transmis est c(x) = r(x) + x4 + x10 = 1 + x + x4 + x5 + x6 + x9 .
i i
i i
31
Étant donné deux polynômes a(x) et b(x) de Fq [x], l’algorithme d’Euclide étendu calcule
leur PGCD d(x) et deux polynômes f(x) et g(x) réalisant l’identité de Bézout
avec deg (g(x)) < deg (a(x)) et deg (f(x)) < deg (b(x)).
L’algorithme procède par itérations successives de divisions euclidiennes. L’initialisation
se fait par r−1 (x) = a(x), f−1 (x) = 1, g−1 (x) = 0, r0 (x) = b(x), f0 (x) = 0, g0 (x) = 1,
puis pour i ≥ 1, on effectue la division euclidienne ri−2 (x) = qi (x)ri−1 (x) + ri (x) avec
deg (ri (x)) < deg(ri−1 (x)). On met à jour fi (x) = fi−2 (x) − qi (x)fi−1 (x) et gi (x) =
gi−2 (x) − qi (x)gi−1 (x).
On a les résultats suivants à chaque étape :
1. pgcd(ri−1 (x), ri (x)) = pgcd(ri (x), ri+1 (x)) ;
2. fi (x)a(x) + gi (x)b(x) = ri (x) ;
3. deg (gi (x)) + deg(ri−1 (x)) = deg(a(x)) ;
Théorème 1.80. Si l’on utilise l’algorithme d’Euclide étendu en prenant comme polynômes
de départ S(x) et x2t , et en s’arrêtant dès que le reste ri (x) est tel que deg (ri−i (x)) ≥ t et
deg (ri (x)) < t, alors on obtient le polynôme σ 0 (x) (et donc σ(x)) par la relation σ 0 (x) =
gi (x), en prenant gi (x) monique.
Preuve. Si l’on arrête l’algorithme d’Euclide étendu à l’endroit précisé dans le théorème, on
obtient, d’après le rappel sur l’algorithme d’Euclide étendu, deg (gj (x)) = 2t − deg(rj−1 (x)) ≤ t
et fj (x)x2t + gj (x)s(x) = rj (x). Le polynôme gj (x) est un polynôme de degré au plus t tel que
deg (S(x)gj (x)) (mod x2t )) = deg (rj (x) < t, ce qui implique, d’après ce que l’on a vu plus haut,
en tenant compte du fait que σt = 1, que σ 0 (x) = gj (x) (pris sous forme monique). n
La complexité de l’algorithme d’Euclide étendu est en O(n2 ) (voire O(n log(n)) avec des
méthodes avancées), ce qui est plus efficace pour trouver σ(x) que l’algorithme classique d’in-
version de matrice en O(n3 ). Il existe aussi des méthodes pour accélérer le calcul des Ej que
nous ne décrivons pas ici.
i i
i i
32
Exemple 1.81. On considère à nouveau l’exemple 1.79 pour lequel on va appliquer l’al-
gorithme d’Euclide étendu pour retrouver σ(x). On a dans ce cas 2t = 4 et S(x) =
S1 x3 +S2 x2 +S3 x+S4 , soit, en reprenant les données précédentes S(x) = α2 x3 +α4 x2 +α11 x+α8 .
Partie . TABLE DES MATIÈRES
Théorème 1.83. Les codes de Reed-Solomon RS(n, k)q sont des codes [n, k, n − k + 1]q .
Preuve. Par définition, les codes RS(n, k)q sont des codes de longueur n ; la linéarité des
codes découle de la linéarité de l’addition de polynômes dans Pk . Le nombre de mots d’un code
RS est inférieur ou égal au nombre de polynômes de Pk , c’est-à-dire qk . Supposons que deux
i i
i i
33
Remarque. Comme les codes de Reed-Solomon satisfont l’égalité dans la borne de Singleton,
ils sont MDS.
Proposition 1.84. Il existe au moins un polynôme Q(x, y) non nul vérifiant les conditions
précédentes.
Preuve. Le polynôme Q(x, y) peut être décrit à partir de ses degrés en Q0 (x) et Q1 (x) en
prenant pour inconnues les coefficients de Q0 et Q1 . On va simplement compter le nombre de
contraintes et le nombre de degrés de liberté. La condition 1 donne n contraintes linéaires ; les
conditions 2 et 3 fixent les degrés de Q0 et Q1 , ce qui donne deg (Q0 )+1+deg(Q1 )+1 degrés de
libertés (les coefficients des monômes de Q0 et Q1 ). Il y a donc n−1−t+1+n−1−t−(k−1)+1 =
n − k − 2t + 1 + n + 1 inconnues. Mais, comme t = b(n − k + 1)/2c, le nombre de degrés de liberté
est supérieur ou égal à n + 1. Comme le nombre n + 1 d’inconnues est supérieur au nombre
n de contraintes, on est sûr qu’il existe au moins un tel polynôme Q(x, y) non nul obtenu en
résolvant un système à n équations et n + 1 inconnues. n
Théorème 1.85. Soit c = c(f), un mot d’un code RS( n, k)q , construit à partir de f(x)
avec deg (f) ≤ k − 1. Soit maintenant un mot reçu r = c + e avec une erreur e de poids
wH (e) 6 t = b d−1
2
c. Si l’on construit le polynôme Q(x, y) = Q0 (x) + yQ1 (y), le polynôme
d’interpolation bivarié défini précédemment à partir du mot reçu r, alors on peut retrouver le
polynôme f(x) associé à c(f) par f(x) = −Q 0 (x)
Q1 (x)
.
i i
i i
34
est de degré au plus n − t − 1 et s’annule en au moins n − t valeurs. C’est donc le polynôme nul,
d’où Q(x, f(x)) = 0 et donc Q0 (x) + f(x)Q1 (x) = 0, ce qui implique que f(x) = − Q 0 (x)
Q1 (x)
. n
Partie . TABLE DES MATIÈRES
1. Pour un mot reçu r, construire le polynôme interpolé Q(x, y) = Q0 (x) + yQ1 (x).
2. Décoder par division de Q0 (x) par Q1 (x).
Ce décodage est polynomial en n puisque ces deux étapes peuvent s’effectuer en temps
polynomial en n ; plus précisément, la première étape (la plus coûteuse) peut se faire dans le
pire des cas par inversion d’une matrice n × n, soit en O(n3 ) opérations. En fait, il existe des
méthodes (que nous ne décrivons pas ici) qui permettent de le faire en O(n2 ).
Exemple 1.86. On considère un code de Reed-Solomon [6, 4, 3]7 défini par les points
x1 , .., x6 , avec xi = 3i−1 . Une matrice génératrice G s’obtient en évaluant les xi pour les
polynômes 1, x, x2 et x3 , soit
2 3
1 1 1 1 1 1
6 1 3 2 6 4 5 7
G=64 1 2 4 1 2 4 5.
7
1 6 1 6 1 6
Comme d = 3, on peut décoder au plus une erreur. On veut maintenant décoder le mot reçu
r = (r1 , r2 , ..., r6 ) = (3, 1, 1, 6, 3, 3) avec l’algorithme de Welch-Berlekamp.
Dans ce cas, le polynôme Q0 (x) a degré au plus n − 1 − t = 6 − 1 − 1 = 4 et le polynôme
Q1 (x) a degré n − 1 − t − (k − 1) = 1. On cherche donc un polynôme, non nul, Q(x, y) =
a0 + a1 x + a2 x2 + a3 x3 + a4 x4 + y(b0 + b1 x), tel que Q(xi , ri ) = 0 pour 1 6 i 6 6. En
remplaçant les xi par 3i−1 et les ri par leur valeur dans Q(x, y), pour 1 6 i 6 6, on obtient un
système avec 6 équations et 7 inconnues : a0 , a1 , ..., a4 , b0 , b1 . La résolution du système donne
Q0 (x)
Q0 (x) = 3x + 3x2 + 6x3 et Q1 (x) = 2 + x, soit f(x) = − Q 1 (x)
= x2 + x. En évaluant f sur
(x1 , x2 , x3 , x4 , x5 , x6 ) = (1, 3, 2, 6, 4, 5), on obtient comme mot décodé c(f) = (3, 1, 1, 6, 3, 0) et
comme erreur (0, 0, 0, 0, 0, 3).
i i
i i
35
Définition 1.88. (Codes alternants) On note RSn−r (α, v) un code de Reed-Solomon géné-
ralisé [n, n − r, r + 1]qm construit sur une extension Fqm de Fq .
Un code alternant Ak (α, v) est défini comme l’ensemble des mots d’un code de Reed-Solomon
généralisé RSn−r (α, v), dont les coordonnées sont à coefficients dans le sous-corps Fq .
Proposition 1.89. Soit RSn−r (α, v) un code de Reed-Solomon généralisé [n, n − r, r + 1]qm
construit sur une extension Fqm de Fq . Le code alternant Ak (α, v) correspondant (sur Fq )
est un code [n, k, d]q avec n − mr ≤ k ≤ n − r et r + 1 ≤ d.
Preuve.
Le code alternant est un code linéaire puisque la somme de mots du sous-code sur Fq est
stable par addition et multiplication externe. Le sous-code a une distance minimale au moins
égale à celle du code. Soit H = {Hij }1≤i≤n−r,1≤j≤n une matrice de contrôle de parité du code
RSn−r (α, v) de paramètres [n, n − r, r + 1]qm . On considère une base {e1 , · · · , em } de Fqm sur
Xm
Fq . Chacun des Hij peut s’écrire comme Hij = Hijk ek . On peut alors définir une matrice
k=1
H 0 rm × n à partir de H, en écrivant chacun des Hij en colonne dans la base {b1 , . . . , bm }.
Comme, par définition, les mots du code alternant Ak (α, v) sont les mots de Fn
q contenus dans
RSn−r (α, v), on a pour c ∈ Fn
q
c ∈ Ak (α, v) ⇔ Hct = 0.
Mais comme c ∈ Fn q , l’équivalence précédente reste vraie lorsque l’on développe Fqm sur une
base de Fq , soit pour c ∈ Fnq
Hct = 0 ⇔ H 0 ct = 0.
La matrice H 0 engendre donc une matrice duale de Ak (α, v) ; comme elle a rm lignes, elle
a pour rang au plus rm et donc la dimension du code alternant est supérieure à n − rm et
inférieure à n − r (la dimension du code sur l’extension). n
En pratique, la dimension des codes alternants reste proche de n − rm. La classe générale des
codes alternants peut se décoder en tant que sous-code d’un code de Reed-Solomon généralisé,
qui se décode à partir des codes de Reed-Solomon (en multipliant par v−1 = (v−1 −1
1 , · · · , vn )).
La classe des codes alternants contient un grand nombre de sous-classes avec des paramètres et
des décodages spécifiques.
Les codes de Goppa ont été introduits par V. D. Goppa en 1970. Ils forment une classe
particulière des codes alternants et peuvent être vus comme une généralisation des codes BCH.
Ils sont en particulier très bons en caractéristique 2, où ils ont le même type de paramètres
que les codes BCH, mais sont beaucoup plus nombreux pour des paramètres donnés. Cette
dernière propriété en fait des codes très intéressants pour une utilisation en cryptographie dans
le cryptosystème de chiffrement à clé publique de R. McEliece (voir le chapitre suivant).
i i
i i
36
VI.3.1. Une autre construction pour les codes BCH au sens strict
Soit t = ordq (n) et soit α une racine n-ième de l’unité dans Fqt . Soit maintenant δ > 1 la
Partie . TABLE DES MATIÈRES
distance construite pour un code BCH au sens strict C. On voit alors, en reprenant la section
IV.3 sur les codes BCH, que c(x) = c0 + c1 x + · · · + cn−1 xn−1 est dans C si et seulement si
c(αi ) = 0 pour tout 1 ≤ i ≤ δ − 1. On remarque que l’on peut écrire
X
n−1
ci X n−1
n−1 X k −i n−1−k n−1
X k n−1
X
(xn − 1) = c i x (α ) = x ci (αk+1 )i . (1.1)
i=0
x − α−i i=0 k=0 k=0 i=0
X
n−1
Comme c(αi ) = 0 pour 1 ≤ i ≤ δ − 1, la somme ci (αk+1 )i est nulle pour 0 ≤ k ≤ δ − 2, et
i=0
donc le dernier membre de l’égalité précédente peut s’écrire comme un certain polynôme q(x)
fois xδ−1 . La dernière égalité devient donc
X
n−1
ci xδ−1 q(x)
−i
= , (1.2)
i=0
x−α xn − 1
que l’on peut aussi voir comme vérifiant l’égalité
X
n−1
ci
≡0 (mod xδ−1 ), (1.3)
i=0
x − α−i
où le modulo est considéré pour le polynôme a(x) lorsque l’on écrit le membre gauche de l’égalité
1.2 sous forme de fraction rationnelle a(x)
b(x)
(avec a(x) et b(x) premiers entre eux).
L’égalité 1.3 (dérivée de l’égalité 1.1) montre que les mots de Fq qui la vérifient sont exac-
tement les mots c(x) dont les coefficients sont tels que c(αi ) = 0 pour 1 6 i 6 δ − 1. Et donc le
code est le code BCH au sens strict de distance construite δ.
Cette égalité peut être généralisée en prenant un autre polynôme que le polynôme xδ−1 . Ce
point de vue permet d’introduire les codes de Goppa.
déf
X
n
ci
Rc (x) = ≡0 (mod G(x)).
i=1
x − αi
Lorsque le polynôme G(x) est irréductible, on dit que le code est un code de Goppa irréductible.
L’égalité modulo G(x) est considérée comme précédemment en termes de fraction rationnelle
par rapport à a(x) pour Rc (x) = a(x)
b(x)
et a(x) et b(x) premiers entre eux.
Théorème 1.91. Le code de Goppa Γ (L, G) de longueur n sur Fq , défini à partir d’un
polynôme G(x) de degré r, à coefficients dans une extension Fqm de Fq pour un m quelconque,
est un code linéaire de longueur n, de dimension k ≥ n−mr et de distance minimale d ≥ r+1.
Dans le cas binaire (q = 2), si G(x) n’a pas de racine multiple, alors d ≥ 2r + 1.
i i
i i
37
Preuve. Le code Γ (L, G) est clairement linéaire : si c ∈ Γ (L, G), alors on a γc ∈ Γ (L, G) et
si c1 , c2 ∈ Γ (L, G), alors on a c1 + c2 ∈ Γ (L, G) d’après les propriétés de somme modulo G(x)
intervenant pour le calcul de Rc (x). On va maintenant calculer le dual de Γ (L, G). On remarque
X
n
(G(x) − G(αi ))
c∈Γ ⇔ ci G(αi )−1 ≡ 0 (mod G(x)). (1.4)
i=1
x − αi
X
r
Si l’on écrit G(x) = gi xi avec gi ∈ Fqm et gr 6= 0, alors
i=0
(G(x) − G(αi ))
G(αi )−1 = gr (xr−1 + xr−2 αi + · · · + αr−1
i )
x − αi
+gr−1 (xr−2 + xr−3 αi + · · · + αr−2
i ) + · · · + g2 (x + αi ) + g1 .
0 1 0 1
gr 0 0 ··· 0 1 1 ··· 1
B
B gr−1 gr 0 ··· 0 C B
C B α1 α2 ··· αn C
α21 α22 α2n
C
H=B
B gr−2 gr−1 gr ··· 0 C.B
C B ··· C
C
@ ··· ··· A @ ··· ··· A
g1 g2 g3 ··· gr αr−1
1 αr−1
2 ··· αr−1
n
G(α1 )−1
0 1
0 ··· 0
B 0 G(α2 )−1 ··· 0 C
.B C.
@ 0 0 ··· 0 A
0 0 ··· G(αn )−1
Comme la première des trois matrices est une matrice carrée inversible (puisque gr 6= 0), on en
déduit qu’une matrice de contrôle de parité H peut aussi s’écrire comme le produit des deux
dernières matrices qui peut s’écrire sous la forme
i i
i i
38
De manière similaire au cas des codes BCH binaires qui sont relativement meilleurs que
les codes BCH généraux, on peut aussi faire mieux avec des codes de Goppa binaires. Soit
Γ (L, G) un code de Gopa binaire et soit c(c1 , . . . , cn ) un mot du code, non nul, de poids w avec
Partie . TABLE DES MATIÈRES
et
X
w
1 f 0 (x)
Rc (x) = = c .
i=1
x − αli fc (x)
Par définition du code, les αi sont distincts et donc fc0 (x) et fc (x) n’ont pas de facteurs communs ;
de plus, comme les αi ne sont pas racines de G(x), les polynômes fc (x) et G(x) n’ont pas de
facteur commun et sont premiers entre eux. On obtient donc
Comme on travaille sur une extension de F2 , fc0 (x) ne contient que des puissances paires et
peut s’écrire sous la forme d’un carré parfait fc0 (x) 2
Pl= p(x)2i, d’un certain polynôme p(x). En
0 0
effet, fc (x) est un polynôme de la forme fc (x) = i=0 ai x avec ai ∈ F2m et, comme on est
élément ai de F2m peut s’écrire sous la forme d’un carré ai = b2i
sur une extension de F2 , tout P
pour bi ∈ F2m , d’où fc (x) = ( li=0 bi xi )2 .
0
Comme fc0 (x) est un carré parfait et que G(x) divise fc0 (x), alors, fc0 (x) est aussi divisible par
le polynôme de plus petit degré, qui est à la fois un carré parfait et est divisible par G(x). Dans
le cas où G(x) n’a pas de racine multiple, le plus petit polynôme qui est un carré parfait divisible
par G(x) est G(x)2 . Donc, G(x)2 | fc0 (x) et, comme deg (fc0 (x)) = w − 1 et deg (G(x)2 ) = 2r, il
vient w − 1 ≥ 2r pour tout mot c du code non nul. Dans le cas d’un code de Goppa binaire avec
G(x) sans racine multiple, on en déduit que d ≥ 2r + 1. n
Les codes de Goppa non binaires peuvent se décoder en tant que codes alternants. Pour le
cas binaire, il existe un algorithme spécifique de N. J. Patterson que nous ne décrivons pas ici.
Toujours pour le cas binaire, si l’on prend un polynôme G(x) irréductible sur Fqm (et il y en a
beaucoup !), on obtient un polynôme sans racine multiple.
Exemple 1.92. Soit le corps F8 construit comme extension de F2 par le polynôme x3 +x+1.
Soit α une racine primitive de F8 . On veut construire le code de Goppa binaire avec pour L,
l’ensemble des éléments de F8 , pris dans l’ordre {α, α2 , ..., α6 , 1, 0} (avec α7 = 1) et pour
polynôme G(x) = 1 + αx + x2 . On vérifie tout d’abord que G(x) ne s’annule pas sur F8 . On
construit alors la matrice H du dual sur F8 du code alternant induit par le polynôme de Goppa,
donnée par
soit
α5 α6 α5 α2 α2 α6
„ «
1 1
H= .
α 1 α2 α2 1 α α6 0
Pour obtenir le sous-code sur le sous corps, on choisit une base de F8 sur F2 , comme par
exemple {1, α, α2 }, et on écrit les éléments de H représentés en binaire et en colonne dans cette
i i
i i
39
Par exemple l’avant-dernière colonne correspond bien à α6 , écrit deux fois en colonne dans la
base {1, α, α2 }. Le code a pour dimension k ≥ 8 − 3.2 = 2 ; comme le polynôme G(x) n’a pas de
zéro multiple, on doit trouver d ≥ 2 ∗ 2 + 1 = 5. Le calcul du code donne un code de dimension
2 engendré par les mots (1, 0, 1, 0, 1, 1, 1, 1) et (0, 1, 1, 1, 1, 0, 0, 1), soit un code binaire [8, 2, 5].
i i
i i
40
tient au décodage classique, on peut décoder de manière univoque jusqu’à w(e) = t = b(512 −
1)/2c = 255. Pourtant, en pratique, si l’on calcule de manière combinatoire la probabilité qu’un
mot avec une erreur de poids donné τ soit décodable de manière univoque, on trouve que la
Partie . TABLE DES MATIÈRES
probabilité qu’un mot avec une erreur aléatoire de poids 410 soit décodable de manière univoque
est de l’ordre de 10−9 !
Lorsque l’on fait du décodage à distance bornée, on est sûr de décoder l’erreur si son poids est
inférieur à une distance donnée (en général b d−1
2
c). Maintenant, si l’on est prêt à admettre une
probabilité d’erreur dans le décodage pour une erreur de poids fixé, il est possible de décoder
beaucoup plus loin.
La première famille de codes pour laquelle il a été possible de trouver un décodage en liste
avec une complexité polynomiale a été la famille des codes de Reed-Solomon pour laquelle M.
Sudan a proposé un algorithme en 1996. Sa méthode a été généralisée avec de meilleurs résultats
par V. Guruswami et M. Sudan en 1999. Par la suite, des algorithmes ont aussi été proposés
pour les codes de Reed-Muller et certains codes alternants. Dans ce qui suit, nous présentons le
premier algorithme de Sudan.
l
Proposition 1.93. Si τ < n l+1 − 2l (k − 1) et n − τ − 1 − l(k − 1) ≥ 0, alors un tel polynôme
Q(x, y) existe.
Preuve. La première condition sur Q(x, y) donne n contraintes. La deuxième condition donne
des degrés de liberté qui correspondent aux différents coefficients des polynômes Qi . Le polynôme
Q(x, y) peut s’obtenir en résolvant un système en les coefficients des Qj (x). Plus précisément,
chaque polynôme Qj a degré au plus n − τ − 1 − j(k − 1), ce qui donne 1 + n − τ − 1 − j(k − 1)
degrés de libertés. Un tel polynôme Q(x, y) non nul existera donc si le nombre de degrés de
liberté est strictement supérieur au nombre de contraintes, soit si
X
l
(1 + n − τ − 1 − j(k − 1)) > n.
j=0
X
l Xl Xl
1
(1 + n − τ − 1 − j(k − 1)) = (n − τ) − j(k − 1) = (l + 1)(n − τ) − l(l + 1)(k − 1).
j=0 j=0 j=0
2
i i
i i
41
Une fois un tel polynôme Q(x, y) construit, on peut décoder à partir de la proposition
suivante.
Théorème 1.94. Si Q(x, y) vérifie les contraintes précédentes et si le mot de code envoyé
est c(f) = (f(x1 ), f(x2 ), · · · , f(xn )) avec deg (f(x)) < k, alors
Preuve. Pour un polynôme Q(x, y) vérifiant les conditions précédentes, on considère le poly-
nôme univarié Q(x, f(x)). D’après les conditions sur les degrés des Qj (x), chacun des polynômes
f(x)j Qj (x) est de degré n − τ − 1 et donc le polynôme Q(x, f(x)) est de degré au plus n − τ − 1.
Maintenant, par hypothèse, on a Q(xi , ri ) = 0 pour tout i dans {1, 2, · · · , n}, et comme
f(xi ) = ri pour au moins n − τ valeurs de i (l’erreur étant de poids τ), on a finalement
Q(xi , f(xi )) = 0 pour au moins n − τ valeurs de i. Le polynôme Q(x, f(x)) est donc un po-
lynôme de degré ≤ n − τ − 1, ayant au moins n − τ racines. C’est donc le polynôme nul.
Montrons qu’alors (y − f(x)) | Q(x, y). Le polynôme Q(x, y) s’écrit
soit
Q0 (x) = −(Q1 (x)f(x) + Q2 (x)f(x)2 + · · · + Ql (x)yl ).
En remplaçant cette dernière expression de Q0 (x) dans l’expression de Q(x, y), on obtient
X
l X
j−1
= (y − f(x)) (Qj (x) yp f(x)j−1−p )
j=1 p=0
i i
i i
42
1. Pour un mot reçu r avec une erreur de poids τ, construire le polynôme interpolé Q(x, y) =
Q0 (x) + Q1 (x)y + Q2 (x)y2 + . . . + Ql (x)yl .
2. Trouver les facteurs de la forme (y − f(x)) avec deg (f(x)) < k qui divisent Q(x, y). Si
l
τ < n l+1 − 2l (k − 1), alors le mot émis fait partie de cette liste.
Il existe plusieurs méthodes possibles pour chacune de ces étapes. L’étape la plus coûteuse
est l’étape 1 : il est toujours possible de trouver le polynôme Q(x, y) en résolvant un système
linéaire, mais les méthodes de type interpolation multivariée donnent les meilleurs résultats en
termes de complexité calculatoire.
Une analyse détaillée des paramètres de l’algorithme permet de montrer que cet algorithme
améliore le décodage en b(d − 1)/2c pour un taux k/n < 1/3. On peut aussi montrer qu’asymp-
√
totiquement pour k/n petit, et k et n grands l’algorithme
q permet de décoder jusqu’à n − 2nk
erreurs, soit un taux d’erreurs décodables en 1 − 2kn
, qui tend vers 1 lorsque k/n tend vers
zéro. Ce résultat est à comparer au décodade classique qui ne décode que jusqu’à un taux de
1/2 lorsque k/n tend vers zéro.
Remarque. L’algorithme de décodage de Guruswami-Sudan améliore ce dernier algorithme
en introduisant plus de contraintes sur le polynôme Q(x, y). À la différence de l’algorithme de
Sudan, il améliore le décodage classique des codes de √
Reed-Solomon pour des taux quelconques
et, pour k/n petit, il permet de décoder jusqu’à n − nk erreurs.
Exemple 1.95. On considère le code de Reed-Solomon [10, 2, 9]11 défini pour xi = 2i−1 .
Par décodage classique, on peut décoder jusqu’á t = (9 − 1)/2 = 4 erreurs. Prenons l = 2
dans la définition du polynôme interpolé Q(x, y), alors on peut décoder jusqu’à une erreur de
l
poids τ < n 1+l − 2l (k − 1) = 10.2/3 − 1, soit jusqu’à τ = 5. Considérons le mot à décoder
r = (7, 6, 5, 3, 8, 7, 9, 0, 2, 5). On cherche un polynôme Q(x, y) = Q0 (x) + Q1 (x)y + Q2 (x)y2
avec Q0 (x) = a0 + a1 x + a2 x2 + a3 x3 + a4 x4 , Q1 (x) = b0 + b1 x + b2 x2 + b3 x3 et Q2 (x) =
d0 +d1 x+d2 x2 , tel que Q(xi , ri ) = 0 pour 1 6 i 6 10. En écrivant les contraintes sur Q(x, y), on
obtient un système linéaire de 10 équations et 12 inconnues, les a0 , ..., a4 , b0 , ..., b3 , d0 , d1 , d2 .
Une résolution du système amène un espace solution de dimension 2, engendré par les deux
vecteurs (1, 0, 0, 2, 2, 4, 6, 0, 7, 1, 10, 6) et (0, 1, 10, 3, 1, 2, 7, 10, 2, 5, 2, 9). Prenons par exemple le
premier vecteur. On peut retrouver un exemple de polynôme Q(x, y) en écrivant Q0 (x), Q1 (x)
et Q2 (x) à partir des coordonnées de ce vecteur, comme défini précd́emment. Ce qui amène
Q(x, y) = 1 + 2x3 + 2x4 + y(4 + 6x + 7x3 ) + y2 (1 + 10x + 6x2 ), qui se factorise en Q(x, y) =
7(y − (4x + 3))(x3 + 2x2 y + 7x2 + 7xy + 9x + 4y + 10). Il existe un facteur de la forme
(y − f(x)) qui divise Q(x, y). On en déduit que le mot décodé correspond à f(x) = 4x + 3, soit
c(f) = (7, 10, 5, 6, 8, 1, 9, 3, 2, 0). On vérifie de plus que l’erreur (0, 7, 0, 8, 0, 6, 0, 8, 0, 5) a poids
5.
VIII. Exercices
i i
i i
43
i i
i i
44
Première partie
Solutions des tests
i i
i i
Deuxième partie
Solutions des tests
0.1.S’il y a une erreur dans un des quatre bits d’information, il y aura deux erreurs sur une ligne et une colonne
différente. Si l’erreur n’est pas sur un des quatre bits d’information, il y aura, soit une ligne, soit une colonne
avec une erreur, et donc l’erreur sera dans la ligne ou colonne extérieure.
0.2.On suppose qu’il y a exactement 1 erreur. Il y a plusieurs cas possibles : si l’erreur est sur p1 , p2 ou p3 ,
deux des cercles auront une somme paire et le troisième correspondant à l’un des pi aura une somme impaire.
Si l’erreur est en d1 , d2 ou d3 , deux des cercles auront une somme incorrecte et l’erreur sera à l’intersection
de ces deux cercles (mais pas d4 ). Enfin, si les trois cercles ont une somme incorrecte, l’erreur sera d4 .
0.3.Si l’on part d’une matrice identité avec des 1 sur la diagonale, cette matrice engendre tout l’espace. On
considère les vecteurs ei de longueur n valant 0 partout sauf sur la coordonnée i où ils valent 1. Les ei sont
0 0
indépendants et engendrent Fn 2 . Considérons maintenant ei = ei + en pour 1 6 i 6 n − 1. Les ei sont
indépendants, et comme la somme de deux mots avec un nombre pair de 1 a aussi un nombre pair de 1, on en
déduit que le code engendré par les ei0 est contenu dans le code de parité. Ce code a pour dimension n − 1.
Comme le code de parité ne peut avoir dimension n car sinon il contiendrait e1 , ce qui n’est pas possible, alors
ce code est exactement le code de parité de dimension n − 1.
0.4.Les mots du code sont les mots (d1 , d2 , d3 , d4 , p1 , p2 , p3 ) satisfaisant les conditions de parité pour les
trois cercles. Si deux mots appartiennent au code alors, d’après les propriétés de parité, ces conditions seront
aussi vérifiées pour la somme des coordonnées de ces mots. Le code est donc linéaire.
Pour trouver une matrice génératrice du code, par linéarité il suffit de regarder les valeurs des redondances
p1 , p2 et p3 pour de l’information fixée. On peut par exemple regarder la valeur des pi pour des valeurs
(d1 , d2 , d3 , d4 ) valant respectivement (1000), (0100), (0010) et (0001) qui forment des vecteurs indépen-
dants. On trouve donc comme matrice génératrice
1 0 0 0 0 1 1
0 1
B 0 1 0 0 1 0 1 C
@ 0 .
0 1 0 1 1 0 A
0 0 0 1 1 1 1
0.5. 0 1
0 0 1 1 0 0
H=@ 0 1 0 0 1 0 A·
1 1 1 0 0 1
0.15.C’est une simple généralisation du cas binaire ; on prend tous les vecteurs de Fm
q à une constante près. Par
exemple, sur F3 avec m = 2, on a comme colonnes (10)t , (01)t , (11)t et (12)t ; on considère que la colonne
(20) est associée à (10)t . On obtient un code [4, 2, 3]3 .
i i
i i
46
0.17.Il suffit de calculer tous les mots possibles, modulo un facteur non nul. Par exemple, (100111) est dans
le code, donc ω(100111) et ω2 (100111), aussi, avec le même poids. Soit, en tout, simplement vingt et une
possibilités ((64 − 1)/3) en ne comptant pas le mot nul tout à 0.
0.18.Le code R(1, 2) est un code [4, 3, 2], le code R(0, 2) est le code engendré par le mot (1111). On applique
ensuite la construction de Plotkin.
0.19.C’est une application directe du théorème.
0.20.Faire le calcul.
0.21.Non, car il existe des mots de l’espace qui sont à distance r de deux mots du codes (par exemple le mot
nul et un mot de poids 2r). Il n’y a donc pas de décodage univoque pour ces éléments et le code n’est pas
parfait.
0.22.Les boules de rayon re (C) ne s’intersectent pas, alors que les boules de rayon rc (C) recouvrent tout
l’espace par définition, donc re (C) ≤ rc (C). Ces deux rayons sont égaux uniquement pour des codes parfaits.
0.23.En reprenant la même idée que dans le lemme 1.52, on peut montrer que, si le rayon de recouvrement
d’un code linéaire C avec B2 (n, d) mots, est supérieur ou égal à d, alors on peut construire un code linéaire,
C 0 = C ∪ x + C, de distance minimale d, pour un x choisi comme dans le lemme, ce qui montre que le rayon
de recouvrement de C est au plus d − 1. Le reste de la démonstration est identique à la preuve de la borne de
Gilbert-Varshamov.
0.24.C0 = {0}, C1 = {1, 2, 4, 8}, C3 = {3, 6, 12, 9}, C5 = {5, 10}, C7 = {7, 14, 13, 11}.
0.25.ord2 (9) = 6, 26 −1 = 9×7, C0 = {0}, C1 = {1, 2, 4, 8, 7, 5}, C3 = {3, 6}, x9 −1 s’écrit donc sous la forme
x9 − 1 = (x − 1).p1 (x).p2 (x) où deg (p1 (x)) = 6 et deg (p2 (x)) = 2. Comme il n’y a qu’un seul polynôme
irréductible de degré 2 sur F2 : x2 + x + 1, on a p2 (x) = x2 + x + 1 et p1 (x) = (x9 − 1)/((x − 1).(x2 + x + 1)) =
x6 + x3 + 1.
0.26.On peut partir du polynôme irréductible de degré 3 :x3 + x + 1. On peut prendre comme élément primitif
α = x. Dans ce cas par exemple α6 = x6 (mod x3 + x + 1) = x2 + 1 = (1 + x)2 = (α3 )2 .
0.27.On obtient un code [7, 4, 3] (le code de Hamming).
0.28.On connaît la factorisation de x7 − 1 = (x + 1)(x3 + x2 + 1)(x3 + x + 1) = g1 (x).g2 (x).g3 (x). On calcule
les différents cas possibles (23 = 8). Par exemple, pour le polynôme générateur g2 (x).g1 (x), la dimension est
7 − 4 = 3 et la distance minimale 4.
0.29.Prendre αi au lieu de α revient à permuter les colonnes du code par l’application qui envoie la colonne
j sur la colonne ij (mod n). Cette opération est bien une permutation puisque pgcd(i, n) = 1.
0.35.σ(x) = α2 x2 + α12 x + 1.
0.36.Une matrice génératrice reprend les trois premières lignes de la matrice de l’exemple précédent. Le mot
envoyé correspond à f(x) = 1 + 2x + 3x2 et l’erreur vaut (0, 0, 2, 0, 0, 0).
0.37.On obtient à nouveau un code [8, 2, 5].
0.38.Il y a deux mots du code possibles et l’algorithme renvoie une liste. Les mots à distance 5 sont (7, 1, 0, 9, 5, 8, 3, 4, 6, 10)
et (6, 10, 7, 1, 0, 9, 5, 8, 3, 4).
i i
i i
Troisième partie
Solutions des exercices
i i
i i
Quatrième partie
Solutions des exercices
0.39.1) Pour un code auto-orthogonal, le produit x ∗ y est pair et donc, pour le calcul du poids de la somme,
2w(x ∗ y) ≡ 0 (mod 4) ce qui donne le résultat.
2) Sur F3 , on a 12 = (−1)2 = 1. De plus, si le code est auto-orthogonal, alors x.x = 0, ce qui implique que le
nombre de coordonnées non nulles est un multiple de 3.
0.40.On peut faire la table des syndromes, sinon cela vient directement du théorème 1.26.
0.41.Puisque l’on choisit les colonnes à une constante non nulle près, le nombre de colonnes (la longueur du
code) est (qm − 1)/(q − 1). Le nombre de lignes dans le dual est toujours m. Maintenant, deux colonnes du
dual ainsi construit sont toujours indépendantes par construction et donc la distance minimale est plus grande
que 3 (et exactement 3 en exhibant une relation entre 3 colonnes).
0.42.On montre d’abord, comme pour le cas binaire, que le code associé à la matrice est un code autodual sur
F3 et que tout mot de poids 6 s’écrit (a|b) mais que, par symétrie, on a aussi (b|a). Comme x.x = 0 pour tout
x du code, le poids de chaque mot est un multiple de 3. Pour montrer que le code a pour distance minimale 6,
il suffit donc de vérifier qu’il n’a pas de mots de poids 3.
0.43.Faire le calcul.
0.44.Les paramètres de tout code doivent vérifier la borne de Hamming. Ce n’est pas le cas pour un code avec
ces paramètres, donc il ne peut exister.
0.45.Dans le cas m impair, la symétrie des coefficients binomiaux assure que la dimension est exactement
m−1 m+1 √
2m /2. Pour ces codes, la distance vaut 2m− 2 = 2 2 qui est de l’ordre de 2m avec n = 2m pour ces
codes. Cette famille n’est donc pas asymptotiquement bonne. En fait, elle est même plutôt mauvaise si l’on
considère uniquement le critère de la distance, puisque la distance croît en racine carrée et non linéairement
par rapport à la longueur.
0.46.Dire que {0} fait partie de l’ensemble de définition signifie que, pour tout mot du code c(x), α0 = 1 est
solution donc c(1) = 0 pour tout c ∈ C. Cela signifie que c a un nombre pair de coordonnées non nulles.
0.47.À chaque fois, il y en a 23 . Il s’agit des codes de Golay quand la dimension correspond.
0.48.On trouve des codes [13, 10, 3]3 , [13, 7, 4]3 , [13, 4, 7]3 et [13, 1, 13]3 .
0.49.On recherche un tel code sous la forme d’un code BCH ternaire primitif au sens strict de longueur
n = 3m − 1. La taille des 3-classes cyclotomiques est un diviseur de m. Pour avoir une distance construite
supérieure à 3t + 1, il suffit d’avoir une séquence {1, 2, . . . , 3t} de 3t valeurs consécutives dans l’ensemble de
définition du code.
Considérons le code d’ensemble de définition T = C1 ∪ C2 ∪ ... ∪ C3t . Par construction, ce code a bien une
distance minimale d ≥ 3t+1. Dans le cas ternaire, Ci = C3i donc T s’écrit aussi simplement comme la réunion
des classes Ci pour 1 ≤ i ≤ 3t et i non divisible par 3. L’ensemble T peut donc s’écrire comme réunion de 2t
classes cyclotomiques, chacune ayant au plus m éléments. Le code obtenu a donc une dimension k supérieure
ou égale à n − 2tm et une distance minimale construite de 3t + 1.
Dans le cas q-aire, on obtient des codes [qm − 1, k ≥ qm − 1 − (q − 1)mt, d ≥ qt + 1]q . Cette construction
s’avère être particulièrement intéressante pour des alphabets de petite taille comme q = 2, q = 3 ou q = 4.
0.50.Pour le décodage, on peut suivre la méthode de Welch-Berlekamp. On peut connaître le nombre d’erreurs
en calculant le rang de la matrice des syndromes.
0.51.Le code est cyclique car si c(f) = (f(x1 ), f(x2 , · · · , f(xn )) = (f(α0 ), f(α), · · · , f(αn−1 )) est un mot du
code pour deg(f) < k, alors le mot décalé de une position c 0 = (f(αn−1 ), f(α0 ), f(α), · · · , f(αn−2 )) est aussi
un mot du code. En effet, on peut remarquer que c 0 = (f1 (α0 ), f1 (α), · · · , f1 (αn−1 )) pour f1 (x) = f(α−1 x)
car αn = 1. Comme f est de degré k, f1 est aussi de degré k et donc c 0 appartient au code, qui est donc
X
n−1
j i
cyclique. Maintenant, on peut remarquer que, pour tout 1 6 j 6 n − 1, la somme S = (α ) vérifie
i=0
S = 0 car αj S − S = (αj )n − 1 = 0 et 1 − αj 6= 0. Le code RSk est engendré par les vecteurs de la forme
el = (αl , (α2 )l , · · · , (αn−1 )l ) pour 0 6 l 6 k − 1. En utilisant le fait que la somme S est nulle pour
1 6 j 6 n − 1, on peut alors en déduire que, pour la matrice H définie par
αn−1
2 3
1 α ...
6 1 2 2(n−1)
α . . . α 7
H=6 7,
4 ... ... 5
1 αn−k ... α(n−k)(n−1)
le produit H.utl = 0 pour tout 0 6 l 6 k − 1. Cela montre que H est contenue dans le dual de RSk . De plus,
elle est de rang n − k car on peut en extraire une sous-matrice (n − k) × (n − k) inversible sous forme de
i i
i i
49
matrice de Vandermonde. C’est donc exactement une matrice du dual de RSk . En reprenant la démonstration
de la borne BCH, on en déduit que si c(x) = (c1 , · · · , cn ) est un mot du code, alors H.ct = 0 implique
i i
i i
Index
Code
code linéaire, 3
construction de Plotkin, 12
cyclique, 22
de Golay, 14
de Reed-Muller, 15
distance minimale, 7
dual d’un, 5
matrice génératrice, 4
mots de, 3
Syndrome, 9
Code correcteur, 3
Hamming
distance de, 6
borne de, 17
premier code de, 3
Reed-Solomon
code de, 32
Singleton
borne de, 18
i i