Maths Post-Bac Ouvrir l'app

Exercices corrigés — Codes correcteurs

Algèbre · 18 exercices-types du palier socle

L2L3Maths ingénieur

Chaque exercice donne l'énoncé, des indices progressifs et la correction rédigée étape par étape. Ouvre les blocs seulement après avoir cherché.

Revoir le cours : Codes correcteurs Définitions, méthodes et exemples corrigés du chapitre.

Code linéaire : dimension et cardinal

CalculDifficulté 3/5

Soit le code binaire CC engendré par G=(10110110)G=\begin{pmatrix}1&0&1&1\\0&1&1&0\end{pmatrix} sur F2\mathbb{F}_2. Déterminer nn, k=dim⁡Ck=\dim C, le cardinal ∣C∣\lvert C\rvert et lister les mots de code.

Indices (3)

nn est la longueur (nombre de colonnes), kk le rang de GG.

∣C∣=2k\lvert C\rvert=2^{k} car CC est un sous-espace.

Les mots sont les combinaisons u1L1+u2L2u_1L_1+u_2L_2, ui∈{0,1}u_i\in\{0,1\}.

Correction détaillée
Ce que G encode, et comment on lit ses paramètres

Une matrice génératrice GG de taille k×nk\times n définit un code CC comme l'ensemble des combinaisons linéaires de ses lignes :

C={mG : m∈F2 k}C=\{mG\ :\ m\in\mathbb{F}_2^{\,k}\}

Les trois paramètres se lisent directement sur la forme de GG :

  • nn = nombre de colonnes = longueur des mots de code ;
  • kk = nombre de lignes (si elles sont indépendantes) = dimension ;
  • ∣C∣=qk\lvert C\rvert=q^k où qq est la taille du corps.

Ici GG est 2×42\times 4 sur F2\mathbb{F}_2, donc on attend n=4n=4, k=2k=2, ∣C∣=4\lvert C\rvert=4. Encore faut-il vérifier que les deux lignes sont indépendantes.

Étape 1 — Les paramètres
G=(10110110)G=\begin{pmatrix}1&0&1&1\\0&1&1&0\end{pmatrix}

n=4n=4 : quatre colonnes.

k=2k=2 : les deux lignes sont indépendantes. On le voit sans calcul grâce à la partie I2I_2 à gauche — la première ligne commence par 1010, la seconde par 0101, aucune n'est multiple de l'autre. Le rang vaut donc 22.

∣C∣=2k=22=4\boxed{\lvert C\rvert=2^{k}=2^{2}=4}

On dit que GG est sous forme systématique [ I2∣A ][\,I_2\mid A\,] avec A=(1110)A=\begin{pmatrix}1&1\\1&0\end{pmatrix} : les kk premiers bits d'un mot de code sont le message lui-même, les n−kn-k derniers sont les bits de contrôle.

Étape 2 — Lister les quatre mots

On parcourt les 44 messages possibles m=(m1,m2)m=(m_1,m_2) et on calcule mG=m1L1+m2L2mG=m_1L_1+m_2L_2, où L1=1011L_1=1011 et L2=0110L_2=0110 sont les lignes de GG. L'addition est modulo 22 — c'est-à-dire le OU exclusif bit à bit.

mmGcalcul000000le mot nul010110L2101011L1111101L1+L2\begin{array}{ccl} m & mG & \text{calcul}\\\hline 00 & 0000 & \text{le mot nul}\\ 01 & 0110 & L_2\\ 10 & 1011 & L_1\\ 11 & 1101 & L_1+L_2 \end{array}

Détail du dernier, le seul qui demande un calcul :

1011+0110=11011011+0110=1101

colonne par colonne : 1+0=11+0=1 · 0+1=10+1=1 · 1+1=01+1=0 (modulo 22 !) · 1+0=11+0=1.

C={0000, 0110, 1011, 1101}\boxed{C=\{0000,\ 0110,\ 1011,\ 1101\}}
Étape 3 — Les deux contrôles qui valident la liste

Le nombre. On a bien 4=224=2^2 mots distincts. Si deux messages avaient donné le même mot, GG ne serait pas de rang 22 et kk vaudrait 11.

La stabilité par addition. Un code linéaire est un sous-espace vectoriel : la somme de deux mots de code est un mot de code. Vérifions sur une paire :

0110+1011=1101 ∈C ✓0110+1011=1101\ \in C\ \checkmark
0110+1101=1011 ∈C ✓0110+1101=1011\ \in C\ \checkmark

Et le mot nul appartient toujours à un code linéaire (prendre m=0m=0) — c'est ce qui rendra possible le raccourci de l'exercice A2.

Ce que ce code vaut, et pourquoi c'est important de le dire

Regardons les poids (nombre de 11) des mots non nuls :

w(0110)=2,w(1011)=3,w(1101)=3w(0110)=2,\qquad w(1011)=3,\qquad w(1101)=3

La distance minimale est donc d=2d=2 (exercice A2), et le code est un [4,2,2][4,2,2].

t=⌊d−12⌋=⌊12⌋=0t=\left\lfloor\frac{d-1}{2}\right\rfloor=\left\lfloor\frac12\right\rfloor=0

⚠️ Ce code ne corrige AUCUNE erreur. Il en détecte une seule : si un bit bascule, le mot reçu est à distance 11 d'un mot de code, donc il n'est plus dans CC — on sait qu'il y a eu une erreur, mais on ne peut pas savoir laquelle, car il peut être à distance 11 de plusieurs mots.

C'est une bonne raison de ne pas confondre détecter et corriger, et cela motive tout le reste du chapitre : pour corriger, il faut d≥3d\geq 3 — le code [5,2,3][5,2,3] de l'exercice A3, puis Hamming.

Réponse. [n,k]=[4,2][n,k]=[4,2], ∣C∣=4\lvert C\rvert=4, C={0000,1011,0110,1101}C=\{0000,1011,0110,1101\}. (Vérifié machine — A1 ✓)
Faire cet exercice dans l'app →

Distance minimale = poids minimal

DémonstrationDifficulté 3/5

Montrer que pour un code linéaire CC, la distance minimale égale le poids minimal d'un mot non nul : d=min⁡x∈C, x≠0w(x)d=\min_{x\in C,\,x\neq 0}w(x). L'appliquer au code [4,2][4,2] de l'exercice précédent.

Indices (3)

d(x,y)=w(x−y)d(x,y)=w(x-y) pour la distance de Hamming.

Si x,y∈Cx,y\in C alors x−y∈Cx-y\in C (sous-espace).

Faire varier la paire (x,y)(x,y) et le mot z=x−yz=x-y.

Correction détaillée
Pourquoi cet énoncé fait gagner un facteur énorme

La distance minimale est définie comme

d=min⁡x≠y, x,y∈CdH(x,y)d=\min_{x\neq y,\ x,y\in C} d_H(x,y)

où dH(x,y)d_H(x,y) est le nombre de positions où xx et yy diffèrent. Calculée telle quelle, elle demande d'examiner toutes les paires : (∣C∣2)\binom{\lvert C\rvert}{2} comparaisons.

L'énoncé affirme que pour un code linéaire, il suffit de parcourir les mots un par un :

d=min⁡x∈C, x≠0w(x)d=\min_{x\in C,\ x\neq 0} w(x)

On passe de (qk2)\binom{q^k}{2} à qk−1q^k-1 calculs. Sur Hamming [7,4][7,4] : 120120 paires contre 1515 poids. Sur un code de dimension 3232, la différence est celle entre l'impossible et l'immédiat.

L'ingrédient est la linéarité, et rien d'autre : CC est un sous-espace, donc stable par différence.

Étape 1 — La relation entre distance et poids

Le point de départ est une identité valable pour tous vecteurs :

dH(x,y)=w(x−y)d_H(x,y)=w(x-y)

Pourquoi : les coordonnées où xx et yy diffèrent sont exactement celles où x−yx-y est non nul. Compter les unes ou les autres, c'est la même chose.

(Sur F2\mathbb{F}_2, x−y=x+yx-y=x+y, ce qui simplifie les calculs sans changer l'argument.)

Étape 2 — La double inégalité

Sens ≤\leq. Soit x∈Cx\in C non nul. Comme 0∈C0\in C (un sous-espace contient toujours le vecteur nul), le couple (x,0)(x,0) est un couple de mots de code distincts, donc

d≤dH(x,0)=w(x)d\leq d_H(x,0)=w(x)

Ceci valant pour tout xx non nul, on obtient d≤min⁡x≠0w(x)d\leq \min_{x\neq 0}w(x).

Sens ≥\geq. Soient x≠yx\neq y deux mots de code réalisant la distance minimale. Comme CC est un sous-espace, z=x−yz=x-y est encore un mot de code, et il est non nul puisque x≠yx\neq y. Donc

d=dH(x,y)=w(x−y)=w(z)≥min⁡u≠0w(u)d=d_H(x,y)=w(x-y)=w(z)\geq \min_{u\neq 0}w(u)

Les deux inégalités donnent l'égalité :

d=min⁡x∈C, x≠0w(x)\boxed{d=\min_{x\in C,\ x\neq 0}w(x)}
Étape 3 — Application au code de A1
C={0000, 0110, 1011, 1101}C=\{0000,\ 0110,\ 1011,\ 1101\}

Poids des trois mots non nuls :

w(0110)=2,w(1011)=3,w(1101)=3w(0110)=2,\qquad w(1011)=3,\qquad w(1101)=3
d=2\boxed{d=2}

Le code est donc un [4,2,2][4,2,2].

Contrôle par la définition, sur les (42)=6\binom42=6 paires — c'est ce que le théorème permet justement d'éviter, mais le faire une fois convainc :

dH(0000,0110)=2dH(0110,1011)=w(1101)=3dH(0000,1011)=3dH(0110,1101)=w(1011)=3dH(0000,1101)=3dH(1011,1101)=w(0110)=2\begin{array}{ll} d_H(0000,0110)=2 & d_H(0110,1011)=w(1101)=3\\ d_H(0000,1011)=3 & d_H(0110,1101)=w(1011)=3\\ d_H(0000,1101)=3 & d_H(1011,1101)=w(0110)=2 \end{array}

Minimum =2=2 ✓. Et l'on voit la mécanique : chaque distance entre deux mots de code est le poids d'un troisième mot de code.

La limite, et pourquoi elle mérite d'être connue

⚠️ L'énoncé est FAUX pour un code non linéaire. Contre-exemple minimal :

C′={0011, 0101}C'=\{0011,\ 0101\}

Ses deux mots ont poids 22, donc « le poids minimal » vaudrait 22. Mais

dH(0011,0101)=2d_H(0011,0101)=2

ici les deux coïncident — prenons plutôt C′′={1110, 1101}C''=\{1110,\ 1101\} : poids minimal 33, alors que dH(1110,1101)=2d_H(1110,1101)=2. La distance est strictement plus petite que le poids minimal.

Ce qui casse : 1110−1101=00111110-1101=0011 n'appartient pas à C′′C'', donc le raisonnement de l'étape 2 ne s'applique pas.

👉 Vérifier la linéarité avant d'employer le raccourci. C'est l'une des raisons pour lesquelles on travaille presque toujours avec des codes linéaires : ils rendent la distance minimale calculable.

Réponse. d=min⁡x≠0w(x)d=\min_{x\neq 0}w(x) ; ici d=2d=2. (Vérifié machine : min sur les paires == min des poids — A2 ✓)
Faire cet exercice dans l'app →

Capacité de correction et boules disjointes

DémonstrationDifficulté 3/5

Un code a distance minimale dd. Montrer qu'il corrige t=⌊(d−1)/2⌋t=\lfloor(d-1)/2\rfloor erreurs (les boules de Hamming de rayon tt autour des mots de code sont disjointes). Préciser tt pour le code [5,2,3][5,2,3] de générateur G=(1011001011)G=\begin{pmatrix}1&0&1&1&0\\0&1&0&1&1\end{pmatrix}.

Indices (3)

Supposer deux mots c≠c′c\neq c' et un reçu yy avec d(y,c)≤td(y,c)\leq t et d(y,c′)≤td(y,c')\leq t.

Inégalité triangulaire : d(c,c′)≤d(c,y)+d(y,c′)d(c,c')\leq d(c,y)+d(y,c').

