TP sur les codes correcteurs d’erreurs Agrégation, option calcul formel Delphine Boucher 29 Janvier 2008 1 1.1 Codes de Hamming Matrice de contrôle. Ecrire un programme qui prend en entrée un entier naturel r non nul et qui calcule la matrice de contrôle d’un code de Hamming de longueur n = 2r − 1. Indications : with(linalg): r:=4; H:=[]; colH:=convert(1,base,2): ncolH:=nops(colH): colH:=[op(colH),seq(0,j=1..r-ncolH)]: colH:=[seq(colH[r+1-i],i=1..r)]; H:=augment(op(H),colH); 1.2 Matrice génératrice. Ecrire une procédure qui prend en entrée un entier r non nul et rend en sortie une matrice génératrice d’un code de Hamming de longueur n = 2r − 1. Indications : H := matrix([[0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1], [0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1], [0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]]); Ker:=Nullspace(H) mod 2; G:=[]: for v in Ker do G:=stackmatrix(op(G),v): od: evalm(G); #Construction d’un mot du code : m:=vector([1,1,1,1,1,0,1,0,1,0,0]); c:=evalm(m&*G); c:=evalm(m&*G) mod 2; c:=map(X->X mod 2,evalm(m&*G)); 1.3 Canal de transmission. Ecrire un programme qui simule l’erreur produite dans le canal de transmission. Il prendra en entrée un mot de code c et ressortira le mot reçu x après passage dans le canal de transmission. Vous perturberez aléatoirement le mot de code c en lui ajoutant un vecteur e de même longueur ayant des 0 partout sauf 1 en une position, pos, que vous choisirez au hasard. Indications : r:=4; n:=2^r-1; pos:=3; e:=vector([seq(0,i=1..pos-1),1,seq(0,i=pos+1..n)]); die:=rand(1..n): pos:=die(); e:=vector([seq(0,i=1..pos-1),1,seq(0,i=pos+1..n)]); x:=map (X->X mod 2,evalm(c+e)); 1.4 Correction de l’erreur. Ecrire un programme qui en entrée prend le mot reçu x (perturbé) et retourne le mot de code initialement envoyé c. 2 Codes BCH. 2.1 Polynômes unitaires, polynomes minimaux d’éléments primitifs. 1. Ecrire une procédure qui rend la liste de tous les polynômes unitaires de degré r dans Z/2Z[x]. 2. Ecrire une procédure qui rend la liste de tous les éléments primitifs ayant un polynôme minimal de degré r dans Z/2Z[x]. On représentera les éléments primitifs par leurs polynômes minimaux. Primitive(x^4+x+1) mod 2; 2.2 Table des éléments du code. Ecrire une procédure qui prend en entrée un entier r et une racine primitive nième a de l’unité où n = 2r −1 de polynôme minimal de degré r et qui exprime les éléments de F 2(a) sous forme des puissances de a . On utilisera un alias pour représenter a comme racine de son polynome minimal p : p:=x^4+x+1; alias(a=RootOf(p) mod 2); evala(Normal(a^5)) mod 2; evala(Normal(a^6+a+1)) mod 2; 2.3 Polynôme générateur du code. Ecrire une procédure qui prend en entrée un entier naturel non nul r, un entier naturel t, une racine primitive nième de 1 a (n = 2r − 1) de polynome minimal de degré r et une variable x et qui calcule le polynome générateur d’un code BCH t-correcteur d’erreurs de longueur n en la variable x. 2.4 Canal de transmission. Ecrire une procédure qui simule le canal de transmission : en entrée un entier naturel r, un entier naturel t, une variable x et un élément c du code BCH t-correcteur de longueur n = 2r − 1 (polynôme en x) ; en sortie, un mot de code perturbé aléatoirement, X. 2.5 Vecteur syndrome. Ecrire une procédure qui calcule le vecteur syndrome d’un polynôme. Petit rappel : Le vecteur syndrome d’un polynome p est le vecteur des p(ai ) avec i = 1 . . . d = 2t + 1 où t est la capcité de correction 2 2.6 Correction via l’algorithme d’Euclide étendu. Ecrire une procédure de décodage via l’algorithme d’Euclide étendu. Elle prendra en entrée un entier naturel non nul r, un entier naturel t, une racine primitive n-ième de l’unité a (avec n = 2r − 1) une variable x et un mot reçu X (polynôme en la variable x) ; en sortie le mot de code corrigé C du code BCH t-correcteur d’erreurs de longueur n. Testez-la sur le code BCH 3-correcteur d’erreurs (toujours avec a4 + a + 1 = 0) et sur les polynômes suivants : X = 1 + x2 + x3 + x4 + x5 + x6 + x7 + x10 X = 1 + x3 + x7 + x10 + x11 + x13 3 Polynômes générateurs des codes BCH Le but de cet exercice est de construire un algorithme de calcul du polynôme générateur d’un code BCH via les polynômes cyclotomiques. Soit n un entier non nul et soit un corps fini contenant des racines nièmes de l’unité. On note Φn (x) le nième polynôme cyclotomique, c’est le produit des x − w où w est une racine primitive nième de l’unité. On rappelle deux propriétés des polynômes cyclotomiques : Y xn − 1 = Φd d|n et par la formule d’inversion de Mobius : Φn = Y (xd − 1)µ(n/d) d|n où µ désigne la fonction de Mobius définie par si n = 1 1 (−1)k si n est le produit de k premiers distincts µ(n) = 0 si n n’est pas sans facteur carré 3.1 Propriétés calculatoires des polynômes cyclotomiques. Montrer les propriétés suivantes : 1. Si n est premier alors Φn (x) = xn−1 + · · · + x + 1. 2. Si p est premier et ne divise pas n, alors Φpn (x) = Φn (xp ) Φn (x) . 3. Si n est impair, alors Φ2n (x) = Φn (−x). k−1 4. Si p est premier et ne divise pas m alors Φmpk = Φmp (xp ) 5. Si p est premier et divise n, alors Φpn (x) = Φn (xp ) n 6. Si m est la partie sans facteur carré de n alors Φn (x) = Φm (x m ) 3.2 Algorithme de calcul des polynômes cyclotomiques Montrer que l’algorithme qui suit retourne bien Φn (x) et le programmer : entrée : n sortie : n ième polyn^ ome cyclotomique Calculer les facteurs premiers distincts de n : p_1, ..., p_r m:=p_1 ... p_r f_0 := x-1 Pour i = 1 ...r calculer f_i=f_{i-1}(x^{p_i})/f_{i-1}(x) Retourner f_r(x^{n/m}) 3 Montrer que l’algorithme coûte O(M (n) log(n)) opérations dans ZZ où M (n) désigne le coût de la multiplication de deux polynômes de degré < n dans ZZ. On pourra rappeler les valeurs de M (n) suivant la méthode utilisée pour multiplier les polynômes. Comparer le programme obtenu avec la commande Maple numtheory[cyclotomic]. 3.3 Factorisation des polynômes cyclotomiques Soit Fq un corps fini de caractéristique p ne divisant pas n. Montrer que pour n entier non nul impair, Φn (x) se factorise en un produit de ϕ(n)/d polynômes irréductibles sur Fq de degré d où d est l’ordre multiplicatif de q modulo n. Expliquer comment procéder pour factoriser Φn (x) (rappeler l’algorithme de factorisation le plus approprié pour la situation). Programmer cet algorithme (on se placera sur Fp , p premier). 3.4 Algorithme de calcul du polynôme générateur d’un code BCH Ecrire un algorithme de construction du polynôme générateur d’un code BCH sur Fp , p premier de longueur n et de distance prescrite δ. Le programmer. 4