Vous êtes sur la page 1sur 34

Pr cheikh Thiecoumba Gueye

Equipe de Recherche en Codes Correcteurs et


Implantations Sécurisées Post-Quantiques (ERCISpq)
Laboratoire d’Algebre de Cryptographie
de Geometrie Algebrique et Applications (LACGAA)
Dept de Mathématiques et Informatique
FST-UCAD-Dakar
cheikht.gueye@ucad.edu.sn

Les Codes Correcteurs d’Erreurs


Cours conçu à partir du :
- Cours de cryptographie basée sur les CCE (poly de Dakar 2013) - Pierre Louis Cayrel-
Univ St Etienne
- Cours de codes correcteurs d’erreurs - Marc Chaumon- LIRMM Montpellier
- Cours de Codes Algébriques- Master TDSI- Cheikh Thiecoumba Gueye-UCAD-Dakar
- Cours de communication numérique, codes correcteurs d’erreurs- Yoann Morel-ESTEI-
Bordeau
- Introduction to Coding Theory- Alain Couvreur
- Introduction to Coding Theory- Irene Marquez

1 Intoduction et Motivations
Par codes, on peut entendre plusieurs concepts distincts :

les codes pour la cryptographie,


les codes pour la compression,
les codes pour la correction d’erreur.
Dans ce cours, nous nous interessons uniquement aux codes correcteurs d’erreurs.

Dans la grande majorité des cas, une transmission de données se fait en utilisant une voie de
communication qui n’est pas entiérement fiable : le canal de communication. Autrement dit,
les données, lorsqu’elles circulent sur une voie, elle sont susceptibles d’être altérées. la situation
classique est decrite par la figure suivante :

Figure 1 – : Un Canal de Communication

Par conséquant , il faut des mécanismes de détection et de correction de ces erreurs (bruit).
La théorie des codes correcteurs d’erreurs introduite par C. Shannon (1947) est conçu pour

1
fiabiliser les (télé-)communication (numériques) dans un environnement bruitée. La situation
est décrite par la figure suivante :

Figure 2 – : Encodage et Decodage

Comment ?
En ajoutant de la redondance à l’information transmise.
En corrigeant les erreurs quand le message reçu est corrompu/erroné.
On utilise les codes correcteurs d’erreurs pour :
• DVD, CD : réduisent les effets de la poussière (voire plus). . .
• téléphone portable : améliorent la qualité de la communication.
• Internet (Protocole TCP/IP qui permet de communiquer de facon fiable )
• Identification des livres (code ISBN), Identification bancaire (RIB), etc...
• cryptographie (cryptographie post-quantique)

1.1 Codes Correcteurs d’Erreurs :


On distingue deux types de corrections :
— La correction directe : le signal erroné reçu contient suffisament d’information(ajout de
redondance) pour permettre la correction ;

— La correction par retransmission (ARQ) Automatics Repeat reQuest : une erreur est
détectée mais ne peut être corrigée, le recepteur demande à l’émetteur de retransmettre
une nouvelle fois le message source.

1.1.1 Quelques exemples d’utilistion des codes :


Sur internet, (Protocoles IP) : Les protocoles IP sont considérés comme non fiables
. Cela ne signifie pas qu’ils n’envoient pas correctement les données sur le réseau, mais qu’ils
n’offrent aucune garantie pour les paquets (paquets IP) envoyés concernant les points suivants :
• corruption de données,
• ordre d’arrivée des paquets (un paquet A peut etre envoyé avant un paquet B, mais le
paquet B peut arriver avant le paquet A),
• perte ou destruction de paquets,
• duplication des paquets.
Le rôle des codes correcteurs d’erreurs se limite à la détection des erreurs (somme de contrôle).
La correction est alors réalisée par une nouvelle demande de transmission du message (protocole
TCP).

2
DVD, CD : réduisent les effets de la poussière (voire plus)... Dans le cas du disque compact,
les erreurs peuvent être causées par des rayures ou des impuretés du support, elles sont moins
fréquentes mais beaucoup plus volumineux. Le code utilisé corrige jusquà 4096 bits consécutifs
soit une rayure de plus d’un millimétre de large (dans certaine société la norme impose la
capacité de correction d’erreurs dans le cas d’une rayure de 0,2 milimètre)

Code ISBN A chaque livre est affecté un code appelé ISBN (pour International Standard
Book Number). C’est un numéro qui identifie tous les livres édités dans le monde. il figure en
dos de couverture. Il s’agit de dix chiffres regroupés en quatre segments séparé par un tiret (ou
un point). Le premier groupe de chiffre identifie le pays, le groupe de chiffre suivant indique
l’éditeur, le groupe suivant le numéro du livre chez l’éditeur. Le dernier chiffre est la clef de
contrôle, anologue au bit de parité en binaire. Il est obtenu en calculant 9i=1 ixi modulo 11.
P

C’est soit un chiffre entre 0 et 9, soit la lettre X qui représente 10. Soit k cette clef, elle est
telle que
9
X
k = 11 − ixi mod 11
i=1

Par exemple, le code ISBN de Codes Correcteurs d’Erreurs : Une Introduction au Codage
Algébrique est
2 − 225 − 82538 − 6
Le code ISBN permet de :
- detecter s’il y a une erreur dans le numero
- retrover un numero effacé
- detecter une permutation de deux chiffres

Exercice 1.1 Ex1 : le numero ISBN suivant est - il valide ? 2 − 70 − 421030 − 6


Ex2 : Pourquoi avoir choisi l’hyperplan 10
P P10
i=1 ixi = 0 au lieu de i=1 xi = 0 ?
Ex3 : Pourquoi avoir choisi le calcul modulo 11 au lieu de modulo 10 par exemple ?

La clé RIB Un numéro RIB ( Relevé d’Identité Bancaire ) de compte bancaire B −G−N −R
comporte 23 caractère. B et G sont des nombres de 5 chiffres qui identifient respectivement le
code banque et le code guichet. N est le numéro de compte est composé de 11 alphanumériques
que l’on convertit en une séquence SN de 11 chiffres en remplacant les lettres éventuelles cycli-
quement comme suit : A et J par 1 ; B, K et S par 2 ; C, L, T par 3 ; D, M, U par 4 ; E, N, V
par 5 ; F, O, W par 6 ; G, P, X par 7 ; H, Q, Y par 8 ; I, R, Z par 9. Enfin la clé RIB R est un
nombre de deux chiffres qui est tel que R = 97 − ([BGSN ]X100)mod 97.

3
Comme indiqué ci dessus le numero du RIB comporte 23 caracteres. Soit

K = x1 ..x5 x6 ..x10 x11 ..x21 x22 x23 = B1018 + G1013 + N 102 + R.

Ce numero peut comporter à la fois ds lettres et des chiffres. Pour utiliser l’algorithme de calcul
il est necessaire de transformer les lettres en chiffres en utilisant la correspondance ci dessus.
La clé R est calculée de telle sorte que le reste de la division entière de K par 97 est nul et
1 6 R 6 97. Autrement
K ≡ 0 mod 97 1 6 R 6 97

Donc pour un calcul simple de R on a

R = 97 − ((89B + 15G + 3N ) mod 97)

Si l’algo doit fonctionner sur 32 bits, du fait de la longueur du numero du compte N ( 11 chifres
x 3 ! !), le numéro du compte sera séparé en deux. Ainsi on a :
K = x1 ..x5 x6 ..x10 x11 ..x16 x17 ..x21 x22 x23 = B1018 + G1013 + M 107 + N 102 + R.
La formule de calcul de R devient :

R = 97 − ((89B + 15G + 76M + 3N ) mod 97)

4
Communication sans fil ( GSM, satelite, sous marine) : améliorent la qualité de la com-
munication. Dans ce cas la correction par ARQ peut se revéler insuffisante et inadaptée.

