Chapitre 02 Codes Linéaires
Chapitre 02 Codes Linéaires
2020-21
Les codes linéaires sont des espaces vectoriels. Pourquoi s’en servir en pratique ?
Il y a au moins trois raisons à cela :
1. Mettre au service de la théorie des codes une bonne partie des outils de l’algèbre
linéaire.
2. Au lieu de transmettre des messages qui ne possèdent pas de caractéristiques parti-
culières, on transmet des mots appartenant à un espace vectoriel et codant les éléments
du message. En analysant leurs propriétés à la réception, on saura s’ils ont été altérés ou
non, et l’on pourra, éventuellement, effectuer des corrections et retrouver les véritables
mots expédiés.
3. Le calcul de la distance de Hamming devient plus simple. Comme on l’a vu au chapitre
précédent, le nombre d’erreurs que peut détecter et corriger un code en blocs, lors de la
transmission d’un mot via un canal parasité, dépend étroitement de cette distance.
Plus précisément, nous allons traiter dans ce chapitre des questions suivantes :
• La définition des codes linéaires pour fixer le vocabulaire et traduire la signification de
la distance de Hamming pour ces codes.
• La matrice génératrice G qui caractérise un code linéaire.
• La matrice de contrôle H qui vérifie rapidement l’appartenance d’un mot reçu au code
puisqu’on verra que le code devient le noyau de cette matrice. Dans certain cas, la matrice
H permet le calcul de la distance minimale et donc le nombre d’erreurs que ce code peut
détecter ou corriger.
• Le décodage des codes linéaires.
• La construction des codes de Reed-Muller (1954).
1
Codes correcteurs Ann. Univ. 2020-21
Donnons une structure algébrique à l’ensemble de tous les blocs constitué des n−uplets
dont chaque composante vaut le bit 0 ou 1. Ces deux bits de base seront représentés par
Z
les classes 0 et 1 de l’anneau .
2Z
Z n
L’ensemble (( ) , +, .) est un espace vectoriel (e.v) de dimension n ∈ N sur le corps à
2Z
Z
deux éléments K = dont la base canonique est :
2Z
e1 = (1, 0, 0, 0, ..., 0, 0)
e2 = (0, 1, 0, 0, ..., 0, 0)
e3 = (0, 0, 1, 0, ..., 0, 0) (1)
..
.
e = (0, 0, 0, 0, ..., 0, 1)
n
Définition 2. Le poids d’un vecteur (x1 , x2 , ..., xn ) où xi ∈ {0, 1} est le nombre des
composantes non nulles :
La proposition suivante justifie l’intérêt porté aux codes linéaires. En effet le calcul de la
distance minimale se simplifie.
Proposition 1. La distance minimale d’un code linéaire C est égale au poids minimal
des éléments non nuls du code C.
2
Codes correcteurs Ann. Univ. 2020-21
Listons tous les éléments du code C et leurs poids. Ils sont de la forme λ1 u1 + λ2 u2 + λ3 u3
où les λi ∈ {0, 1}. D’où la table :
(λ1 , λ2 , λ3 ) (mot information) mots ui ∈ C poids p(ui ) = d(ui , 0)
000 000000 0
001 011101 4
010 100111 4
011 111010 4
100 011011 4
101 000110 2
110 111100 4
111 100001 2
La distance minimale ici est d = 2 et l’on vérifie la formule de Singleton vue dans un
exercice du chapitre 1 : d + k ≤ n + 1. Ce code peut servir à représenter au maximum 8
symboles. Il peut détecter une erreur.
3
Codes correcteurs Ann. Univ. 2020-21
La matrice génératrice est pratique pour inclure un message de longueur k bits dans un
mot code de longueur n bits, n > k. Au lieu de transmettre le message via un canal de
communication parasité, on transmet le mot code car ce dernier possède des propriétés
permettant de détecter et corriger les erreurs survenues lors de la transmission.
Définition 3. Soit C ⊂ {0, 1}n un code linéaire de dimension k dont une base est :
e1 = (a11 , . . . , a1n )
e2 = (a21 , . . . , a2n )
(4)
.........
ek = (ak1 , . . . , akn )
Une matrice génératrice du code C est la matrice dont les lignes sont les composantes des
éléments de la base (ei )1≤i≤k :
a11 a12 ... a1n
a21 a22 ... a2n
G=
...
(5)
... ... ...
ak1 ak2 ... akn
Proposition 2. Soit C ⊂ {0, 1}n un code linéaire de dimension k dont une matrice
génératrice est G. Alors
k
X
Démonstration. On peut vérifier que ∀ b ∈ {0, 1}k , bG = bi e i .
i=1
Nous avons ici un moyen de coder l’information. Il suffit de la mettre sous la forme de
k bits et de la multiplier par la matrice fixe G qui ne dépend que du code linéaire et de
l’une de ses bases. Après la multiplication, on tombe sur un élément du code.
Lorsqu’on ajoute à une ligne une combinaison linéaire (C.L) des autres lignes de la matrice
génératrice G, on ne fait qu’un changement de base et donc le code ne se modifie pas.
4
Codes correcteurs Ann. Univ. 2020-21
On peut souvent par ce biais s’arranger pour mettre G sous la forme réduite (standard,
normale, canonique) :
G = [Ik | A] (6)
où Ik est la matrice identité d’ordre k et A est une matrice (k, n − k).
L3 ←− L3 + L1
1 0 1 0 1
G2 = 0 0 1 1 1
0 1 1 1 0
échanger(L2 , L3 )
1 0 1 0 1
G2 = 0 1 1 1 0
0 0 1 1 1
L1 ←− L1 + L3
1 0 0 1 0
G3 = 0 1 1 1 0
0 0 1 1 1
L2 ←− L2 + L3
1 0 0 1 0
G4 = 0 1 0 0 1 = [I3 | A(3 × 2)]
0 0 1 1 1
5
Codes correcteurs Ann. Univ. 2020-21
6
Codes correcteurs Ann. Univ. 2020-21
La matrice de contrôle de parité est pratique pour savoir rapidement si un mot reçu
x = (x1 , x2 , . . . , xn ) appartient ou non au code linéaire C[n, k, d]. Bien sûr, quand x 6∈ C,
c’est qu’il y a eu une erreur lors de la transmission des signaux. Si on désigne par H cette
matrice, le test revient à vérifier si H x = 0 en écrivant le mot x en colonne. C’est-à-dire
vérifier si H t x = 0 où t
A désigne la transposée de la matrice A.
En effet, d’après un résultat d’algèbre linéaire, pour tout sous-espace vectoriel C de dimen-
sion k d’un espace vectoriel de dimension n, il existe un système (S) de (n − k) équations
linéaires homogènes indépendantes dont la solution est l’ensemble C. Autrement dit :
f1 (x) = 0
f2 (x) = 0
x ∈ C ⇐⇒ (S) .. (7)
.
f (x) = 0
n−k
Proposition 3. Soit H une matrice de contrôle de parité pour le code linéaire C[n, k, d].
On a :
1. La matrice H admet (n − k) lignes indépendantes et n colonnes.
2. x ∈ C ⇐⇒ H t x = 0. (égalité utile lors du décodage).
3. Le code C est le noyau de l’application linéaire associée à la matrice H.
7
Codes correcteurs Ann. Univ. 2020-21
Un autre intérêt de la matrice de contrôle de parité est qu’elle peut nous fournir la distance
minimale du code.
Proposition 4. Soit C[n, k, d] un code linéaire dont une matrice de contrôle de parité
est H. Soient C1 , C2 , . . . , Cn les vecteurs colonnes de H. Alors :
Xn
1. x = (x1 , x2 , . . . , xn ) ∈ C ⇐⇒ xi Ci = 0.
i=1
r
X
2. Le code C possède un mot de poids r ≥ 1 ⇐⇒ ∃(i1 , i2 , . . . , ir ) | Cij = 0.
j=1
3. r colonnes de H sont liées ⇐⇒ d(C) ≤ r.
4. d(C) = r ⇐⇒ toute famille de r − 1 colonnes est libre et il existe r colonnes liées.
Corollaire 1. La distance minimale d’un code linéaire C[n, k, d] est égale au nombre
minimal de colonnes liées dans la matrice de contrôle H.
8
Codes correcteurs Ann. Univ. 2020-21
d(C) = 1.
3. Si une matrice de contrôle d’un code linéaire C, sans colonne nulle, contient deux
colonnes égales, alors d(C) = 2.
9
Codes correcteurs Ann. Univ. 2020-21
H t y = H t (x − e) = H t (x + e) = H t e.
10
Codes correcteurs Ann. Univ. 2020-21
11
Codes correcteurs Ann. Univ. 2020-21
Voici comment on décode : Supposons que l’on reçu le mot y = 00101 après avoir expédié
le mot x ∈ C. On localise y grâce au calcul de son syndrome : H t y = 011. L’erreur
e4 =00010 montre qu’il y a eu un seul bit erroné. Et comme ce code est de distance
minimale d(C) = 3, il est capable de corriger une erreur, on prend l’élément du code C
de la colonne y, c’est-à-dire : x = 00111.
Complexité : La multiplication de la matrice de contrôle H par le mot reçu y de longueur
n, exige (n − k)kn multiplications. La recherche du syndrome dans la table des syndromes
qui est de cardinal 2n−k nécessite O(2n−k ). Donc le coût de l’algorithme est exponentiel.
12
Codes correcteurs Ann. Univ. 2020-21
La matrice de contrôle de parité de H est facile à retenir car chaque colonne est le renversé
de l’écriture binaire de 1,2,3,4,5,6,7. De plus on peut échanger la première et la troisième
lignes pour avoir directement l’écriture binaire de 1,2,3,4,5,6,7.
D’autre part, la matrice H contient trois colonnes de somme nulle et deux colonnes quel-
conques ne sont pas égales. D’où la distance minimale du code de Hamming est bien trois.
Il peut en conséquence corriger une seule erreur.
Comme (x1 , x2 , x3 , x4 , x5 , x6 , x7 ) = (x3 + x5 + x7 , x3 + x6 + x7 , x3 , x5 + x6 + x7 , x5 , x6 , x7 )
= x3 (1, 1, 1, 0, 0, 0, 0) + x5 (1, 0, 0, 1, 1, 0, 0) + x6 (0, 1, 0, 1, 0, 1, 0) + x7 (1, 1, 0, 1, 0, 0, 1) ; une
matrice génératrice de C est
1 1 1 0 0 0 0
1 0 0 1 1 0 0
G=
0
1 0 1 0 1 0
1 1 0 1 0 0 1
13
Codes correcteurs Ann. Univ. 2020-21
i1 i2 i3 i4
• •
• •
• •
• • •
⊕ ⊕ ⊕
x1 x2 x4 x3 x5 x6 x 7
t
y = t (y1 , .., y7 )
On obtient :
s1 = y 1 + y 3 + y 5 + y 7
s2 = y 2 + y 3 + y 6 + y 7
s3 = y 4 + y 5 + y 6 + y 7
•−−−−−•−−−−−•−−−−−•−−−−−•
14
Codes correcteurs Ann. Univ. 2020-21
y1 y2 y3 y4 y5 y6 y7
•
•
• •
⊕ ⊕ ⊕
Z Y X
15
Codes correcteurs Ann. Univ. 2020-21
Les codes duaux jouent un rôle important dans le décodage des erreurs. La définition
suivante utilise le produit scalaire classique entre deux n−uplets. Il est noté à l’aide d’un
point en gras.
Proposition 6. Si C ≡ C[n, k, d] est un code linéaire dont une matrice génératrice est
G, alors G est une matrice de contrôle de parité du code dual C ⊥ .
16
Codes correcteurs Ann. Univ. 2020-21
Corollaire 3. Soit C ≡ C[n, k, d] un code linéaire dont une matrice génération est G et
dont le dual est C ⊥ . On a :
1. dim(C ⊥ ) = n − k.
2. (C ⊥ )⊥ = C.
Puisque le rang deHC est n − k, la famille (e0i )1≤i≤n−k est libre. De plus pour tout x ∈ C,
e01 .x = 0
e0 .x = 0
2
HC (x) = 0, donc .. et par suite le sous-espace vectoriel < e0i > engendré par
.
e0 .x = 0
n−k
les éléments e0i est contenu dans le code dual C ⊥ et les deux ont même dimension. D’où
< e0i >= C ⊥ et par conséquent HC est bien une matrice génératrice du code dual C ⊥ .
Remarque pratique 2. Que ce soit pour le code linéaire C ou pour son code dual
C ⊥ , la détermination de l’une des matrices G ou H à partir de l’autre se ramène à la
17
Codes correcteurs Ann. Univ. 2020-21
18
Codes correcteurs Ann. Univ. 2020-21
Découverts indépendamment par deux chercheurs américains en 1954, ce sont des codes
très efficaces pour la correction des erreurs lors de transmissions de messages et possèdent
un bon taux de rendement dimension/longueur. L’algorithme qui permet leur construction
est assez simple. On les fabrique par une technique de récurrence. L’un de ces codes a été
utilisé par la NASA pour les missions spatiales de 1969 à 1976. En particulier, en 1972, la
sonde Mariner, pour transmettre des images de la planète Mars aux stations terrestres,
était programmée pour se servir d’un code de Reed-Muller capable de corriger jusqu’à 7
erreurs.
Voici comment ces codes se construisent récursivement. Soient C1 un code [n, k1 , d1 ] et
C2 un code [n, k2 , d2 ] deux codes linéaires de même longueur n, de dimensions respectives
k1 , k2 et de distances minimales respectives d1 < d2 . On fabrique un nouveau code C3 =
C1 ∗ C2 de longueur 2n et de dimension k1 + k2 de la façon suivante : les mots de C3 sont
les mots w = (u, u + v) où u et v sont tous les mots de C1 et de C2 respectivement. La
longueur de C3 vaut bien 2n et sa dimension k1 + k2 .
Pourquoi la dimension de C3 est k1 + k2 ? :
Soient (e1 , e2 , . . . , ek1 ) une base de C1 et (e01 , e02 , . . . , e0k2 ) une base de C2 . On forme la famille
B = (e1 , e1 ), (e2 , e2 ), . . . , (ek1 , ek1 ), (0, e01 ), (0, e02 ), . . . , (0, e0k2 ). C’est une famille génératrice
Xk1 X k1 Xk2 k1
X
car (u, u + v) = (u, u) + (0, v) = ( λi ei , λi ei ) + (0, µj ej ) = λi (ei , ei ) +
i=1 i=1 j=1 i=1
k2
X
µj (0, e0j ).
j=1
On vérifie facilement que la famille B est libre. Donc c’est une base et par conséquent
dim(C3 ) = dim(C1 ∗ C2 ) = k1 + k2 .
Pourquoi la distance minimale de C3 est min(2d1 , d2 ) ? :
On partage le code C3 en deux sous ensemble disjoints : A = {(u, u) | u ∈ C1 } et
B = {(u, u + v) | u ∈ C1 , v ∈ C2 , v 6= 0}.
Pour avoir le poids minimal de C3 , il suffit de calculer celui de A et celui de B et de
prendre leur minimum.
Il est évident que le poids minimal de A est 2d1 .
Le poids d’un couple (u, u + v) est supérieur ou égal au poids de (0, v) car un bit ”1”
neutralisé dans la seconde composante u + v, est récupéré dans la première composante u
19
Codes correcteurs Ann. Univ. 2020-21
de (u, u + v). Donc le poids minimal dans B est (0, v0 ) où v0 est l’élément de C2 de poids
minimal. Ainsi le poids minimal dans l’ensemble B est d2 .
En conclusion la distance minimale, qui se confond avec le poids minimal pour les codes
linéaires, de C3 = C1 ∗ C2 est min(2d1 , d2 ).
En d’autres termes, C3 = C1 ∗ C2 est un code [2n, k1 + k2 , min(2d1 , d2 )]. Et si l’on a
2d1 = d2 et k1 > k2 , alors C3 = C1 ∗ C2 est un code meilleur que C1 sur la distance
minimale et meilleur que C2 sur le taux d’information.
Exemple 7. Partons des codes C1 = {00, 01, 10, 11} = C[2, 2, 1] et C2 = {00, 11} =
C[2, 1, 2].
0 1
00 01 11 10
00000000 00001111 ... ... ... ... ... ... ... ... ... ... ... ... ...
Combinant celui-ci avec le code [4, 1, 4] = {0000, 1111}, on fabrique un code C[8, 4, 4].
Combinant ce dernier avec un code C[8, 1, 8] = {00000000, 11111111}, on fabrique un
code C[16, 5, 8].
20
Codes correcteurs Ann. Univ. 2020-21
La table suivante contient le code de Reed-Muller C[16, 5, 8] de longueur 16. Ce code peut
coder jusqu’à 25 = 32 symboles. On peut donc séparer les bits du flux à coder en paquets
de 5 bits. Le code détecte toutes les erreurs entre 1 et 7 et il en corrige jusqu’à 3.
A retenir : Si la longueur des mots d’un code de Reed-Muller est 2m alors sa distance
minimale est 2m−1 (moitié de la longueur) et son cardinal est 2m+1 (le double de la
longueur).
•−−−−−•−−−−−•−−−−−•−−−−−•
21