TIPE : Code correcteur d’erreurs
Melvyn EL KAMEL(cid:21)MEYRIGNE
Sous la direction de Benoit FabrŁges
Table des matiŁres
1 ThØorie des codes correcteurs
1.1 DØ(cid:28)nition . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Codes binaires . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Codes linØaires
. . . . . . . . . . . . . . . . . . . . . . . . . .
1.4 Codage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.5 DØcodage
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.6 Codes parfaits . . . . . . . . . . . . . . . . . . . . . . . . . . .
2 Code de Hamming
3
3
4
5
6
7
8
10
3 Codes cycliques
13
3.1 Fonctionnement des codes cycliques . . . . . . . . . . . . . . . 13
3.2 Recherche des codes cycliques . . . . . . . . . . . . . . . . . . 15
3.3 Algorithme de dØcodage . . . . . . . . . . . . . . . . . . . . . 19
4 Annexes
24
4.1 Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.2 Code SAGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1
Introduction
Lorsque deux personnes communiquent entre elles, il arrive souvent que
le message re(cid:231)u di(cid:27)Łre de celui Ømis ; que ce soit (cid:224) cause de fautes d’ortho-
graphes, d’une diction trop rapide ou bien de bruits perturbateurs. Toutefois,
il n’est pas toujours nØcessaire d’obtenir l’intØgralitØ du message pour en de-
viner le sens. Ainsi, mŒme si on mØlange l’ordre des lettres dans un mot
tout en laissant les lettres aux extrØmitØs (cid:224) leur place, on puet qnaud mmŒe
cmopnrde la prshae.
On constate que le transfert d’informations numØriques est trŁs important
dans de nombreux domaines, par exemple pour les sondes spatiales qui re-
(cid:231)oivent des signaux parcourant une Ønorme distance. Il est donc primordial de
s’assurer que la perte d’informations soit minimale : c’est l(cid:224) qu’interviennent
les codes correcteurs.
L’objectif est de rajouter une couche d’informations au message initial
qui ne rajoute pas de sens mais qui permettront de dØtecter les erreurs et de
les corriger. Bien Øvidemment, l’ajout d’informations a un prix : l’e(cid:30)cacitØ
d’un code sera donc dØterminØe par la quantitØ d’informations ajoutØe et par
sa capacitØ (cid:224) conserver l’information d’un message. Nous allons nous pencher
sur les principaux codes correcteurs binaires et voir comment se dØroule le
codage et la correction d’erreurs, notamment pour les codes cycliques.
2
1 ThØorie des codes correcteurs
1.1 DØ(cid:28)nition
On appellera une lettre la plus petite information transmissible et un mot
comme un ensemble de lettres. L’ensemble des lettres est l’alphabet, notØ Ω ;
nous travaillerons avec Ω = {0, 1}.
Ainsi, on considØrera qu’un mot m est une suite de lettres appartenant
2Z ou GF (2)).
au corps (cid:28)ni (cid:224) deux ØlØments que l’on notera F2 (ou encore Z
Un mot de longueur n appartient donc (cid:224) Fn
2 .
Introduisons quelques dØ(cid:28)nitions a(cid:28)n de pouvoir travailler avec ces mots.
DØ(cid:28)nition 1.1.1. On dØ(cid:28)nit le poids d’un mot m de Fn
de composantes non nulles du mot. On le note w(m).
2 comme le nombre
Ainsi, si on note 0 le mot nul et 1 le mot plein (composØ uniquement de
1), on a w(0) = 0 et w(1) = n.
DØ(cid:28)nition 1.1.2. La distance de Hamming entre deux mots x, y de Fn
le nombre de composantes distinctes de x et y. On la note d(x, y).
2 est
Proposition 1.1.3. La distance de Hamming est une distance.
DØmonstration. Montrons qu’il s’agit bien d’une distance. Il est clair que
pour tout x, y de Fn
2 , on a,
d(x, y) = d(y, x);
d(x, y) ≥ 0;
d(x, y) = 0 ⇐⇒ x = y.
VØri(cid:28)ons l’inØgalitØ triangulaire : Soient x, y, z dans Fn
2 ; On note x =
x1 . . . xn, y = y1 . . . yn et z = z1 . . . zn. On dØ(cid:28)nit les ensembles U , S et T
suivants :
U := {xi (cid:54)= zi},
S := {(xi (cid:54)= zi) ∧ (xi = yi)},
T := {(xi (cid:54)= zi) ∧ (xi (cid:54)= yi)}.
Ainsi, S ∪T = U et S ∩T = ∅. Donc, d(x, y) = |U | = |T |+|S| et |T | (cid:54) d(x, z)
et |S| (cid:54) d(y, z).
Puisque l’on est dans Fn
2 , d(x, y) = w(x − y) = w(x + y).
DØ(cid:28)nition 1.1.4. Une boule de Hamming de centre x et de rayon r est
dØ(cid:28)nie comme,
BH(x, r) = {y ∈ Fn
2 | d(x, y) ≤ r}.
On peut maintenant s’intØresser aux codes.
3
1.2 Codes binaires
DØ(cid:28)nition 1.2.1. Un code binaire de longueur n et de dimension k est
une partie C de dimension k de Fn
2 ; on dit que C est un code de paramŁtres
(n, k).
En associant (cid:224) l’action d’encoder une application injective ϕ (l’injectivitØ
assure que le dØcodage soit possible), on a C = Im(ϕ).
Un exemple particuliŁrement simple est le bit de paritØ : on ajoute (cid:224) la
(cid:28)n du message un bit correspondant (cid:224) la paritØ de la somme des ØlØments du
message. Si la somme est paire, le bit vaut 0 sinon il vaut 1. Pour un mot de
longueur k, le code associØ a donc pour paramŁtres (k + 1, k). Exemple :
0011010 → 00110101
Lorsqu’il y a au plus une erreur, ce code permet de dØtecter s’il y a eu
une erreur ou non ; mais il ne permet pas de trouver sa position et donc de
la corriger. De plus, s’il y a un nombre pair d’erreurs, elles se compensent et
sont donc indØtectables. On peut pallier partiellement ce dernier problŁme
en divisant le mot en plusieurs petits mots de longueur 2 que l’on encodera
sØparØment.
0011010 → 000110101
Ainsi, tant que les erreurs ne se produisent pas sur des bits appartenant
(cid:224) la mŒme paire, on peut les dØtecter.
Une autre idØe qui pourrait venir (cid:224) l’esprit serait de rØpØter plusieurs fois
chaque bit. En rØpØtant n fois chaque bit d’un mot de longueur k, le code
associØ a pour paramŁtres (nk, k). Exemple : On rØpŁte deux fois chaque bit,
010 → 000111000
Si une erreur se produit, il est possible de la localiser et de la corriger
facilement :
000111000 → 000111001 (erreur sur la derniŁre lettre).
On constate que le dernier trio de bits n’est pas composØ de lettres iden-
tiques, donc l’erreur provient probablement de la lettre di(cid:27)Ørentes des deux
autres. Malheureusement, ce code reste lui aussi assez limitØ : s’il y a deux
erreurs dans le mŒme trio de bits, cela donnera lieu (cid:224) une mauvaise correc-
tion ; s’il y en a 3, on ne peut mŒme pas dØtecter l’erreur. On constate qu’en
rØpØtant chaque bit n fois, le code permet de retrouver le bon mot tant qu’il
y a au plus (cid:98) n−1
2 (cid:99) erreurs ((cid:98)·(cid:99) dØsignant la partie entiŁre). Cela peut sembler
correct, mais la quantitØ d’informations ajoutØe est particuliŁrement ØlevØe.
4
DØ(cid:28)nition 1.2.2. La distance minimale dC d’un code C est dØ(cid:28)nie comme,
dC = min{d(x, y)|x ∈ C, y ∈ C, x (cid:54)= y}.
DØ(cid:28)nition 1.2.3. La capacitØ de correction eC d’un code est le plus grand
entier tel qu’il soit toujours possible de corriger eC erreurs ou moins.
Un mot erronØ peut donc Œtre corrigØ s’il existe un unique mot du code le
plus proche ; de ce fait, les boules de Hamming centrØes en un mot du code
et de rayon eC sont disjointes. Il en dØcoule que eC = (cid:98) dC −1
2 (cid:99) (le −1 permet
de lever l’incertitude lorsqu’il y a dC
2 erreurs).
La capacitØ de dØtection d’erreurs d’un code est naturellement plus Øle-
vØe : on peut dØtecter toute erreur e vØri(cid:28)ant w(e) < dC. En e(cid:27)et, si le mot du
code m est perturbØ par l’erreur e, m(cid:48) = m + e (cid:54)∈ C car sinon e = m − m(cid:48) ∈ C
ce qui contredit la dØ(cid:28)nition de dC.
DØ(cid:28)nition 1.2.4. Le taux d’information d’un code C de paramŁtres (n, k)
est le rapport k
n .
On veut maximiser ce taux d’informations (qu’il soit le plus proche pos-
sible de 1) a(cid:28)n de ne pas rajouter des donnØes inutilement ; le taux d’infor-
mation d’un code de rØpØtition vaut 1
n ce qui est loin d’Œtre dØsirable.
IntØressons nous (cid:224) un type de code particulier qui o(cid:27)re des algorithmes
de dØcodage e(cid:30)caces : les codes linØaires.
1.3 Codes linØaires
DØ(cid:28)nition 1.3.1. Un code C de paramŁtres (n, k) est dit linØaire si pour tout
m, m(cid:48) de C, m + m(cid:48) est dans C. C est un sous-espace vectoriel de dimension
k de Fn
2
Cette nouvelle condition permet d’Øtablir un lien entre le poids et la
distance minimale :
Proposition 1.3.2. Soit C un code linØaire,
dC = min{w(m)|m ∈ C, m (cid:54)= 0}.
DØmonstration. Soient x, y dans C tels que dC = d(x, y). On sait que
d(x, y) = w(x+y). Comme C est linØaire, il existe m dans C tel que x+y = m
donc w(x + y) = w(m).
5
DØsormais, nous inclurons la distance minimale du code dans ses para-
mŁtres ; un code C a pour paramŁtres (n, k, dC). Comment dØterminer la
distance minimale d’un code ? On pourrait calculer le poids de tous les ØlØ-
ments mais ce serait laborieux. Il est possible d’obtenir une majoration de
dC en fonction de n et de k.
Proposition 1.3.3. Soit C un code linØaire de paramŁtres (n, k, dC). Alors,
dC ≤ n − k + 1.
C’est la borne de Singleton.
DØmonstration. Il su(cid:30)t de montrer qu’il existe un mot du code dont les k −1
derniŁres composantes sont nulles. Soit E le sous-espace vectoriel de Fn
2 dont
les k − 1 derniŁres composantes sont nulles, on a dim(E) = n − (k − 1) =
n − k + 1. Donc, dim(C) + dim(E) = n + 1 > n donc C ∩ E (cid:54)= {∅}. Il existe
bien un mot du code dont les k − 1 derniŁres composantes sont nulles ce qui
prouve que dC ≤ n − k + 1.
1.4 Codage
Soit C un code linØaire de paramŁtres (n, k, dC). Il existe ϕ une appli-
cation linØaire injective de F k
telle que Im(ϕ) = C. On peut le
reprØsenter matriciellement par ϕ(x) = xG; G Øtant la transposØe de la ma-
2 et de F n
trice reprØsentative de ϕ par rapport aux bases canoniques de F k
2 .
Les mots sont donc considØrØs comme des vecteurs lignes. On dit que G est
la matrice gØnØratrice de C et que C est le code engendrØ par G.
2 dans F n
2
Exemple : x = (101) , G =
1 0 0 1
0 1 0 1
0 0 1 1
ϕ(x) = (cid:0)1 0 1(cid:1) *
1 0 0 1
0 1 0 1
0 0 1 1
Il s’agit du codage par bit de paritØ vu prØcØdemment.
= (1010)
DØ(cid:28)nition 1.4.1. Un codeC linØaire de paramŁtres (n, k, dC) est dit systØ-
matique si l’encodage consiste (cid:224) rajouter n − k bits (cid:224) la (cid:28)n du mot. Pour
un code linØaire, sa matrice gØnØratrice G est de la forme (Ik|B), Ik Øtant la
matrice unitØ (cid:224) k lignes et k colonnes et B une matrice (cid:224) k lignes et n − k
colonnes.
6
Travailler avec un code systØmatique nous simpli(cid:28)era quelques calculs par
la suite.
1.5 DØcodage
DØ(cid:28)nition 1.5.1. On appelle matrice de contr(cid:244)le d’un code linØaire C de
paramŁtres (n, k, dC) la matrice H ∈ Mn−k,n (cid:224) coe(cid:30)cients dans F2 telle que
ker(H) = C. Ainsi, ∀m ∈ C, H tm = 0 et H tG = 0.
Proposition 1.5.2. : S’il existe dans C un mot de poids r, il existe r co-
lonnes de H linØairement dØpendantes.
DØmonstration. Soit m = m0m1...mn−1 un mot du code de poids r, on note
Ci la i-Łme colonne de H et mi1, mi2, ...mir les composantes non nulles de m.
0
...
mip
...
0
Publicité
mipCip donc il existe bien r
0
...
mi
...
0
0 = H tm = H
n−1
(cid:80)
i=0
r
(cid:80)
p=1
r
(cid:80)
p=1
= H
=
colonnes de H Øtant linØairement dØpendantes.
Proposition 1.5.3. S’il existe r colonnes linØairement dØpendantes de H,
alors il existe un mot du code de poids r(cid:48) ≤ r.
r
(cid:80)
p
mipCip = 0.
DØmonstration. Il existe r scalaires non tous nuls tels que
Soit m ∈ F n
les autres sont nulles. On a w(m) ≤ r.
2 dont les composantes de rang i1, i2, ...ir sont mi1, mi2, ...mir et
On en dØduit que la distance minimale dC (c’est-(cid:224)-dire le poids minimal)
est Øgale au nombre minimum de colonnes linØairement dØpendantes de H.
DØ(cid:28)nition 1.5.4. Soit m ∈ F n
s = H tm.
2 , on appelle syndrome s du mot m le vecteur
Supposons que w soit un mot erronØ, w = m + e avec m un mot du code
e l’erreur. Ainsi, H tw = H t(m + e) = H te ; le mot erronØ et l’erreur ont donc
le mŒme syndrome s. L’ensemble des mots de syndrome s est appelØ classe
latØrale (ou coset) de w. Corriger w revient donc (cid:224) trouver le mot dont le
poids w(m) vØri(cid:28)e w(m) ≤ eC dans la classe latØrale de w ; cela n’est possible
que si ce mot est unique, on suppose donc qu’il y a moins d’erreurs que la
capacitØ de correction du code.
7
Proposition 1.5.5. Chaque syndrome s est associØ (cid:224) un unique mot m ∈ F n
2
dont le poids w(m) vØri(cid:28)e w(m) ≤ eC.
DØmonstration. Supposons qu’il existe m(cid:48) ∈ F n
2
H tm = H tm(cid:48) donc H t(m − m(cid:48)) = 0 et donc m − m(cid:48) est un mot du code.
w(m − m(cid:48)) ≤ w(m) + w(m(cid:48)) ≤2eC ≤ dC − 1. Le seul mot du code x qui vØri(cid:28)e
w(x) ≤ dC − 1 est le mot nul donc m − m = 0 et m = m(cid:48).
tel que w(m(cid:48)) ≤ eC et
Il su(cid:30)t maintenant de dresser une liste des syndromes de chaque ØlØment
2 pour pouvoir retrouver l’erreur et (cid:224) fortiori le mot codØ.
de F n
S’il n’y a qu’une erreur : soit ei le mot contenant un 1 (cid:224) la i-Łme place
et des 0 ailleurs. Alors, il existe i tel que w = m + ei. Le syndrome de ei est
donc la i-Łme colonne de H, on peut donc facilement localiser l’erreur.
Proposition 1.5.6. Si C est un code systØmatique et G = (Ik|B), alors
H = (−tB|In−k).
DØmonstration. H tG =t B −t B = 0.
(cid:18)1 0 1 0
0 1 1 1
(cid:19)
.
Exemple : Prenons G =
(cid:18)1 1 1 0
0 1 0 1
Ainsi, H =
(cid:19)
.
Codons le mot m = (01), w = (01)
(cid:18)1 0 1 0
0 1 1 1
(cid:19)
= (0111).
Ajoutons lui d’abord une erreur en troisiŁme position : z = (0101).
Calculons le syndrome de z : s = H tz =
(cid:18)1 1 1 0
0 1 0 1
(cid:19)
0
1
0
1
(cid:19)
(cid:18)1
0
.
=
Cela correspond (cid:224) la troisiŁme colonne de H, l’erreur provient donc du
troisiŁme bit.
1.6 Codes parfaits
IntØressons-nous (cid:224) C en tant qu’espace vectoriel.
Proposition 1.6.1. #BH(x, r) =
r
(cid:80)
i=0
C i
n.
8
DØmonstration. Pour tout i ∈ {0, 1, ..., r}, il existe C i
d(x, y) = i.
n mots y ∈ F n
2
tels que
Proposition 1.6.2. InØgalitØ de Hamming :
ec(cid:80)
i=0
C i
n ≤ 2n−k.
DØmonstration. Les boules BH(m, eC) centrØes en les mots du codes de rayon
eC sont deux (cid:224) deux disjointes donc :
#BH(m, eC) = (cid:80)
n ≤ |{0, 1}n| = 2n.
eC(cid:80)
C i
(cid:80)
m∈C
m∈C
i=0
Il y a 2k boules de Hamming dans le code donc :
eC(cid:80)
eC(cid:80)
2k
C i
n ≤ 2n et donc
C i
n ≤ 2n−k.
i=0
i=0
La situation optimale serait donc que les boules de Hamming forment
2 , ce qui est le cas lorsque l’inØgalitØ de Hamming est une
une partition de F n
ØgalitØ.
Figure 1 (cid:21) Situation oø chaque mot est associØ (cid:224) un unique mot du code.
DØ(cid:28)nition 1.6.3. Un code C de paramŁtres (n, k, dC) est dit parfait lorsque
les boules de Hamming centrØes en les mots du code de rayon eC forment une
partition de F n
2 .
eC(cid:80)
Ainsi,
i=0
C i
n = 2n−k et ∀ m ∈ F n
2 , il existe m qui minimise d(r, m). On
remarquera que dC est forcØment impair.
9
2 Code de Hamming
CrØons un code qui satisfait l’ØgalitØ de Hamming et qui soit capable
de corriger une erreur ; on prend donc la distance minimale la plus petite
possible, dC = 3.
Posons r = n − k.
1
(cid:80)
n = 2n−k ⇒ 1 + n = 2k
i=0
n = 2r − 1 et k = 2r − r − 1.
C i
Les codes ayant ces paramŁtres sont appelØs codes de Hamming.
DØ(cid:28)nition 2.0.1. Un code de Hamming est un code de paramŁtres (2r −
1, 2r − r − 1, dC) avec r ≥ 2 ; c’est un code parfait.
Les codes parfaits ayant une capacitØ de correction 1 sont donc nØcessai-
rement des codes de Hamming. Pour r = 2, le code parfait de paramŁtres
(3, 1, 3) est le code de rØpØtition.
Exemple : (cid:201)tudions le cas r = 3.
ConsidØrons un code linØaire systØmatique C(7, 4, 3). Soit x ∈ F4
2 , x =
d1d2d3d4 et soit ϕ : F 4
telle que ϕ(x) = d1d2d3d4p1p2p3 avec p1 =
d1 + d2 + d4 , p2 = d1 + d3 + d4 et p3 = d2 + d3 + d4 . On obtient la matrice
gØnØratrice
2 → F 7
2
G =
1 0 0 0 1 1 0
0 1 0 0 1 0 1
0 0 1 0 0 1 1
0 0 0 1 1 1 1
.
Essayons d’encoder un mot, de modi(cid:28)er un de ses bits et de le dØcoder. Pre-
nons m = (1010).
mG = (1010)
= (1010101).
1 0 0 0 1 1 0
0 1 0 0 1 0 1
0 0 1 0 0 1 1
0 0 0 1 1 1 1
Publicité
Modi(cid:28)ons le 4Łme bit (1010101) −→ (1011101) Puisque le code est sys-
tØmatique, on peut rapidement trouver la matrice de contr(cid:244)le H.
H =
1 1 0 1 1 0 0
1 0 1 1 0 1 0
0 1 1 1 0 0 1
On a bien H tG = 0.
10
Calculons le syndrome du message erronØ :
(1011101)tH = (1011101)
1 1 0
1 0 1
0 1 1
1 1 1
1 0 0
0 1 0
0 0 1
= (111).
On obtient trois 1, il y a donc une erreur sur les trois bits de paritØ ; l’er-
reur provient donc du bit qui intervient dans la construction des trois bits
de paritØ : le quatriŁme. On aurait bien sßr reprendre l’algorithme vu prØcØ-
demment et retrouver le mŒme rØsultat.
Figure 2 (cid:21) Illustration montrant comment repØrer facilement la provenance
d’une erreur.
Ainsi, ce code est plus e(cid:30)cace qu’un simple code linØaire. Voil(cid:224) une com-
paraison en image (avec un taux d’erreur de 0.01) :
Figure 3 (cid:21) Code de Hamming/ Code linØaire gØnØrØ alØatoirement
Ces codes ont ØtØ rØalisØs sur Cocalc https://cocalc.com/ (ancienne-
11
ment nommØ Sage) et sont disponibles dans l’annexe. J’ai utilisØ le Jupi-
ter Notebook et le kernel le plus rØcent (SageMath Dev). Cocalc permet de
travailler facilement avec plusieurs types de codes correcteurs (linØaires, de
Hamming, cycliques) et permet de simuler l’apparition d’erreurs.
12
3 Codes cycliques
3.1 Fonctionnement des codes cycliques
DØ(cid:28)nition 3.1.1. Un code linØaire est dit cyclique s’il est stable par dØca-
lage circulaire.
Plus formellement, soit C un code de paramŁtres (n, k, dC) et m ∈ F n
2
,
m = m0m1...mn−1. On note σ(m) = mn−1m0...mn−2.
Alors, C est cyclique si ∀m ∈ C, σ(m) ∈ C.
Ainsi, ∀k ∈ N , σk(m) ∈ C et σn(m) = m.
Exemple Le code C = {000, 110, 011, 101} est cyclique.
DØ(cid:28)nition 3.1.2. Soit m = m0m1...mn−1 un mot, m(X) = m0 + m1X +
... + mn−1X n−1 est la reprØsentation polynomiale associØe (cid:224) m. On notera PC
la reprØsentation polyn(cid:244)miale d’un code (on pourra aussi utiliser C s’il n’y a
pas de risque de confusion).
En reprenant le code prØcØdent, on a PC = {0, 1 + X, X + X 2, 1 + X 2}.
Regardons (cid:224) quoi correspond un dØcalage circulaire vers la droite en
termes de polyn(cid:244)me.
σ(m)(X) = mn−1 + m0X + ... + mn−2X n−1
= Xm(X) + mn−1(1 − X n).
(mod X n − 1).
Donc, σ(m)(X) = X(m)X
C’est ce qui nous motive (cid:224) travailler dans l’anneau des polyn(cid:244)mes (cid:224) coe(cid:30)-
F2[X]
cients dans F2 modulo (X n − 1) :
X n−1.
Rappelons la dØ(cid:28)nition d’un idØal :
DØ(cid:28)nition 3.1.3. Un sous-ensemble non-vide I d’un anneau commutatif A
est un idØal si ∀a, b ∈ I, a + b ∈ I et ∀x ∈ A, x · a ∈ I.
Proposition 3.1.4. C est un code cyclique si PC est un idØal de
F2[X]
X n−1.
DØmonstration. Si PC est un idØal de
etXm(X) = σ(m)(X) ⇒ σ(m) ∈ C.
Inversement, si C est un code cyclique, σk(m) ∈ C∀k ∈ N donc X km(X) ∈
F2[X]
PC. Puisque C est un code linØaire, P (X)m(X) ∈ PC ∀P [X] ∈
X n−1 donc
PC est un idØal.
F2[X]
X n−1 alors ∀m ∈ C, Xm(X) ∈ PC
13
DØ(cid:28)nition 3.1.5. Le polyn(cid:244)me gØnØrateur g(X) d’un code cyclique C est
le polyn(cid:244)me non nul unitaire de plus bas degrØ de C.
Proposition 3.1.6. Le polyn(cid:244)me gØnØrateur est unique.
DØmonstration. Supposons que g1 et g2 soient deux polyn(cid:244)mes gØnØrateurs
distincts et di(cid:27)Ørents de 0 de C. Alors, g1 - g2 est un polyn(cid:244)me de C de degrØ
strictement infØrieur (cid:224) celui de g1 et g2, ce qui entra(cid:238)ne une contradiction.
Proposition 3.1.7. Tout mot du code est un multiple de g.
DØmonstration. Soit m ∈ C. Par division euclidienne, on a :
m(X) = q(X)g(X)+r(X) avec q(X), r(X) ∈ F2[X] et deg(r(X)) < deg(g(X)).
r(X) = q(X)g(X) − m(X) donc r est un mot du code d’aprŁs les propriØ-
tØs prØcØdentes (multiple de g(X) et linØaritØ). Si r(X) (cid:54)= 0, cela contre-
dit l’hypothŁse que g(X) soit le polyn(cid:244)me gØnØrateur. Donc, r(X) = 0 et
m(X) = q(X)g(X).
Proposition 3.1.8. g(X) divise X n − 1.
DØmonstration. On sait que X kg(X) = gk(X) oø gk(X) est le polyn(cid:244)me
obtenu en dØcalant les composantes de g(X)k fois vers la droite, c’est donc un
mot du code. Ce qui implique qu’il existe a(X) tel que X kg(X) = a(X)g(X)
et donc (X k + a(X))g(X) = X n − 1.
DØ(cid:28)nition 3.1.9. Un idØal I de A est dit principal s’il existe i ∈ I tel que
I = {i ∗ a|a ∈ A}.
C est donc un idØal principal de
F2[X]
Xn−1 et C = {m(X)g(X)|m(X) ∈
F2[X]
Xn−1}.
Proposition 3.1.10. dim(C) = n−deg(g(X)) et (g(X), Xg(X), ..., X n−1−deg(g(X))g(X))
est une base de C.
DØmonstration. Soit m ∈ C, deg(m(X)) ≤ n − 1 par dØ(cid:28)nition. Sim(X) =
q(X)g(X) alors deg(q(X)) ≤ n − 1 − deg(g(X)). Cela montre que m(X) est
une combinaison linØaire des polyn(cid:244)mes g(X), Xg(X), ..., X n−1−deg(g(X))g(X)).
Donc, dim(C) = n − deg(g(X)) et comme chaque combinaison linØaire
est de degrØ au plus n − 1, ces polyn(cid:244)mes forment une famille libre de
F2[X]
X n−1.(X, Xg(X), ..., X n−1−deg(g(X))) est bien une base de C.
De ce fait, on en dØduit que la matrice gØnØratrice G liØe (cid:224) C est de la
· · ·
· · ·
a0
0
0
an−k
a1
a0
0
0
0
0
∈ Mk,n(F2), deg(g(X)) =
forme
0
· · ·
· · · an−k
· · ·
a1
...
0
· · ·
a0
a1
· · · an−k
14
n − k.
Proposition 3.1.11. Soit C un code cyclique et g(X) son polyn(cid:244)me gØnØ-
rateur de degrØ r, g(X) = a0 + a1X + ...ar−1X r−1 + X r. Alors, a0 = 1.
DØmonstration. Supposons que a0 = 0.
g(X) = a1X + ...an−1X n−1 + X r
g(X) = X(a1 + ...an−1X n−2 + X r−1)
Si on dØcale g(X)n − 1 fois vers la droite (ou 1 fois vers la gauche), on obtient
le polyn(cid:244)me ci-dessus de degrØ < r ce qui gØnŁre une contradiction.
DØ(cid:28)nition 3.1.12. On appelle polyn(cid:244)me de contr(cid:244)le le polyn(cid:244)me h(X)
qui vØri(cid:28)e g(X)h(X) = X n − 1.
Son existence est garantie par g(X) | X n − 1.
En outre, si m ∈ C et m(X) = q(X)g(X),
h(X)m(X) = h(X)g(X)q(X)
= (X n − 1)q(X)
F2[X]
Xn−1.
= 0 dans
h(X) remplit bien un r(cid:244)le similaire (cid:224) celui de la matrice de contr(cid:244)le ; on
considØrera d’ailleurs la matrice de contr(cid:244)le H associØe. Si h(X) = b0 +b1X +
... + bkX k , H =
hk hk−1
0
hk
...
0
0
0
· · · h0
· · · h1 h0
· · ·
0 hk
· · ·
· · ·
0
0
...
· · · h0
∈ Mn−k,n(F2).
On a bien H tG = 0.
3.2 Recherche des codes cycliques
Soit C un code cyclique. Puisque le polyn(cid:244)me gØnØrateur divise X n − 1,
rechercher les polyn(cid:244)mes gØnØrateurs possibles pour un code de longueur n
revient (cid:224) trouver les facteurs de X n − 1 (cid:224) coe(cid:30)cients dans F2.
Soit α une racine primitive n-iŁme de l’unitØ, on a X n − 1 =
dans C[X].
n−1
(cid:81)
i=0
(X − αi)
15
Si g(X) est un polyn(cid:244)me gØnØrateur, il est de la forme g(X) = (cid:81)
(X −αi)
oø Σ est une partie convenable de Fn.
i∈Σ
Proposition 3.2.1. Les coe(cid:30)cients de g(X) = (cid:81)
(X − αi) sont dans F2 ssi
Σ est stable par multiplication par 2 modulo n.
Publicité
i∈Σ
DØmonstration. Si g est (cid:224) coe(cid:30)cients dans F2, chaque coe(cid:30)cient de g est
stable par ØlØvation au carrØ. Comme cette opØration respecte aussi l’addi-
tion, on voit que g(X 2) = (g(X))2. Ainsi, l’ensemble des racines de g est
stable par ØlØvation au carrØ, ce qui signi(cid:28)e que Σ est stable par multiplica-
tion par 2. Inversement, si Σ est stable par multiplication par 2 :
(X 2 − αi)= (cid:81)
(X 2 − α2i) = (cid:81)
g(X 2) = (cid:81)
et donc les coe(cid:30)cients de g sont dans F2.
i∈Σ
i∈Σ
i∈Σ
(X − αi)2 = (g(X))2
La recherche de polyn(cid:244)mes gØnØrateurs revient donc (cid:224) trouver les parties
stables par multiplication par 2 de Fn. Soit j ∈ Fn, on note Σj la plus petite
partie stable contenant j. Alors, il existe un plus petit entier s > 0 tel que
2sj ≡ j[n], on peut ainsi prendre Σj={j, 2j, ..., 2s−1j} qui est bien stable par
multiplication par 2 modulo n.
DØ(cid:28)nition 3.2.2. La classe cyclotomique de j (relative (cid:224) 2 modulo n) est
Σj={j2k mod n|k ∈ N}.
Le degrØ du polyn(cid:244)me irrØductible associØ gj = (cid:81)
i∈Σj
(X − αi) est Øgal (cid:224)
card(Σj) = s.
Cherchons les codes cycliques de longueur 7 a(cid:28)n d’illustrer tout cela.
Exemple : 2sj ≡ j[7]. Pour j = 1, s = 3 convient.
Σ1 = {1, 2, 4}. De mŒme, pour j = 3, s = 3 convient (cid:224) nouveau : Σ3 =
{3, 5, 6}
En(cid:28)n pour j = 0, Σ0 = {0}.
X 7 − 1 peut donc Œtre dØcomposØ comme produit de 3 facteurs irrØduc-
tibles :
g0 = X − 1
g1 = (X − α)(X − α2)(X − α4)
g3 = (X − α3)(X − α5)(X − α6)
16
α Øtant une racine primitive 7-iŁme de l’unitØ.
On peut tester manuellement les polyn(cid:244)mes de degrØ 3 se terminant par 1
(sinon 0 est une racine) (cid:224) coe(cid:30)cients dans F2 qui conviennent : X 3+X 2 + 1 ;
X 3 + X + 1 ; X 3 + 1 et X 3+X 2 + X + 1.
Les deux derniers admettent une racine en 1 et X 3 +1 = (X −1)(X 2 +X +1)
et X 3 + X 2 + X + 1 = (X − 1)3, il n’y a donc que deux choix possibles.
Supposons que α soit racine primitive de P (X) = X 3 + X + 1, on obtient
plusieurs informations concernant α :
α3 = α + 1
α4 = α2 + α
α5 = α4 + 1
α6 = α2 + 1
g1 = (X − α)(X − α2)(X − α4)
= X 3+X 2( α+α2+α4)+X(α3+α5+α6)
= X 3 + X + 1.
De mŒme, on trouve que g3 = X 3 + X 2 + 1 et X 7 − 1 = (X − 1)(X 3 +
X + 1)(X 3 + X 2 + 1).
On obtient ainsi 23 = 8 codes cycliques di(cid:27)Ørents :
Code nul.
C0 = (cid:104)X 7 + 1(cid:105)
C1 = (cid:104)X + 1(cid:105)
C2 = (cid:104)X 3 + X + 1(cid:105)
C3 = (cid:104)X 3 + X 2 + 1(cid:105)
C4 = (cid:104)(X 3 + X + 1)(X + 1)(cid:105) = (cid:104)X 4 + X 3 + X 2 + 1(cid:105)
C5 = (cid:104)(X 3 + X 2 + 1)(X + 1)(cid:105) = (cid:104)X 4 + X 2 + X + 1(cid:105)
C6 = (cid:104)(X 3 + X + 1)(X 3 + X 2 + 1)(cid:105) = (cid:104)X 6 + X 5 + X 4 + X 3 + X 2 + X + 1(cid:105)
C7 = (cid:104)1(cid:105)
Ne change pas le mot.
Les code C2 et C3 ont pour paramŁtres (7, 4, 1), ce sont des codes de
Hamming. Le code C6 correspond au bit de rØpØtition.
On peut dØterminer les polyn(cid:244)mes gØnØrateurs d’une autre fa(cid:231)on :
DØ(cid:28)nition 3.2.3. On appelle polyn(cid:244)me cyclotomique le polyn(cid:244)me Φn
dØ(cid:28)ni par Φn(X) =
n )).
(X − exp( 2kiπ
n
(cid:81)
k=1
k∧n=1
Proposition 3.2.4. X n − 1 = (cid:81)
Φd(X).
d|n
17
DØmonstration. On sait que X n − 1 =
(cid:70)
{k ∈ {1, ...n}|k ∧ n = d}.
d|n
n−1
(cid:81)
i=0
(X − αi). De plus, {1, ...n} =
X n − 1 = (cid:81)
d|n
n
(cid:81)
k=1
k∧n=1
(X − αk) = (cid:81)
(X − αkd)
n
d(cid:81)
k=1
d|n
k∧( n
d )=1
=(cid:81)
d|n
d
(cid:81)
k=1
k∧d=1
(X − α nk
d ) = (cid:81)
Φd(X).
d|n
La derniŁre ØgalitØ venant du fait que si α est une racine primitive n-iŁme
de l’unitØ, α n
d est une racine primitive d-iŁme de l’unitØ.
(cid:3)
Proposition 3.2.5. Les polyn(cid:244)mes cyclotomiques sont (cid:224) coe(cid:30)cients dans Z.
DØmonstration. On montre qu’ils sont (cid:224) coe(cid:30)cients entier par rØcurrence.
C’est vrai pour φ1(X) = X − 1. On suppose que c’est vrai jusqu’au rang
n − 1. On a X n − 1 = (cid:81)
φd(X) = φn(X)h(X) dans C[X] oø h(X) est
d|n
un polyn(cid:244)me (cid:224) coe(cid:30)cients entier par hypothŁse de rØcurrence. En faisant
la division euclidienne dans Z[X] de X n − 1 par h(X) on a : X n − 1 =
g(X)h(X) + r(X) avec deg(r) < deg(h) et g(X) dans Z[X]. Par unicitØ de
la division euclidienne dans C[X], on a φn = g et donc φn est (cid:224) coe(cid:30)cient
entier.
Le calcul des polyn(cid:244)mes cyclotomiques permet donc aussi de retrouver
les polyn(cid:244)mes gØnØrateurs.
Nous allons dØsormais introduire une minoration de la distance minimale
d’un code cyclique.
Proposition 3.2.6. S’il existe des entiers a et s > 0 tels que (cid:80) contienne
a + 1, a + 2, ..., a + s, la distance minimale du code construit est ≥ s + 1.
DØmonstration. Il faut montrer qu’un polyn(cid:244)me R ∈ F2[X] de degrØ < n qui
a au plus s coe(cid:30)cients non nuls (et donc de poids < s + 1) est identiquement
nul. Cela revient donc (cid:224) montrer le lemme suivant :
Lemme Soient d1, ...ds des entiers avec 0 ≤ d1 < · · · < ds < n, et
λ1, ..., λs des ØlØments de F2. Posons R(X) = (cid:80) λjX dj . Si R(αi) = 0 pour
i = a + 1,...,a + s, alors tous les λj sont nuls.
18
DØmonstration. Le dØterminant des αidj est un dØterminant de Vandermonde.
Mais comme α est une racine primitive n-iŁme de l’unitØ, les αdj sont deux
(cid:224) deux distincts.
Pour le code cyclique de longueur 7 vu prØcØdemment, (cid:80) contient {1, 2}
(ou {5, 6}), la distance minimale de ce code est donc ≥3.
Les di(cid:27)Ørents codes cycliques dØsormais dØterminØs, on peut passer (cid:224)
l’Øtape du codage : il su(cid:30)t de multiplier la reprØsentation polynomiale d’un
mot par le polyn(cid:244)me gØnØrateur modulo X n − 1.
Exemple : On prend g(X) = X 3 + X + 1 et m(X) = 1 + X + X 2.
g(X)m(X) = (X 3 + X + 1)(1 + X + X 2) = 1 + X + X 5.
3.3 Algorithme de dØcodage
De fa(cid:231)on analogue aux codes linØaires, le dØcodage se fait par la dØtermi-
nation du syndrome.
DØ(cid:28)nition 3.3.1. Le syndrome d’un mot S(m)(X) est le reste de la division
euclidienne de ce mot par le polyn(cid:244)me gØnØrateur modulo X n − 1.
Cette dØ(cid:28)nition vØri(cid:28)e bien que si un mot appartient au code, son syn-
drome est nul.
Proposition 3.3.2. Soit C un code cyclique de longueur n et de dimension
k. Soit w(X) = q(X)g(X) + s(X), s(X) Øtant le syndrome de w(X). Alors,
le syndrome de Xw(X) est :
Xs(X) si deg(s(X)) < n − k − 1.
Xs(X) − g(X) si deg(s(X)) = n − k − 1.
DØmonstration. Si deg(s(X)) < n − k − 1 alors deg(Xs(X)) < n − k =
deg(g(X)) et on a bien Xw(X) = Xq(X)g(X) + Xs(X) par unicitØ de la
division euclidienne.
Si deg(s(X)) = n − k − 1, s(X) = s0 + s1X + ... + X n−k−1. On note (cid:98)s(X)=s0 +
s1X + ... + X n−k−2. De mŒme, g(X) = g0 + g1X + ... + X n−k et (cid:98)g(X) =
g0 + g1X + ... + X n−k−1.
Xs(X) = X(cid:98)s(X)+X n−k = Xs(X)+g(X)− (cid:98)g(X) = g(X) +(X(cid:98)s(X)− (cid:98)g(X))
19
et deg(X(cid:98)s(X) − (cid:98)g(X)) < n − k − 1. Comme X(cid:98)s(X) = X(X) − X n−k et
(cid:98)g(X) = g(X) − X n−k, le syndrome de w(X) vaut bien Xs(X) − g(X).
Soit C un code cyclique de paramŁtres(n, k, dC), g(X) son polyn(cid:244)me gØ-
nØrateur et w un mot erronØ. Ainsi, w(X) = m(X) + e(X) oø m est un mot
du code et e l’erreur associØe (cid:224) w. On rappelle que le mot peut Œtre corrigØ si
w(e) ≤ eC = (cid:98) dC −1
2 (cid:99), w dØsignant le poids du mot (le nombre de composantes
non nulles). L’objectif du dØcodage est donc de dØterminer le polyn(cid:244)me e(X).
DØterminons la forme de l’erreur. Soit e(cid:48) = (ts,0) oø 0 dØsigne le vecteur
(cid:224) k 0 et s le syndrome de w. Le degrØ de e(cid:48)(X) Øtant strictement infØrieur
(cid:224) celui du polyn(cid:244)me gØnØrateur par dØ(cid:28)nition, son syndrome est le mŒme
que celui de e. De plus, si on suppose que w(s) ≤ eC alors w(e(cid:48)) ≤ eC cela
implique que e(cid:48) = e car il n’existe qu’un seul vecteur de poids ≤ eC associØ
(cid:224) chaque syndrome. L’erreur est donc de la forme (ts,0).
On veut maintenant se ramener au cas oø w(s) ≤ eC a(cid:28)n de pouvoir
dØterminer l’erreur. Supposons que e possŁde k 0 (cid:224) la suite et que w(e) ≤ eC.
Alors, il existe i ∈ {0, 1, .., n − 1} tel que les k 0 de σi(e) soient situØs (cid:224) la
(cid:28)n du mot. Ainsi, σi(e) est de la forme(β,0), β Øtant un vecteur de longueur
n-k ; donc deg(β(X))≤ n − k − 1 =deg(g(X)) − 1. Le syndrome de β(X)
est donc β(X) lui-mŒme. Comme w(β(X)) ≤ eC, w(si(X)) ≤ eC oø si(X)
est le syndrome de X ie(X) modulo X n − 1. D’aprŁs l’argument prØcØdent,
e(X)X i = (tsi,0) donc e(X) = X n−i(tsi,0).
On peut donc expliciter l’algorithme de dØcodage :
1. On dØtermine le syndrome de w(X) par division euclidienne.
2. On prend i = 0 et si w(si(X)) ≤ eC, e(X) = X n−i(si,0) et
m(X) = w(X) − e(X).
3. Sinon, i = i + 1 et on calcule si(X) ;on recommence jusqu’(cid:224) ce que i = n.
Si i = n la correction est impossible.
Exemple Soit C un code cyclique de paramŁtres (15, 7, 5) de polyn(cid:244)me
gØnØrateur g(X) = X 8 + X 7 + X 6 + X 4 + 1 ; sa capacitØ de correction est
donc de 2.
Prenons m(X) = 1 + X + X 3 et w(X) = m(X)g(X).
w(X) = (1 + X + X 3)(1 + X 4 + X 6 + X 7 + X 8) = 1 + X + X 3 + X 4 + X 5 +
X 6 + X 7 + X 10 + X 11.
20
Modi(cid:28)ons deux de ses composantes, disons la quatriŁme et la huitiŁme et
notons ce nouveau polyn(cid:244)me z(X) = 1 + X + X 3 + X 5 + X 6 + X 7 + X 8 +
X 10 + X 11.
Par division euclidienne, on obtient z(X) = (X 3 + X)(1 + X 4 + X 6 + X 7 +
X 8) + X 7 + X 6 + 1.
Le syndrome est donc s(X) = X 7 + X 6 + 1 de poids 3 > 2.
deg(s(X)) = 7 = deg(g(X)) − 1 donc s1(X) = Xs(X) − g(X).
s1(X) = X 8 + X 7 + X − (X 8 + X 7 + X 6 + X 4 + 1) = X 6 + X 4 + X + 1.
s2(X) = X(X 6 + X 4 + X + 1) = X 7 + X 5 + X 2 + X.
s3(X) = X 8+X 6+X 3+X 2−(X 8+X 7+X 6+X 4+1) = X 7+X 4+X 3+X 2+1.
...
...
s10(X) = X 7 + X 6 + X 5.
s11(X) = X 8 + X 7 + X 6 − (X 8 + X 7 + X 6 + X 4 + 1) = X 4 + 1.
w(s11(X)) = 2 , c’est ce que l’on recherchait.
e(X) = X n−11s11(X) = X 4(X 4 + 1) = X 8 + X 4.
Les erreurs sont bien en position 4 et 8, l(cid:224) oø on les avait placØes. Il su(cid:30)t
ensuite de diviser le mot obtenu par le polyn(cid:244)me gØnØrateur a(cid:28)n de
retrouver le mot initial.
Toutefois, l’algorithme de dØcodage n’aurait pas fonctionnØ si e(X) ne
comportait pas au moins k zØros (cid:224) la suite (ce qui arrive forcØment pour un
code de longueur 15 et de dimension 7 lorsqu’il n’y a que deux erreurs).
DØ(cid:28)nition 3.3.3. Un "burst" de longueur λ est un mot de Fn
composantes non nulles sont con(cid:28)nØes dans λ positions consØcutives.
2 dont l...