cryptographie : (offre plusieurs services, CAIN(D) : Confidentialité (garantir le secret des


données), Authentification(garantir qu’une entité est celle qu’elle prétend être), Intégrité (ga-
rantir la non modification des données), Non-répudiation(garantir qu’une transaction ne peut
pas être niée) et la Disponibilité (garantir le bon fonctionnement d’un système d’information)
- Cryptographie basés sur les codes, introduits au même moment que RSA par McEliece.
*Chiffrement : possibilité de garantir le secret de l !information.
générer un code C que l’on sait décoder.
ceci est la clé privée.
transformer C pour obtenir C 0 qui semble aléatoire.
ceci est la clé publique.
chiffrer un message m en calculant :

c0 = M ⊕ e

avec e une erreur aléatoire de poids la capacité de correction du code et M est une
fonction de m. Connaissant c0 retrouvé M est une correction d’erreur.
*Identification : impossibilté de se faire passer pour quelqu’un d’autre
Avec le probléme du décodage par syndrôme, un système d’identification a divulgation de
connaissance zero ( ou encore sans fuite d’information : prouver que l’on a la connaissance d’un

5
secret sans transferer cette connaissance).

* Signature : la signature permet d’assurer le AIN


Comment signer :

— Prendre CA la fonction de chiffrement (connu de tous par la clef publique) et DA celle


de déchiffrement (n’est connue que par Alice la seule à détenir la clef privée).
— Calculer S = DA (M ), M est le message à signer par Alice.
— Toute personne disposant du message M et de la signature S peut alors vérifier qu’Alice
est à l’origine de la signature en calculant CA (S).
— Si CA (S) = M alors on est certain qu’Alice est l’auteur de la signature et que le message
n’a pas été altéré.

1.1.2 Notions de base des Codes Correcteurs d’Erreurs


Considérons la situation suivante : on désire protéger un message contre les erreurs. A cette
fin, on adjoint à un bloc u = (u1 , ..., uk ) de k symboles d’informations certains nombres, soit r
symboles calculés en fonctions des premiers par l’intermdiaire d’une fonction ϕ
Ces r symboles forment un bloc qu’on appelle la redondance ou symbole de contrôle.

ϕ(u) = v = (v1 , ..., vr ).

En concaténant information et redondance, on obtient un mot de code. L’ensemble de tous les


mots obtenus de cette façon est un code.

u1 , ..., uk ϕ(u) = (v1 , ..., vr )


←→ ←→ .
k symboles r symboles

←→
(u1 , ..., uk , v1 , ..., vr )
n=k+r
(u1 , ..., uk , v1 , ..., vr ) est un mot code.

Remarque 1.2 • Le codage est correcteur d’erreur si ϕ est injective.


• Pour vérifier qu’un mot y = (y1 , y2 ...yn ) appartient au code, il suffit de calculer la redon-
dance w = ϕ(y1 , .., yk ) et de comparer cette redondance calculée avec la redondance don-
née (yk+1 , ..., yn ). S’il y a égalité le mot appartient au code sinon, il y a détection d’erreur.
Supposons que le mot reçu est : (y1 , ..., yk , yk+1 , ..., yn ) pour décoder, on calcule

y 0 = ϕ(y1 , ..., yk )
0
= (yk+1 , ..., yn0 )

, c’est la redondance calculée, puis on le compare à (yk+1 , ..., yn ) (redondance reçue). A


cette fin on forme le vecteur S(y) appelé syndrome
0
S(y) = (yk+1 − yk+1 , ..., yn − yn0 ).

Il y a erreur si S(y) 6= 0 sinon y appartient au mot de code.

6
• Si S(y) = 0, on est sûr que y est un mot de code mais apparemment, rien ne nous
garantit que y est le mot envoyé. Une telle situation nécessite le choix d’un bon code i.e.
un code C pour lequel la probabilité qu’un mot appartient à C ne soit pas envoyé est trés
faible.

• Shannon à l’aide de ses travaux sur la théorie de l’information nous assure l’existence
théorique de tels codes : Soit un canal sans mémoire de capacité K. Pour tout
ε, ε > 0, et pour tout R0 , R0 < K, il existe un code C de taux R > R0 qui
vérifie la contrainte de performance sur la probabilité : Pe (C) < ε.
D’une maniére plus prosaïque :
On peut transmettre à tout taux R inférieur à la capacité du canal avec une probabilité
d’erreur "evanescente" (c’est à dire bornée par une quantité ε arbitrairement petite).
• Pour la suite les codes considérés sont des codes linéaires en bocs, c’est ad́ire des espaces
vectoriels. Cependant il existe des codes non linéaires.

1.1.3 Les codes linéaires et leurs parametres


Définition 1.3 : Un code linéaire C de longueur n et de dimension k sur le corps fini Fq est
un sous-espace vectoriel de Fnq de dimension k.

k = dimFq C

Distance de Hamming et Distance minimale

Définition 1.4 : Soit Fq ; pour deux éléments x = (x1 , ..., xn ) et y = (y1 , ..., yn ) ∈ Fnq , on
appelle distance de Hamming de x et y, le nombre de compsosantes pour lesquelles x et y dif-
férent. Elle se note :
d(x, y) = Card({i ∈ {1, ..., n} / xi 6= yi })

F4 = {0, 1, 2, 3} et n = 5
Exemple 1.5 : x = (0, 1, 2, 3, 1) et y = (0, 2, 1, 3, 1)
dH (x, y) = 2

Exercice 1.6 Montrer que l’application

d : Fnq × Fnq −→ N
(x, y) 7−→ d(x, y)

définie bien une distance De plus si F est additif alors, on a : d(x + z, y + z) = d(x, y).

Remarque 1.7 : Cette distance de Hamming permet de caractériser le nombre d’erreur que le
code C peut corriger. En effet, soit c ∈ C un mot de code émis et soit y le mot reçu, supposé
différent de c ( donc d(c,y)>0) :
1) Il est nécessaire que y ∈
/ C pour que C puisse détecter une erreur, si non il sera considéré
comme un mot de code donc correcte.
2) Pour pouvoir corriger, il faut que c soit l’unique mot de C le plus proche de y ; c’est à dire :
∀x ∈ C : x 6= c → d(x, y) > d(c, y).
Ce qui se traduit par la propriété suivante :
Soit C un code de longueur n, C est t-correcteur (s’il permet de corriger t erreurs ou moins)
si : ∀x ∈ F, card({c ∈ C/d(x, c) 6 t}) 6 1

7
On peut utiliser des notions de boules pour définir la détection et la correction d’erreur :
Soit Fq un corps de q et r un entier, x ∈ Fnq . Alors le sous - ensemble Bn,q (x, r) = {y ∈
Fnq /d(x, y) 6 r} est appelé boule de centre x et de rayon r.

Lemme 1.8 : Soit r ∈ N, pour chaque x ∈ Fnq , le cardinal de la boule Bn,q (x, r) est :

r
Cnj (q − 1)j
X
Card Bn,q (x, r) =
j=0

Exercice 1.9 1- Demontrer le lemme ci dessus.


2- Montrer que : Card Bn,q (x, r) = Card Bn,q (y, r) pour tout x, y ∈ Fn ., c’est à dire toutes
les boules de même rayons ont même cardinal.

Exemple 1.10
B((1, 1)1) = {(1, 1), (1, 0), (0, 1)}
B((1, 0)1) = {(1, 0), (0, 0), (1, 1)}
B((1, 1), 2) = {(1, 1), (0, 0), (1, 0)(0, 1)} = F2

Exercice 1.11 Soit F = Z/2Z , n = 3.


1) Déterminer les boules suivantes : B((1, 11), 1) , B((111), 2).
2) Calculer le cardinal, Card B((111), 3) et Card B((111), 2).
3) Calculer le cardinal Card B(111), 3).
4) Représenter ces boules dans l’espace.

Définition 1.12 (Poids de Hamming)


Si Fq un corps fini ; le poids de Hamming d’un mot x = (x1 , ..., xn ) est sa distance au mot "
nul." On le note W (x) = d(x, 0). Donc le poids de x est le nombre composantes non nuls de x.

Remarque 1.13 : Pour un bon code les éléments c de C sont choisis de façon qu’ils restent
distingables même une fois altérés, ie qu’ils puissent être corrigés même si une erreur intervient
lors de la transmission. Ces mots de code doivent être suffisamment éloignés les uns des autres.
Donc la distance entre les mots de code doit être aussi grande que possible ; ce qui suggère l’in-
troduction de la notion distance minimale d’un code

Définition 1.14 La distance minimale d’un code est la plus petite distance entre les mots de
code de C. On le note
d(C) = mind(x, y)
(x, y) ∈ C 2 , x 6= y

F= Z/2Z = {0, 1}, n = 6


Exemple 1.15
C = {(1 0 1 1 1 1); (0 0 1 0 0 1)(1 1 0 0 0 1) (0 0 0 0 0 1)}
Calculer d(C).

Si C est de dimension k de longueur n et de distance minimale d alors C est un (n, k, d) code.

Proposition 1.16 (Propriété des distances et des poids) Si C est un code linéaire, l’ensemble
des distances entre les mots de C est l’ensemble des poids des mots de C.

8
Démonstration :
Soit x, y ∈ C , alors x − y ∈ C car C est un espace vectoriel, or d(x, y) = w(x − y). Donc toure
distance est un poids d’un mot de C.
Réciproquement si x est un mot de C, on sait que W (x) = d(x, 0). Donc tout poids est une
distance de mots de C.
Conséquences :
La distance minimale d’un code linéaire est le poids minimal des mots non nuls du code.
En effet soit x, y deux mots de C tels que d(C) = d(x, y). Si W (C) est le poids minimal, alors
d(C) = W (x − y) > W (C).
D’autre part W (C) = W (z) = d(z, 0) > d(C).
D’oú d(C) = W (C).
Remarque 1.17 Cette conséquence nous donne une amélioration dans la recherche de la dis-
2
tance minimale qui est le cardinal de C-1 ((Card(C) − 1 opérations) au lieu de CCard(C) =
1
2
Card(C)(Card(C) − 1) opérations).