En déduire d(c,c′)≤2t≤d−1<dd(c,c')\leq 2t\leq d-1<d, contradiction.

Correction détaillée
Ce qu'on veut établir, et l'image qui porte tout

Un code de distance minimale dd corrige t=⌊(d−1)/2⌋t=\lfloor(d-1)/2\rfloor erreurs. La preuve tient dans une image géométrique, qu'il faut avoir en tête pour tout ce chapitre.

Autour de chaque mot de code cc, on trace la boule de Hamming de rayon tt :

B(c,t)={x: dH(x,c)≤t}B(c,t)=\{x:\ d_H(x,c)\leq t\}

c'est-à-dire tous les mots qu'on peut obtenir en changeant au plus tt bits de cc.

Si ces boules ne se chevauchent pas, alors un mot reçu avec au plus tt erreurs tombe dans une seule boule — celle de son émetteur — et le décodage « au plus proche voisin » retrouve le bon mot, sans ambiguïté.

Tout se ramène donc à : quand les boules sont-elles disjointes ?

Étape 1 — Les boules sont disjointes

Raisonnons par l'absurde. Supposons qu'un mot xx appartienne à deux boules, autour de deux mots de code distincts c1≠c2c_1\neq c_2 :

dH(x,c1)≤tetdH(x,c2)≤td_H(x,c_1)\leq t\qquad\text{et}\qquad d_H(x,c_2)\leq t

L'inégalité triangulaire — vraie pour la distance de Hamming comme pour toute distance — donne alors

dH(c1,c2)≤dH(c1,x)+dH(x,c2)≤2td_H(c_1,c_2)\leq d_H(c_1,x)+d_H(x,c_2)\leq 2t

Or c1c_1 et c2c_2 sont deux mots de code distincts, donc dH(c1,c2)≥dd_H(c_1,c_2)\geq d. D'où

d≤2td\leq 2t

Mais par définition t=⌊(d−1)/2⌋t=\lfloor(d-1)/2\rfloor, donc 2t≤d−1<d2t\leq d-1<d — contradiction.

Les boules de rayon tt sont donc deux à deux disjointes.

Étape 2 — En déduire la correction

Soit cc le mot émis et r=c+er=c+e le mot reçu, avec w(e)≤tw(e)\leq t erreurs.

Alors dH(r,c)=w(e)≤td_H(r,c)=w(e)\leq t, donc r∈B(c,t)r\in B(c,t). Et par l'étape 1, rr n'est dans aucune autre boule. Le décodeur qui cherche le mot de code le plus proche de rr trouve donc cc, et lui seul :

toute erreur de poids≤t est corrigeˊe, sans ambigui¨teˊ\boxed{\text{toute erreur de poids}\leq t\ \text{est corrig\'ee, sans ambigu\"it\'e}}

Pourquoi la partie entière. Il faut 2t<d2t<d, soit t<d/2t<d/2, soit t≤⌈d/2⌉−1t\leq\lceil d/2\rceil-1, ce qui s'écrit t=⌊(d−1)/2⌋t=\lfloor(d-1)/2\rfloor. Concrètement :

dtlecture20deˊtecte 1 erreur, n’en corrige aucune31corrige 1 erreur41corrige 1, deˊtecte 252corrige 2\begin{array}{ccl} d & t & \text{lecture}\\\hline 2 & 0 & \text{d\'etecte 1 erreur, n'en corrige aucune}\\ 3 & 1 & \text{corrige 1 erreur}\\ 4 & 1 & \text{corrige 1, d\'etecte 2}\\ 5 & 2 & \text{corrige 2} \end{array}

Noter que d=3d=3 et d=4d=4 corrigent autant : c'est le passage à dd impair qui fait gagner.

Étape 3 — Le code $[5,2,3]$ de l'énoncé
G=(1011001011)G=\begin{pmatrix}1&0&1&1&0\\0&1&0&1&1\end{pmatrix}

Énumérons les 22=42^2=4 mots, comme en A1 :

mmGpoids00000000010101131010110311111014\begin{array}{ccl} m & mG & \text{poids}\\\hline 00 & 00000 & 0\\ 01 & 01011 & 3\\ 10 & 10110 & 3\\ 11 & 11101 & 4 \end{array}

(pour m=11m=11 : 10110+01011=1110110110+01011=11101, en additionnant modulo 22 colonne par colonne.)

Par l'exercice A2, d=min⁡(3,3,4)=3d=\min(3,3,4)=3, donc

t=⌊3−12⌋=1\boxed{t=\left\lfloor\frac{3-1}{2}\right\rfloor=1}

Ce code [5,2,3][5,2,3] corrige une erreur, là où le [4,2,2][4,2,2] de A1 n'en corrigeait aucune. Un bit de plus a suffi à faire passer dd de 22 à 33.

Ce que ça coûte, et la question que ça ouvre

Comptons le volume occupé. Chaque boule de rayon 11 dans F2 5\mathbb{F}_2^{\,5} contient

V2(5,1)=1+(51)=6 motsV_2(5,1)=1+\binom51=6\ \text{mots}

et il y a 44 mots de code, donc les boules couvrent 4×6=244\times 6=24 mots sur les 25=322^5=32 possibles.

2432=75 %\frac{24}{32}=75\,\%

Il reste 88 mots hors de toute boule : reçus, ils sont détectés comme erronés mais ne se décodent pas de façon fiable. Le code n'est donc pas parfait.

👉 La question naturelle : existe-t-il des codes dont les boules pavent exactement l'espace, sans trou ni chevauchement ? Oui — c'est le code de Hamming (exercice E2), où 16×8=128=2716\times 8=128=2^7 tombe juste. C'est le fil qui mène à la borne de Hamming (E3).

Réponse. Boules de rayon t=⌊(d−1)/2⌋t=\lfloor(d-1)/2\rfloor disjointes ⇒\Rightarrow corrige tt erreurs ; pour [5,2,3][5,2,3], t=1t=1. (Vérifié machine : boules de rayon 11 disjointes — A3 ✓)
Faire cet exercice dans l'app →

Code à répétition et code de parité

CalculDifficulté 3/5

Donner les paramètres [n,k,d][n,k,d] : (a) du code à répétition {00000,11111}\{00000,11111\} ; (b) du code de parité sur 44 bits (bit de parité ajouté à 33 bits d'information).

Indices (3)

Répétition : un seul bit d'information répété nn fois.

Parité : G=[I3∣1]G=[I_3\mid \mathbf{1}], la dernière colonne est la somme des 33 premières.

dd = poids minimal d'un mot non nul.

Correction détaillée
Les deux codes extrêmes, et pourquoi les étudier

Ces deux familles sont les bornes du compromis entre protection et efficacité, et tout le chapitre se situe entre elles.

  • Le code à répétition protège au maximum et transmet le minimum : il envoie le même bit nn fois.
  • Le code de parité transmet presque tout et protège au minimum : il ajoute un seul bit de contrôle.

On mesure l'efficacité par le rendement R=k/nR=k/n : la proportion de bits utiles.

(a) Le code à répétition $\{00000,11111\}$

n=5n=5 : les mots ont cinq bits.

k=1k=1 : il y a 22 mots, et 2=212=2^1. On peut le voir sur la génératrice, qui n'a qu'une ligne :

G=(11111)G=\begin{pmatrix}1&1&1&1&1\end{pmatrix}

d=5d=5 : le seul mot non nul est 1111111111, de poids 55 (exercice A2).

[5,1,5]\boxed{[5,1,5]}
t=⌊5−12⌋=2t=\left\lfloor\frac{5-1}{2}\right\rfloor=2

Il corrige deux erreurs, par vote majoritaire : sur cinq bits reçus, on décode par la valeur qui apparaît le plus souvent. Avec au plus deux erreurs, la majorité reste du bon côté.

Rendement : R=1/5=20 %R=1/5=20\,\% — quatre bits sur cinq sont de la redondance pure.

(b) Le code de parité sur $4$ bits

On part de 33 bits d'information (m1,m2,m3)(m_1,m_2,m_3) et on ajoute un quatrième bit égal à leur somme modulo 22 :

G=(100101010011)G=\begin{pmatrix}1&0&0&1\\0&1&0&1\\0&0&1&1\end{pmatrix}

n=4n=4, k=3k=3, donc ∣C∣=23=8\lvert C\rvert=2^3=8 mots.

d=2d=2 : tout mot de code a un poids pair. En effet le dernier bit vaut m1+m2+m3m_1+m_2+m_3, donc la somme des quatre bits vaut 2(m1+m2+m3)≡02(m_1+m_2+m_3)\equiv 0. Le plus petit poids non nul possible est donc 22, et il est atteint (par exemple 10011001, obtenu avec m=100m=100).

[4,3,2]\boxed{[4,3,2]}
t=⌊2−12⌋=0t=\left\lfloor\frac{2-1}{2}\right\rfloor=0

Il détecte une erreur (la parité devient impaire) et n'en corrige aucune. Rendement : R=3/4=75 %R=3/4=75\,\%.

Le compromis, mis côte à côte
code[n,k,d]tR=k/nusagereˊpeˊtition[5,1,5]220 %canal treˋs bruiteˊHamming[7,4,3]157 %compromispariteˊ[4,3,2]075 %deˊtection seule\begin{array}{lcccc} \text{code} & [n,k,d] & t & R=k/n & \text{usage}\\\hline \text{r\'ep\'etition} & [5,1,5] & 2 & 20\,\% & \text{canal tr\`es bruit\'e}\\ \text{Hamming} & [7,4,3] & 1 & 57\,\% & \text{compromis}\\ \text{parit\'e} & [4,3,2] & 0 & 75\,\% & \text{d\'etection seule} \end{array}

La tension est structurelle : augmenter dd oblige à écarter les mots de code, donc à en avoir moins, donc à baisser kk. C'est ce que quantifient les deux bornes du chapitre — Hamming (E3) et Singleton (E4).

La parité est utilisée partout où l'on peut redemander la donnée (bus série, mémoire avec retransmission) : détecter suffit. La répétition est réservée aux canaux où redemander coûte trop cher.

Les deux sont MDS, et ce n'est pas un hasard

La borne de Singleton (exercice E4) affirme d≤n−k+1d\leq n-k+1. Vérifions :

reˊpeˊtition:n−k+1=5−1+1=5=d ✓\text{r\'ep\'etition}:\quad n-k+1=5-1+1=5=d\ \checkmark
pariteˊ:n−k+1=4−3+1=2=d ✓\text{parit\'e}:\quad n-k+1=4-3+1=2=d\ \checkmark

Les deux atteignent la borne : ce sont des codes MDS (maximum distance separable), c'est-à-dire optimaux au sens de Singleton.

⚠️ Cela ne veut pas dire qu'ils sont bons en pratique. Être MDS signifie « meilleure distance possible pour ce couple (n,k)(n,k) » ; ça ne dit rien sur le fait que le couple (n,k)(n,k) soit un bon choix. La répétition est MDS et de rendement catastrophique.

Contraste utile : Hamming [7,4,3][7,4,3] n'est pas MDS (3<43<4, exercice E5), et c'est pourtant un bien meilleur code que la répétition pour un canal ordinaire.

Réponse. (a) [5,1,5][5,1,5] ; (b) [4,3,2][4,3,2]. (Vérifié machine — A4 ✓)
Faire cet exercice dans l'app →

Énumérateur de poids

CalculDifficulté 3/5

Pour le code [4,2][4,2] de générateur G=(10110110)G=\begin{pmatrix}1&0&1&1\\0&1&1&0\end{pmatrix}, donner la distribution des poids (A0,A1,A2,A3,A4)(A_0,A_1,A_2,A_3,A_4) où AiA_i est le nombre de mots de poids ii. Vérifier que ∑iAi=2k\sum_i A_i=2^k et retrouver dd.

Indices (3)

Reprendre les 44 mots de code et compter leurs poids.

A0=1A_0=1 (le mot nul).

dd est le plus petit indice i>0i>0 avec Ai>0A_i>0.

Correction détaillée
Ce qu'est un énumérateur de poids, et à quoi il sert

La distribution des poids d'un code est la suite (A0,A1,…,An)(A_0,A_1,\dots,A_n) où AiA_i compte les mots de code de poids exactement ii.

C'est un résumé bien plus riche que le seul dd : il dit combien de mots sont à chaque distance, ce qui permet d'estimer la probabilité d'erreur après décodage, et non seulement de savoir si elle est nulle.

On l'écrit souvent sous forme polynomiale — l'énumérateur —

WC(x,y)=∑i=0nAi x n−iy iW_C(x,y)=\sum_{i=0}^{n}A_i\,x^{\,n-i}y^{\,i}

et c'est sous cette forme que l'identité de MacWilliams relie WCW_C à WC⊥W_{C^\perp}.

Étape 1 — Énumérer et compter

Le code de l'exercice A1 :

C={0000, 0110, 1011, 1101}C=\{0000,\ 0110,\ 1011,\ 1101\}

Poids un par un :

motpoids00000le mot nul01102deux 110113trois 111013trois 1\begin{array}{ccl} \text{mot} & \text{poids} & \\\hline 0000 & 0 & \text{le mot nul}\\ 0110 & 2 & \text{deux }1\\ 1011 & 3 & \text{trois }1\\ 1101 & 3 & \text{trois }1 \end{array}
(A0,A1,A2,A3,A4)=(1, 0, 1, 2, 0)\boxed{(A_0,A_1,A_2,A_3,A_4)=(1,\ 0,\ 1,\ 2,\ 0)}
Étape 2 — Les deux contrôles

La somme. Chaque mot de code est compté exactement une fois, donc

∑i=04Ai=1+0+1+2+0=4=2k ✓\sum_{i=0}^{4}A_i=1+0+1+2+0=4=2^k\ \checkmark

C'est le contrôle à faire systématiquement : un total qui ne tombe pas sur qkq^k signale un mot oublié ou compté deux fois.

La distance minimale. Par l'exercice A2, dd est le plus petit poids non nul, donc le plus petit indice i≥1i\geq 1 avec Ai>0A_i>0 :

A1=0,A2=1>0 ⟹ d=2A_1=0,\qquad A_2=1>0\ \Longrightarrow\ \boxed{d=2}

Un troisième contrôle, gratuit : A0=1A_0=1 toujours, pour un code linéaire — le mot nul y est, et il est le seul de poids 00.

Ce que la distribution dit de plus que $d$

Comparons deux codes qui auraient tous deux d=2d=2 :

notre [4,2]: (1,0,1,2,0)contrepariteˊ [4,3]: (1,0,6,0,1)\text{notre }[4,2]:\ (1,0,1,2,0)\qquad\text{contre}\qquad\text{parit\'e }[4,3]:\ (1,0,6,0,1)

(pour la parité : les mots de poids pair sur 44 bits sont (42)=6\binom42=6 de poids 22, et 11 de poids 44, plus le nul.)

Même dd, distributions très différentes. Le second a six mots à distance 22 du mot nul, le premier un seul : à bruit égal, les confusions ne sont pas aussi probables.

👉 En pratique, la probabilité qu'une erreur de transmission passe inaperçue vaut ∑i≥dAi p i(1−p) n−i\sum_{i\geq d}A_i\,p^{\,i}(1-p)^{\,n-i} où pp est la probabilité d'erreur par bit, et celle qu'un décodeur se trompe se majore, elle aussi, par une somme pondérée par les AiA_i. C'est la distribution entière qui entre dans le calcul, pas seulement son premier terme non nul.

Le cas remarquable, à connaître

Certains codes ont tous leurs mots non nuls de même poids : on les dit à poids constant. C'est le cas du code simplexe [7,3][7,3] (exercice E6), dual du code de Hamming :

(A0,…,A7)=(1,0,0,0,7,0,0,0)(A_0,\dots,A_7)=(1,0,0,0,7,0,0,0)

Ses 77 mots non nuls sont tous de poids 44. La distribution tient en deux nombres, et l'on lit immédiatement d⊥=4d^\perp=4.

Contrôle : 1+7=8=231+7=8=2^3 ✓.

Le code de Hamming lui-même a pour distribution

(1,0,0,7,7,0,0,1)(1,0,0,7,7,0,0,1)

avec ∑Ai=16=24\sum A_i=16=2^4 ✓. Le A7=1A_7=1 est le mot 11111111111111 — le complément du mot nul, toujours dans le code de Hamming.

Réponse. (A0,…,A4)=(1,0,1,2,0)(A_0,\dots,A_4)=(1,0,1,2,0), ∑Ai=4=2k\sum A_i=4=2^k, d=2d=2. (Vérifié machine — A5 ✓)
Faire cet exercice dans l'app →

Un code sur F_3 (au-delà du binaire)

CalculDifficulté 3/5

Sur F3\mathbb{F}_3, soit CC engendré par G=(10120121)G=\begin{pmatrix}1&0&1&2\\0&1&2&1\end{pmatrix}. Déterminer ∣C∣\lvert C\rvert et la distance minimale dd.

Indices (3)

∣C∣=qk=32\lvert C\rvert=q^k=3^2.

dd = poids minimal d'un mot non nul (linéarité, valable sur tout Fq\mathbb{F}_q).

Examiner par exemple la ligne L1=(1,0,1,2)L_1=(1,0,1,2) et les combinaisons.

Correction détaillée
Pourquoi sortir du binaire

Presque tout le chapitre se passe sur F2\mathbb{F}_2, où les calculs sont des OU exclusifs. Cet exercice montre que rien dans la théorie ne dépend de q=2q=2 : la définition d'un code linéaire, la distance de Hamming, le lien distance-poids valent sur tout corps fini.

Ce qui change, ce sont les calculs : sur F3\mathbb{F}_3, les coefficients sont 0,1,20,1,2, et 22 joue le rôle de −1-1 puisque 2≡−1(mod3)2\equiv-1\pmod 3.

L'enjeu pratique est réel : les codes de Reed-Solomon (exercices D1 à D3), qui protègent les CD, les QR-codes et les transmissions spatiales, vivent sur des corps à 256256 éléments.

Étape 1 — Le cardinal
G=(10120121)sur F3G=\begin{pmatrix}1&0&1&2\\0&1&2&1\end{pmatrix}\quad\text{sur }\mathbb{F}_3

n=4n=4 colonnes, k=2k=2 lignes indépendantes (partie I2I_2 à gauche), donc

∣C∣=qk=32=9\boxed{\lvert C\rvert=q^k=3^2=9}

⚠️ Le passage de 2k2^k à qkq^k est la seule chose à adapter — et c'est là qu'on se trompe si l'on raisonne par habitude binaire.

Étape 2 — Énumérer les neuf mots

On calcule mG=m1L1+m2L2mG=m_1L_1+m_2L_2 avec L1=1012L_1=1012, L2=0121L_2=0121, tout modulo 33 :

mmGpoids000000001012130202123101012311110021212214202021321211242222002\begin{array}{ccc} m & mG & \text{poids}\\\hline 00 & 0000 & 0\\ 01 & 0121 & 3\\ 02 & 0212 & 3\\ 10 & 1012 & 3\\ 11 & 1100 & \mathbf{2}\\ 12 & 1221 & 4\\ 20 & 2021 & 3\\ 21 & 2112 & 4\\ 22 & 2200 & \mathbf{2} \end{array}

Détail du mot de poids minimal, m=11m=11 :

1012+0121=(1+0, 0+1, 1+2, 2+1)=(1, 1, 3, 3)≡(1,1,0,0)1012+0121=(1{+}0,\ 0{+}1,\ 1{+}2,\ 2{+}1)=(1,\ 1,\ 3,\ 3)\equiv(1,1,0,0)

car 3≡0(mod3)3\equiv 0\pmod 3. C'est là que le calcul diffère du binaire : deux coordonnées s'annulent d'un coup.

Contrôle : m=22m=22 donne 2×(1100)=22002\times(1100)=2200 — cohérent, puisque CC est stable par multiplication scalaire.

Étape 3 — La distance minimale

Par l'exercice A2, valable sur tout corps :

d=min⁡x≠0w(x)=min⁡(3,3,3,2,4,3,4,2)=2d=\min_{x\neq 0}w(x)=\min(3,3,3,\mathbf{2},4,3,4,\mathbf{2})=\boxed{2}

Le code est un [4,2,2]3[4,2,2]_3, avec

t=⌊2−12⌋=0t=\left\lfloor\frac{2-1}{2}\right\rfloor=0

Il détecte une erreur, n'en corrige aucune — comme le [4,2,2][4,2,2] binaire de A1.

Contrôle de la distribution : (A0,A1,A2,A3,A4)=(1,0,2,4,2)(A_0,A_1,A_2,A_3,A_4)=(1,0,2,4,2), de somme 1+0+2+4+2=9=321+0+2+4+2=9=3^2 ✓.

Ce qui change et ce qui ne change pas
identique sur tout FqdeˊfinitionC={mG} sous-espacedistanced=min⁡w(x), x≠0(exo A2)correctiont=⌊(d−1)/2⌋(exo A3)Singletond≤n−k+1(exo E4)\begin{array}{lll} & \text{identique sur tout }\mathbb{F}_q & \\\hline \text{d\'efinition} & C=\{mG\} \text{ sous-espace} & \\ \text{distance} & d=\min w(x),\ x\neq 0 & \text{(exo A2)}\\ \text{correction} & t=\lfloor (d-1)/2\rfloor & \text{(exo A3)}\\ \text{Singleton} & d\leq n-k+1 & \text{(exo E4)} \end{array}
deˊpend de qcardinal∣C∣=qk9 et non 4volume de bouleVq(n,t)=∑i(ni)(q−1)ile (q−1)i !controˆle HH=[−AT∣I]le signe compte\begin{array}{lll} & \text{d\'epend de }q & \\\hline \text{cardinal} & \lvert C\rvert=q^k & 9 \text{ et non } 4\\ \text{volume de boule} & V_q(n,t)=\sum_i\binom ni (q-1)^i & \text{le }(q-1)^i\ !\\ \text{contr\^ole } H & H=[-A^{\mathsf T}\mid I] & \text{le signe compte} \end{array}

⚠️ Les deux pièges sont dans la seconde table. Le volume de boule : changer une coordonnée offre q−1q-1 valeurs possibles, pas une seule — sur F3\mathbb{F}_3, V3(4,1)=1+4×2=9V_3(4,1)=1+4\times 2=9 et non 55. Et le signe de −AT-A^{\mathsf T} (exercice B1), invisible sur F2\mathbb{F}_2 où −1=1-1=1, devient indispensable dès q≥3q\geq 3.

Réponse. ∣C∣=9\lvert C\rvert=9, d=2d=2. (Vérifié machine sur F3\mathbb{F}_3 — A6 ✓)
Faire cet exercice dans l'app →

De G systématique à H

DémonstrationDifficulté 3/5

Soit G=[ Ik∣A ]G=[\,I_k\mid A\,] une matrice génératrice systématique. Montrer que H=[ −AT∣In−k ]H=[\,-A^{\mathsf T}\mid I_{n-k}\,] est une matrice de contrôle (i.e. GHT=0GH^{\mathsf T}=0 et rg⁡H=n−k\operatorname{rg}H=n-k). Construire HH pour A=(110011101)A=\begin{pmatrix}1&1&0\\0&1&1\\1&0&1\end{pmatrix} sur F2\mathbb{F}_2.

Indices (3)

Calculer GHT=Ik(−A)+A In−kGH^{\mathsf T}=I_k(-A)+A\,I_{n-k} par blocs.

rg⁡H=n−k\operatorname{rg}H=n-k car HH contient le bloc identité In−kI_{n-k}.

Sur F2\mathbb{F}_2, −A=A-A=A.

Correction détaillée
Les deux matrices, et leur division du travail

Un code linéaire se décrit de deux façons complémentaires :

  • par ce qu'il contient — la génératrice GG : C={mG}C=\{mG\} ;
  • par ce qu'il vérifie — la matrice de contrôle HH : C={x: HxT=0}C=\{x:\ Hx^{\mathsf T}=0\}.

La seconde est celle qui sert au décodage : tester si un mot reçu appartient au code coûte un produit matriciel, alors qu'avec GG il faudrait chercher un antécédent.

Quand GG est systématique, G=[ Ik∣A ]G=[\,I_k\mid A\,], on passe de l'une à l'autre sans aucun calcul :

H=[ −AT∣In−k ]\boxed{H=[\,-A^{\mathsf T}\mid I_{n-k}\,]}

⚠️ Le signe −- est invisible sur F2\mathbb{F}_2 (où −1=1-1=1) mais indispensable dès q≥3q\geq 3.

Étape 1 — Pourquoi $GH^{\mathsf T}=0$

Calculons le produit par blocs :

GHT=[ Ik∣A ]((−AT)TIn−k)=[ Ik∣A ](−AIn−k)GH^{\mathsf T}=[\,I_k\mid A\,]\begin{pmatrix}(-A^{\mathsf T})^{\mathsf T}\\ I_{n-k}\end{pmatrix}=[\,I_k\mid A\,]\begin{pmatrix}-A\\ I_{n-k}\end{pmatrix}
=Ik⋅(−A)+A⋅In−k=−A+A=0=I_k\cdot(-A)+A\cdot I_{n-k}=-A+A=0

Ce que ça signifie : chaque ligne de GG — donc chaque générateur du code — annule HH. Par linéarité, tout mot de code x=mGx=mG vérifie

HxT=H(mG)T=HGTmT=(GHT)TmT=0Hx^{\mathsf T}=H(mG)^{\mathsf T}=HG^{\mathsf T}m^{\mathsf T}=(GH^{\mathsf T})^{\mathsf T}m^{\mathsf T}=0

Donc C⊂ker⁡HC\subset\ker H.

Étape 2 — Le rang, et l'égalité des deux descriptions

HH contient le bloc In−kI_{n-k} à droite : ses n−kn-k lignes sont donc indépendantes (aucune combinaison non triviale ne peut annuler la partie identité), d'où

rg⁡H=n−k\operatorname{rg}H=n-k

Par le théorème du rang, dim⁡ker⁡H=n−(n−k)=k\dim\ker H=n-(n-k)=k.

Or on a montré C⊂ker⁡HC\subset\ker H, et dim⁡C=k=dim⁡ker⁡H\dim C=k=\dim\ker H. Une inclusion entre espaces de même dimension finie est une égalité :

C=ker⁡H={x: HxT=0}\boxed{C=\ker H=\{x:\ Hx^{\mathsf T}=0\}}

HH est donc bien une matrice de contrôle : elle ne se contente pas d'annuler le code, elle le caractérise.

Étape 3 — Construction sur l'exemple
A=(110011101)sur F2,k=3, n−k=3, n=6A=\begin{pmatrix}1&1&0\\0&1&1\\1&0&1\end{pmatrix}\quad\text{sur }\mathbb{F}_2,\qquad k=3,\ n-k=3,\ n=6

Transposer (échanger lignes et colonnes) :

AT=(101110011)A^{\mathsf T}=\begin{pmatrix}1&0&1\\1&1&0\\0&1&1\end{pmatrix}

Sur F2\mathbb{F}_2, −AT=AT-A^{\mathsf T}=A^{\mathsf T}. En accolant I3I_3 :

H=[101100110010011001]\boxed{H=\left[\begin{array}{ccc|ccc}1&0&1&1&0&0\\1&1&0&0&1&0\\0&1&1&0&0&1\end{array}\right]}

Et la génératrice correspondante :

G=[100110010011001101]G=\left[\begin{array}{ccc|ccc}1&0&0&1&1&0\\0&1&0&0&1&1\\0&0&1&1&0&1\end{array}\right]
Étape 4 — Vérification, et la lecture qui suit

Vérifions GHT=0GH^{\mathsf T}=0 sur la première ligne de GG, soit g1=100110g_1=100110. Il faut Hg1T=0Hg_1^{\mathsf T}=0, c'est-à-dire, ligne de HH par ligne de HH :

L1⋅g1=1⋅1+0⋅0+1⋅0+1⋅1+0⋅1+0⋅0=1+1=0L_1\cdot g_1=1{\cdot}1+0{\cdot}0+1{\cdot}0+1{\cdot}1+0{\cdot}1+0{\cdot}0=1+1=0
L2⋅g1=1⋅1+1⋅0+0⋅0+0⋅1+1⋅1+0⋅0=1+1=0L_2\cdot g_1=1{\cdot}1+1{\cdot}0+0{\cdot}0+0{\cdot}1+1{\cdot}1+0{\cdot}0=1+1=0
L3⋅g1=0⋅1+1⋅0+1⋅0+0⋅1+0⋅1+1⋅0=0L_3\cdot g_1=0{\cdot}1+1{\cdot}0+1{\cdot}0+0{\cdot}1+0{\cdot}1+1{\cdot}0=0

Les trois s'annulent ✓ (le calcul complet donne bien la matrice nulle 3×33\times 3).

Ce que HH va servir à faire, dans les trois exercices suivants :

  • lire dd sur ses colonnes (B2) ;
  • calculer un syndrome pour localiser une erreur (B3) ;
  • engendrer le code dual (B6).

Réciproquement, on passe de H=[ B∣In−k ]H=[\,B\mid I_{n-k}\,] à G=[ Ik∣−BT ]G=[\,I_k\mid -B^{\mathsf T}\,] : la construction est symétrique.

Réponse. H=[−AT∣In−k]H=[-A^{\mathsf T}\mid I_{n-k}] avec GHT=0GH^{\mathsf T}=0 ; code [6,3,3][6,3,3]. (Vérifié machine — B1 ✓)
Faire cet exercice dans l'app →

Distance et colonnes de H

DémonstrationDifficulté 3/5

Montrer que la distance minimale d'un code vaut le plus petit nombre de colonnes de HH linéairement dépendantes. L'appliquer au [6,3][6,3] de matrice HH ci-dessus pour retrouver d=3d=3.

Indices (3)

x∈C  ⟺  HxT=0x\in C\iff Hx^{\mathsf T}=0, i.e. les colonnes HjH_j avec xj≠0x_j\neq 0 sont liées.

HxT=∑jxjHjHx^{\mathsf T}=\sum_j x_j H_j.

Un mot de poids ww   ⟺  \iff une relation de dépendance entre ww colonnes.

Correction détaillée
Le théorème, et pourquoi il change la façon de calculer $d$

Théorème. La distance minimale d'un code de matrice de contrôle HH est le plus petit nombre de colonnes de HH linéairement dépendantes.

L'intérêt est calculatoire. L'exercice A2 réduisait déjà le calcul de dd à qk−1q^k-1 poids ; celui-ci le ramène à un examen de familles de colonnes de HH : pour certifier d≥s+1d\geq s+1, il suffit de vérifier qu'aucune famille d'au plus ss colonnes n'est liée. Sur un code binaire [255,239][255,239] dont on veut certifier d≥5d\geq 5, c'est la différence entre 22392^{239} mots et environ 1,7⋅1081{,}7\cdot 10^{8} familles d'au plus 44 colonnes.

Et surtout, il guide la construction : pour obtenir d≥3d\geq 3, il suffit de choisir des colonnes deux à deux non proportionnelles. C'est exactement l'idée du code de Hamming (exercice E1).

Étape 1 — Traduire l'appartenance au code

Notons h1,…,hnh_1,\dots,h_n les colonnes de HH. Pour un vecteur x=(x1,…,xn)x=(x_1,\dots,x_n) :

HxT=∑j=1nxj hjHx^{\mathsf T}=\sum_{j=1}^{n}x_j\,h_j

Donc

x∈C  ⟺  ∑jxjhj=0x\in C\iff \sum_{j}x_j h_j=0

Un mot de code est exactement une relation de dépendance entre les colonnes de HH, où les coefficients sont les coordonnées du mot.

Le support de xx — l'ensemble des jj avec xj≠0x_j\neq 0 — donne les colonnes qui participent, et w(x)w(x) est leur nombre.

Étape 2 — La double inégalité

Sens ≥\geq. Soit x∈Cx\in C non nul de poids dd. Alors ∑j∈supp(x)xjhj=0\sum_{j\in\mathrm{supp}(x)}x_jh_j=0 est une relation de dépendance non triviale entre dd colonnes. Donc il existe dd colonnes dépendantes, et le plus petit tel nombre est ≤d\leq d.

Sens ≤\leq. Réciproquement, si rr colonnes hj1,…,hjrh_{j_1},\dots,h_{j_r} sont dépendantes, il existe des coefficients λi\lambda_i non tous nuls avec ∑λihji=0\sum\lambda_ih_{j_i}=0. Le vecteur xx défini par xji=λix_{j_i}=\lambda_i et 00 ailleurs est alors un mot de code non nul de poids ≤r\leq r, donc d≤rd\leq r.

d=min⁡{r: ∃ r colonnes de H deˊpendantes}\boxed{d=\min\{r:\ \exists\ r\ \text{colonnes de }H\ \text{d\'ependantes}\}}
Étape 3 — Les deux corollaires qu'on utilise tout le temps
d≥2aucune colonne nulled≥3colonnes non nulles ET deux aˋ deux non proportionnelles\begin{array}{ll} d\geq 2 & \text{aucune colonne nulle}\\ d\geq 3 & \text{colonnes non nulles ET deux \`a deux non proportionnelles} \end{array}

Pourquoi. Une colonne nulle est à elle seule une dépendance (1⋅hj=01\cdot h_j=0), donc donnerait d=1d=1. Deux colonnes proportionnelles (hi=λhjh_i=\lambda h_j) donnent une dépendance de taille 22, donc d=2d=2.

👉 C'est la recette du code de Hamming : prendre pour colonnes tous les vecteurs non nuls de F2 m\mathbb{F}_2^{\,m}. Ils sont non nuls et, sur F2\mathbb{F}_2, deux vecteurs distincts non nuls ne sont jamais proportionnels (le seul scalaire non nul est 11). Donc d≥3d\geq 3 automatiquement.

Étape 4 — Application au $[6,3]$
H=[101100110010011001]H=\left[\begin{array}{cccccc}1&0&1&1&0&0\\1&1&0&0&1&0\\0&1&1&0&0&1\end{array}\right]

Colonnes : h1=(11)0=(1,1,0)h_1=\binom{1}{1}_0=(1,1,0), h2=(0,1,1)h_2=(0,1,1), h3=(1,0,1)h_3=(1,0,1), h4=(1,0,0)h_4=(1,0,0), h5=(0,1,0)h_5=(0,1,0), h6=(0,0,1)h_6=(0,0,1).

Aucune colonne nulle — les six sont non nulles, donc d≥2d\geq 2.

Aucune paire proportionnelle — sur F2\mathbb{F}_2 cela revient à : les six colonnes sont distinctes. On le vérifie d'un coup d'œil sur la liste ci-dessus. Donc d≥3d\geq 3.

Une dépendance de taille 3 existe : les trois premières colonnes,

h1+h2+h3=(1,1,0)+(0,1,1)+(1,0,1)=(2,2,2)≡(0,0,0)(mod2)h_1+h_2+h_3=(1,1,0)+(0,1,1)+(1,0,1)=(2,2,2)\equiv(0,0,0)\pmod 2
d=3\boxed{d=3}

Recoupement direct : cette dépendance correspond au mot de code 111000111000, de poids 33. Il est bien dans le code — c'est g1+g2+g3g_1+g_2+g_3, la somme des trois lignes de GG : 100110+010011+001101=111000100110+010011+001101=111000 ✓ (chaque colonne comporte exactement deux 11 sur les trois dernières positions, qui s'annulent).

Réponse. dd = plus petit nombre de colonnes de HH liées =3=3 ici. (Vérifié machine — B2 ✓)
Faire cet exercice dans l'app →

Syndrome d'un mot reçu

CalculDifficulté 3/5

Avec H=[101100110010011001]H=\left[\begin{array}{ccc|ccc}1&0&1&1&0&0\\1&1&0&0&1&0\\0&1&1&0&0&1\end{array}\right] ([6,3][6,3] sur F2\mathbb{F}_2), un mot de code cc subit l'erreur e=100000e=100000. Calculer le syndrome s=HrTs=Hr^{\mathsf T} du mot reçu r=c+er=c+e et expliquer pourquoi il ne dépend que de ee.

Indices (3)

HrT=HcT+HeTHr^{\mathsf T}=Hc^{\mathsf T}+He^{\mathsf T} et HcT=0Hc^{\mathsf T}=0.

HeTHe^{\mathsf T} = colonne de HH correspondant à la position erronée.

e=100000e=100000 pointe la 1ʳᵉ colonne.

Correction détaillée
Ce qu'est un syndrome, et pourquoi c'est l'idée décisive

Le récepteur reçoit r=c+er=c+e : le mot émis, plus un motif d'erreur inconnu. Il ne connaît ni cc ni ee — seulement rr.

Le syndrome est

s=HrTs=Hr^{\mathsf T}

et son intérêt tient en une ligne de calcul :

s=H(c+e)T=HcT⏟=0+HeT=HeTs=H(c+e)^{\mathsf T}=\underbrace{Hc^{\mathsf T}}_{=0}+He^{\mathsf T}=He^{\mathsf T}
s ne deˊpend QUE de l’erreur, pas du mot eˊmis\boxed{s\ \text{ne d\'epend QUE de l'erreur, pas du mot \'emis}}

C'est ce qui rend le décodage praticable : au lieu de comparer rr aux qkq^k mots de code, on lit un vecteur de taille n−kn-k qui pointe directement l'erreur.

Étape 1 — Le calcul
H=[101100110010011001],e=100000H=\left[\begin{array}{ccc|ccc}1&0&1&1&0&0\\1&1&0&0&1&0\\0&1&1&0&0&1\end{array}\right],\qquad e=100000

Comme s=HeTs=He^{\mathsf T} et que ee n'a qu'un seul 11, en première position :

s=HeT=1⋅h1+0⋅h2+⋯=h1s=He^{\mathsf T}=1\cdot h_1+0\cdot h_2+\cdots=h_1

c'est-à-dire la première colonne de HH :

s=(110)\boxed{s=\begin{pmatrix}1\\1\\0\end{pmatrix}}

Vérifions ligne par ligne, pour se convaincre :

L1⋅e=1⋅1+0+1⋅0+1⋅0+0+0=1L_1\cdot e=1\cdot 1+0+1\cdot 0+1\cdot 0+0+0=1
L2⋅e=1⋅1+1⋅0+0+0+0+0=1L_2\cdot e=1\cdot 1+1\cdot 0+0+0+0+0=1
L3⋅e=0⋅1+1⋅0+1⋅0+0+0+0=0L_3\cdot e=0\cdot 1+1\cdot 0+1\cdot 0+0+0+0=0
Étape 2 — Pourquoi le syndrome ignore $c$

Reprenons le calcul en détail. Par linéarité du produit matriciel :

HrT=H(c+e)T=HcT+HeTHr^{\mathsf T}=H(c+e)^{\mathsf T}=Hc^{\mathsf T}+He^{\mathsf T}

Et HcT=0Hc^{\mathsf T}=0 par définition même de HH (exercice B1) : cc est un mot de code, donc il annule la matrice de contrôle.

s=HeTs=He^{\mathsf T}

Conséquence pratique décisive. Un décodeur peut construire une table

syndrome ⟼ erreur la plus probable\text{syndrome}\ \longmapsto\ \text{erreur la plus probable}

de taille q n−kq^{\,n-k}, indépendante du mot reçu. Pour ce [6,3][6,3] : 23=82^3=8 entrées, contre 26=642^6=64 mots reçus possibles. Le gain croît exponentiellement avec kk.

Étape 3 — Localiser l'erreur

Comparons s=(1,1,0)s=(1,1,0) aux colonnes de HH :

h1=(1,1,0) =s,h2=(0,1,1),h3=(1,0,1),h_1=(1,1,0)\ \mathbf{=s},\quad h_2=(0,1,1),\quad h_3=(1,0,1),
h4=(1,0,0),h5=(0,1,0),h6=(0,0,1)h_4=(1,0,0),\quad h_5=(0,1,0),\quad h_6=(0,0,1)

ss est la première colonne, et aucune autre. Le décodeur conclut : erreur unique, en position 11.

e^=100000,c^=r+e^\hat e=100000,\qquad \hat c=r+\hat e

(sur F2\mathbb{F}_2, ajouter l'erreur la retire — e+e=0e+e=0.)

La règle générale, à retenir : si ss est nul, pas d'erreur détectée ; si ss est égal à la colonne hjh_j, l'erreur unique est en position jj. C'est exactement ce que le code de Hamming pousse à sa perfection (exercice E1), où le syndrome écrit en binaire donne directement le numéro de la position fautive.

La limite, et ce qu'elle ouvre

⚠️ Ce raisonnement ne vaut que si l'on suppose au plus t=1t=1 erreur. Le code a d=3d=3, donc t=1t=1 : deux erreurs peuvent produire le même syndrome qu'une seule.

Exemple concret sur ce code : l'erreur double e′=011000e'=011000 donne

s′=h2+h3=(0,1,1)+(1,0,1)=(1,1,0)=ss'=h_2+h_3=(0,1,1)+(1,0,1)=(1,1,0)=s

Même syndrome que l'erreur simple en position 1. Le décodeur choisira e^=100000\hat e=100000 — le motif de poids minimal — et se trompera. C'est inévitable : un code de distance 33 ne peut pas corriger deux erreurs, et le nier serait dépasser la borne de l'exercice A3.

👉 Le principe du décodage au plus proche voisin est donc : parmi tous les ee ayant le syndrome observé, choisir celui de poids minimal. C'est ce qu'organise le tableau standard de l'exercice B4.

Réponse. s=(1,1,0)s=(1,1,0) = 1ʳᵉ colonne de HH ; s=HeTs=He^{\mathsf T} ne dépend que de ee. (Vérifié machine — B3 ✓)
Faire cet exercice dans l'app →

Décodage par tableau standard

CalculDifficulté 3/5

Pour le [6,3,3][6,3,3] précédent, expliquer le décodage par syndrome : à chaque syndrome on associe le chef de classe (erreur de poids minimal). Combien y a-t-il de syndromes ? Montrer (idée) que ce décodage corrige toute erreur de poids ≤t=1\leq t=1.

Indices (3)

Il y a qn−k=23q^{n-k}=2^{3} syndromes possibles.

Chaque erreur de poids ≤1\leq 1 a un syndrome distinct (colonnes de HH distinctes et non nulles).

On décode c^=r−(chef de classe de s)\hat c=r-\text{(chef de classe de }s).

Correction détaillée
L'idée du tableau standard

Le décodage par syndrome repose sur une observation de l'exercice B3 : le syndrome ne dépend que de l'erreur. On construit donc, une fois pour toutes, une table

syndrome ⟼ chef de classe\text{syndrome}\ \longmapsto\ \text{chef de classe}

où le chef de classe est le motif d'erreur de poids minimal ayant ce syndrome.

Le décodage devient alors immédiat : calculer s=HrTs=Hr^{\mathsf T}, lire le chef e^\hat e dans la table, et rendre c^=r−e^\hat c=r-\hat e. Deux opérations, quel que soit kk.

Étape 1 — Combien de syndromes ?

Le syndrome est un vecteur de Fq n−k\mathbb{F}_q^{\,n-k}, et l'application e↦HeTe\mapsto He^{\mathsf T} est surjective puisque rg⁡H=n−k\operatorname{rg}H=n-k (exercice B1). Donc tous les syndromes sont atteints :

q n−k syndromes\boxed{q^{\,n-k}\ \text{syndromes}}

Pour le [6,3][6,3] sur F2\mathbb{F}_2 :

26−3=23=8 syndromes2^{6-3}=2^3=8\ \text{syndromes}

et il y a 26=642^6=64 mots reçus possibles, répartis en 88 classes de 88 mots chacune (exercice B5).

Étape 2 — Le tableau complet du $[6,3,3]$
syndromechef de classepoids00000000001101000001011010000110100100011000001001010000010100100000111110010102\begin{array}{ccl} \text{syndrome} & \text{chef de classe} & \text{poids}\\\hline 000 & 000000 & 0\\ 110 & 100000 & 1\\ 011 & 010000 & 1\\ 101 & 001000 & 1\\ 100 & 000100 & 1\\ 010 & 000010 & 1\\ 001 & 000001 & 1\\ 111 & 001010 & \mathbf{2} \end{array}

Les sept premières lignes se lisent directement sur HH : le syndrome d'une erreur simple en position jj est la colonne hjh_j (exercice B3). Comme les six colonnes sont distinctes et non nulles, on obtient six syndromes distincts, plus le syndrome nul.

1+6=7 classes couvertes par des erreurs de poids≤11+6=7\ \text{classes couvertes par des erreurs de poids}\leq 1
Étape 3 — Pourquoi toute erreur de poids $\leq t=1$ est corrigée

L'argument tient en deux points.

Les syndromes des erreurs de poids ≤1\leq 1 sont deux à deux distincts. Le syndrome de e=0e=0 est 00 ; celui d'une erreur en position jj est hjh_j, non nul (exercice B2, d≥2d\geq 2) ; et hi≠hjh_i\neq h_j pour i≠ji\neq j (exercice B2, d≥3d\geq 3). Aucune collision.

Chacun est chef de sa classe. Un motif de poids ≤1\leq 1 est de poids minimal dans sa classe, puisqu'il n'y a rien de plus petit qu'un poids 11 à part 00, et le poids 00 occupe déjà sa propre classe.

Donc, si l'erreur réelle est de poids ≤1\leq 1, son syndrome pointe vers elle-même dans la table, et le décodage est exact.

toute erreur de poids≤1 est corrigeˊe\boxed{\text{toute erreur de poids}\leq 1\ \text{est corrig\'ee}}

C'est la traduction concrète du théorème des boules disjointes (exercice A3).

La huitième classe, et ce qu'elle révèle

⚠️ Le tableau a 8 lignes, et les erreurs de poids ≤1\leq 1 n'en occupent que 7. Il reste une classe, celle du syndrome 111111, dont le chef est de poids 22 — par exemple 001010001010.

Vérifions : h3+h5=(1,0,1)+(0,1,0)=(1,1,1)h_3+h_5=(1,0,1)+(0,1,0)=(1,1,1) ✓.

Ce que cette classe orpheline signifie : le code n'est pas parfait. Comptons le volume couvert par les boules de rayon 11 :

∣C∣⋅V2(6,1)=8×(1+6)=56 < 64=26\lvert C\rvert\cdot V_2(6,1)=8\times(1+6)=56\ <\ 64=2^6

Il reste 64−56=864-56=8 mots hors de toute boule — exactement les 88 mots de la classe 111111.

👉 Un code est parfait quand les boules pavent l'espace sans reste, c'est-à-dire quand toutes les classes ont un chef de poids ≤t\leq t. C'est le cas du code de Hamming [7,4,3][7,4,3] (exercice E2), où 16×8=128=2716\times 8=128=2^7 tombe juste — et c'est rare.

⚠️ Le choix du chef 001010001010 est d'ailleurs arbitraire : plusieurs motifs de poids 22 partagent ce syndrome. Le décodeur en choisit un, et se trompera si l'erreur réelle était l'un des autres.

Réponse. 88 syndromes ; les 77 erreurs de poids ≤1\leq 1 ont des syndromes distincts ⇒\Rightarrow correction de 11 erreur. (Vérifié machine : décodage corrige tout poids ≤t\leq t — B4 ✓)
Faire cet exercice dans l'app →

Cosets et syndromes

DémonstrationDifficulté 3/5

Montrer que deux mots reçus ont le même syndrome si et seulement s'ils sont dans le même coset r+Cr+C, et qu'il y a exactement q n−kq^{\,n-k} cosets.

Indices (3)

Hr1T=Hr2T  ⟺  H(r1−r2)T=0Hr_1^{\mathsf T}=Hr_2^{\mathsf T}\iff H(r_1-r_2)^{\mathsf T}=0.

HzT=0  ⟺  z∈CH z^{\mathsf T}=0\iff z\in C.

Le nombre de cosets de CC dans Fqn\mathbb{F}_q^n est qn/qkq^n/q^k.

Correction détaillée
Ce qu'on relie, et pourquoi

Un coset (ou classe latérale) de CC est un ensemble de la forme

r+C={r+c : c∈C}r+C=\{r+c\ :\ c\in C\}

On veut montrer deux choses :

  1. deux mots reçus ont le même syndrome si et seulement si ils sont dans le même coset ;
  2. il y a exactement q n−kq^{\,n-k} cosets.

Ensemble, ces deux faits fondent le tableau standard de l'exercice B4 : le syndrome est une étiquette des cosets, et le chef de classe est le représentant de poids minimal de chacun.

Étape 1 — Même syndrome $\iff$ même coset
Hr1T=Hr2T  ⟺  H(r1−r2)T=0(lineˊariteˊ)  ⟺  r1−r2∈C(exercice B1 : C=ker⁡H)  ⟺  r1∈r2+C  ⟺  r1+C=r2+C(deux cosets se rencontrant sont eˊgaux)\begin{aligned} Hr_1^{\mathsf T}=Hr_2^{\mathsf T} &\iff H(r_1-r_2)^{\mathsf T}=0 &&\text{(lin\'earit\'e)}\\ &\iff r_1-r_2\in C &&\text{(exercice B1 : }C=\ker H)\\ &\iff r_1\in r_2+C\\ &\iff r_1+C=r_2+C &&\text{(deux cosets se rencontrant sont \'egaux)} \end{aligned}

La dernière équivalence mérite d'être justifiée : si r1=r2+c0r_1=r_2+c_0 avec c0∈Cc_0\in C, alors pour tout c∈Cc\in C, r1+c=r2+(c0+c)∈r2+Cr_1+c=r_2+(c_0+c)\in r_2+C, d'où r1+C⊂r2+Cr_1+C\subset r_2+C, et l'inclusion réciproque s'obtient symétriquement.

le syndrome est un INVARIANT COMPLET du coset\boxed{\text{le syndrome est un INVARIANT COMPLET du coset}}

« Invariant » : il ne dépend pas du représentant choisi. « Complet » : il les distingue tous.

Étape 2 — Le nombre de cosets

Deux arguments, à connaître tous les deux.

Par le comptage. Les cosets partitionnent Fq n\mathbb{F}_q^{\,n} (ils sont deux à deux disjoints ou égaux, et recouvrent tout puisque r∈r+Cr\in r+C). Chacun a exactement ∣C∣=qk\lvert C\rvert=q^k éléments, l'application c↦r+cc\mapsto r+c étant une bijection de CC sur r+Cr+C. Donc

nombre de cosets=q nq k=q n−k\text{nombre de cosets}=\frac{q^{\,n}}{q^{\,k}}=q^{\,n-k}

Par le syndrome. L'application r↦HrTr\mapsto Hr^{\mathsf T} est linéaire surjective de Fq n\mathbb{F}_q^{\,n} sur Fq n−k\mathbb{F}_q^{\,n-k} (surjective car rg⁡H=n−k\operatorname{rg}H=n-k). Par l'étape 1, elle induit une bijection entre les cosets et les syndromes. Il y a donc autant de cosets que de syndromes :

q n−k cosets\boxed{q^{\,n-k}\ \text{cosets}}
Étape 3 — Sur le $[6,3]$
q=2, n=6, k=3 ⟹ 23=8 cosets de 8 motsq=2,\ n=6,\ k=3\ \Longrightarrow\ 2^{3}=8\ \text{cosets de }8\ \text{mots}

Contrôle : 8×8=64=268\times 8=64=2^6 ✓ — la partition est bien complète.

Le coset du syndrome 000000 est le code lui-même :

0+C=C={000000, 001101, 010011, 011110, 100110, 101011, 110101, 111000}0+C=C=\{000000,\ 001101,\ 010011,\ 011110,\ 100110,\ 101011,\ 110101,\ 111000\}

Le coset du syndrome 110110 est 100000+C100000+C, dont le chef est 100000100000 (poids 11) :

{100000, 101101, 110011, 111110, 000110, 001011, 010101, 011000}\{100000,\ 101101,\ 110011,\ 111110,\ 000110,\ 001011,\ 010101,\ 011000\}

Tous ces mots ont le même syndrome 110110, et le décodeur les ramène tous à leur mot de code en retirant 100000100000.

Le vocabulaire, et le pont avec l'algèbre

Ce qu'on vient de démontrer est un cas particulier d'un théorème général : CC est un sous-groupe de (Fq n,+)(\mathbb{F}_q^{\,n},+), les cosets sont ses classes latérales, et le syndrome est la projection canonique

π: Fq n ⟶ Fq n/C ≃ Fq n−k\pi:\ \mathbb{F}_q^{\,n}\ \longrightarrow\ \mathbb{F}_q^{\,n}/C\ \simeq\ \mathbb{F}_q^{\,n-k}

L'étape 1 est l'énoncé « π(x)=π(y)  ⟺  x−y∈ker⁡π\pi(x)=\pi(y)\iff x-y\in\ker\pi », et l'étape 2 est le théorème de Lagrange : l'indice d'un sous-groupe est le quotient des cardinaux.

👉 C'est le même mécanisme que les congruences modulo nn : les classes de Z/nZ\mathbb{Z}/n\mathbb{Z} sont les cosets de nZn\mathbb{Z}, et le reste de la division euclidienne joue le rôle du syndrome — un invariant complet, calculable, de la classe.

Cette parenté n'est pas décorative : elle prépare la lecture des codes cycliques comme idéaux d'un anneau quotient (exercice C1).

Réponse. Syndrome   ⟺  \iff coset ; qn−kq^{n-k} cosets (=8=8 pour le [6,3][6,3]). (Vérifié machine — B5 ✓)
Faire cet exercice dans l'app →

Code dual

DémonstrationDifficulté 3/5

Le code dual C⊥={y:y⋅x=0 ∀x∈C}C^{\perp}=\{y:y\cdot x=0\ \forall x\in C\}. Montrer que HH engendre C⊥C^{\perp}, que dim⁡C⊥=n−k\dim C^{\perp}=n-k, et que (C⊥)⊥=C(C^{\perp})^{\perp}=C.

Indices (3)

y∈C⊥  ⟺  y⊥y\in C^{\perp}\iff y\perp toute ligne de GG   ⟺  GyT=0\iff Gy^{\mathsf T}=0.

HH a pour lignes une base de ker⁡GT=C⊥\ker G^{\mathsf T}=C^{\perp} (rôles de GG et HH échangés).

Dimensions : dim⁡C+dim⁡C⊥=n\dim C+\dim C^{\perp}=n.

Correction détaillée
Ce qu'est le dual, et pourquoi il double toute la théorie

Le code dual de CC est

C⊥={y∈Fq n : y⋅x=0 pour tout x∈C}C^{\perp}=\{y\in\mathbb{F}_q^{\,n}\ :\ y\cdot x=0\ \text{pour tout }x\in C\}

où y⋅x=∑jyjxjy\cdot x=\sum_j y_jx_j est le produit scalaire usuel.

Trois énoncés à établir : HH engendre C⊥C^\perp, dim⁡C⊥=n−k\dim C^\perp=n-k, et (C⊥)⊥=C(C^\perp)^\perp=C.

L'intérêt est que GG et HH échangent leurs rôles : la génératrice de CC est la matrice de contrôle de C⊥C^\perp, et réciproquement. Toute construction se lit donc de deux façons — et l'identité de MacWilliams pousse la dualité jusqu'aux distributions de poids.

Étape 1 — $H$ engendre $C^\perp$

Les lignes de HH sont dans C⊥C^\perp. Pour tout x∈Cx\in C, on a HxT=0Hx^{\mathsf T}=0 (exercice B1), ce qui s'écrit coordonnée par coordonnée : chaque ligne LiL_i de HH vérifie Li⋅x=0L_i\cdot x=0. Donc Li∈C⊥L_i\in C^\perp, et par linéarité l'espace engendré par les lignes de HH est inclus dans C⊥C^\perp.

L'inclusion réciproque. Soit y∈C⊥y\in C^\perp. Alors yy est orthogonal à toutes les lignes de GG (qui sont dans CC), soit GyT=0Gy^{\mathsf T}=0. Donc y∈ker⁡Gy\in\ker G, espace de dimension n−kn-k par le théorème du rang (rg⁡G=k\operatorname{rg}G=k).

Ainsi C⊥⊂ker⁡GC^\perp\subset\ker G, tandis que l'espace engendré par les lignes de HH est de dimension n−kn-k (elles sont indépendantes, exercice B1). Les trois espaces ayant la même dimension et étant emboîtés, ils coïncident :

C⊥=ker⁡G=⟨lignes de H⟩,dim⁡C⊥=n−k\boxed{C^\perp=\ker G=\langle\text{lignes de }H\rangle,\qquad \dim C^\perp=n-k}

Autrement dit : HH est génératrice de C⊥C^\perp, et GG est matrice de contrôle de C⊥C^\perp.

Étape 2 — La bidualité

Inclusion facile. Tout x∈Cx\in C est orthogonal à tout y∈C⊥y\in C^\perp (c'est la définition de C⊥C^\perp, lue dans l'autre sens). Donc C⊂(C⊥)⊥C\subset(C^\perp)^\perp.

Égalité par les dimensions. En appliquant l'étape 1 au code C⊥C^\perp, qui est de dimension n−kn-k :

dim⁡(C⊥)⊥=n−(n−k)=k=dim⁡C\dim(C^\perp)^\perp=n-(n-k)=k=\dim C

Une inclusion entre espaces de même dimension finie est une égalité :

(C⊥)⊥=C\boxed{(C^\perp)^\perp=C}

⚠️ Cet argument passe par les dimensions, et pas autrement. Sur Rn\mathbb{R}^n on conclurait par C⊕C⊥=RnC\oplus C^\perp=\mathbb{R}^n, mais c'est faux sur un corps fini : la restriction du produit scalaire à CC peut y être dégénérée — un vecteur non nul peut même être orthogonal à lui-même. Voir la section suivante.

Étape 3 — Sur l'exemple du $[6,3]$
H=[101100110010011001]H=\left[\begin{array}{cccccc}1&0&1&1&0&0\\1&1&0&0&1&0\\0&1&1&0&0&1\end{array}\right]

C⊥C^\perp est le code [6,3][6,3] engendré par ces trois lignes. Vérifions l'orthogonalité sur un couple : L1=101100L_1=101100 et le mot de code g1=100110g_1=100110,

L1⋅g1=1⋅1+0⋅0+1⋅0+1⋅1+0⋅1+0⋅0=1+1=0 ✓L_1\cdot g_1=1{\cdot}1+0{\cdot}0+1{\cdot}0+1{\cdot}1+0{\cdot}1+0{\cdot}0=1+1=0\ \checkmark

Ici dim⁡C=dim⁡C⊥=3\dim C=\dim C^\perp=3, et 3+3=6=n3+3=6=n — les dimensions se complètent, comme attendu.

Mais les deux codes ne sont pas en somme directe pour autant : on peut avoir C∩C⊥≠{0}C\cap C^\perp\neq\{0\}. C'est le point suivant.

Le piège du produit scalaire sur un corps fini

⚠️ Sur Fq\mathbb{F}_q, un vecteur non nul peut être orthogonal à lui-même. Exemple minimal sur F2\mathbb{F}_2 :

y=1100,y⋅y=1+1+0+0=2≡0(mod2)y=1100,\qquad y\cdot y=1+1+0+0=2\equiv 0\pmod 2

Plus généralement, sur F2\mathbb{F}_2, y⋅y=w(y) mod 2y\cdot y=w(y)\bmod 2 : tout vecteur de poids pair est isotrope.

Conséquences, qui n'ont pas d'équivalent réel :

  • C∩C⊥C\cap C^\perp peut être non nul, et C+C⊥≠Fq nC+C^\perp\neq\mathbb{F}_q^{\,n} ;
  • un code peut être auto-dual (C=C⊥C=C^\perp), ce qui exige k=n/2k=n/2. Exemple : C={00,11}C=\{00,11\} sur F2\mathbb{F}_2, où 11⋅11=011\cdot 11=0 ;
  • ou auto-orthogonal (C⊂C⊥C\subset C^\perp).

👉 Retenir : la formule dim⁡C+dim⁡C⊥=n\dim C+\dim C^\perp=n reste vraie, mais elle ne dit plus que les espaces sont supplémentaires. C'est pourquoi la preuve de l'étape 2 passe par les dimensions et non par une décomposition.

Exemple du chapitre : le dual du code de Hamming [7,4,3][7,4,3] est le code simplexe [7,3,4][7,3,4] (exercice E6), qui est auto-orthogonal : ses mots non nuls ont tous poids 44, donc x⋅x=0x\cdot x=0, et pour x≠yx\neq y non nuls, w(x+y)=w(x)+w(y)−2∣x∩y∣w(x+y)=w(x)+w(y)-2\lvert x\cap y\rvert (où ∣x∩y∣\lvert x\cap y\rvert compte les positions où xx et yy valent 11) donne ∣x∩y∣=2\lvert x\cap y\rvert=2, donc x⋅y=0x\cdot y=0. Des poids seulement pairs ne suffiraient pas : dans la parité [4,3,2][4,3,2], tous les mots sont isotropes mais 1100⋅1010=11100\cdot 1010=1.

Réponse. C⊥=⟨lignes de H⟩C^{\perp}=\langle\text{lignes de }H\rangle, dim⁡=n−k\dim=n-k, (C⊥)⊥=C(C^{\perp})^{\perp}=C. (Vérifié machine : C⊥C⊥C\perp C^{\perp}, dim⁡C⊥=3\dim C^{\perp}=3 — B6 ✓)
Faire cet exercice dans l'app →

Le code de Hamming [7,4,3]

CalculDifficulté 3/5

On prend pour colonnes de HH tous les vecteurs non nuls de F2 3\mathbb{F}_2^{\,3} (écrits en binaire 001,…,111001,\dots,111). Donner nn, kk, et justifier d=3d=3.

Indices (3)

Il y a 23−1=72^3-1=7 vecteurs non nuls dans F23\mathbb{F}_2^3.

n−k=n-k= nombre de lignes de HH ; k=n−rg⁡Hk=n-\operatorname{rg}H.

dd = plus petit nombre de colonnes liées.

Correction détaillée
La construction, et pourquoi elle est si naturelle

L'exercice B2 a livré une recette : pour garantir d≥3d\geq 3, il suffit que les colonnes de HH soient non nulles et deux à deux non proportionnelles.

Sur F2\mathbb{F}_2, le seul scalaire non nul est 11, donc « non proportionnelles » signifie simplement distinctes. La construction optimale saute aux yeux :

prendre pour colonnes de H TOUS les vecteurs non nuls de F2 3\text{prendre pour colonnes de }H\ \textbf{TOUS}\ \text{les vecteurs non nuls de }\mathbb{F}_2^{\,3}

On ne peut pas faire mieux : ajouter une colonne obligerait à répéter un vecteur (il n'y en a que 77) et ferait tomber dd à 22.

Étape 1 — Écrire $H$

Les 23−1=72^3-1=7 vecteurs non nuls de F2 3\mathbb{F}_2^{\,3}, rangés dans l'ordre binaire 001,010,…,111001,010,\dots,111 :

H=(000111101100111010101)H=\begin{pmatrix}0&0&0&1&1&1&1\\0&1&1&0&0&1&1\\1&0&1&0&1&0&1\end{pmatrix}

La colonne jj est l'écriture binaire de jj (sur 33 bits, bit de poids fort en haut).

Ce choix d'ordre n'est pas cosmétique : il fait que le syndrome, lu comme un nombre binaire, donne directement le numéro de la position en erreur (voir la fin).

Étape 2 — Les paramètres $n$ et $k$

n=7n=7 : sept colonnes.

k=n−rg⁡Hk=n-\operatorname{rg}H. Les lignes de HH sont indépendantes : HH contient les colonnes 100100, 010010, 001001 (aux positions 44, 22, 11), qui forment une sous-matrice I3I_3. Donc rg⁡H=3\operatorname{rg}H=3 et

k=7−3=4k=7-3=4
∣C∣=24=16 mots de code\boxed{\lvert C\rvert=2^4=16\ \text{mots de code}}

Le rendement est R=4/7≈57 %R=4/7\approx 57\,\% : on transmet 44 bits utiles pour 77 bits envoyés.

Étape 3 — Justifier $d=3$

d≥3d\geq 3, par l'exercice B2 :

  • aucune colonne n'est nulle (on a pris les vecteurs non nuls), donc pas de dépendance de taille 11 ;
  • les colonnes sont deux à deux distinctes (ce sont tous les vecteurs non nuls, chacun une fois), donc pas de dépendance de taille 22 — sur F2\mathbb{F}_2, hi+hj=0h_i+h_j=0 équivaut à hi=hjh_i=h_j.

d≤3d\leq 3 : il faut exhiber trois colonnes dépendantes. Prenons

h1=001,h2=010,h3=011h_1=001,\qquad h_2=010,\qquad h_3=011
h1+h2+h3=001+010+011=(0,2,2)≡(0,0,0)(mod2) ✓h_1+h_2+h_3=001+010+011=(0,2,2)\equiv(0,0,0)\pmod 2\ \checkmark

Le mot de code correspondant est 11100001110000, de poids 33.

d=3,code [7,4,3]\boxed{d=3,\qquad \text{code }[7,4,3]}
t=⌊3−12⌋=1 : il corrige UNE erreurt=\left\lfloor\frac{3-1}{2}\right\rfloor=1\ :\ \text{il corrige UNE erreur}
Le décodage en une ligne, et la généralisation

C'est ici que l'ordre des colonnes paie. Si une seule erreur frappe la position jj, le syndrome vaut hjh_j (exercice B3), c'est-à-dire l'écriture binaire de jj.

s=101 ⟹ erreur en position 5s=101\ \Longrightarrow\ \text{erreur en position } 5

Il n'y a aucune table à consulter : on lit le syndrome comme un entier, et c'est la position à corriger. Un syndrome nul signifie « aucune erreur détectée ».

La famille complète. La construction se fait pour tout m≥2m\geq 2 : on prend les 2m−12^m-1 vecteurs non nuls de F2 m\mathbb{F}_2^{\,m}, d'où

[ n=2m−1,  k=2m−1−m,  d=3 ]\big[\,n=2^m-1,\ \ k=2^m-1-m,\ \ d=3\,\big]
mnkR=k/n37457 %4151173 %5312684 %712712094 %\begin{array}{cccc} m & n & k & R=k/n\\\hline 3 & 7 & 4 & 57\,\%\\ 4 & 15 & 11 & 73\,\%\\ 5 & 31 & 26 & 84\,\%\\ 7 & 127 & 120 & 94\,\% \end{array}

Le rendement tend vers 11 : plus le code est long, moins la protection coûte cher — mais dd reste 33, donc il corrige toujours une seule erreur, sur un bloc de plus en plus grand. C'est le bon compromis pour un canal peu bruité, et c'est pourquoi les mémoires ECC utilisent des Hamming étendus.

Réponse. [7,4,3][7,4,3] : colonnes de HH == les 77 non-nuls de F23\mathbb{F}_2^3. (Vérifié machine : 77 colonnes distinctes, d=3d=3 — E1 ✓)
Faire cet exercice dans l'app →

Hamming est un code parfait

DémonstrationDifficulté 3/5

Montrer que le code de Hamming [7,4,3][7,4,3] est parfait : les boules de rayon t=1t=1 pavent exactement F2 7\mathbb{F}_2^{\,7}, i.e. 24⋅V2(7,1)=272^{4}\cdot V_2(7,1)=2^{7}.

Indices (3)

V2(7,1)=(70)+(71)V_2(7,1)=\binom{7}{0}+\binom{7}{1} (boule de rayon 11).

Multiplier par le nombre 242^4 de mots de code.

Comparer à ∣F27∣=27\lvert\mathbb{F}_2^7\rvert=2^7.

Correction détaillée
Ce qu'est un code parfait

L'exercice A3 a montré que les boules de Hamming de rayon tt autour des mots de code sont disjointes. Rien ne dit qu'elles remplissent l'espace : sur le [6,3,3][6,3,3] de l'exercice B4, il restait 88 mots hors de toute boule.

Un code est parfait quand elles le pavent exactement :

∣C∣⋅Vq(n,t)=q n\boxed{\lvert C\rvert\cdot V_q(n,t)=q^{\,n}}

Autrement dit : tout mot reçu est à distance ≤t\leq t d'un unique mot de code. Le décodeur ne rencontre jamais de cas ambigu, et il n'y a aucune redondance gaspillée.

C'est rare : les codes parfaits binaires sont, à peu de chose près, seulement les Hamming, les répétitions de longueur impaire, et le code de Golay [23,12,7][23,12,7].

Étape 1 — Le volume d'une boule
V2(n,t)=∑i=0t(ni)V_2(n,t)=\sum_{i=0}^{t}\binom{n}{i}

Pourquoi : un mot à distance exactement ii du centre s'obtient en choisissant ii positions parmi nn et en y basculant le bit. Il y a (ni)\binom ni tels mots, et l'on somme sur ii de 00 à tt.

Pour n=7n=7, t=1t=1 :

V2(7,1)=(70)+(71)=1+7=8V_2(7,1)=\binom70+\binom71=1+7=8

Le 11 est le centre lui-même ; les 77 sont les mots obtenus en changeant un bit.

⚠️ Sur Fq\mathbb{F}_q avec q>2q>2, la formule devient Vq(n,t)=∑i(ni)(q−1)iV_q(n,t)=\sum_i\binom ni(q-1)^i : changer une coordonnée offre q−1q-1 nouvelles valeurs, pas une seule.

Étape 2 — Le calcul décisif
∣C∣⋅V2(7,1)=24×8=16×8=128\lvert C\rvert\cdot V_2(7,1)=2^4\times 8=16\times 8=128
q n=27=128q^{\,n}=2^7=128
16×8=128=27 ✓\boxed{16\times 8=128=2^7\ \checkmark}

L'égalité est exacte : le code de Hamming [7,4,3][7,4,3] est parfait.

Une autre façon de le dire, plus parlante : 1616 boules de 88 mots chacune, soit 128128 mots au total, dans un espace qui en compte 128128. Pas un mot de reste.

Étape 3 — Ce que la perfection signifie concrètement

Tout syndrome correspond à une erreur de poids ≤1\leq 1. Il y a 2n−k=23=82^{n-k}=2^3=8 syndromes, et exactement 88 motifs d'erreur de poids ≤1\leq 1 (le motif nul, plus 77 erreurs simples). Ces 88 motifs ayant des syndromes distincts (exercice B4), ils épuisent les syndromes.

1⏟e=0+7⏟poids 1=8=2 n−k\underbrace{1}_{e=0}+\underbrace{7}_{\text{poids }1}=8=2^{\,n-k}

Le tableau standard n'a donc aucune ligne orpheline, contrairement au [6,3,3][6,3,3] où le syndrome 111111 exigeait un chef de poids 22.

Conséquence : le décodeur ne se trouve jamais devant un choix arbitraire — chaque syndrome pointe vers une unique erreur de poids minimal.

Contrepartie : le code ne détecte rien au-delà de ce qu'il corrige. Deux erreurs produisent le syndrome d'une erreur simple, et sont donc « corrigées » à tort, sans le moindre signal. Un code parfait n'a aucune marge.

Le contraste, en une table
code∣C∣V2(n,1)produitqn[6,3,3]875664 (8 mots de reste)[7,4,3]168128128 PARFAIT[5,2,3]462432 (8 de reste)\begin{array}{lcccl} \text{code} & \lvert C\rvert & V_2(n,1) & \text{produit} & q^n\\\hline [6,3,3] & 8 & 7 & 56 & 64\ \text{(8 mots de reste)}\\ [7,4,3] & 16 & 8 & \mathbf{128} & \mathbf{128}\ \text{PARFAIT}\\ [5,2,3] & 4 & 6 & 24 & 32\ \text{(8 de reste)} \end{array}

Pourquoi Hamming tombe juste, structurellement : n=2m−1n=2^m-1 et k=n−mk=n-m, donc

∣C∣⋅V2(n,1)=2 n−m⋅(1+n)=2 n−m⋅2m=2 n\lvert C\rvert\cdot V_2(n,1)=2^{\,n-m}\cdot(1+n)=2^{\,n-m}\cdot 2^{m}=2^{\,n}

L'égalité vient de 1+n=1+(2m−1)=2m1+n=1+(2^m-1)=2^m : le nombre de positions plus une est exactement une puissance de 22, donc le nombre de syndromes. C'est ce qui rend la famille de Hamming parfaite pour tout mm, et pas seulement pour m=3m=3.

👉 La perfection entraîne l'optimalité au sens de la borne de Hamming (exercice E3) : un code parfait sature la borne.

Réponse. 24⋅8=128=272^{4}\cdot 8=128=2^{7} : Hamming [7,4,3][7,4,3] est parfait. (Vérifié machine — E2 ✓)
Faire cet exercice dans l'app →

Borne de Hamming (sphère)

DémonstrationDifficulté 3/5

Établir la borne de Hamming : pour un code corrigeant tt erreurs, ∣C∣⋅Vq(n,t)≤qn\lvert C\rvert\cdot V_q(n,t)\leq q^{n}. En déduire que pour n=7n=7, t=1t=1 sur F2\mathbb{F}_2, ∣C∣≤16\lvert C\rvert\leq 16, et que Hamming est optimal.

Indices (3)

Les boules de rayon tt centrées sur les mots de code sont disjointes.

Leur réunion est incluse dans Fqn\mathbb{F}_q^n.

Sommer les volumes.

Correction détaillée
Ce que la borne exprime

Borne de Hamming. Pour tout code corrigeant tt erreurs, de longueur nn sur Fq\mathbb{F}_q :

∣C∣⋅Vq(n,t)≤q n\boxed{\lvert C\rvert\cdot V_q(n,t)\leq q^{\,n}}

C'est un argument de volume, purement combinatoire — il ne suppose même pas le code linéaire. On l'appelle aussi borne de la sphère.

Elle dit ce qu'on ne peut pas dépasser : à longueur et capacité de correction fixées, il y a un plafond au nombre de mots. Toute construction plus ambitieuse est impossible, et pas seulement « pas encore trouvée ».

Étape 1 — La preuve

Les boules B(c,t)B(c,t), pour cc parcourant CC, sont deux à deux disjointes — c'est exactement l'exercice A3.

Chacune contient Vq(n,t)V_q(n,t) mots, ce nombre ne dépendant pas du centre (l'espace est homogène : la translation x↦x+cx\mapsto x+c envoie B(0,t)B(0,t) sur B(c,t)B(c,t) bijectivement).

Leur réunion est donc de cardinal exactement ∣C∣⋅Vq(n,t)\lvert C\rvert\cdot V_q(n,t), et elle est contenue dans Fq n\mathbb{F}_q^{\,n} :

∣C∣⋅Vq(n,t)=∣⨆c∈CB(c,t)∣ ≤ q n\lvert C\rvert\cdot V_q(n,t)=\left\lvert\bigsqcup_{c\in C}B(c,t)\right\rvert\ \leq\ q^{\,n}

L'égalité a lieu si et seulement si le code est parfait (exercice E2) : c'est le cas où la réunion des boules est l'espace entier.

Étape 2 — Application à $n=7$, $t=1$, $q=2$
V2(7,1)=1+(71)=8V_2(7,1)=1+\binom71=8
∣C∣×8≤27=128 ⟹ ∣C∣≤16\lvert C\rvert\times 8\leq 2^7=128\ \Longrightarrow\ \boxed{\lvert C\rvert\leq 16}

Aucun code binaire de longueur 77 corrigeant une erreur ne peut avoir plus de 1616 mots. Ce n'est pas une limite de nos méthodes, c'est une impossibilité de comptage.

Or le code de Hamming a exactement 1616 mots (exercice E1). Il atteint la borne :

Hamming [7,4,3] est OPTIMAL pour (n,t)=(7,1)\boxed{\text{Hamming }[7,4,3]\ \text{est OPTIMAL pour }(n,t)=(7,1)}

Pour un code linéaire, la contrainte se lit sur kk : 2k≤162^k\leq 16 donne k≤4k\leq 4. Hamming atteint k=4k=4.

Ce que la borne interdit, exemples

Elle sert surtout à écarter des constructions avant de les chercher.

Un [7,5,3][7,5,3] existe-t-il ? Il aurait t=1t=1 et 25=322^5=32 mots, or

32×8=256>12832\times 8=256>128

Impossible. Inutile de chercher : aucun choix de matrice génératrice n'y parviendra.

Un [7,4,5][7,4,5] ? Il aurait t=2t=2, donc

V2(7,2)=1+7+(72)=1+7+21=29,16×29=464>128V_2(7,2)=1+7+\binom72=1+7+21=29,\qquad 16\times 29=464>128

Impossible aussi.

Un [15,11,3][15,11,3] ? t=1t=1, V2(15,1)=16V_2(15,1)=16, et 211×16=32768=2152^{11}\times 16=32768=2^{15} ✓ — la borne est saturée, et ce code existe : c'est le Hamming m=4m=4.

👉 La borne ne garantit jamais l'existence ; elle ne fait qu'exclure. Un code peut la respecter sans exister.

Les deux bornes du chapitre, et leurs domaines
HammingSingletoneˊnonceˊ∣C∣Vq(n,t)≤qnd≤n−k+1argumentvolumeprojectionsaturationcode PARFAITcode MDSmord quandq petit, t grandq grand\begin{array}{lll} & \text{Hamming} & \text{Singleton}\\\hline \text{\'enonc\'e} & \lvert C\rvert V_q(n,t)\leq q^n & d\leq n-k+1\\ \text{argument} & \text{volume} & \text{projection}\\ \text{saturation} & \text{code PARFAIT} & \text{code MDS}\\ \text{mord quand} & q\ \text{petit},\ t\ \text{grand} & q\ \text{grand} \end{array}

Les deux sont incomparables, et c'est utile de le savoir : un code peut saturer l'une sans saturer l'autre.

  • Hamming [7,4,3][7,4,3] : parfait (sature Hamming) mais pas MDS, car 3<7−4+1=43<7-4+1=4 (exercice E5) ;
  • Reed-Solomon [6,3,4][6,3,4] sur F7\mathbb{F}_7 : MDS (sature Singleton) mais pas parfait — 343×V7(6,1)=343×37=12691<76=117649343\times V_7(6,1)=343\times 37=12691<7^6=117649.

Sur les corps de grande taille, c'est Singleton qui devient la contrainte pertinente, et c'est pourquoi les codes de Reed-Solomon (exercices D1 à D3) y sont la référence.

Réponse. ∣C∣≤qn/Vq(n,t)\lvert C\rvert\leq q^n/V_q(n,t) ; ici ≤16\leq 16, atteint par Hamming. (Vérifié machine : borne =16=2k=16=2^k — E3 ✓)
Faire cet exercice dans l'app →

Borne de Singleton et codes MDS

DémonstrationDifficulté 3/5

Démontrer la borne de Singleton d≤n−k+1d\leq n-k+1. Un code MDS atteint l'égalité : vérifier que les codes à répétition [n,1,n][n,1,n] et de parité [n,n−1,2][n,n-1,2] sont MDS.

Indices (3)

Projeter les mots sur les k−1k-1 premières coordonnées : l'application est injective ou non ?

Deux mots égaux sur n−d+1n-d+1 positions sont égaux (sinon d(x,y)<dd(x,y)<d).

Argument de comptage / d'algèbre linéaire sur les coordonnées effacées.

Correction détaillée
L'énoncé, et l'idée en une phrase

Borne de Singleton. Tout code [n,k,d][n,k,d] vérifie

d≤n−k+1\boxed{d\leq n-k+1}

L'idée de la preuve tient en une phrase : effacer d−1d-1 coordonnées ne peut pas faire fusionner deux mots de code, puisqu'ils diffèrent en au moins dd positions. La projection reste donc injective, et un comptage de dimensions conclut.

Un code atteignant l'égalité est dit MDS (maximum distance separable) : à nn et kk fixés, il a la meilleure distance possible.

Étape 1 — La preuve par projection

Soit π\pi l'application qui efface les d−1d-1 dernières coordonnées :

π: Fq n→Fq n−d+1,(x1,…,xn)↦(x1,…,xn−d+1)\pi:\ \mathbb{F}_q^{\,n}\to\mathbb{F}_q^{\,n-d+1},\qquad (x_1,\dots,x_n)\mapsto(x_1,\dots,x_{n-d+1})

π\pi restreinte à CC est injective. Si π(x)=π(y)\pi(x)=\pi(y) pour x,y∈Cx,y\in C, alors xx et yy coïncident sur les n−d+1n-d+1 premières coordonnées, donc diffèrent au plus sur les d−1d-1 dernières :

dH(x,y)≤d−1<dd_H(x,y)\leq d-1<d

Or deux mots de code distincts sont à distance ≥d\geq d. Donc x=yx=y.

Conclusion par les cardinaux. π(C)\pi(C) a autant d'éléments que CC, et vit dans un espace de dimension n−d+1n-d+1 :

qk=∣C∣=∣π(C)∣≤q n−d+1q^{k}=\lvert C\rvert=\lvert\pi(C)\rvert\leq q^{\,n-d+1}
k≤n−d+1 ⟺ d≤n−k+1k\leq n-d+1\ \Longleftrightarrow\ d\leq n-k+1

ℹ️ La preuve n'utilise la linéarité que pour écrire ∣C∣=qk\lvert C\rvert=q^k ; l'inégalité ∣C∣≤q n−d+1\lvert C\rvert\leq q^{\,n-d+1} vaut pour tout code.

Étape 2 — La répétition est MDS
[n,1,n] :C={00⋯0, 11⋯1}[n,1,n]\ :\quad C=\{00\cdots 0,\ 11\cdots 1\}

Le seul mot non nul a poids nn, donc d=nd=n (exercice A2). Et

n−k+1=n−1+1=n=d ✓n-k+1=n-1+1=n=d\ \checkmark
la reˊpeˊtition est MDS\boxed{\text{la r\'ep\'etition est MDS}}

Interprétation par la preuve : effacer d−1=n−1d-1=n-1 coordonnées laisse une seule coordonnée, et elle suffit à distinguer les deux mots (00 contre 11). La projection est tout juste injective — l'égalité est atteinte parce qu'on ne peut pas effacer davantage.

Étape 3 — La parité est MDS
[n,n−1,2] :C={x : x1+⋯+xn=0}[n,n-1,2]\ :\quad C=\{x\ :\ x_1+\cdots+x_n=0\}

d=2d=2 : tous les mots ont un poids pair (la somme des coordonnées est nulle), donc le plus petit poids non nul est 22 — atteint par exemple par 110⋯0110\cdots 0. Et

n−k+1=n−(n−1)+1=2=d ✓n-k+1=n-(n-1)+1=2=d\ \checkmark
le code de pariteˊ est MDS\boxed{\text{le code de parit\'e est MDS}}

Vérification sur le [4,3,2][4,3,2] de l'exercice A4 : 4−3+1=2=d4-3+1=2=d ✓.

Ce que MDS ne veut PAS dire

⚠️ MDS ne signifie pas « bon code ». La répétition [5,1,5][5,1,5] est MDS et son rendement est de 20 %20\,\% ; la parité [4,3,2][4,3,2] est MDS et ne corrige aucune erreur. Être MDS veut seulement dire : pour ce couple (n,k)(n,k), la distance est la meilleure possible. Le choix du couple, lui, n'est pas jugé.

⚠️ Et MDS n'implique pas parfait, ni l'inverse :

MDSparfaitHamming [7,4,3]nonouireˊpeˊtition [5,1,5]ouiouipariteˊ [4,3,2]ouinonRS [6,3,4]7ouinon\begin{array}{lcc} & \text{MDS} & \text{parfait}\\\hline \text{Hamming }[7,4,3] & \text{non} & \textbf{oui}\\ \text{r\'ep\'etition }[5,1,5] & \textbf{oui} & \textbf{oui}\\ \text{parit\'e }[4,3,2] & \textbf{oui} & \text{non}\\ \text{RS }[6,3,4]_7 & \textbf{oui} & \text{non} \end{array}

Les vrais MDS utiles sont les Reed-Solomon (exercice D2), qui atteignent d=n−k+1d=n-k+1 avec des paramètres exploitables — par exemple [255,223,33][255,223,33] sur F256\mathbb{F}_{256}, qui corrige 1616 erreurs sur 255255 octets. C'est le code des CD, des QR-codes et des sondes spatiales.

ℹ️ Un théorème dit que sur Fq\mathbb{F}_q, un code MDS de dimension k≥2k\geq 2 vérifie d≤qd\leq q, c'est-à-dire n≤q+k−1n\leq q+k-1 : les MDS exigent un grand corps, ce qui explique qu'on ne les rencontre pas en binaire.

Réponse. d≤n−k+1d\leq n-k+1 ; répétition et parité atteignent l'égalité (MDS). (Vérifié machine sur tous les codes — E4 ✓)
Faire cet exercice dans l'app →

Hamming n'est pas MDS

CalculDifficulté 3/5

Pour le code de Hamming [7,4,3][7,4,3], comparer dd et n−k+1n-k+1. Conclure sur le caractère MDS.

Indices (3)

n=7n=7, k=4k=4, d=3d=3.

Calculer n−k+1n-k+1.

MDS   ⟺  d=n−k+1\iff d=n-k+1.

Correction détaillée
La question, et pourquoi elle mérite d'être posée

Le code de Hamming [7,4,3][7,4,3] est parfait (exercice E2) : ses boules pavent l'espace sans reste. On pourrait croire qu'il est optimal à tous égards.

L'exercice demande de le confronter à la borne de Singleton, qui est une mesure d'optimalité différente. La réponse est instructive : il ne la sature pas.

Étape 1 — Le calcul
n=7,k=4,d=3n=7,\qquad k=4,\qquad d=3
n−k+1=7−4+1=4n-k+1=7-4+1=4
d=3 < 4=n−k+1d=3\ <\ 4=n-k+1
Hamming [7,4,3] n’est PAS MDS\boxed{\text{Hamming }[7,4,3]\ \text{n'est PAS MDS}}

L'écart vaut 11 : il « perd » une unité de distance par rapport à l'optimum de Singleton.

Étape 2 — Ce que coûterait un $[7,4,4]$

Un tel code serait MDS. Existe-t-il ?

Non, et la borne de Hamming le montre. Avec d=4d=4 on a encore t=⌊3/2⌋=1t=\lfloor 3/2\rfloor=1, donc la borne de Hamming s'écrit 16×8≤12816\times 8\leq 128 ✓ — elle ne conclut pas.

Il faut un autre argument : par la borne de Singleton appliquée au code raccourci, ou plus simplement par le théorème cité en E4 — sur Fq\mathbb{F}_q, un code MDS de dimension k≥2k\geq 2 vérifie d≤qd\leq q. Ici q=2q=2, donc d≤2<4d\leq 2<4 : aucun code binaire de longueur 77 n'est MDS, sauf les cas dégénérés (répétition et parité).

👉 C'est le vrai enseignement : le binaire ne permet pas d'être MDS. Ce n'est pas un défaut de Hamming, c'est une propriété du corps.

Étape 3 — Les deux optimalités, côte à côte
parfaitMDSsatureborne de Hammingborne de Singletonargumentvolume des boulesprojectionHamming [7,4,3]OUInonRS [6,3,4]7nonOUI\begin{array}{lll} & \text{parfait} & \text{MDS}\\\hline \text{sature} & \text{borne de Hamming} & \text{borne de Singleton}\\ \text{argument} & \text{volume des boules} & \text{projection}\\ \text{Hamming }[7,4,3] & \textbf{OUI} & \text{non}\\ \text{RS }[6,3,4]_7 & \text{non} & \textbf{OUI} \end{array}

Deux notions d'optimalité, deux réponses opposées sur les deux codes phares du chapitre. Aucune n'implique l'autre.

Le point commun des cas où les deux tombent ensemble : la répétition de longueur impaire, à la fois parfaite et MDS — mais avec un rendement dérisoire.

Ce qu'il faut retenir pour choisir un code

Le vrai critère n'est ni « parfait » ni « MDS », mais l'adéquation au canal.

  • Canal peu bruité, erreurs isolées : Hamming. Rendement élevé, corrige l'erreur unique, décodage immédiat par lecture du syndrome. C'est le choix des mémoires ECC.
  • Erreurs en rafale (rayure sur un CD, salissure sur un QR-code) : Reed-Solomon. Il travaille sur des symboles (octets) et non des bits, donc une rafale de 88 bits consécutifs n'abîme qu'un ou deux symboles (deux si elle chevauche une frontière d'octet).
  • Canal très bruité : répétition ou codes concaténés.

👉 « Hamming n'est pas MDS » ne signifie donc pas qu'il soit un mauvais code — il est le meilleur possible dans sa classe (parfait), sur un corps où être MDS est impossible. Comparer un code binaire à la borne de Singleton, c'est le juger sur un critère que le corps lui interdit d'atteindre.

Réponse. d=3<n−k+1=4d=3<n-k+1=4 : Hamming [7,4,3][7,4,3] n'est pas MDS. (Vérifié machine — E5 ✓)
Faire cet exercice dans l'app →

Le code dual de Hamming : le simplexe

CalculDifficulté 3/5

Le dual du code de Hamming [7,4,3][7,4,3] est le code simplexe [7,3][7,3], engendré par HH. Montrer que tous ses mots non nuls ont le même poids 44 ; en déduire d⊥=4d^{\perp}=4.

Indices (3)

Le simplexe a 23=82^3=8 mots, dont 77 non nuls.

Chaque coordonnée d'un mot == produit scalaire d'une colonne de HH avec le vecteur de coefficients.

Compter combien de colonnes donnent un produit scalaire non nul.

Correction détaillée
Ce qu'on va montrer, et pourquoi c'est remarquable

Le dual du code de Hamming [7,4,3][7,4,3] est le code simplexe [7,3][7,3], engendré par la matrice HH de Hamming (exercice B6).

On veut établir que tous ses mots non nuls ont exactement le poids 44, ce qui donne immédiatement d⊥=4d^\perp=4.

Un code dont tous les mots non nuls ont le même poids est dit à poids constant. C'est une propriété rare et forte : la distribution des poids tient en deux nombres, et le code est aussi « équilibré » que possible.

Étape 1 — Les paramètres
G⊥=H=(000111101100111010101)G^\perp=H=\begin{pmatrix}0&0&0&1&1&1&1\\0&1&1&0&0&1&1\\1&0&1&0&1&0&1\end{pmatrix}

n=7n=7, et k⊥=3k^\perp=3 puisque les trois lignes de HH sont indépendantes (exercice E1). Donc

∣C⊥∣=23=8 mots\lvert C^\perp\rvert=2^3=8\ \text{mots}

Cohérent avec dim⁡C+dim⁡C⊥=4+3=7=n\dim C+\dim C^\perp=4+3=7=n ✓ (exercice B6).

Étape 2 — Tous les mots non nuls ont poids 4

Soit m=(m1,m2,m3)≠0m=(m_1,m_2,m_3)\neq 0 un message, et x=mHx=mH le mot correspondant. Sa jj-ième coordonnée est

xj=m⋅hjx_j=m\cdot h_j

où hjh_j est la jj-ième colonne de HH. Comptons les jj pour lesquels xj=1x_j=1.

Les colonnes hjh_j parcourent tous les vecteurs non nuls de F2 3\mathbb{F}_2^{\,3} (c'est la définition du code de Hamming). Donc

w(x)=#{v∈F2 3∖{0} : m⋅v=1}w(x)=\#\{v\in\mathbb{F}_2^{\,3}\setminus\{0\}\ :\ m\cdot v=1\}

Or m≠0m\neq 0, donc la forme linéaire v↦m⋅vv\mapsto m\cdot v est non nulle : c'est une surjection de F2 3\mathbb{F}_2^{\,3} sur F2\mathbb{F}_2, dont le noyau est un hyperplan de dimension 22.

#{v: m⋅v=1}=8−4⏟noyau=4\#\{v:\ m\cdot v=1\}=8-\underbrace{4}_{\text{noyau}}=4

Le vecteur v=0v=0 étant dans le noyau, il ne compte pas parmi les 44. Donc

w(x)=4 pour tout m≠0\boxed{w(x)=4\ \text{pour tout }m\neq 0}
Étape 3 — La conclusion et le contrôle

Par l'exercice A2, la distance minimale est le plus petit poids non nul :

d⊥=4,code simplexe [7,3,4]\boxed{d^\perp=4,\qquad \text{code simplexe }[7,3,4]}

Distribution des poids :

(A0,…,A7)=(1, 0, 0, 0, 7, 0, 0, 0)(A_0,\dots,A_7)=(1,\,0,\,0,\,0,\,\mathbf{7},\,0,\,0,\,0)

Contrôle : 1+7=8=231+7=8=2^3 ✓.

Vérification directe sur un mot. Prenons m=100m=100 : le mot est la première ligne de HH, soit 00011110001111, de poids 44 ✓. Et m=110m=110 donne L1+L2=0001111+0110011=0111100L_1+L_2=0001111+0110011=0111100, de poids 44 ✓ (colonne par colonne : 0,1,1,1,1,0,00,1,1,1,1,0,0).

Est-il MDS ? n−k+1=7−3+1=5>4=dn-k+1=7-3+1=5>4=d : non (exercice E4). Est-il parfait ? t=1t=1 et 8×8=64<1288\times 8=64<128 : non plus.

Pourquoi « simplexe », et à quoi ça sert

L'origine du nom. Les 88 mots du code sont deux à deux à la même distance : pour x≠yx\neq y dans C⊥C^\perp, dH(x,y)=w(x−y)=4d_H(x,y)=w(x-y)=4, puisque x−yx-y est encore un mot non nul du code. Les 88 points forment donc un simplexe régulier dans F2 7\mathbb{F}_2^{\,7} — l'analogue du triangle équilatéral ou du tétraèdre.

C'est la configuration la plus symétrique possible : aucun mot n'est privilégié.

La famille. Pour tout mm, le simplexe est un [2m−1, m, 2m−1][2^m-1,\ m,\ 2^{m-1}] : longueur exponentielle, dimension mm, et tous les mots non nuls de poids 2m−12^{m-1} — exactement la moitié de la longueur, à un demi près.

Usages. Ces codes sont liés aux séquences de longueur maximale (registres à décalage à rétroaction linéaire), employées en télécommunications pour l'étalement de spectre et la synchronisation : leur autocorrélation est presque nulle hors de zéro, précisément parce que tous les décalages sont à la même distance.

La dualité, en résumé :

Hammingsimplexe[n,k,d][7,4,3][7,3,4]distribution(1,0,0,7,7,0,0,1)(1,0,0,0,7,0,0,0)parfaitouinon\begin{array}{lcc} & \text{Hamming} & \text{simplexe}\\\hline [n,k,d] & [7,4,3] & [7,3,4]\\ \text{distribution} & (1,0,0,7,7,0,0,1) & (1,0,0,0,7,0,0,0)\\ \text{parfait} & \text{oui} & \text{non} \end{array}

ℹ️ Les deux distributions sont reliées par l'identité de MacWilliams, qui calcule WC⊥W_{C^\perp} à partir de WCW_C sans énumérer le dual.

Réponse. Simplexe [7,3,4][7,3,4] équidistant : tous les mots ≠0\neq 0 de poids 44, d⊥=4d^{\perp}=4 (non MDS car n−k+1=5n-k+1=5). (Vérifié machine — E6 ✓)
Faire cet exercice dans l'app →

S'entraîner davantage sur codes correcteurs

18 exercices d'entraînement supplémentaires sur ce chapitre, plus le palier approfondissement, les quiz, le tuteur IA et les PDF à imprimer — dans l'app Maths Post-Bac.