Codes linéaires

Remarque

On peut se passer de linéarité pour beaucoup d’énoncés, mais tous nos codes seront linéaires.

Premiers exemples

code de parité (claviers) : soit \((x_1,\dots x_7)\in\F_2^7\), on ajoute un 8è bit de sorte que \(\sum x_i=0\). On peut détecter une erreur.

code par triple vérification : à \((x_1,x_2,x_3)\) on ajoute les bits \((x_2+x_3, x_1+x_3,x_1+x_2)\). On peut à présent corriger une erreur.

Si vous suivez...

On considère le code par triple vérification. Si on reçoit le mot 101011, et que l’on sait qu’il contient au plus un bit erroné, le mot correct est ?

  1. 101101

  2. 100011

  3. 010101

  4. 001011

101 devrait être complété par 101, donc il y a au moins une erreur. Une erreur sur le 3è bit donne le mot 100011 qui convient.

Définition

On considère l’alphabet \(\F_q\), et on se place dans l’espace vectoriel \(\F_q^n\) des mots de longueur \(n\).

Définition

Un code linéaire \(C\) de longueur \(n\) est un sous-espace vectoriel de \(\F_q^n\). Si \(C\) est de dimension \(k\), on dit que \(C\) est un \([n,k]\)-code.

Exemple

  • le code \(C_1=\set{(x_1,\dots x_7,x_8),\sum x_i=0}\in\F_2^8\) est un \([8,7]\)-code.

  • le code \(C_2=\set{(x_1,x_2,x_3,x_2+x_3,x_1+x_3,x_1+x_2)}\in\F_2^6\) est un \([6,3]\)-code.

Si vous suivez...

Combien y a-t-il d’éléments dans le code \(C_2\) ?

  1. 6

  2. 64

  3. 16

  4. 8

Distance

Définition

Pour \(x,y\in\F_q^n\), on pose

\[d(x,y) = \card \{i, x_i\neq y_i\}\]

le nombre de composantes par lesquelles \(x\) et \(y\) diffèrent. C’est une distance sur \(\F_q^n\), appelée distance de Hamming.

Si vous suivez...

Sur \(\F_2\), les octets 00100101 et 01000110 sont à distance

  1. 2

  2. 3

  3. 4

  4. 5

4

On corrige au plus proche voisin pour la distance de Hamming.

Soit \(c\in C\) un mot de code transmis, et \(y\) le mot reçu. On note \(c'\in C\) le mot de code distinct de \(c\) le plus proche de \(y\). Alors

  • si \(d(c',y)>0\), on peut détecter l’erreur (il y a nécessairement eu une erreur puisqu’on n’obtient pas un mot de code)

  • si \(d(c',y)>d(c,y)\), la correction au plus proche est correcte (on retourne vers \(c\) et non pas vers un autre mot \(c'\)).

Si vous suivez...

On transmet un mot de code \(c\) dont le plus proche voisin est à distance \(8\). Quel est le nombre maximum d’erreurs que l’on est sûr de pouvoir corriger ?

  1. 7

  2. 4

  3. 3

  4. 2

3

Définition

On appelle distance minimale de \(C\) l’entier

\[d(C)=\min\set{d(c,c'),c\neq c'\in C}\]

Si vous suivez...

La distance minimale du code par triple vérification est

  1. 4

  2. 3

  3. 2

  4. 1

3. Cela découlera bientôt de la théorie générale. Notons simplement que si l’on change un des trois premier bits, on en change aussi deux des trois suivants (et réciproquement). Si l’on change deux des trois premiers, on en change un des trois suivants (et réciproquement). Ainsi, on change au moins 3 bits.

En particulier, on a le lien suivant entre distance minimale et capacité de correction.

Proposition

  • Si \(d(C)\geq t+1\), on peut détecter jusqu’à \(t\) erreurs

  • Si \(d(C)\geq 2t+1\), on peut corriger jusqu’à \(t\) erreurs.

Démonstration

Par inégalité triangulaire, \(d(c',y)\geq d(c,c')-d(c,y)\), or \(d(c,c')\geq d(C)\) et \(d(c,y)\leq t\).

Dans le premier cas on a bien \(d(c',y)\geq d(C)-t>0\).

Dans le second, \(d(c',y)-d(c,y)\geq d(C)-2t>0\).

Un code de longueur \(n\), dimension \(k\) et distance minimale \(d\) est appelé un \([n,k,d]\)-code.

Exemple

  • \(C_1\) est un \([8,7,2]\)-code.

  • \(C_2\) est un \([6,3,3]\)-code.

Poids

Pour \(x\in\F_q^n\), on définit le poids de \(x\)

\[w(x) = \card \{i, x_i\neq 0\} = d(x,0)\]

alors pour tous \(x\neq y\) on a

\[d(x,y)=w(x-y).\]

En particulier, si \(C\) est un code linéaire, il est stable par différence donc

\[d(C) = \min_{c\in C, c\neq 0}\set{w(c)}\]

Si vous suivez...

Quel est le poids du mot 21012 de \(\F_5^5\) ?

  1. 4

  2. 6

  3. 1

  4. 2