Définition 1.18 (détection et correction d’erreur)


Soit C un code de longueur n. On dit que :
1) C peut détecter t erreurs si pour tout c ∈ C la boule B(c, t) ∩ C = {c}
2) C peut corriger e erreurs si pour tout c et c0 de C, B(c, e) ∩ B(c0 , e) = ∅
(condition de décodage d’ordre e) ou bien (capacité de correction du code).

Exercice 1.19 :
a) F = F2 = {0, 1}, n = 4
C = {1 1 0 1, 1 0 0 0, 0 0 1 1}
1) Est - ce que C peut détecter et corriger une erreur
2) Est - ce que C peut détecter et corriger 2 erreurs
3) Calculer d(C).

b) F2 = {0, 1} et n = 4
C = {1110 0000}
1) Est - ce que C peut détecter et corriger 1 erreur
2) Est - ce que C peut détecter et corriger 2 erreurs.
3) Calculer d(C).

Théome 1.20 (Théoréme fondamental)


Soit C un code de longueur n et de distance minimale d. Alors
1) Si d > t + 1 , C peut détecter t erreurs
2) Si d > 2e + 1 , C peut corriger e erreurs.

Exercice 1.21 Démontrer le théorème ci dessus

Remarque 1.22 Les inégalités du théorème ci-dessus, suggérent de chercher la plus grande
valeur de e vérifiant la relation d > 2 e + 1. Un tel e est appelé capacité de décodage ou de
correction.
 Supposons que d est pair, (d = 2p)
2e + 1 = 2p impossible
2e + 1 = 2p − 1 =⇒ e = p − 1

9
La meilleure e possible est e = p − 1.
 Supposons que d = 2p + 1
=⇒ 2e + 1 = 2p + 1.
la meilleure e possible
! est e = p : donc
d(c) − 1
e=E quelle que soit la valeur de d.
2
!
d(c) − 1
Un code C de distance minimale d(C) est susceptible de corriger e = E , Cette pro-
!
2
d(c) − 1
position signifie que si le mot reçu y comporte e = E , il est possible sans ambiguité
2
de déterminer le mot de code c émis. procéde de la manière suivante.

Paramétres Relatifs
Définition 1.23 : Soit C un code linéaire de longueur n, de dimension k et de distance mini-
male d le taux d’information du code C est définie par
k
R=
n
et la distance relative est définie par
d
δ= .
n
Le taux d’information et la distance minimale sont des nombres rationels contenus dans [0, 1].
Le taux d’information quantifie l’éfficacité du code. Il est le rapport entre les bits d’information
et les bits envoyés. Un taux proche de 0 correspond á un code trés redondant qui nécessite
une énorme énergie pour transmettre un message court. Un taux proche de 1 correspond á un
code éfficace pour lequel le rapport des informations pures dans la chaine de bits transmise
est proche de 1. D’autre part, la distance relative quantifie la capacité théorique á corriger les
erreurs. Plus on se rapproche de 1, plus on peut théoriquement corriger d’erreurs. Plus δ se
rapproche de 1, plus on peut théoriquement corriger d’erreurs.
De toute évidence, notre objectif est que le taux et la distance relative soient proches de 1.
Malheureusement, ces exigences sont contradictoires. En effet, comme nous le verrons dans les
prochains chapitres, plusieurs bornes supérieures impliquent l’impossibilité d’avoir á la fois le
taux et la distance relative proches de 1. Le plus célébre d’entre elles est la soi-disante borne
de Singleton qui affirme que
1
R+δ 61+ .
n
Ainsi, "un bon code" sera un code admettant un bon compromis entre ces deux paramétres .
Une autre conclusion de cette observation est qu’il est impossible de coder efficacement c’est á
dire avec une faible redondance et de corriger de nombreuses erreurs. Ainsi, le choix des codes
dépendra de la situation dans laquelle ils sont ës : par exemple, si le canal est trés bruyant,
nous choisirons probablement un code avec une grande distance minimale, meme si son taux est
faible. D’autre part, certains appareils nécessitent une limitation de la consommation d’énergie,
et vont donc encourager l’utilisation d’un code de taux élevé. Notez que de nombreux autres faits
doivent etre pris en compte. Par exemple, dans certaines communications, on peut demander
á l’expéditeur de renvoyer un bloc corrompu. Dans une telle situation, si cette "opération de
renvoi" est facile á effectuer, vous pouvez alors choisir un code á taux élevé. D’autre part,

10
cette "opération de renvoi" peut etre impossible dans les communications á longue distance,
par exemple avec des engins spatiaux. Comme nous le verrons dans le chapitre sur les codes de
Reed Muller, la Nasa a utilisé un code [32, 6, 16]2 pour recevoir des photos de Mars provenant
de la sonde spatiale Mariner IX. En utilisant ce code, la Nasa pourrait corriger jusqu’á 7 erreurs
par bloc alors que le taux est plutot faible (0,375). Meme si l’engin spatial avait une mémoire
et des ressources énergétiques limitées, il était important de pouvoir corriger un grand nombre
d’erreurs car il n’y avait aucune interaction possible avec l’engin spatial et qu’il n’était donc
pas possible de lui demander de renvoyer une photo corrompue.

Les paramétres désignés Il est fréquent que, pour un code donné, les paramétres exacts
soient inconnus mais que leurs bornes inférieures soient connues. Dans cette situation, ces bornes
inférieures sont appelées les paramétres désignés. Notez qu’en général, la dimension est connue
ou peut etre calculée par élimination gaussienne. D’autre part, on remarquera en outre que le
calcul de la distance minimale d’un code est un probléme algorithmique complexe. Ainsi, il est
fréquent de traiter des codes dont la distance minimale réelle est inconnue, alors qu’une borne
inférieure, c’est á dire une distance minimale désignée, est connue. Cette distance désignée
est fondamentale car, en général, les algorithmes de décodage corrigent les erreurs dés que leur
nombre est inférieur á la moitié de la distance désignée et ne dépasse pas la moitié de la distance
réelle (inconnue).

Les codes non linéaires On peut plus généralement définir un code correcteur d’erreur en
tant que sous-ensemble C de Fq . Pour les codes non linéaires, on peut toujours définir une
distance minimale en utilisant (1.14) mais faites attention de ne pas utiliser (1.16), ce qui est
en général non pertinent pour les codes non linéaires. Au lieu de traiter avec la dimension qui
ne peut pas etre définie si le code n’est pas un espace vectoriel, on peut considérer le nombre de
mots de code, ce qui est souvent désigné par M. Ensuite, un analogue naturel pour la dimension
est logq (M ).
Bien que la théorie des codes non linéaires soit riche et sujette á de nombreux développements
intéressants, nous traitons principalement des codes linéaires dans ce cours. L’utilisation et
l’intéret des codes linéaires seront motivés dans la section 1.1.4. A partir de maintenant, le
terme code signifiera toujours code linéaire.

1.1.4 La description d’un code


Il existe deux maniéres de décrire un code, qui sont les deux maniéres classiques de décrire un
sous-espace vectoriel de Fnq . A savoir, on peut soit donner une base ou au moins une famille
de générateurs, soit un systme d’équations linéaires dont l’espace de solution est le code. Plus
formellement, un code peut etre représenté sous la forme d’une image d’une matrice ou du
noyau d’une autre matrice. Cela motive les définitions suivantes.

Définition 1.24 (Matrice génératrice ) On appelle matrice génératrice d’un (n, k, d) code li-
néaire sur Fq , la matrice l × n sur Fq G, avec l > k, dont les lignes forment une famille
génératrice de C. C’est á dire

Ainsi le code est l’ensemble des mots c ∈ Fnq tel que c = m ∗ G avec m ∈ Fkq .

C = {m ∗ G / m ∈ Flq }

11
Définition 1.25 (Matrice de controle ) On appelle matrice de controle d’un (n, k, d) code li-
néaire sur Fq , la matrice (n − l) × n sur Fq H, avec l > k, dont le ker est égal á C. C’est á
dire
C = {x ∈ Fnq /H ∗ xt = 0}

Remarque 1.26 Fréquemment dans la littérature, une matrice génératrice est définie comme
une matrice k × n dont les lignes forment une base de C et une matrice de controle de parité est
définie comme une matrice ((n − k) × n) dont le noyau est C. Pour de nombreuses raisons, qui
apparaissent dans ce qui suit, nous avons choisi cette définition plus générale. Nous parlerons
de matrice génératrice de rang complet (resp. Matrice de controle de rang complet) lorsque la
matrice a k (resp. n − k) lignes.

