![]() |
Un code est «correcteur d'erreurs» si parmi les voisins dans
l'hypercube d'un
élément codé, on ne trouve jamais ni un autre élément
codé, ni l'un de ses voisins. De cette façon, si
un -uplet est reçu, soit il a été transmis sans erreur et
il figure dans le code, soit une erreur a été commise, et elle
sera corrigée en remplaçant le
-uplet reçu par celui de
ses voisins qui figure dans le code. Cela ne fonctionne plus si deux
erreurs ou plus ont été commises, mais on peut généraliser :
il existe des codes capables de corriger plusieurs erreurs.
Contentons nous pour l'instant de comprendre le problème en
dimension (cf. figure 5). Supposons que
code un objet, alors aucun de ses
voisins ne peut être
codant ; mais si un de ces voisins est reçu, il faut pouvoir le
relier à
sans ambiguïté.
Donc les voisins des voisins de
0 ne peuvent pas non plus coder. Il reste
vecteurs codants
possibles,
,
,
,
et
. Si l'un de ceux-là est codant, aucun des
autres ne
peut l'être. Donc on ne peut utiliser que
éléments, par exemple
et
. Si une coordonnée est changée, on
pourra retrouver où est l'erreur et la corriger. Observons au
passage que l'ensemble
est un sous-espace
vectoriel de dimension
de
: c'est une «droite»
vectorielle.
![]() |
Nous allons présenter un exemple de code correcteur d'erreur, le
code de Hamming. Notre objectif sera surtout de relier ses
propriétés aux applications linéaires sur
l'espace vectoriel
.
Nous considérons le problème de coder les éléments de
par ceux de
, donc de
définir une application injective
de
dans
.
Evidemment,
doit être plus grand que
. Pour les codes de Hamming, on prend
, et
, où
est un certain entier. Nous prendrons l'exemple
, donc nous
coderons les
éléments de
par autant
d'éléments choisis dans
(
éléments).
Dans la pratique, on
utilise les codes de Hamming pour des valeurs de
beaucoup plus
élevées, et la «place perdue» n'est pas aussi importante qu'il y
paraît. Comme nous l'avons vu précédemment, si on
veut pouvoir corriger une erreur, deux mots du code ne peuvent ni
être voisins, ni avoir un voisin en commun. Ils doivent donc
différer en au moins
coordonnées.
Nous devons donc trouver une application de
dans
, telle que les images de deux vecteurs quelconques
diffèrent en
coordonnées au moins.
Dans toute la suite, les espaces vectoriels considérés sont munis
de leur base canonique.
Considérons l'application linéaire , de
dans
, définie par
la matrice
suivante.
Par la proposition précédente, l'image par d'un vecteur
quelconque est dans le noyau de
. Donc si un code a été
correctement transmis, son image par
doit être nulle.
Reprenons le vecteur
et
supposons maintenant qu'une erreur a été commise sur son
codage : au lieu de transmettre le vecteur
, on a transmis
, c'est-à-dire que le cinquième bit a été
changé : c'est
qui a été transmis, avec
. Puisque
est le vecteur nul,
l'image par
de
est
, à savoir la cinquième
colonne de
.
Etant donné un vecteur de
bits reçu, on commence par
prendre son image par
(en le multipliant par la matrice
).
Si cette image est nulle, alors il n'y a
pas eu d'erreur de transmission, et il suffit de lire
les
derniers bits du vecteur transmis. Si l'image est égale
à l'un des vecteurs colonnes de
, disons le
-ième,
alors le
-ième bit du vecteur reçu est faux :
on le corrige et on lit ensuite les
derniers bits du vecteur
corrigé.