espace de Hamming, code, erreurs détectables, corrigeables, distance minimale
codes linéaires, poids, base et matrice génératrice, équations et matrice vérificatrice, code orthogonal
distance minimale et matrice vérificatrice, syndrome
bornes de Hamming, codes parfaits ; de Singleton, code MDS ; taux d’information et de correction
codes de Hamming
codes cycliques = idéaux de \(\F_q[x]/x^n-1\), polynôme générateur, vérificateur. Générateur de l’orthogonal.
Note
Si \(q\wedge n=1\) et \(\alpha\) est une racine \(n\)-ième primitive de l’unité, \(x^n-1=\prod_{i\in\Z/n\Z}(x-\alpha^i)\) se factorise sur \(\F_q\) en \(\prod_I f_I(x)\) où \(I\) parcourt les \(q\)-orbites de \(\Z/n\Z\) et \(f_I(x)=\prod_{i\in I}(x-\alpha^i)\).
codes de Reed-Solomon pour \(n\mid q-1\), ils sont MDS.
codes BCH (distance prévue)
Note
Soit \(α\) une racine nième de l’unité ; si \(g(x)\) s’annule en \(r\) puissances consécutives \(α^{i+1},\dots α^{i+r}\), alors le code est de distance minimale \(\geq r+1\) (Ecrire la matrice de Vandermonde codant l’annulation d’un polynôme de poids \(r\)).
Écrire une fonction VHamming(r)
qui calcule une matrice vérificatrice
du code de Hamming \([2^r-1,2^r-r-1,3]\) sur \(\F_2\).
VHamming(r):=matrix(r,2^r-1,(k,l)->(bitand(l+1,2^k)?1:0));
On pose V:=VHamming(4)
. Donner une matrice génératrice du code (utiliser xcas
plutôt que la formule).
Le code est le noyau de V. Comme xcas fonctionne en colonne, pas besoin de transposer V.
V:=VHamming(4)
G:=ker(V)
(G%2)%0
Décoder le mot reçu y:=[1,1,0,1,0,0,1,0,0,0,0,1,0,0,1]
.
On calcule le syndrome
y:=[1,1,0,1,0,0,1,0,0,0,0,1,0,0,1]
((V*y)%2)%0
Les bits forment le nombre 3, c’est la 3è colonne de la vérificatrice, il y a une erreur sur le 3e bit.
\(G_{23}\) est un \([23,12]\) code cyclique binaire. Montrer qu’il existe deux tels codes.
qorbites(23,2)
Calculer un polynôme générateur de \(G_{23}\).
factor(x^23-1%2)
Le polynôme
>>> g := x^11 + x^9 + x^7 + x^6 + x^5 + x + 1
convient.
Écrire une matrice génératrice \(G\) de \(G_{23}\)
G := matrix(12, 23, (l,c)->coeff(g*x^l,c))
Montrer que \(d(G_{23})\geq 5\) (utiliser la borne BCH).
On veut déterminer les racines de \(g\). En notant \(x\mod g\) une racine, on voit que les autres sont les \(x^j\) pour \(j\in\set{1, 2, 4, 8, 16, 9, 18, 13, 3, 6, 12}\).
Calculer une matrice génératrice \(\overline G\) du code étendu \(\overline{G_{23}}\), obtenu en ajoutant un bit de parité (\(\sum x_i=0\)).
Le code étendu consiste à rajouter le bit de parité, ou à partir du polynôme \((x-1)g(x)\)
GE := matrix(12, 24, (l,c)->coeff(rem(g*(x-1%2)*x^l,x^23-1),c))%0
Vérifier que \(\overline{G_{23}}\) est auto-orthogonal.
GE * transpose(GE)
Montrer que les mots de \(\overline{G_{23}}\) ont un poids divisible par \(4\).
C’est vrai sur chacun des vecteurs de base
Montrer que \(\overline{G_{23}}\) est de distance \(8\).
Montrer que \(G_{23}\) est un code parfait.
Écrire une fonction qorbites(n,q)
qui calcule la liste des \(q\)-orbites
de \(\Z/n\Z\).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | qorbites(n,q) := {
local zn, res, c, k, orbite, j;
zn := [ seq(1,k=0..n-1) ];
res := [];
c := 0; k := 0;
while(c<n) {
while(!zn[k]) k++;
orbite := [k];
zn[k]:=0; c++;
j:=irem(k*q, n);
while(j != k) {
orbite := append(orbite, j);
zn[j]:=0; c++;
j:=irem(k*q, n);
print(orbite);
}
res := append(res, orbite);
print(res);
}
return(res);
}
|
Combien y a-t-il de codes binaires cycliques de longueur 15 ?
qorbites(15,2)
[[0], [1, 2, 4, 8], [3, 6, 12, 9], [5, 10], [7, 14, 13, 11]]
On a 5 orbites, donc 5 facteurs irréductibles de :math:`x^{15}-1`,
donc :math:`2^5=32` codes cycliques.
Le code de Golay ternaire \(G_{11}\) est un code cyclique de dimension \(k=6\) et de longueur \(n=11\).
Donner un algorithme de parcours de \(\F_2^n\) par ordre lexicographique, et le programmer.
Comme on l’a fait pour construire les codes de Hamming binaires, il suffit de parcourir les entiers et de regarder leur décomposition binaire. On peut aussi procéder de manière récursive.
Une fonction qui passe d’un entier \(k\) à son écriture binaire sur \(n\) bits. À la main
bdigits(k,n):= {
local L,j; L:=[];
for(j:=0;j<n;j++) {
L:=prepend(L,irem(k,2));
k:=iquo(k,2);
}
L;
}
ou bien en cherchant dans l’aide xcas on trouve convert( ,base,2)
,
on ruse juste un peu en ajoutant et retranchant \(2^n\) pour avoir le
résultat sur \(n\) bits.
bdigits(k,n):=convert(k+2^n,base,2)[1..n]
bouclef2(n):={
for(k:=0;k<2^n;k++) {
m := bdigits(k,n);
}
}
On peut encore procéder de manière récursive, mais je ne comprends rien au comportement d’xcas pour la concaténation de listes de listes, et c’est vite lourd en mémoire.
vecteursf2(n):={
if(n==0) return [[]];
else {
L := vecteursf2(n-1);
return concat([apply(l->append(l,0),L)], [apply(l->append(l,1),L)])[0];
}
}
On considère la construction de code gloutonne suivante :
Construire de la sorte un code binaire de longueur \(23\) et de distance \(7\) qui soit parfait. Montrer que c’est un code linéaire.
on écrit la distance de Hamming
hamming(x,y) := sum(x[k]!=y[k],k,0,min(length(x),length(y))-1);
et on écrit l’algorithme
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | codeglouton(d,n) := {
local C,c,nc,k,m;
C := [ ]; nc := 0;
for(k:=0;k<2^n;k++) {
m := bdigits(k,n);
for(c:=0;c<nc;c++) {
if(hamming(m,c)<d) break;
}
if(c==nc) {
C := append(C, m); nc++;
}
}
C;
}
|