Remarque 1.27 Il est á noter que l’on ne peut pas dire "la matrice génératrice de C" mais
"une matrice génératrice de C". En effet, si G est une matrice génératrice de C, l × n sur Fq ,
alors pour toutes matrices S inversibles l × l, la matrice SG est une autre matrice génératrice.
Ainsi, une telle matrice n’est pas unique. Pour la meme raison, une matrice de controle de
parité n’est pas unique non plus.

Une motivation d’utiliser les codes linéaires La description ci dessus description est
en fait la principale motivation d’utiliser des codes linéaires au lieu de codes non linéaires. En
effet, les matrices génératrice ou de controle fournissent une description trés "compacte d’un
code". Pour comparer, si nous devons décrire un code non linéaire, nous devons lister tous ses
mots de code. Si ce code est binaire (défini sur F2 ) et contient M mots, il faut nM bits pour
le décrire complétement. Par contre, si le code est linéaire, la représentation par une matrice
génératrice ne nécessite que nk = nlog2 (M ) bits. Ainsi, la taille de la mémoire nécessaire pour
stocker un code non linéaire de M mots est exponentiellement supérieure á la taille nécessaire
pour stocker un code linéaire avec le meme nombre de mots.

Codes systématiques

Définition 1.28 (Matrice génératrice systématique). Soit C un code linéaire dans Fnq et G une
matrice génératrice k × n sur Fq de rang complet de C. La matrice G est dite systématique si
elle est de la forme :
G = (Ik , A).
oú A est une matrice k × (n − k) sur Fq et Ik la matrice identité d’ordre k. Un code C est dit
systématique si une des ces matrices genératrices est systématique.

Remarque 1.29 Si G = (Ik , A) alors H = (−tA , In−k . Tout code linéaire n’est pas systéma-
tique, par contre il est systématique a une permutation prés.
Le lemme suivant caractérise les codes systématique :

Lemme 1.30 Un code C dans Fnq est systématique si et seulement si, pour toute matrice géné-
ratrice G de rang complet de C, les k premiéres colonnes de G sont linéairement indépendantes,
ou de maniére équivalente, le déterminant d’ordre k composé des k colonnes les plus á gauche
de G est non nul.

12
Preuve : Notons d’abord si G et G0 sont deux matrices génératrice du code C, alors il existe
une matrice inversible P d’ordre k telle que G = P G0 . Donc si le déterminant d’ordre k composé
des k colonnes les plus á gauche de G est non nul, alors il en est de meme pour G0 .
Si C est un code systématique, alors C admet une matrice génératrice systématique dont les
k premiéres colonnes sont naturellement indépendantes puisque étant la base canonique de
Fkq . Inversement si C admet une matrice génératrice G dont les k premiéres sont linéairement
indépendants, alors
G = (L, M )
où L, est une matrice k × k inversible et M une matrice k × r(r=n-k). Posons G00 = L−1 G
donc G00 = (Id , | T = L−1 M ) (cette matrice peut etre obtenue par une élimination de Gauss).
L’action du produit de L−1 par G est de remplacer chaque ligne de G par une combinaison de
lignes de G, donc G00 est une matrice génératrice systématique du code C

Remarque 1.31 Soit C un code de matrice genératrie de rang complet G , le codage se fait
par l’intermédiare G. En effet un code linéaire est entièrement déterminé par G. A tout mot
m de longueur k (le message) on associe le mot de code de longueur n, c = m ∗ G donc on a
l’application de codage qui est representée par :

φ : Fkq −→ Fnq
m 7−→ c = m ∗ G

m étant le mot initial à coder de longueur k et c = m ∗ G le mot de code de longueur n. Ainsi


le code est l’ensemble des mots c ∈ Fnq tel que c = m ∗ G avec m ∈ Fkq . Si G est systématique
un mot de code c est obtenu en ajoutant au message m une redondance de longueur n − k

De plus la matrice génératrice systématique, si elle existe, est unique.

Lemme 1.32 Soit C un code systématique sur Fq . Alors admet une unique matrice génératrice
si elle existe.

Preuve . Soit G et G0 deux matrices génératrice systématique du codes C. Alors il existe une
matrice P inversible d’ordre k sur Fq telle que :

G = P G0 .

Puisque les deux matrices ont Ik comme bloc de gauche, l’égalité ci dessus implique que P = Ik .

Matrice de controle et distance minimale Une propriété importante d’une matrice de


controle de parité est que la distance minimale du code "peut etre déterminé" en étudiant les
relations linéaires entre les colonnes de la matrice. Le lemme suivant est souvent trés utile en
théorie du codage.

Lemme 1.33 Soit un code linéaire (n, k) sur Fq de matrice de contrôle H. Alors la distance
minimale de C est d si et seulement si tous d−1 colonnes de H sont linéairement indépendantes
et que d colonnes de H sont linéairtement dépendantes.

13
Preuve Si C1 , C2 , ..., Cn sont les colonnes de H, alors si x = (x1 , ..., xn ) ∈ Fnq on a :
  
C1 C2 ... Cn x1
t
 . .. ..   . 
 ..
H x= .   ..  = C1 x1 + C2 x2 + ...Cn xn
.   
xn
Si x est dans C alors on a Hxt = 0.Donc il existe dans C un mot de poids r s’il existe une
combinaison linéaire de r colonnes de H qui est nulle. En particulier, le poids minimal de C
est le plus petit entier non nul r tel qu’il existe une combinaison linéaire( de coefficients non
nuls ) de r colonnes de H qui est nul. Autrement dit, r est le plus grand entier tel que tout
sous-ensemble de r − 1 colonnes de H est linéairement indépendante.

Corollaire 1.34 Soit C un code de matrice de parité H. Soit d la distance minimale de C.


• Si H n’a aucune colonne nulle, alors d > 1
• Si les colonnes de H sont deux á deux non colinéaire, alors d > 2

1.2 Premiers Exemple


1.2.1 Le code á répétition
Il s’agit d’aboder le probléme de la manière la plus naïve : si la transmission d’un message peut
être entachée d’erreur(s), il n’y a qu’à le transmettre directement plusieurs fois !
Le codage avec répétition consiste à envoyer le message plusieurs fois de suite pour augmenter
nos changes de recevoir un message correct. Dans le cas suivant on répéte 5 fois le message :
on envoie 0 par (00000) et 1 par (11111).
Ce code est représenté par une matrice génératrice G et une matrice de controle définie de la
1 −1 0 0 0
 
 0 1 −1 0 0 
manière suivante : G = (11111) et pour matrice de controle H = 
 
 0 0 1 −1 0 

0 0 0 1 −1
D’une maniere générale, pour tout entier n et pour tout corps fini, on peut définir le code á
répition comme le code de matrice génératrice G = (111...1) avec G une matrice 1 × n. Un tel
code est de longueur n, de dimention 1 et de distance minimale n. En effet les mots non nuls
d’un tel code sont de la forme (aa...a) pour a ∈ F∗q . On a pour ce code :
• Il est un code [n, 1, n]q
1
• Son taux d’information est Rn = en particulier la limite de Rn quand n tend vers plus
n
infini est égal á 0.
n−1
• Pour chaque bloc, on peut corriger jusqu’á [ ]. En effet étant donné un mot y ∈ Fnq
2
n−1
recu avec moins de [ ], trouver l’unique élément a ∈ Fq tel que la majorité des
2
composantes de y sont égales á a ; alors le message envoyé est (aa...a).
En conclusion, ce code a un mauvais taux d’information (asymptodiquement égal á zéro), mais
il a une bonne capcité de correction.

14
1.2.2 Le code de parité
Le code de parité est l’image de l’application de codage suivant :

φ : Fqn−1 −→ Fnq
n−1
X
(x1 ...xn−1 ) 7−→ (x1 ...xn−1 , xi )
i=1

Les matrices
 génératrice et de controle
 sont définies de la maniére suivante :
1 −1 0 0 . . 0
 0 1 −1 0 . . 0 
 
 
G= 
 et H = (11..11). Si q = 2, alors le code est l’ensemble des

 
 
0 . . . . 1 −1
mots dont le nombre de 1 est paire, ce qui justifie le nom de code de parité. Ces proporiétés
sont :
• Ces paramétres sont [n, n-1, 2] ;
2
• En particulier, sa distance relative est δn = et donc sa limite quand n tend vers plus
n
l’infini est égale á zéro.
• Le code n’est pas correcteur d’erreur, mais il est détecteur : Il peut détecter une erreur

Remarque 1.35 La matrice génératrice du code á répétition est la matrice de controle du code
de parité et vice versa. On vera dans le chapitre sur la dualité que ces codes sont duaux l’un de
l’autre.

1.2.3 Le code de Hamming


Définition 1.36 On appelle code de Haming binaire de longueur 2r − 1, le code binaire admet-
tant comme matrice de contrôle, la mtrice r × 2r − 1 dont les colonnes sont les éléments non
nuls de Fr2 .

Remarque 1.37 1) Le code de Harming de longueur n = 2r − 1 est de dimension k = n − r =


