canal de transmission, erreurs, détection et correction
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 et de Singleton, 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.
factorisation de \(x^n-1\) dans \(\F_q[x]\).
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 BCH (distance prévue)
É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 considère à présent le code de Hamming de paramètre \(r=3\).
(1,0,0,0,1,0,1)
. Quel était le mot envoyé, si l’on
suppose qu’il y a au plus une erreur ?(x,1,0,1,1,y,0)
, où x
est y
sont des bits
illisibles mais les autres ont été transmis sans erreur. Quel était le mot
envoyé ?Factoriser \(x^{23}-1\) sur \(\F_2\).
\(G_{23}\) est un \([23,12]\) code cyclique binaire. Montrer qu’il existe deux tels codes.
>>> qorbites(23,2)
[[0], [1, 2, 4, 8, 16, 9, 18, 13, 3, 6, 12], [5, 10, 20, 17, 11, 22, 21,
19, 15, 7, 14]]
On a deux diviseurs de degré 11 qui sont les facteurs de \(\Phi_{23}\), d’où l’existence de \(G_{23}\). Ces orbites contiennent une liste de 4 éléments consécutifs (respectivement 1-2-3-4 et 19-20-21-22), d’où une distance \(\geq 5\) d’après le lemme BCH.
factor(x^23-1 % 2)
Calculer un polynôme générateur de \(G_{23}\).
Le polynôme
g := x^11 + x^9 + x^7 + x^6 + x^5 + x + 1
convient.
>>> factor(x^23-1)
(x + 1) * (x^11 + x^9 + x^7 + x^6 + x^5 + x + 1) * (x^11 + x^10 + x^6 +
x^5 + x^4 + x^2 + 1)
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))
>>> G = matrix(11,23) ## pb
>>> G = pari("matrix(12,23)")
>>> for i in range(12):
... gi = g * x^i % (x^23-1)
... for j in range(23)
... G[i,j] = gi[j]
>>> G.lift()
Le code étendu consiste à rajouter le bit de parité, ou à partir du polynôme \((x-1)g(x)\)
>>> Gb = pari("matrix(12,24)")
>>> for i in range(12):
... b = 0
... for j in range(23):
... Gb[i,j] = G[i,j]
... b += G[i,j]
... Gb[i,23] = b
>>> Gb.lift()
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.
>>> lift( Gb * GB.mattranspose() )
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 def qorbites(n,q): d = {} res = [] for i in xrange(n): if i in d: continue # start orbit orb = [] while i not in d: d[i] = 1 orb.append(i) i = (i*q)%n res.append(orb) return res
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 \(x^{15}-1\), donc \(2^5=32\) codes cycliques.
qorbites(15,2) [[0], [1, 2, 4, 8], [3, 6, 12, 9], [5, 10], [7, 14, 13, 11]]
Les identifier en factorisant \(X^{15}-1\) sur \(\F_2\).
On associe les facteurs aux orbites :
Le code de Golay ternaire \(G_{11}\) est un code cyclique de dimension \(k=6\) et de longueur \(n=11\).
On considère la construction de code gloutonne suivante :