2r − 1 − r, n − k est le nombre de symbole de contrôle dans chaque mot de code (redondance).
2) Les codes de Haming de longueur 2r − 1 est défini à une équivalence prés.
3) On peut définir les codes de Harming sur tout corps fini Fq .

Exemple 1.38 On définit un code Harming, de longueur 7, de dimension 4 et r = 3


 
0 0 0 1 1 1 1
H= 0 1 1 0 0 1 1 
 

1 0 1 0 1 0 1

Les colonnes de H sont choisies suivant l’ordre naturel décroissante d’écriture binaire numéro
de chaque colonne de 1 à 7. Par exemple 1 = 0 22 + 0 21 + 1 20 .

Théome 1.39 Soit C un code Harming binaire de longueur 2r − 1 avec r > 2, alors on a :
1) C est un code (2r − 1, 2r − r − 1) = (n, k).
2) C est de distance minimale 3.
3) C peut détecter 2 erreurs et corriger 1 erreur.
4) C est parfait.

15
Démonstration
1) Par définition sa matrice de contrôle est r × 2r − 1 i.e n = 2r − 1 et n − k = r, k = n − r =
2n − 1 − r.
2) Puisque le code de Harming est linéaire, si le code C contient un mot de poids 1, on a
C = (0...0, 1, 0...0) donc H t C = 0 ⇐⇒ C i = 0.(Ci est la colonne numéro i de H)
Ceci veut dire que H contient une colonne nulle. Ce qui est faux. Si C contient un mot de poids
2 on a C = (0....010.....010.....0) H t C = Ci + Cj = 0. Dans H deux colonnes sont identiques
ce qui est faux. Par conséquent d(C) > 3 (1).
D’autre
 part 
0 0 0 ... ...
 0 0 0 ... ... 
 
. .. 
 
H=  .. . 
 

 0 1 1 ... ... 
1 0 1 ... ...
C1 + C2 + C3 = 0, donc C contient un mot de poids 3 d’où d(C) 6 3 (2). De (1) et (2) on a
d(C) = 3.
3) évident d’aprés 2).
1
Cnj (q − 1)j = q n
X
4) |C|
j=0
1
Cni = 2n−r (1 + n) = 2n−r (1 + 2r − 1) = 2n . Donc le code est parfait.
X
|C|
i=0

Décodage avec un code de Harming binaire.


Puisque le code de Harming de longueur 2r − 1 est parfait et de capacité de correction 1,
alors les tétes de classes sont exactement les 2r vecteurs de F2 de poids 1. Le syndrome est
00 ... 010 ... 0
H t( ) = t Ci (où Ci est la colonne noi de H.
i
Si les colonnes de H sont choisies suivant l’écriture binaire de i, i étant le numéro de colonne
de H, alors le décodage s’effectue de la maniere suivante : Si y est le mot reçu, on calcule le
syndrome S(y) = H t y.
- Si S(y) = 0, alors y est le mot envoyé.
- Si S(y) 6= 0 alors l’erreur est à la position i qui correspond à l’écriture binaire décroissante de
S(y).
 
0 0 0 1 1 1 1
H= 0 1 1 0 0 1 1 
 

1 0 1 0 1 0 1
y = (1101011).

16
S(y) = H t y = (110) = 6 (en base binaire).
Donc erreur à la position 6.
ŷ envoyé = (1101001).

17
Exemple 1.40 Exemple numérique d’un code de Hamming de longueur 7 sur F2

18
1.3 Construction de nouveaux codes
1.3.1 Codes Etendus
Définition 1.41 Soit C ∈ Fnq un code contenant au moins un mot c ∈ C tel que c1 + c2 + . . . +
cn 6= 0. Le code étendu de C est le codes :
n
X
Ext(C) = {(c1 , . . . , cn , − cj )/c = (c1 , . . . , cn ) ∈ C}
j=1

Les mots du code étendu vérifie le fait que la somme de leurs composantes est toujours nulle.
En Magma la commande ExtendCode(C, n) retourne le code C, n fois étendu.

Proposition 1.42 Soit C ∈ Fnq un code de longueur n de matrice de parité H, une matrice
l × n. Alors la matrice (l + 1) × (n + 1) ; H 0 est une matrice de parité du code Ext(C).

Preuve : la preuve est une simple vérification

Exemple 1.43 E est le code étendu du code Hamming C dans l’exemple ci dessus.

1.3.2 Codes racoucis et Poiçonnés


L’opération la plus élémentaire pour obtenir un code de longueur courte á partir d’un code
de longueur plus longue est probablement le poiçonnage, qui consiste uniquement á supprimer
certaines entrées prescrites de tout mot de code.
Soit C un code linéaire de paramétres [n, k, d] et I un sous-ensemble de S = {1, . . . n}.

19
Définition 1.44 (poiçonnage) Si c ∈ Fnq est un mot de code, le poinçonné de c sur les positions
I est le mot de code P unctI (c) obtenu en supprimant les coordonnées indexées par les éléments
de I. Le code poinçonné P unctI (C) est le code obtenu en poinçonnant les mots du code C en I.
P unctI (C) = {(ci )i∈{1,...n \I | c ∈ C}
Exemple 1.45
C = {(0000), (0101), (1001), (1010), (0110), (0011), (1100), (1111)}
P unctI (C) = {(00), (11), (10), (01)}
Lemme 1.46 Soit C ⊆ Fnq un code de longueur n et de dimension k. Soit G ∈ Mk,n (Fq ) de C
une matrice génératrice de C. Soit I ⊆ {1, . . . , n}. Alors la matrice G0 obtenu á partir de G en
délectant les colonnes de G dont leur index est dans I est une matrice génératrice de P unctI (C)

Preuve Evidente
Proposition 1.47 Soit C un (n, k, d)q code et I ⊆ {1, . . . , n}. Alors, le code P unctI (C) est
un (n0 , k 0 , d0 )q code tel que :
n0 = n − |I|
k0 6 k
d − |I| 6 d0 6 d

Preuve l’égalité sur les longueur est évidente


Pour la dimension, d’après le Lemme 1.45 la matrice génératrice du code P unctI (C) est dans
Mk,n−|I| (Fq ), cette matrice peut ne pas ebtre de rang plein. Donc k 0 6 k.
Pour la distance minimale, , on sait d’une part que si c ∈ C, P unctI (c) = (ci )i∈{1,...n \I, donc
WH (P unctI (c)) > WH (c) − |I|
On a l’égalité si I est entiérement contenu dans le support de c i.e. si pour tout i ∈ I, ci 6= 0.
D’autre part d’une maniére evidente on a
WH (P unctI (c)) 6 WH (c).
Les deux inégalités ci dessous permet d’obtenir les inégalités sur la distance minimale.
Définition 1.48 (racourcis) Si C ⊂ Fnq est un code, le racourcis de C sur I est le code
ShortI (C) de longueur (n − |I|) obtenu de la maniére suivante
ShortI (C) = {(ci )i∈{1,...n \I | c ∈ C, ∀j ∈ I, cj = 0}
Soit C̄I le sous-code de C constitué des mots de codes c = (c1 , . . . , cn ) ∈ C tels que ci = 0 pour
tout i ∈ I, i.e. : C̄I = {c = (c1 , . . . , cn ) ∈ C|ci = 0, ∀i ∈ I}.
ShortI (C) = P unctI (C̄)
Par définition du code racourci on a le lemme ci dessous :
Lemme 1.49 Soit c0 ∈ ShortI (C), alors il existe un mot de code c ∈ C tel que

c0 , si i∈
/I
∀i ∈ {1, . . . , n}, ci =  i
0, sinon
Lemme 1.50 Soit C ⊂ Fnq un code et H ∈ Ml,n (Fq ) une matrice de patité de C. Soit I ⊂
{1, . . . , n}, alors la matrice H 0 obtenue de H en delectant les colonnes dont leur index est I,
est la matrice de parité de ShortI (C).

20
Preuve Puisque c ∈ C, par définition de H, on a H × ct = 0, il est évident donc que,
H 0 × c0t = 0. D’oú, on a montré que ShortI (C) ⊂ kerH 0 .
Inversement, soit c0 ∈ Fn−|I|
q tel que H 0 × c0t = 0. Alors contruisons le mot c ∈ Fnq comme
ennoncé au lemme 1.48. Puisque H 0 × c0t = 0, on a aussi H × ct = 0 et donc c ∈ C. D’oú
c0 ∈ ShortI (C). Parconséquent kerH = ShortI (C).

Proposition 1.51 Soit C un (n, k, d)q code et I ⊆ {1, . . . , n}. Alors, le code ShortI (C) est un
(n0 , k 0 , d0 )q code tel que :
n0 = n − |I|
k 0 > k − |I|
d0 > d

Preuve l’égalité sur les longueur est évidente


Pour la dimension, la matrice de parité du code de ShortI (C) (contruit au lemme 1.49 est dans
Mn−k,n−|I| (Fq ), cette matrice peut ne pas ebtre de rang plein. Donc (n − |I|) − k 0 6 n − k ⇔
k 0 > k − |I|.
Pour la distance minimale, , on sait pour tout c0 ∈ ShortI (C), il existe c ∈ C comme définit au
lemme 1.48 et on a
WH (c0 ) = WH (c)
En prenant le minimum de l’équation ci dessus pour tout c0 ∈ ShortI (C)\0, on a le résultat.

1.3.3 Sous Codes sur un Sous-Corps, Codes Trace


Une autre façon de construire un code à partir d’un autre est de changer le corps de base. Cer-
taines constructions de codes ne peuvent etre effectuées que sur un corps de base suffisamment
grand, ce qui constitue par exemple un inconvénient des codes de Reed Solomon (voir dans les
chapitres prochains). Par ailleurs, pour de nombreuses applications pratiques, il est préférable
de définir un code sur un petit corps : idéalement, F2 .

Dans ce qui suit, m désigne un entier plus grand que 1. Il existe deux maniéres de construire
un code sur un sous-corps á partir d’un code sur un corps plus grand. Le premier est le sous
code sur un sous-corps (subfield subcode). La deuxiéme façon de construire un code sur un
sous-corps est la construction de code trace. Sa définition nécessite la définition de l’application
trace sur des corps finis.

Définition 1.52 Soit C un code linéaire de longueur n sur une extension Fqm . Le sous-code
sur le sous-corps Fq est le code SFq (C) = C ∩ Fnq

Proposition 1.53 Si C est un code de paramétres [n, k, d] sur Fqm , alors SFq (C) est un code
de paramétre [n, k 0 , d0 ] sur Fq , la dimension k 0 et la distance minimale d0 vérifient les inégalités
k 0 > mk − n(m − 1) et d0 > d.
De plus, tout algoirthme de décodage de C peut s’appliquer á SFq (C) .

Preuve 
Fnm −→ Fnqm
q
Φ: .
(x1 , . . . xn ), 7−→ (xq − x1 , . . . xq − xn )
1 n

Le noyau de Φ est Fnq qui est de dimension n sur Fq , donc Im(Φ) est de dimension (nm − n)
sur Fq . Considérons la restriction de Φ|C : C −→ Fnqm . Son image est de dimension sur Fq au

21
plus égale á (nm − n). Il est connu que :

dimFq kerΦ|C + dimFq ImΦ|C = dimFq (C).

Donc
dimFq ImΦ|C = dimFq (C) − dimFq kerΦ|C 6 n(m − 1).
D’oú
dimFq kerΦ|C > dimFq (C) − n(m − 1) > km − n(m − 1)
Or kerΦ|C n’est rien d’autre que SFq (C)
La deuxiéme maniére de construire un code sur un sous corps est le code trace, pour sa définition
il est nécéssaire de définir l’application trace sur les corps finis.

Définition 1.54 Soit Fqm une extension de Fq . Soit a ∈ Fqm , la trace de a sur Fq est noté par
T rFqm /Fq (a) et est définie comme suit :
m−1
T rFqm /Fq (a) = a + aq + . . . aq

La trace d’un élément de Fqm est dans Fq . En effet, il est facile de voir que pour tout a ∈ Fqm ,
m−1 2 m
T rFqm /Fq (a)q = (a + aq + . . . aq )q = aq + aq + . . . aq .
m
Puisque, pour tout a ∈ Fqm , aq = a, on en déduit que T rFqm /Fq (a)q = T rFqm /Fq (a), ce qui veut
dire que T rFqm /Fq (a) ∈ Fq

Remarque 1.55 La terminologie trace est vu de cette maniére. Considérons l’application dé-
finie par la multiplication par a : 
F m −→ F m
q q
.
x 7−→ a.x
Cette application peut etre vu comme un Fq -endomorphisme d’un Fq -espace vectoriel de dimen-
sion m. La trace de cet endomorphisme, i.e. la trace de toute representation matricielle de cet
endomorphisme, n’est rien d’autre que la trace de a.

Lemme 1.56 La trace T rFqm /Fq : Fqm −→ Fq st une application Fq -linéaire et surjective.

Preuve La Fq -linéarité est une conséquence de la Fq -linéarité de l’application de Frobenius


x −→ xq . Donc, l’application trace est une forme Fq -linéaire sur Fqm considérée comme Fq -espace
vectoriel. Il en résulte de la définition d’une forme linéaire que son image est contenu dans un
espace vectoriel de dimension 1, donc elle est nulle ou surjective. Montrons que l’application
trace n’est pas nulle. Le ker de T rFqm /Fq est l’ensemble des éléments de a ∈ Fqm tels que
m−1
a + aq + . . . aq = 0.
m−1
Donc, c’est l’ensemble des racines du polynome X + X q + . . . X q . Puisque ce polynome est
non nul il a au plus q m−1 racines, parconséquent le ker est différent de Fqm et l’application trace
n’est pas nulle, elle est donc surjective.

Corollaire 1.57 Soit a ∈ Fqm tel que pour tout λ ∈ Fqm on a T rFqm /Fq (λa) = 0, a = 0.

22
Preuve Si a est non nul alors pour tout b ∈ Fqm , on aura T r(b) = T r(aa−1 b)qui sera égale á
zéro par hypothése sur a. Donc l’application trace est nulle, ce qui contrdit le fait qu’elle est
surjective.
Nous avons maintenant tous les éléments necécessaire pour définir et étudier les codes.

Définition 1.58 (Code Trace) Soit C ⊆ Fnqm . Le code trace de C sur Fq est défini par

T rFqm /Fq (C) = {(T rFqm /Fq (c1 ), . . . , T rFqm /Fq (cn )) |c = (c1 , . . . , cn ) ∈ C}

Proposition 1.59 Soit C ⊆ Fnqm un code de dimension k sur Fqm . Alors T r(C) ⊆ Fq est un
code de dimension au plus mk sur Fq

Preuve Considérons l’application suivante :



C −→ Fnq
.
c = (c1 , . . . , cn ) 7−→ (T r m (c1 ), . . . , T r m (cn ))
Fq /Fq Fq /Fq

C’est une application Fq -linéaire de C qui est un Fq -espace vectoriel de dimension mk. Le code
trace est l’image de l’application ci dessus, donc d’aprés l’équation des dimensions, le code trace
est de dimension au pluségale á mk.

Remarque 1.60 En général , il n’existe pas de relation entre la distance minimale du code et
celle du son code trace. on peut avoir un mot de code de poids n tel que la trace des composantes
sont toute nulle.

Matrice Génératrice et matrice de parité de codes trace La matrice génératrice du


code trace peut etre déduit facilement du code. Pour comprendre cette déduction nous avons
besoin de la notion de base dual.

Proposition 1.61 (Base duale) Soit (α1 , . . . , αm ) une Fq -base de Fqm , alors il existe une base
unique (α1∗ , . . . , αm

) appelé base duale vérifiant :

23
2 Les Problémes de Décodage
Dans la section précédente nous avons discuté des premiéres définitions et propriétés des codes
linéaires sans considérer la question principale : Comment utiliser les codes pour corriger des
erreurs ? Pour répondre á cette question, nous allons formaliser la notion de décodeur ou d’al-
gorithme deécodage et les différentes versions de problémes deécodage.
Définition 2.1 (Decodeur). Soit C ⊆ Fnq un code correcteur d’erreur. Un décodeur de C est
une fonction D : Fnq −→ C ∪ {?}, telle que pour tout c ∈ C, D(c) = c

Remarque 2.2 Un décodeur ne peut pas corriger n’importe quel motif d’erreur et peut échouer.
C’est la raison pour laquelle il peut retourner " ?".

Les deux fonctionnalités principales attendues d’un décodeur sont :


• Un décodeur devrait corriger de nombreuses erreurs, c’est á dire qu’il devrait résoudre
certains problémes de décodage spécifiques.
• Un décodeur devrait être efficace en termes de complexité temporelle et spatiale. Par
efficace, nous entendons en général une complexité spatio-temporelle qui est polynomiale
en la longueur du code n.

2.1 Probléme de décodage déterministe


2.1.1 Exemples de problémes de décodage
Le probléme de décodage borné Soit C ⊆ Fnq un code, r un entier et y ∈ Fnq , trouver (s’il
existe) un mot c ∈ C tel que
dH (c, y) 6 r

Remarque 2.3 Un probléme de décision connexe est de décider s’il existe un mot c ∈ C tel
que dH (c, y) 6 r.

Le probléme de décodage non ambigu Soit C ⊆ Fnq un code et y ∈ Fnq , trouver un mot
c ∈ C tel que
dH (c, y) 6 bd − 1/2c
ou d est la distance minimale du code C.
Remarque 2.4 Grace á la définition 1.18 la solution du probléme de décodage non ambigu
est unique, si elle existe. Notez que pour énoncer le probléme, il faut connaitre la distance
minimale du code. Cependant, la distance minimale d’un code est difficile á calculer en général
(voir section 2.1.2).

Le probléme de décodage par liste Soit C ⊆ Fnq un code, r un entier et y ∈ Fnq , trouver
(s’il existe) la liste entiére des mots c1 . . . cs ∈ C tel que

∀i ∈ {1, . . . , s} dH (ci , y) 6 r

Remarque 2.5 Comme définie dans la définition 2.1 le décodeur ne peut résoudre en général
le probléme de décodage par liste. On a besoin d’introduire une notion de décodeurparliste
comme une fonction Fnq −→ P (C) ∪ {?} ou P (C) est l’ensemble des sous ensembles de C

24
Remarque 2.6 Pour qu’un algorithme de décodage de liste soit polynomial, la liste renvoyée
doit avoir une taille polynomiale. Nous discuterons plus en détail du probléme de décodage de
liste et définissons une limite supérieure appelée borne de Johnson de r qui affirme que la liste
a UNE taille polynomiale en la longueur du code.

2.1.2 Difficulté (Hardness) du décodage


L’une des difficultés majeures de la théorie du codage est que, pour presque tous les codes,
aucun décodeur efficace (c’est á dire avec une complexité polynomiale en temps et en espace)
n’est connu. En fait, Berlekamp, McEliece et VanTilborg ont prouvé que la version décisionnelle
du probléme de décodage borné est NP-complét.
De meme, la détermination de la distance minimale est un probléme difficile en général : plus
précisément, á partir d’un code C ⊆ Fnq et d’un entier r 6 n. Décider si la distance minimale
de C est inférieure á r est un probléme NP-complet.
La difficulté du probléme de décodage a motivé R.J. McEliece pour appliquer ces problémes á
la cryptographie et concevoir un schéma de chiffrement á clé puiblique basé sur la difficulté du
décodage.

2.2 Décodage probabiliste


Les problémes de décodage précédents exigent que le décodeur corrige toute erreur avec un
poids de Hamming inférieur á un seuil.
Une autre classe de problémes de décodage est probabiliste et consiste, pour un modéle d’erreur
probabiliste, á corriger une erreur avec une probabilité d’échec inférieure á un seuil. Ce probléme
sera approfondi ultérieurement. Pour introduire cette approche, nous avons tout d’abord besoin
d’une modélisation probabiliste des erreurs. C’est la notion de canal.

2.2.1 Canaux
Un canal est un modéle théorique pour décrire une communication avec des erreurs possibles.
Dans ce cours, nous ne considérerons que des canaux sans mémoire. Autrement dit, étant donné
un bit ou un digit transmis, les erreurs qui le corrompent ne dépendent pas des bits / digits
transmis précédents.

Le canal binaire symétrique Le premier et le plus classique exemple de canal en théorie


du codage est le canal binaire symétrique, noté BSC (p), oú p ∈ [0, 1] est un paramétre réel.
Ce canal fonctionne comme suit. Si un 0 est envoyé sur le canal, le récepteur obtient un 0 avec
une probabilité de 1 − p et un 1 avec une probabilité de p. Inversement, si un 1 est envoyé,
le récepteur obtient un 1 avec une probabilité de 1 − p et un 0 avec une probabilité de p. Ce
canal est généralement représenté par la figure 3. La description rigoureuse de ce canal est
la suivante : Soit une variable aléatoire de Bernouilli de paramétre p tel que pour chaque bit
transmis b, le récepteur obtienne b+e, oú le "+" correspond á l’addition dans F2 (ou, de maniére
équivalente, á la porte Xor).

Remarque 2.7 En fait, on peut toujours supposer que p 6 1/2 . En effet, si p > 1/2 , alors,
aprés avoir flippé chaque bit du mot reçu, nous pouvons faire comme si le message avait été
transmis sur un canal symétrique binaire de paramétre 1 − p 6 1/2.

D’aprés la remarque ci dessus, si on considére un BSC de paramétre p, on peut toujours supposé


que p 6 1/2

25
Le canal binaire á effacement Dans le présent chapitre, nous traitons principalement du
canal symétrique binaire. Ce canal correspond á un cas oú, lors d’une transmission, certains
bits peuvent etre changés. En fait, dans certaines situations, les bits ne sont pas changés mais
seulement perdus ou détruits. Ceci est représenté par le canal dit canal binaire á effacement
qui est décrit par la figure 4

Les canaux q-aire symétrique et á effacement En cas de transmission d’éléments d’un


corps fini Fq á la place de F2 , nous devons définir un autre canal appelé q-aire canal symétrique
défini comme suit. Pour une entrée a ∈ Fq , le récepteur obtient a avec une probabilité 1 − p ou
chaque élément b ∈ Fq \a peut etre reçu avec une probabilité p/(q − 1) De la meme maniére, on
peut définir un q-aire canal á effacement envoyant un élément α ∈ Fq sur lui-meme avec une
probabilité p et sur ] avec une probabilité 1 − p.

Figure 3 – : Le canal binaire symétrique

Figure 4 – : Le canal binaire á effacement

26
2.2.2 Un probléme de décodage probabiliste
Le probléme peut etre énoncé comme suit. Considérons un canal fixe, une constante ε > 0 et
un code donné C ⊆ Fnq .
Probléme. Trouver un décodeur D tel que pour un élément uniformément aléatoire c ∈ C et
un motif d’erreur aléatoire e produit par le canal que nous avons :

P (D(c + e) 6= c) < ε

Par rapport aux problémes de décodage présentés au § 2.1 pour lesquels l’objectif était de
corriger tout motif d’erreur de poids inférieur á une limite supérieure, nous visons ici á corriger
"presque tous" les motifs d’erreur produits par le canal. Le décodeur peut échouer avec une
certaine probabilité (qui devrait être faible).

2.2.3 Le probléme de décodage par maximum de vraisemblance


Soit un code C, un vecteur uniformément aléatoire c ∈ C et un motif d’erreur e produit par le
canal. Par définition, soit y = c + e. Trouver, le cas échéant, le vecteur c0 ∈ C maximisant la
probabilité conditionnelle

Pevchannel (c’ is sent | y is received)

Relation avec la distance minimale Si le canal est le canal binaire ou symétrique q-aire
de paramétre p, résoudre le probléme du maximum de vraisemblance équivaut á résoudre le
probléme suivant

Probléme Soit un code C ⊆ Fnq et un mot y ∈ Fnq , trouver (si unique) le mot c ∈ C tel que
dH (c, y) = minx∈C dH(x, y) si unique.
En effet, soit x un mot binaire du code C et y = x + e le vecteur reçu aprés la transmission de
x á travers un BSC (p). Autrement dit, e = (e1 , . . . , en ) est un vecteur dont les entrées sont des
variables aléatoires indépendantes de Bernouilli avec le paramétre p.
Posons PevBSC(p) (x is sent | y is received) = Pr (x/y) On voit facilement que

n
(Pr (xi /yi )) = (1 − p)card{i:yi =xi } pcard{i:yi 6=xi }
Y
Pr (x/y) =
i=1
p card{i:yi 6=xi }
= (1 − p)n ( )
1−p

Figure 5 – : Le q-aire canal symétrique

27
Une solution du problém de décodage par maximum de vraisemblance n’est rien d’autre qu’un
mot de code qui est le plus proche de y i.e le mot de code qui maximise la fonction P (c) : c =
p card{i:yi 6=ci }
(c1 , ..., cn ) → (1 − p)n ( 1−p ) .
p
Comme 1−p < 1, maximiser cette probabilité revient à minimiser le nombre d’erreurs, c’est-
à-dire card{i : yi 6= ci }. Donc un problème de probabilités au départ est transformé en un
problème de combinatoire. Par conséquent le décodage par maximum de vraisemblance est
équivalent au décodage á distance minimum qui permet d’obtenir le mot de code le plus proche
du mot reçu, au sens de la maétrique de Hamming.

Transmission sans code correcteur d’erreurs Soit la suite suivante : 00101110 qu’on
veut transmettre à travers un canal dont la probabilité d’erreurs est de 0, 25 = 14 . Donc en
moyenne, on a une erreur sur tous les quatre bits transmis.
Supposons que le mot reçu est 00000110, ce qui correspond à la configuration suivante :
00101110 → BSC → 00000110.

Transmission avec code correcteur d’erreurs Munissons maintenant cette transmission


d’un code correcteur d’erreurs simples(1-correcteur). On utilise le code à répétition de longueur
3. Donc chaque bit est répété 3 fois ; l’information 00101110 est codé par 000000111000111111111000.
On suppose en moyenne que pour 4 bits transmis, il y’a une erreur. On peut alors recevoir le
mot suivant :010000011010111001111010.
Décodage : Le décodage des codes à répétition se fait par décision majoritaire, i.e
Donc aprés le décodage, on a le mot suivant :00101010. Avec cet exemple, on voit que le code
binaire à répétition de longueur 3 permet de corriger une erreur. Cependant, on ne peut corriger
plus d’une erreur avec ce code.
Comparè avec la transmission sans code, on voit que le nombre d’erreurs est réduit, mais il ne
corrige pas plus d’une erreur. Ceci est une des préoccupations des codes, c’est-à-dire rechercher
des codes plus efficients et plus efficaces.

2.3 Exemples de Decodage


Après avoir étudier le codage on aborde dans ce qui suit les méthodes de décodage : Comment
décoder ? Décoder consiste à retrouver le mot de code c à partir du mot reçu c0 = c + e.

2.3.1 Decodage par recherche exhaustive


Recherche exhaustive du mot de code : pour cette méthode, il faut calculer c0 − mG pour
tous les m possibles et vérifier son poids. Le mot de code mG pour lequel le poids de c0 −mG est
minimal par rapport aux autres correspond au mot de code envoyé. Cette méthode correspond

28
au décodage par maximum de vraisemblance ou à distance minimum, c ’est un algorithme qui
permet d’obtenir le mot de code qui est le plus proche du mot reçu, au sens de la métrique de
Hamming. Malheureusement, ce décodage ne peut pas être utilisé dans la pratique en raison
de sa complexité temporelle, qui est de l’ordre de O(q k ) et qui est donc exponentielle en la
dimension du code, sauf dans le cas de codes de dimensions trés petites.

Application Soit le code C = {00000 10011 01101 11110} et y = 01111 le mot reçu. Utiliser
l’algorithme de décodage par recherche exhaustive pour décoder y.

2.3.2 Decodage par syndrome


L’algorithme de décodage par syndrôme est une génarilisation de l’algorithme de décodage des
codes de Hamming.
Définition 2.8 Soit C ⊆ Fnq un code linéaire de dimension k, de matrice de contrôlle H, une
matrice de rang plein, c’est á dire de rang n − k. Soit y ∈ Fnq . Le syndrôme de y est
S(y) = H.t y
Lemme 2.9 Soit e ∈ Fnq une erreur et c ∈ C. Soit y = c + e. Alors le syndrôme de y dépend
seulement de e. C’est á dire
S(y) = S(e)

Preuve On considère un code linéaire C(n, k) de matrice de controle H. l’application sy-


drôme est définie par :
(S : Fnq −→ Fn−k
q ) qui a x 7→ H.t x
S est une application linéaire, et si c0 = c+e où c0 est le mot recu, c le mot de code correspondant
et e l’erreur, alors
S(c0 ) = S(c) + S(e) = S(e)
. En effet c étant un mot de code alors S(c) = 0. On a donc
H.t c0 = H.t e = s
est le syndrôme de l’erreur.

29
Remarque 2.10 y ∈ C ⇐⇒ S(y) = 0, autrement C est le noyau de l’application S linéaire
(S : Fnq −→ Fn−k
q ), xRy ⇐⇒ x t H = y t H
xRy ⇐⇒ x t H = y t H ⇐⇒ (x − y) t H = 0
xRy ⇐⇒ x − y ∈ C
x̄ = x + C = {x + c/c ∈ C} {0̄ = C}
x + C est la classe de x modulo C. Elle est appelée classe latérale ou translatée de x.
Le code C est la classe du mot nul.

• deux vecteurs sont dans le même translaté si et seulement si ils ont le même syndrôme.
• Tous les translatées d’un code C ont le même nombre d’éléments |C| = q k .
• Deux translatées sont soit disjointes soit égales.
Les translatés par C forment une partition de Fnq en q n−k translatées difféntes, chacune conte-
nant q k éléments.

Définition 2.11 A tout translaté, on peut associer un mot de plus petit poids contenu dans
la translatée.
• 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 pois possibles.
• Tous les translatées de poids inférieur ou égal á t = b d−1
2
c ont un représentant principal
unique.

On a un algorithme de décodage par syndrôme dont sa mise en oeuvre peut être effectuée
comme suit :
• On construit la table de décodage par syndrôme :
• Nous énumeration les classes d’équivalence de C dans Fnq .
• Nous choisissons un représentant principal pour chaque classe d’équivalence.
• Nous calculons leur syndrôme.
• Déterminer le représentant, cl((y), associé au syndrôme du mot reçu y.
• Décoder tout mot reçu y en y − cl((y)
La complexité est de l’ordre de O(nq n−k ).

Remarque 2.12 Attention : on a bien un mot du code mais ce dernier peut ne pas être le
mot emis. Ce probléme est réglé par la proposition ci-dessous le nombre commis est plus petit
ou égal á 6 d−1
2

Proposition 2.13 Soit C un code linéaire de distance minimale d, de matrice de parité H. Le


syndrôme des vecteurs e de poids 6 d−1
2
sont deux á deux distincts.

30
Preuve Suposons qu’il existe deux vecteurs e et e0 de poids 6 d−1
2
tels que S(e) = S(e0 ).
Alors WH (e − e0 ) 6 d − 1 et

S(e − e0 ) = H.t (e − e0 ) = S(e) − S(e0 ) = 0.

Donc e − e0 ∈ C et est de poids plus petit que d − 1, ce qui contredit le fait que d est la distance
minimale.
Ce qui donne le pricipe du decodage par syndrôme suivant :
• On construit le dictionnaire contenant les paires (S(e), e) pour tous les e de poids plus
petit ou égal á 6 d−1
2
:
• Utilisez une structure de données de sorte qu’une entrée s ∈ Fn−k q , la paire (S(e), e) tel
que S(e) = s(s’il existe ) peut etre déterminer de maniere efficiente
Une table de hachage peut effectuer cette recherche en temps constant. La construction de cette
table de hachage est l’étape de précalcul de l’algorithme. Alors, l’algorithme est élémentaire,
étant donné un mot reçu y calculer H.t y et chercher dans la table de hachage la paire (S(e), e)
avec l’entrée correspondante et retourne y − e.

d−1
Donner la table de hachage de l’exemple ci dessus des vecteur de poids plus petit ou égal á 2

Remarque 2.14 L’étape de précalcul peut etre effectuer sans connaitre la distance minimale
du code. Seulement ca sera plus technique : Si deux vecteurs e et e0 de meme poids w le meme
syndrome ont, ceci veut dire que w est plus grand que d−1
2
. Alors on enleve de la table de hachage
tout (S(e), e) tel que WH (e) = w.

31
32
Exercice 2.15

Remarque 2.16 Il est facile d’adapté cet algorithme pour pouvoir corriger tout erreur de poids
plus petit ou égal á t, avec t 6 d−1
2

L’algorithme de décodage par syndrome résout le probléme de décodage non ambigu. Sa com-
plexité en temps est polynomiale, puisque le calcul du syndrome est le produit d’une matrice
par un vecteur qui est O(n(n − k)) opérations dans Fq . De plus le coût de la recherche dans H
est constant si H est une table de hachage.
Malheureusement cet algorithme n’est pas praticable, son inconvénient est sa cmplexité en
espace qui est la taille de la table de hachage :
t
|{e ∈ Fnq / wH = i}|,
X
|H| =
i=0

d−1
oú t = 2
( ou plus petit). Ce cardinal est
t
(i)(q − 1)i ,
X
|H| =
i=0

qui est exponentiel en t. Parconséquent , l’étape du pré-calcul est exponentiel en temps. Donc,
l’algorithme de décofdage par syndrome (pre-calcul et calcul ) est exponentiel en espace.

Problémes des codes correcteurs d’erreurs

33
Exercice 2.17 Exercice 1 : Soit C un code binaire de longueur 6 de matrice génératrice
 
1 0 1 0 1 0
G = 1 1 1 1 0 0
 

1 1 0 0 1 1

a) Déterminer la matrice de controle et la matrice génératrice du code dual de C


b) (1, 1, 1, 1, 1, 1) est elle une matrice parité du code C ?

Exercice 2 : Soit C un code binaire de longueur 12 de matrice génératrice

a) Determiné la dimension et la distance minimale du code et de son dual


b) Combien d’erreurs les deux codes peuvent ils corriger ?

Exercice 3 : Soit C un code binaire de matrice de controle :

Décoder si possible les mots reçu y1 = (11001101), y2 = (00001111) et y3 = (00011110) en


utilisant la table de hachage

34

Vous aimerez peut-être aussi