Rapport de TER Transformation de la matrice génératrice d`un code
Transcription
Rapport de TER Transformation de la matrice génératrice d`un code
Rapport de TER Transformation de la matrice génératrice d’un code quasi-cyclique NARDEAU Nicolas, BENMOUSSA Wafa 2006-2007 1 Table des matières 1 Codes Correcteurs 1.1 Préliminaires . . . . . 1.2 Codes Cycliques . . . . 1.3 Quelques lemmes . . . 1.4 Codes Quasi-Cycliques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Transformation de la matrice génératrice d’un code quasi-cyclique 2.1 Partie théorique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.1 Objectif et méthode . . . . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Théorème de transformation . . . . . . . . . . . . . . . . . . . . . 2.2 Partie programmation de la transformation d’une matrice d’un code quasicyclique en Magma . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2.1 Bibliothèque contenant les fonctions et procédures . . . . . . . . . 2.2.2 Algorithme de transformation de la matrice . . . . . . . . . . . . 2.2.3 Graphe de complexité temps . . . . . . . . . . . . . . . . . . . . . 2.3 Différents exemples obtenus avec le programme en magma . . . . . . . . 2.3.1 Exemple sur F2 avec des mots de longueur 75 . . . . . . . . . . . 2.3.2 Exemple sur F2 avec des mots de longueur 35 . . . . . . . . . . . 2.3.3 Exemple sur F3 avec des mots de longueur 35 . . . . . . . . . . . 2.3.4 Différentes matrices obtenus dans K n avec K = F25 . . . . . . . . 2 . . . . 3 3 7 11 13 15 . 15 . 15 . 16 . . . . . . . . . 21 21 25 27 28 28 31 32 33 1 Codes Correcteurs 1.1 Préliminaires K un ensemble fini, non vide, n un entier naturel non nul. K n l’ensemble des x = (x1 , .., xn ) tels que xi ∈ K. Définition 1 (Distance de Hamming) Soient x et y deux éléments de K n , la distance de Hamming entre x et y est le nombre de composantes pour lesquelles ces éléments sont différents si x = (x1 , .., xn ) et y = (y1 , .., yn ) alors d(x, y) := card{i = 1, 2.., n/xi 6= yi }. a) b) c) d) d(x, y) ∈ R+ d(x, y) = 0 ⇔ x = y d(x, y) = d(y, x) d(x, y) ≤ d(x, z) + d(z, y) Définition 2 (Définition d’un code) Un code sur K de longueur n est un sous-ensemble de K n . n est appelé la longueur du code C et les éléments de C sont appelés les mots du code. Exemple 1 Le code C = {(0, 1, 1), (1, 1, 1), (1, 0, 1)} est un code de longueur 3 sur K = F2 . Code Linéaires Définition 3 Soit K un corps un fini, K n un K-espace vecoriel. C est un code linéaire si et seulement si c’est un sous espace vectoriel de K n . Il est de dimension k s’il est un sous-espace vectoriel de dimension k. Définition 4 (Support d’un mot) Soit x = (x1 , .., xn ) un mot de C. Alors : Supp(x) := {i/xi 6= 0} . Définition 5 (Poids de Hamming) Soit x = (x1 , .., xn ) un mot de C. Alors w(x) = card(Supp(x)) Définition 6 (Distance minimale d’un code linéaire C) Soit C un code linéaire, sa distance minimale est définie par d := M inx∈C w(x) Propriétés 1 Soit d la distance de Hamming et w la fonction poids. Alors : a) d(x, y) = w(x − y) b) w(x) = d(x, 0) c) w(x) = 0 ⇔ x = 0 d) λ ∈ K et λ 6= 0, w(λx) = w(x) e) w(x + y) ≤ w(x) + w(y) Propriétés 2 (Nombre de mots d’un code linéaire C) Si q est le cardinal de K et si C est un code linéaire de longueur n et de dimension k. Alors le nombre de mots de C est q k . Preuve 1 C ' K k en tant que K-espace vectoriel. 3 Nombre d’erreurs commises lors d’une transmission : si x = (x1 , .., xn ) est un 0 0 0 mot envoyé et x = (x1 , .., xn ) le mot reçu. Alors le nombre d’erreurs commises est 0 0 d(x, x ). On suppose par exemple que d(x, x ) ≤ e (e est le nombre maximum d’erreurs). Condition de décodage d’ordre e, et rayon de recouvrement : Définition 7 (Condition de décodage) Un code C vérifie la condition de décodage 0 0 d’ordre e si pour tout x ∈ K n , il existe au plus un mot x ∈ C tel que d(x, x ) ≤ e. c-à-d que les boules fermées (pour la distance de Hamming) de rayon e centrées sur les mots de C sont 2 à 2 disjointes. Définition 8 (Rayon de recouvrement) Soit C un code de K n , et soit r le plus petit rayon tel que les boules de rayon r centrées en chaque mot de C forment un recouvrement de K n , r est appelé rayon de recouvrement de C. Remarque 1 Soit d la distance minimale d’un code C : d = minx∈C w(x). Si d ≥ 2e + 1 alors C vérifie la condition de décodage d’ordre e. Code Parfait Définition 9 (capacité de correction d’un code) Soit e un entier, un code dont la distance minimale est d, est dit e-correcteur si la partie entière de d−1 est égale à e, e 2 s’appelle alors la capacité de correction du code. Définition 10 Un code est dit parfait si sa capacité de correction est égale à son rayon de recouvrement. Codes équivalents - Soient C et D deux codes de longueur n, ils sont équivalents s’il existe une permutation σ de 1, 2, .., n telle que D soit l’image de C par ϕ : (x1 , .., xn ) 7−→ (xσ(1) , .., xσ(n) ) - Deux codes équivalents ont la meme capacité de correction et aussi les mêmes distances entres les mots, la même longueur et le même cardinal. Matrice génératrice d’un code linéaire Définition 11 Une matrice génératrice d’un code linéaire C sur le corps K est une matrice sur K dont les lignes forment une base de C. Remarque 2 Un code possède en général plusieurs matrices génératrices. Exemple 2 1 0 0 1 0 M= 0 1 0 1 1 0 0 1 0 1 La matrice M est de rang 3, c’est la matrice d’un code C de longueur 5 et de dimension 3 sur F2 (C est (5, 3)) dont les mots seront : (1, 0, 0, 1, 0), (0, 1, 0, 1, 1), (1, 1, 0, 0, 1), (1, 0, 1, 1, 1), (0, 1, 1, 1, 0), (1, 1, 1, 0, 0), (0, 0, 1, 0, 1), (0, 0, 0, 0, 0). 4 Propriétés 3 Si G est une matrice génératrice de C, un code linéaire(n, k), alors : a) Les autres matrices génératrices de C sont de la forme A ∗ G où A est une matrice carrée inversible k × k. b) Le code C est l’ensemble des mots de la forme : xk = (u1 , .., uk ) ∗ G où U = (u1 , .., uk ) ∈ K k c) Si c1 , ··, ck sont les vecteurs colonnes de G, les mots du code C sont tous obtenus sous la forme xk = (< c1 , u >, .., < ck , u >) avec u ∈ K k et < ., . > est le produit scalaire usuel sur K k . 0 Remarque 3 Une matrice G obtenue par permutation des colonnes de G serait une 0 matrice génératrice d’un code C équivalent à C. Définition 12 (matrice génératrice normalisée) Une matrice génératrice d’un code C (n, k) est normalisée si la matrice formée par les k premières colonnes est la matrice unité. Définition 13 (Codages des messages au moyen d’un code linéaire) Le codage des messages au moyen d’une matrice génératrice G d’un code C se résume : M essage 7−→ u = (u1 , .., uk ) 7−→ xk = (u1 , .., uk ) ∗ G la matrice G est choisie comme matrice génératice d’un code e-correcteur, et e est choisi en fonction des statistiques d’erreurs commmises lors de la transmission. Si G est normalisée, alors on trouve : u = (u1 , .., uk ) 7−→ (u1 , .., uk , xk+1 , xk+2 , .., xn ) u1 , .., uk sont appelés symboles d’information et xk+1 , xk+2 , .., xn symboles de controles. Définition 14 (Code Systématique) Un code possédant une matrice génératrice normalisée entraine un code systématique. Orthogonal d’un code C Définition 15 Soit C un code (n, k), le code orthogonal de C est l’espace vectoriel orthogonal à C pour le produit scalaire usuel de K n . (le code orthogonal de C est un code linéaire (n, n − k)) Définition 16 (Matrice de Controle) On appelle matrice de controle de C, toute matrice génératrice de son orthogonal. Propriétés 4 Soit H une matrice de controle de C et x = (x1 , .., xn ). Le mot x ∈ C ssi H t x = 0. Codes de Hamming binaires Définition 17 On appelle code de Hamming (binaire) de longueur 2k − 1 tout code admettant comme matrice de controle H, une matrice dont les 2k − 1 colonnes sont tous les vecteurs de Fk2 \ {0}, il est appelé code Hamming de paramètre k. 5 Exemple 3 Matrice de controle du code de Hamming 1 0 0 0 1 1 0 1 0 1 0 1 H= 0 0 1 1 1 0 6 de longueur 7. 1 1 1 1.2 Codes Cycliques Définition 18 Un code C est dit cyclique si : a) C est un code linéaire. b) Si (x1 , .., xn ) ∈ C, alors (xn , x1 , .., xn−1 ) ∈ C. Exemple 4 Soit C le code de matrice 1 0 0 1 G= 0 0 génératrice : 0 1 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 0 1 Ce code possède 23 = 8 éléments. On peut vérifier que pour chacun de ses mots, un décalage à droite donne un autre mot du code C. Par exemple le mot (110110110) qui est égal à la somme des deux premières lignes de G donne (011011011) qui est égal à la somme de la 2eme et 3eme lignes de G. Représentation polynomiale des codes cycliques - Soit C un code linéaire de longueur n, pour chaque mot m de C, m := (a0 , .., an−1 ) on lui associe le polynôme m(X) := a0 + a1 X + .. + an−1 X n−1 . Un décalage à droite correspond donc à faire : Xm(X) mod(X n − 1). - C est donc cyclique Ssi ∀m ∈ C xm(X) mod(X n − 1) est un polynôme associé à un mot de C. Définition 19 Soit K un corps fini, et soit n ∈ N∗ . a) On appelle représentation polynomiale de K n , l’application Θ de K n dans K[X]/(X n − 1) : Θ : K n −→ K[X]/(X n − 1) (a0 , .., an−1 ) 7−→ a0 + a1 x + .. + an−1 xn−1 b) On appelle représentation polynomiale d’un code C, l’ensemble des représentations polynomiales des mots de C : Θ(C). Remarque 4 La représentation polynomiale Θ de K n , est un isomorphisme d’espace vectoriel sur K. Théorème 1 Soit C un code linéaire sur K, le code C est cyclique ssi sa représentation polynomiale Θ(C) est un idéal de K[X]/(X n − 1). Preuve 2 Si C est cyclique, Xm(X) est dans Θ(C) pour tout élément m(X) de Θ(C), il en est de même pour les X i m(X) et puisque C est linéaire les polynômes (d0 + d1 X + ...)m(X) aussi et donc tous les multiples quelconques de m(X). 7 Inversement, si tous les multiples quelconques d’un élément m(X) de Θ(C) sont dans Θ(C) alors en particulier pour Xm(X), le code C est donc invariant par shift, si de plus Θ(C) est un sous-espace vectoriel, alors C est un code cyclique. Remarque 5 Si K est un corps, n un entier non nul, alors tout idéal de K[X]/(X n − 1) est principal (la preuve de ce résultat repose sur l’existence de la division euclidienne). Théorème 2 Soit Θ(C) l’idéal de K[X]/(X n − 1) associé à un code linéaire cyclique C. Soit g(X) un polynôme unitaire de plus petit degré dans Θ(C). Soit r := deg(g(X)). Alors on a les propositions suivantes : a) b) c) d) g(X) est l’unique polynôme unitaire de degré r dans Θ(C). g(X) génère Θ(C) comme idéal principal de K[X]/(X n − 1). g(X) divise xn − 1 {X i g(X), i = 0, .., n − r − 1} est une base de Θ(C), considérée comme sous-espace vectoriel, alors pour tout P (X) de Θ(C), on peut trouver de coefficients Pn−r−1un ensemble i {ai ∈ K, i = 0, .., n − rP − 1} tels que P (X) = a X g(X) c-à-d P (X) = i i=0 n−r−1 i a(X)g(X) avec a(X) = i=0 ai X . 0 Preuve 3 1) Si on suppose qu’il existe g (X), un autre polynôme unitaire de degré r 0 0 dans Θ(C) alors g(X)−g (X) ∈ Θ(C) , ce qui est impossible car deg(g(X) − g (X)) ≤ r − 1. 2) Supposons que g(X) ne génère pas Θ(C), cela revient a dire qu’il existe P (X) de Θ(C) tel que P (X) = q(X)g(X) + r(X) où deg(r(X)) ≤ r − 1, Comme Θ(C) est un idéal donc q(X)g(X) ∈ Θ(C) et r(X) = P (X) − q(X)g(X) ∈ Θ(C) ce qui est aussi en contradiction avec l’hypothèse faite sur g(X). 3) Supposons que g(X) ne divise pas xn − 1. Alors : X n − 1 = q(X)g(X) + r(X) avec deg(r(x)) ≤ r − 1 et de meme le fait que r(X) appartienne à Θ(C) est en contradiction avec l’hypothèse sur le degré de g. 4) Comme g(X) est un générateur de Θ(C), alors tout polynôme de Θ(C) est de la forme a(X)g(X) avec deg(a) ≤ n − 1. Les polynômes g(X), Xg(X), .., X n−1 g(X) forment donc une famille génératrice de Θ(C), on veut en extraire une base. Soit a(X)g(X) un élément de Θ(C) et soit h(X) tel que X n − 1 = g(X)h(X) dans K[X] en divisant a(X) par h(X) dans K[X] on trouve : a(X) = h(X)q(X) + r(X) avec deg(r(X)) ≺ deg(g(X)) où r(X) = 0, le reste r(X) est donc de la forme r(X) = r0 + r1 X + .. + rn−r−1 X n−r−1 d’où : a(X)g(X) = h(X)q(X)g(X) + r(X)g(X). Donc a(X)g(X) = (X n − 1)q(X) + r(X)q(X), en passant à K[X]/(X n − 1) on a : a(X)g(X) = r(X)g(X) = r0 g(X) + r1 Xg(X) + .. + rn−r−1 X n−r−1 g(X) La famille g(X), Xg(X), .., X n−r−1 g(X) est donc aussi une famile génératrice de Θ(C). 8 Montrons maintenant qu’elle est aussi libre : Dans K[X]/(X n − 1), supposons λ0 g(X) + λ1 Xg(X) + .. + λn−r−1 X n−r−1 g(X) = 0 ceci implique dans K[X] que (λ0 + λ1 X + .. + λn−r−1 X n−r−1 )g(X) ≡ 0[X n − 1]. Soit P (X) := λ0 + λ1 X + .. + λn−r−1 X n−r−1 . Le polynôme P est soit nul soit de degré inférieur à n−1 et en même temps divisible par X n − 1, donc P (X)g(X) = 0 dans K[X] mais on sait que K[X] n’a pas de diviseurs de 0 et on sait aussi que g(X) est non nul d’où P (X) = 0 d’où λ0 = λ1 = · · · = λn−r−1 X n−r−1 = 0, alors la famille en question est bien libre et donc c’est bien une base. Remarque 6 On trouve bien que la dimension d’un code cyclique de longueur n, dont le générateur est g(X), est k = n − deg(g(X)). Théorème 3 Soit g(X) = g0 + g1 X + .. + gr X r le générateur d’un code cyclique C de longueur n sur K, la matrice G à k lignes et n colonnes suivante où r = deg(g(X)) = n−k, est une matrice génératrice de C. g0 g1 g2 . . . gr 0 . . . 0 0 g0 g1 g2 . . . gr . . . 0 G = .. . . . . . . . . .. . . . . . . . ... . . 0 . . . 0 g0 g1 g2 . . . gr Preuve 4 Une matrice génératrice est obtenue en choisissant comme lignes les n-uplets correspondants aux polynômes de la base précédente. Soit : g(X), Xg(X), .., X n−r−1 g(X) Ce sont tous les décalages successifs du premier, d’ou le résultat. Exemple 5 La décomposition de X 7 − 1 en diviseurs irréductibles de F2 est : X 7 − 1 = (X − 1)(X 3 + X + 1)(X 3 + X 2 + 1) Les codes cycliques de longueur 7 sur F2 différents de {0} sont donc ceux générés comme suit : C0 : g0 (X) = X 7 − 1 = 0 C0 = {0, .., 0} C1 : g1 (X) = X − 1 C2 : g2 (X) = X 3 + X + 1 C3 : g3 (X) = X 3 + X 2 + 1 C4 : g4 (X) = (X − 1)(X 3 + X + 1) = X 4 + X 3 + X 2 + 1 C5 : g5 (X) = (X − 1)(X 3 + X 2 + 1) = X 4 + X 2 + X + 1 C6 : g6 (X) = (X 3 + X + 1)(X 3 + X 2 + 1) = X 6 + X 5 + X 4 + X 3 + X 2 + X + 1 Pour C4 , on a : G4 est une matrice génératrice 1 0 1 1 1 0 0 G4 = 0 1 0 1 1 1 0 0 0 1 0 1 1 1 9 En appliquant le théorème sur la dimension de chaque code, on trouve effectivement que la dimension de C4 est 3 Pour les autres on a : C0 : 0, C1 : 6, C2 : 4, C3 : 4, C4 : 3, C5 : 3, C6 : 1. 10 1.3 Quelques lemmes Lemme 1 Soit C un code cyclique de longueur m, soit Θ(C) sa représentation polynomiale et M une matrice génératrice de C de taille m × m0 . Alors, le pgcd de X m − 1 et des polynômes Li (X) dont les coefficients sont respectivement les éléments des lignes de M est le polynôme g(X) générateur de l’idéal Θ(C). Preuve 5 On pose d(X) = pcgd(L1 (X), L2 (X) . . . , Lm0 (X), X m −1). D’abord on a g(X) | d(X), car g(X) | Li (X) ∀i = 1...m0 et g(X) | X m − 1. De plus g(X) ∈ Θ(C) et donc : 0 g(X) = m X 0 yi (X)Li (X) car (Li (X)m i=1 ) est une base de Θ(C). i=1 0 = m X yi (X)Li (X) + 0 × (X m − 1) i=1 0 =( m X yi (X)ai (X)) × d(X). i=1 Alors d(X) | g(X). Et on a bien : g(X) = d(X). Lemme 2 Soit l’application ϕ : Mr,m (Fq ) −→ Mm,m (Fq ) ; M 7−→ M 0 avec r ≤ m telle que : rl M 0 M = m−r l 0 L’application ϕ ne change pas le code engendré par les lignes de la matrice. Preuve 6 Soient Li P (X), i = 1...m, les polynômes correspondants aux lignes de M 0 . Pm Pm r λi (X)Li (X) = i=1 λi (X)Li (X) + i=r+1 λi (X)Li (X) i=1P Car m i=r+1 λi (X)Li (X) = 0 car Li (X) = 0, ∀i = r + 1...m Lemme 3 Soient C un code cyclique de longueur m, M une matrice génératrice normalisée de C, r le rang de M (c’est aussi son nombre de lignes), et soit g(X) le polynôme générateur de l’idéal Θ(C). Soit G = (g0 , g1 , ..., gm−r , 0, ..., 0) ∈ M1,m (Fq ). Alors on a : G ∗ ϕ(M ) = G Preuve 7 On a : M= Ir | A tel que Ir matrice identité ∈ Mr,r 0 Alors G = G ∗ ϕ(M ) = (g0 , g1 , ..., gm−r , 0, ..., 0) 11 M 0 Et donc : 0 G = (g0 , g1 , ..., gm−r , 0, ..., 0) Ir | A 0 | 0 0 0 = (g0 , g1 , ..., gr , gr+1 , ..., gm ) On a G et G0 deux éléments de C. Or W = G − G0 = (0, 0, ..., 0, g”r+1 , ..., g”m ) ∈ C et W s’écritPdonc en combinaison linéaire des vecteurs de la base de C. Alors : W = ri=1 λi Li = (λ1 , λ2 , ..., λr , λ0r+1 , ..., λ0m ) Or on sait que W = (0, 0, ..., 0, g”r+1 , ..., g”m ) et donc λi = 0, ∀i = 1..r. Puisque W = P r 0 i=1 λi Li alors W = 0,d’où G = G , et donc G ∗ ϕ(M ) = G. 12 1.4 Codes Quasi-Cycliques Soit σ la permutation circulaire (l’opérateur de décalage d’un rang vers la droite) Un code linéaire C de longueur n, de dimension k et de distance d, est dit quasi-cyclique s’il vérifie : ∃l ∈ N∗ /σ l ∈ C, ∀c ∈ C. Le plus petit entier naturel vérifiant ceci est appelé l’indice du code. On réordonne les éléments Soit C un code quasi-cyclique de longueur n, de dimension k, de distance d et d’indice l sur Fq , posons n = r × l. C = (x0 , .., xl−1 | xl , .., x2l−1 | x2l , .., x3l−1 | ... | xl(r−1) , .., xlr−1 ) On réorganise les mots pour trouver : C = (x0 , xl , x2l , .., xl(r−1) | xl , xl+1 , .., xl(r−1)+1 | ... | xl−1 , x2l−1 , .., xlr−1 ) Et ceci moyennant l’application suivante : r−1 Φ : (A0 , A1 , .., Aj = ((xjl+i )l−1 i=0 ), .., Ar−1 ) 7−→ (C0 , C1 , .., Cj = ((xil+j )i=0 ), .., Cl ) où : C0 = (x0 , xl , x2l , ..., xl(r−1) ), C1 = (xl , xl+1 , ..., xl(r−1)+1 ), ..., Cl = (xl−1 , x2l−1 , .., xlr−1 ) Or le code C est quasi-cyclique d’indice l donc par construction, les Ci sont bien des codes cycliques. Dans toute la suite de notre travail, nous utiliserons des codes quasi-cycliques organisés comme présenté ci-dessus aprés le passage par l’application Φ. Notation : Désormais, on notera : . l l’indice du code quasi-cyclique. . m longueur des codes cycliques qui composent le code quasi-cyclique. On obtient alors un code dont la longueur des mots est égale à m × l que l’on notera n. si x est un mot du code alors il est de la forme : x = (x1 , x2 .., xm | xm+1 , xm+2 .., x2m | ... | x(l−1)m+1 , .., xlm ) Construction d’une matrice génératrice d’un code quasi-cyclique : Soit V un espace vectoriel de dimension n = m × l sur Fq . V := {(x1 , .., xn )/xi ∈ Fq pour xi = 1..n} Soit v un élément de V tiré au hasard. v = (x1 , x2 .., xm | xm+1 , xm+2 .., x2m | ... | x(l−1)m+1 , .., xlm ) 13 Soit σ la permutation définie comme suit : σ : V −→ V x := (x1 , x2 .., xm | xm+1 , xm+2 .., x2m | ... | x(l−1)m+1 , .., xlm ) 7−→ (xm , x1 .., xm−1 | x2m , xm+1 .., x2m−1 | ... | xlm , x(l−1)m+1 , .., xlm−1 ) La permutation σ que nous venons de définir va nous permettre de construire une matrice génératrice du code. Travaillons sur notre élément v, à partir de cet élément nous allons construire une famille de m vecteurs par application de σ. Notons cette famille B , on a alors B := {V, σ(V ), σ 2 (V ), .., σ m−1 (V )} Cette famille est la plus grande que l’on puisse construire à partir de σ car (σ m = Id). On obtient donc une famille de m vecteurs. On vérifie alors que ces vecteurs soient libres (sinon on en extrait une famille libre) et par juxtaposition de ces vecteurs ont construit la matrice M suivante : 0 x1 B xm B B M=B . B . @ . x2 x2 x1 . . . x3 ... ... xm xm−1 xm+1 x2m xm+2 xm+1 ... ... . . . x1 . . . . . . xm+2 xm+3 ... ... ... ... x2m x2m−1 . . . xm+1 ... ... ... ... x(l−1)m+1 xlm x(l−1)m+2 x(l−1)m+1 . . . . . . x(l−1)m+2 x(l−1)m+3 Cette matrice est la matrice génératrice d’un code quasi-cyclique. 14 ... ... ... ... xlm xlm−1 . . . x(l−1)m+1 1 C C C C C A 2 Transformation de la matrice génératrice d’un code quasi-cyclique 2.1 2.1.1 Partie théorique Objectif et méthode Notre objectif est de réaliser la transformation d’une matrice génératrice d’un code quasi-cyclique en une forme canonique unique. Supposons que l’on possède la matrice M génératrice d’un code quasi-cyclique. Cette matrice peut être vue en bloc sous la forme suivante. M := (M1 | M2 | .. | Ml ) Les Mi sont des matrices de taille m0 × m auxquelles on peut associer un code cyclique que l’on notera Ci . Pour réaliser la transformation de cette matrice, nous effectuons les étapes suivantes : – On applique à la matrice M un pivot de gauss. On obtient alors une nouvelle matrice M. – Par suite, on travaille sur la matrice M 1. On récupère le générateur g1 du code C1 et le rang r1 de la matrice M 1. On effectue la multiplication g1 × ϕ(M ) (où ϕ est l’application définie dans le lemme 2). On récupère alors le premier générateur G1 de la matrice. Ce générateur engendrera les r1 premières lignes. – Puis on réitère le même procédé avec la matrice M2 en enlevant les r1 premières lignes (on note le rang de cette matrice r2 ). On P obtient0 ainsi le deuxième générateur G2 . On continue comme cela jusqu’à ce que ri = m . – A partir de maintenant, on travaille uniquement sur les générateurs Gi . Nous allons effectuer une réduction. Pour réduire un générateur Gi , on utilise les générateurs Gj tels que j > i. Regardons les générateurs comme suit : G1 = g1 f11 f12 . . . f1l G2 = 0 g2 f22 . . . f2l Chaque élément de Gi est en faite un vecteur de longueur m qui selon sa position appartient à un des codes Ci . Dans ce cas, on travaille dans le code C2 . En utilisant la représentation polynomiale, on effectue la division de f11 par g2 . On a f11 = g2 ∗ q + r11 et donc r11 = f11 − g2 ∗ q. On remplace alors f11 par r11 . Pour que le mot appartienne toujours au code quasi-cyclique, il faut reporter l’opération sur le reste du mot en posant r1i = f1i − f2i ∗ q, ∀i = 2 . . . l et en remplaçant f1i par r1i . Puis on recommence cette opération sur G1 avec les autres vecteurs Gj tel que j > 2. Ensuite on effectue le même type d’opération sur G2 avec les Gj tels que j > 2. Puis sur G3 , G4 , . . . , et ceux juqu’à épuisement des Gi . 15 – On peut alors construire la nouvelle matrice à l’aide de la permutation σ définie dans la construction d’une matrice (section 1.4). Pour chaque Gi , on effectue ri permutation, puis on juxtapose les vecteurs. On obtient alors la matrice : A1 B1 . . . . . . 0 A2 . . . . . . 0 M = . . 0 0 . ... 0 0 0 Ak Tels que les Ai sont de la forme gi,0 0 Ai = .. . 0 en posant si := m − ri où ri est le rang de la matrice : gi,1 gi,2 . . . gi,si 0 . . . 0 gi,0 gi,1 gi,2 . . . gi,si . . . 0 .. ... ... ... ... ... ... . . . . 0 gi,0 gi,1 gi,2 . . . gi,si Les Ai sont des matrices génératrices de codes cycliques et le générateur de ce code est le mot gi = (gi,0 , gi,1 , gi,2 , . . . , gi,si , 0, . . . , 0) . La matrice obtenu par ce procédé est unique et canonique. 2.1.2 Théorème de transformation Théorème 4 Soit C un code quasi-cyclique, alors il existe une unique matrice M génératrice de forme canonique (forme définie précédement) qui généralise les matrices canoniques des codes cycliques. Preuve 8 Soit C un code quasi-cyclique de longueur n = m × l, et soit M une matrice génératrice de ce code de taille m0 × n. On réalise un pivot de Gauss sur cette matrice et on obtient une autre matrice génératrice du code quasi-cyclique que l’on note toujours M . Après cela, on procède aux opérations suivantes : Modification de la matrice : Regardons maintenant les blocs concaténés qui forment la matrice, ils sont tous de taille m0 × m. Chacun d’entre eux représente un code cyclique que l’on notera Ci pour i = 1 . . . l et auxquels on associe la matrice Mi . M := (M1 | M2 | .. | Ml ) On commence par le code cyclique C1 dans un premier temps on récupère le rang r1 de la matrice M1 . Extraction du polynôme générateur de C1 : On veut trouver le générateur du code cyclique C1 que l’on note g1 (X). On connait maintenant le degré du polynôme recherché deg(g1 (X)) = s1 = m − r1 où r1 est le rang de la matrice M1 . 16 On sait que g1 (X) divise X m − 1 ainsi que tout les polynômes Li (X) dont les coefficients sont les éléments de la i-ème ligne de la matrice M1 . On effectue donc un calcul de pgcd : . pgcd1 = pgcd(L1 (X), X m − 1) . pgcd2 = pgcd(L2 (X), pgcd1 ) .. . . pgcdi = pgcd(Li (X), pgcdi−1 ) tant que deg(pgcdi ) deg(g1 (X)) On en déduit alors : 1 Le degré des pgcd diminue : On a pgcdi+1 = pgcd(Li+1 (X), pgcdi ). donc pgcdi+1 | pgcdi . donc deg(pgcdi+1 ) ≤ deg(pgcdi ). 2 Si l’algorithme va jusqu’à la m0 ème étapes alors : pgcdm0 = pgcd(pgcdm0 −1 , L0m (X)) pgcdm0 = pgcd(pgcd(pgcdm0 −2 , Lm0 −1 ), Lm0 (X)) .. . pgcdm0 = pgcd(pgcd(. . . pgcd(pgcd(L1 (X), X m − 1)L2 (X))L3 (X) . . . Lm (X)) En appliquant Bézout on trouve : pgcd(L1 (X), X m − 1) = U1 (X)L1 (X) + U2 (X)(X m − 1) Si on le réapplique à chaque fois que l’on calcule un pgcd dans la formule de pgcdm0 on trouve alors : pgcdm0 = . . . U3 (X)(U1 (X)L1 (X) + U2 (X)(X m − 1)) + U4 (X)L2 (X)) . . . 0 pgcdm0 = U00 (X)(X m − 1) + U10 (X)L1 (X) + . . . + Um 0 (X)Lm0 (X) 0 Donc puisqu’il existe U00 (X), U10 (X) . . . Um 0 (X) tels que : 0 pgcdm0 = U00 (X)(X m − 1) + U10 (X)L1 (X) + . . . + Um 0 (X)Lm0 (X). Alors pgcdm0 = pcgd(L1 (X) + L2 (X) . . . + Lm0 (X), X m − 1). D’après le lemme 1 on sait que : g1 (X) = pcgd(L1 (X), L2 (X) . . . , Lm0 (X), X m − 1) Donc on trouve bien que pgcdm0 = g1 (X). Donc même au pire, si l’agorithme va jusqu’à la m0 ème étape on tombe sur le polynôme générateur g1 (X). 17 Récupération des vecteurs générateurs Gi : On effectue le produit de G = (g0 , g1 , ..., gm−r1 , 0, ..., 0) ∈ M1,m (Fq ) par ϕ(M ) = (M1 |M2 |...|Ml ) où M est la matrice du code quasi-cyclique, et ϕ est l’application définie dans le Lemme 2 : On fait : (g0 , g1 , ..., gm−r1 , 0, ..., 0)(M1 |M2 |...|Ml ) En tenant compte du Lemme 3, on trouve : 1 2 l−1 G1 = (g1 , g2 .., gm−r1 , 0, ..., 0|f11 , f21 , .., fm |f12 , f22 , .., fm |...|f1l−1 , f2l−1 , .., fm ) C’est le premier vecteur générateur qu’on récupère. Pour le 2ième vecteur générateur on réapplique la même chose à la matrice M 0 constituée par les m0 − r1 dernières lignes de M (on a bien vu dans le Lemme 2 que l’application ϕ ne change pas le code engendré par la matrice) On cherche par le même algorithme le polynôme générateur g2 (X) du code cyclique C20 dont la matrice génératrice est M20 constituée par les m0 − r1 dernières lignes de M2 , on pose r2 le rang de M20 . On effectue le produit de G = (g2,0 , g2,1 , ..., g2,m−r2 , 0, ..., 0) ∈ M1,m (Fq ) par ϕ(M 0 ) , on trouve donc le vecteur suivant : G2 := (0, 0, ..., 0|g2,0 , g2,1 , ..., g2,m−r2 , 0, ..., 0|P11 , P21 , .., Pm1 |, .., |P1l−2 , P2l−2 , .., Pml−2 ) On prendra donc comme second générateur le vecteur G2 . P Et ainsi de suite on récupére tous les vecteurs générateurs on s’arrête lorsque ri = m 0 . Dorénavant, on va travailler exclusivement sur ces vecteurs générateurs. Réduction des Gi : Le principe : On réduit chaque générateur Gi par tous les Gj qui le suivent (pour les j ≥ i + 1) Réduction de G1 par G2 : on a : 1 2 l−1 G1 = (g1 , g2 .., gm−r1 , 0, ..., 0|f11 , f21 , .., fm |f12 , f22 , .., fm |...|f1l−1 , f2l−1 , .., fm ) et G2 := (0, 0, ..., 0|g2,0 , g2,1 , ..., g2,m−r2 , 0, ..., 0|P11 , P21 , .., Pm1 |, .., |P1l−2 , P2l−2 , .., Pml−2 ) On va réduire G1 par G2 : 1 Soit f 1 (X) le polynôme dont les coefficients sont (f11 , f21 , .., fm ). On effectue la division euclidienne de f 1 (X) par g2 (X) : On trouve : f 1 (X) = q 1 (X)g2 (X) + r1 (X) Donc, r1 (X) = f 1 (X) − q 1 (X)g2 (X) Montrons que r1 (X) ∈ Θ(C2 ) (Θ(C2 ) la représentation polynomiale du code cyclique C2 ) On sait que f 1 (X) ∈ Θ(C2 ) car : 18 1 2 l−1 G1 = (g1 , g2 .., gm−r1 , 0, ..., 0|f11 , f21 , .., fm |f12 , f22 , .., fm |...|f1l−1 , f2l−1 , .., fm ) appartient au code quasi-cyclique C = (C1 |C2 |...|Cl ) en tant que code quasi-cyclique constitué par des codes cycliques concaténés. On sait aussi que q 1 (X)g2 (X) ∈ Θ(C20 ) =< g2 (X) > et puisque C20 ⊆ C2 alors q 1 (X)g2 (X) ∈ Θ(C2 ) et donc r1 (X) ∈ Θ(C2 ) pour tout i = 2...l − 1. On pose : ri (X) = f i (X) − q 1 (X)P i−1 (X) Les ri (X) appartiennent bien à Θ(Ci+1 ) car : . f i (X) ∈ Θ(Ci+1 ) . q 1 (X)P i−1 (X) ∈ Θ(Ci+1 ) [car P i−1 (X) ∈ Θ(Ci+1 ) et Ci+1 est un code cyclique]. On récupère donc un vecteur : 1 2 l−1 G01 := (g1 , g2 .., gm−r1 , 0, ..., 0|r11 , r21 , .., rm |r12 , r22 , .., rm |...|r1l−1 , r2l−1 , .., rm ) qui appartient bien au code quasi-cyclique C = (C1 |C2 |...|Cl ). On a donc effectué la réduction de G1 par G2 , on aura alors à réduire G01 par G3 et ainsi de suite.. Ceci est en ce qui concerne la réduction du vecteur générateur G1 . On récupère à la fin le premier vecteur générateur réduit : 1 2 l−1 G1 = (g1 , g2 .., gm−r1 , 0, ..., 0|R11 , R21 , .., Rm |R12 , R22 , .., Rm |...|R1l−1 , R2l−1 , .., Rm ) On passe alors à la réduction du vecteur générateur G2 par tous les Gj qui le suivent (pour les j ≥ 3), on commencera donc par le réduire par G3 , même démarche et ainsi de suite.. Lorsqu’on sera arrivé au bout de la réduction de G2 , on récupèrera le 2 ième vecteur générateur réduit : 1 l−2 G2 = (0, 0, ..., 0|g2,0 , g2,1 , ..., g2,m−r2 , 0, ..., 0|S11 , S21 , .., Sm |, .., |S1l−2 , S2l−2 , .., Sm ) On réduira de la même manière les autres vecteurs générateurs. Reconstruction d’une matrice génératrice du code quasi-cyclique C à partir des vecteurs générateurs réduits : À l’issue de l’opération de réduction, on aura obtenu des vecteurs : 1 2 l−1 G1 = (g1 , g2 .., gm−r1 , 0, .., 0|R11 , R21 , ............................, Rm |R12 , R22 , .., Rm |...|R1l−1 , R2l−1 , .., Rm ) 1 l−2 G2 = (0, 0, ......................, 0|g2,0 , g2,1 , ..., g2,m−r2 , 0, .............., 0|S11 , S21 , ......., Sm |...|S1l−2 , S2l−2 , .., Sm ) 1 l−3 G3 = (0, 0, ......, 0|0, 0, .........................., 0|g3,0 , g3,1 , ..., g3,m−r3 , 0, ..., 0|T11 , T21 , .., Tm |..|T1l−3 , T2l−3 , .., Tm ) .. . Soit σ la permutation qui correspond à un shift. On effectue sur chaque Gi : ri shifts successifs. Et on récupère ainsi pour chaque Gi , la matrice : Gi σ(Gi ) ri l .. . ri i σ (G ) 19 Supposons qu’on avait récupéré k vecteurs Gi . La famille (G1 , σ(G1 ), .., σ r1 (G1 ), G2 , σ(G2 ), .., σ r1 (G2 ), .., Gk , σ(Gk ), .., σ rk (Gk )) est une famille libre, car déja les Gi pour (i = 1..k) sont libres entre eux par construction (voir leurs formes ci-dessus, l’emplacement des zéros au début de chaque vecteur empeche le fait qu’ils soient liés) Ensuite, en faisant des shifts, le même argument tient. C’est donc une famille libre du P code quasi-cyclique C qui est de cardinal ki=1 ri , P Or par construction, on sait que ki=1 ri = m0 donc c’est bien une base de C. Nous allons donc prendre pour nouvelle matrice P génératrice du code quasi-cyclique C la matrice : G1 σ(G1 ) .. . r1 1 σ (G ) G2 2 σ(G ) .. . P= r2 2 σ (G ) .. . Gk σ(Gk ) . .. rk k σ (G ) En forme plus détaillée peut être : A1 B1 . . . . . . 0 A2 . . . . . . P= 0 0 ... . . . 0 0 . . . Ak Tels que les Ai sont de la forme (on gi,0 gi,1 0 gi,0 Ai = .. . . . . 0 ... pose si := m − ri ) : gi,2 . . . gi,si 0 gi,1 gi,2 . . . gi,si ... ... ... ... 0 gi,0 gi,1 gi,2 ... ... ... 0 0 .. . . . . gi,si La matrice P ainsi obtenu est unique car après l’étape du pivot de Gauss, chaque étape effectuer entraine un résultat unique. En effet, lorsqu’on l’on cherche les générateurs g, il n’en existe qu’un à chaque fois. De plus lorsque l’on effectue les réductions à l’aide des différents vecteurs, l’unicité découle directement de la division euclidienne. Les différentes étapes entrainent donc l’unicité de la matrice obtenue et cette forme est canonique quelque soit le code quasi-cyclique sur lequel on travaille. 20 2.2 2.2.1 Partie programmation de la transformation d’une matrice d’un code quasi-cyclique en Magma Bibliothèque contenant les fonctions et procédures /************************************************************************/ /*** procédure qui réalise la permutation dans un code quasi-cyclique ***/ /*** de longueur n, d’indice l et ayant des codes cycliques engendrés ***/ /*** par des polyn^ omes qui divise X^m-1 avec m=n/l ***/ /************************************************************************/ procedure sigma(~x,m,l) // x : élément sur lequel on effectue les permutations // m : longueur des cycles // l : indice du code quasi-cyclique for i:= 0 to l-1 do tmp:=x[m*i+m]; for j:=m-1 to 1 by -1 do x[m*i+j+1]:=x[m*i+j]; end for; x[m*i+1]:=tmp; end for; end procedure; /*******************************************************/ /*** fonction qui construit la liste contenant les ***/ /*** permutations de l’élément tirer au hasard ***/ /*******************************************************/ procedure list(x,~L,k,l) // x : élément aléatoire // L : liste où l’on stocke les permutations // k : nombres de permutations effectuées // l : indice du code tmp:=x; L[1]:=x; for i:= 2 to k do sigma(~tmp,m,l); L[i]:=tmp; end for; end procedure; 21 /***************************************************************/ /*** procédure de création de la matrice génératrice du code ***/ /***************************************************************/ function matrice_du_code(L,m,n,Fq) // L: liste à partir de laquelle on genere la matrice du code M:=KMatrixSpace(Fq,m,n)![p:p in L]; C:=LinearCode(M);C; MAT:=GeneratorMatrix(C); return MAT; end function; /*****************************************************/ /*** fonction qui renvoie le polyn^ ome generateur ***/ /*** d’un code cyclique sous la forme d’un vecteur ***/ /*****************************************************/ function generateur(A,m,Fq) // A:matrice du code // m:longueur du code cyclique F<x>:=PolynomialRing(Fq); r:=Rank(A); // récupere le rang de la matrice // initialisation des variables : f=polyn^ ome,i=compteur f:=0;i:=1;ftmp:=x^m-1;g:=x^m-1; while (Degree(g) ne m-r) and (i le 7) do for j:=1 to m do f:=f+A[i][j]*x^(j-1); // construction du polyn^ ome end for; g:=Gcd(f,ftmp); // calcul du pgcd de f et de g ftmp:=g; i:=i+1; end while; v:=Coefficients(g); // on récupere les coefficients du polyn^ ome // on convertit au format qui nous convient gene:=[**]; for i:=1 to m do if (i le #v) then gene[i]:=v[i]; 22 else gene[i]:=0; end if; end for; gener:=Vector([p:p in gene]); return gener; end function; /************************************************************************/ /*** fonction qui extrait la partie d’un vecteur nécesssaire ***/ /*** à la multiplication pour recuperer la premiere ligne d’un "bloc" ***/ /************************************************************************/ function extractvect(v,d) // v générateur d’un code cyclique // d nombre de lignes restant dans la matrice génératrice du code u:=[**]; // initialisation chaine vide // on récupere les coordonnées du vecteur générateur dont on a besoin for i:= 1 to d do u[i]:=v[i]; end for; // on convertit la liste en vecteur u:=Vector([p:p in u]); return u; end function; /*********************************************************************/ /*** procédure de construction d’un polyn^ ome à partir d’un vecteur ***/ /*********************************************************************/ procedure polyn^ ome(~f,v,m,a,Fq) // f polyn^ ome que l’on renvoie // v vecteur dans lequel on récupère le polyn^ ome // m longueur des codes cycliques // a variable qui permet de ce positionner dans le bon code cyclique F<x>:=PolynomialRing(Fq); f:=0; for i:= 1 to m do f:=f+v[a*m+i]*x^(i-1); 23 end for; end procedure; /**************************************************************************/ /*** procedure qui remplace un vecteur d’un des codes quasi-cycliques ***/ /*** par le reste de la division ***/ /**************************************************************************/ procedure remplace(~v,m,r,a) // v vecteur que l’on modifie // m longueur des codes cycliques // r polyn^ ome reste avec lequel on effectue le remplacement // a variable qui permet de ce positionner dans le bon code cyclique c:=Coefficients(r); // récupération des coefficients du polyn^ ome // remplacement dans le vecteur par les coefficients du polyn^ ome // puis par des zéro pour compléter for h:=1 to m do if (h le #c) then v[a*m+h]:=c[h]; else v[a*m+h]:=0; end if; end for; end procedure; /************************************************************************/ /*** procédure qui réalise la reduction du vecteur generateur de bloc ***/ /*** par division euclidienne ***/ /************************************************************************/ procedure reduct_ligne(~G,m,l,k,h,p,Fq) // G liste qui contient les vecteurs générateur de la matrice // m longueur des codes cycliques // l indice du code quasi-cyclique // k élément de la liste que l’on veut modifier // h élément de la liste gr^ ace auquel on effectue la réduction // p variable qui permet de savoir dans quel bloc on travail F<x>:=PolynomialRing(Fq); // on trouve le quotient et le reste 24 fi:=0;g:=0; polyn^ ome(~fi,G[k],m,p,Fq); // on récupère le polyn^ ome à modifier print"fi:=",fi; polyn^ ome(~g,G[h],m,p,Fq); // on récupère le polyn^ ome par lequel on divise print"g:=",g; r:=fi mod g; // récupèration du reste de la division print"r:=",r; q:=fi div g; // récupèration du quotient de la division print"q:=",q; remplace(~G[k],m,r,p); // remplacement de f par le reste r // répércution et modification sur le reste de la ligne for e:=p+1 to l-1 do polyn^ ome(~fi,G[k],m,e,Fq); // on récupère le polyn^ ome à modifier print"fi:=",fi; polyn^ ome(~g,G[h],m,e,Fq); // on récupère le polyn^ ome qui sert à la modification print"g:=",g; r:=((fi-(g*q))mod (x^m+1)); // on répercute la modification print"g*q:=",g*q;print"r:=",r; remplace(~G[k],m,r,e); // remplacement de f par le r trouver end for; end procedure; 2.2.2 Algorithme de transformation de la matrice /**********************************************************/ /*** Mise en place des différentes valeurs nécessaires ***/ /**********************************************************/ // chargement de la bibliothèque qui contient les fonctions et les procédures load"bibliotheque_final.mag"; // déclartion des différentes constantes SetOutputFile("code_quasi_cyclique.txt":Overwrite); q:=2;l:=3;m:=7; n:=l*m; Fq:=GF(q); V:=VectorSpace(Fq,n); F<x>:=PolynomialRing(Fq); 25 print"q:=",q,"\tl:=",l,"\tm:=",m,"\tn:=",n; v:=Random(V); print "\nElement aléatoire:\n"; print v,"\n"; // construction et réalisation de la mise sous forme canonique de la matrice du code L:=[**];list(v,~L,m,l); // on génère la liste contenant les permutations MAT:=matrice_du_code(L,m,n,Fq); // on construit la matrice du code m1:=Rank(MAT); // on récupère le rang de la matrice du code i:=1;r:=0;j:=0; // initialisation des compteurs // i : permet de se placer dans la bonne partie de la matrice // r : somme des différents rang // j : permet de connaitre le nombre de vecteur générateur G:=[**];RANG:=[**];pos:=[**]; // initialisation des listes // G : liste des générateurs // RANG : liste des différents rang // pos : liste permettant de se placer dans la matrice while(r lt m1) do j:=j+1; // récupération de la sous matrice sur laquelle on travaille A:=SubmatrixRange(MAT,r+1,m*(i-1)+1,m1,i*m); rang:=Rank(A);print"rang du",j,"eme code cyclique:",rang; // rang de cette matrice if (rang eq 0) // si le rang est nul j’incremente then i:=i+1; // et je passe à la boucle suivante j:=j-1; continue; end if; gene:=generateur(A,m,Fq); // on récupère le générateur du code cyclique print"generateur:",j,"eme bloc:",gene; A:=SubmatrixRange(MAT,r+1,1,m1,n); // on recupere la sous matrice à modifier v:=extractvect(gene,m1-r); // on met le vecteur à taille pour la multiplication G[j]:=v*A;G[j]; // on récupère le vecteur generateur du j eme bloc RANG[j]:=rang; // on récupère le rang de ce bloc pos[j]:=i; // on recupère la position de ce bloc dans la matrice r:=rang + r ; // on fait la somme des rangs des différents blocs i:=i+1; end while; // Reduction des différents générateurs for k:=1 to j-1 do 26 for h:=k+1 to j do reduct_ligne(~G,m,l,k,h,pos[h]-1,Fq); end for; end for; // on réalise l’affichage des générateurs réduits for i:=1 to j do G[i]; end for; print "\n"; // on reconstruit la matrice qui a la forme canonique souhaitée H:=[**];i:=1; while (r ne 0) do L:=[**]; list(G[i],~L,RANG[i],l); H:= H cat L; r:=r-RANG[i]; i:=i+1; end while; M:=KMatrixSpace(Fq,m1,n)![p:p in H];M; UnsetOutputFile(); 2.2.3 Graphe de complexité temps Temps de calul en fonction de la longueur des mots du code 450 400 350 300 250 Temps en seconde 200 150 100 50 0 10 ”complexite.txt” using 1 :2 10000 1000 100 Longueur des mots du code 27 100000 2.3 Différents exemples obtenus avec le programme en magma 2.3.1 Exemple sur F2 avec des mots de longueur 75 q := 2 l := 5 m := 15 n := 75 Element aléatoire : (1 1 1 0 1 0 1 1 0 0 1 0 0 0 1 0 0 1 1 0 1 0 0 0 1 1 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1) Matrice générée à partir des permutations et de la fonction LinearCode() : [1 [0 [0 [0 [0 [0 [0 [0 [0 [0 [0 [0 [0 [0 [0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 0 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 1 1 0 1 1 1 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 0 1 0 1 0 1 1 1 1 0 1 0 0 1 0 0 1 1 1 1 1 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 0 1 0 1 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 0 1 0 1 0 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0 0 1 1 1 1 1 0 1 1 1 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0 1 1 0 0 0 0 1 1 1 0 1 0 1 1 0 1 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 1 1 1 1 1 1 1 0 1 1 0 0 1 0 0 1 0 1 1 1 1 0 1 1 0 0 1 1 1 0 1 0 0 1 1 1 1 0 0 1 0 1 0 1 1 1 0 0 0 1 1 0 1 1 1 0 1 0 0 1 0 0 0 0 0 1 0 1 0 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 0 1 1 1 1 1 1 1 0 0 1 1 0 1 0 0 0 1 1 1 0 1 1 1 1 1 0 0 1 1 0 0 0 1 1 0 1 0 0 1 1 0 0 1 0 1 0 1 0 0 0 0 1 0 0 1 1 0 0 1 0 1 0 1 0 0 1 0 1 1 0 0 0 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 0 0 1 1 1 0 1 1 0 0 0 0 1 1 1 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 1 1 1 1 0 1 0 1 1 0 0 1 0 1 1 1 0 1 0 0 1 0 1 0 0 0 0 1 1 1 0 1 1 0 1 1 0 0 0 0 0 1 0 0 0 1 1 1 0 1 0 0 1 0 1 0 1 1 0 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 1 1 1 0 1 0 1 0 0 0 1 0 0 1 0 1 1 0 0 1 0 0] 0] 0] 0] 1] 1] 1] 1] 1] 1] 1] 0] 1] 1] 0] rang du premier bloc : 4 générateur de ce bloc : (1 1 1 1 0 1 0 1 1 0 0 1 0 0 0) générateur à la taille pour la multiplication : (1 1 1 1 0 1 0 1 1 0 0 1 0 0 0) G1 (vecteur qui génére les 4 premières lignes de la matrice) : (1 1 1 1 0 1 0 1 1 0 0 1 0 0 0 0 1 0 1 1 0 0 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0 1 0 1 1 0 1 1 1 0 0 1 1 0 0 0 0 0 1 1 0 0 1 1 1 1 1 0 0 1 1 1 0 1 1 0 1 0 1) rang du deuxième bloc : 6 générateur de ce bloc : (1 1 0 0 1 1 1 0 0 1 0 0 0 0 0) générateur à la taille pour la multiplication : (1 1 0 0 1 1 1 0 0 1 0) G2 (vecteur qui génére les 6 lignes suivantes de la matrice) : (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 0 0 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0) rang du troisième bloc : 4 générateur de ce bloc : (1 1 0 0 0 1 1 0 0 0 1 1 0 0 0) générateur à la taille pour la multiplication : (1 1 0 0 0) G3 (vecteur qui génére les 4 lignes suivantes de la matrice) : (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1) rang du quatrième bloc : 1 generateur de ce bloc : (1 1 1 1 1 1 1 1 1 1 1 1 1 1 1) générateur à la taille pour la multiplication : (1) G1 (vecteur qui génére la dernière ligne de la matrice) : (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0) réduction de la 1ere à l’aide de la 2eme : Travaille sur le deuxième bloc : fi := x14 + x11 + x8 + x4 + x3 + x g := x9 + x6 + x5 + x4 + x + 1 r := x8 + x7 + x6 + x5 + x3 + x2 + x + 1 28 q := x5 + x + 1 On répercute la combinaison linéaire au reste de la ligne : fi := x14 + x13 + x12 + x10 + x9 + x7 + x4 + x g := x14 + x13 + x9 + x8 + x7 + x6 + x5 + x4 + x3 + 1 g ∗ q := x19 + x18 + x15 + x14 + x12 + x11 + x9 + x8 + x5 + x3 + x + 1 r := x13 + x11 + x10 + x8 + x7 + x5 fi := x14 + x13 + x10 + x9 + x3 + x2 g := x14 + x13 + x12 + x11 + x8 g ∗ q := x19 + x18 + x17 + x16 + x15 + x13 + x11 + x9 + x8 r := x14 + x11 + x10 + x8 + x4 + x + 1 fi := x14 + x12 + x10 + x9 + x7 + x6 + x5 + x2 + x + 1 g := x6 + x5 + x3 + x g ∗ q := x11 + x10 + x8 + x7 + x6 + x5 + x4 + x3 + x2 + x r := x14 + x12 + x11 + x9 + x8 + x4 + x3 + 1 réduction de la 1ere à l’aide de la 3eme : fi := x13 + x11 + x10 + x8 + x7 + x5 g := x11 + x10 + x6 + x5 + x + 1 r := x10 + x7 + x6 + x5 + x3 + x q := x2 + x On répercute la combinaison linéaire au reste de la ligne : fi := x14 + x11 + x10 + x8 + x4 + x + 1 g := x12 + x7 + x2 g ∗ q := x14 + x13 + x9 + x8 + x4 + x3 r := x13 + x11 + x10 + x9 + x3 + x + 1 fi := x14 + x12 + x11 + x9 + x8 + x4 + x3 + 1 g := x14 + x13 + x11 + x10 + x9 + x8 + x6 + x5 + x4 + x3 + x + 1 g ∗ q := x16 + x14 + x13 + x9 + x8 + x4 + x3 + x r := x13 + x12 + x11 + 1 Et ainsi de suite : réduction : 1 4 fi := x13 + x11 + x10 + x9 + x3 + x + 1 g := x14 + x13 + x12 + x11 + x10 + x9 + x8 + x7 + x6 + x5 + x4 + x3 + x2 + x + 1 r := x13 + x11 + x10 + x9 + x3 + x + 1 q := 0 29 fi := x13 + x12 + x11 + 1 g := 0 g ∗ q := 0 r := x13 + x12 + x11 + 1 réduction : 2 3 fi := x14 + x13 + x9 + x8 + x7 + x6 + x5 + x4 + x3 + 1 g := x11 + x10 + x6 + x5 + x + 1 r := x7 + x6 + x5 + 1 q := x3 fi := x14 + x13 + x12 + x11 + x8 g := x12 + x7 + x2 g ∗ q := x15 + x10 + x5 r := x14 + x13 + x12 + x11 + x10 + x8 + x5 + 1 fi := x6 + x5 + x3 + x g := x14 + x13 + x11 + x10 + x9 + x8 + x6 + x5 + x4 + x3 + x + 1 g ∗ q := x17 + x16 + x14 + x13 + x12 + x11 + x9 + x8 + x7 + x6 + x4 + x3 r := x14 + x13 + x12 + x11 + x9 + x8 + x7 + x5 + x4 + x2 réduction : 2 4 fi := x14 + x13 + x12 + x11 + x10 + x8 + x5 + 1 g := x14 + x13 + x12 + x11 + x10 + x9 + x8 + x7 + x6 + x5 + x4 + x3 + x2 + x + 1 r := x9 + x7 + x6 + x4 + x3 + x2 + x q := 1 fi := x14 + x13 + x12 + x11 + x9 + x8 + x7 + x5 + x4 + x2 g := 0 g ∗ q := 0 r := x14 + x13 + x12 + x11 + x9 + x8 + x7 + x5 + x4 + x2 réduction : 3 4 fi := x12 + x7 + x2 g := x14 + x13 + x12 + x11 + x10 + x9 + x8 + x7 + x6 + x5 + x4 + x3 + x2 + x + 1 r := x12 + x7 + x2 q := 0 fi := x14 + x13 + x11 + x10 + x9 + x8 + x6 + x5 + x4 + x3 + x + 1 g := 0 30 g ∗ q := 0 r := x14 + x13 + x11 + x10 + x9 + x8 + x6 + x5 + x4 + x3 + x + 1 On obtient alors les vecteurs suivants après la réduction : (1 (0 (0 (0 1 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 1 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 1 1 0 1 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 1 0 1 0 1 1 1 1 1 0 1 0 1 0 1 0 0 0 1 0 1 0 1 0 1 1 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 0 0 1 1 1 0 0 1 0 0 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1 1 0 0 1 1 0 0 0 1 0 0 1 0 0 0 1 1 0 0 1 1 0 0 0 1 0 1 1 1 0 1 1 0 0 1 1 1 0 0), 1), 1), 0) On reconstruit la matrice et on obtient : [1 [0 [0 [0 1 1 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0| 0| 0| 1| 1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 0 0 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0| 0| 0| 0| 0 0 0 0 1 0 0 0 0 1 0 0 1 0 1 0 0 1 0 1 1 0 1 0 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 1 0| 0| 0| 0| 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0 0 1 1 1 1 0 1 1 0| 1| 0| 1| 1 0 1 1 0 1 0 1 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1 0 0] 1] 1] 1] [0 [0 [0 [0 [0 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 0| 0| 0| 0| 0| 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 1 0 0 1 1 0 1 1 0 0 1 1 1 1 1 0 0 1 0 1 1 1 0 0 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 0 1 0 0| 0| 0| 0| 0| 1| 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 0 0 0 0| 0| 0| 0| 0| 0| 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 1 1 1 1 0 0 0 1 1 1 1 0 1 0 1 1 1 1 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 0 1 0 1 1 0 0 0 1 0 1 1 0 0 0 1 0 1 0 0 0 0 1 0 0| 0| 0| 0| 0| 1| 0 1 1 1 1 0 0 0 1 1 1 1 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 0 1 1 0 1 0 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 1] 1] 1] 1] 0] 1] [0 [0 [0 [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 0| 0| 0| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 0| 0| 0| 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0 0 0 1 1 0| 0| 0| 1| 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0| 0| 1| 0| 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1] 1] 0] 1] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0| 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1| 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] 2.3.2 Exemple sur F2 avec des mots de longueur 35 q:= 2 l:= 5 m:= 7 n:= 35 Elément aléatoire: (0 0 1 0 1 1 1 0 1 1 0 0 1 1 0 1 0 1 1 0 1 0 1 1 0 0 1 1 1 1 1 0 1 0 1) [35, 7, 7] Quasicyclic of degree 5 Linear Code over GF(2) Generator matrix:(obtenu avec LinearCode) [1 [0 [0 [0 [0 [0 [0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 1 0 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 1 0 1 1 0 0 0 1 1 0 1 1 0 0 0 0 0 0 0 1 1 0 1 1 1 0 1 0 0 1 1 0 1 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 0 1 0 0 1 0 1 1] 0] 0] 1] 1] 1] 1] rang du 1 er bloc : 3 générateur 1 er bloc: (1 0 1 1 1 0 0) G^1 = (1 0 1 1 1 0 0 1 1 0 1 0 1 0 1 1 1 1 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 1 1) rang du 2 eme bloc : 3 générateur: 2 eme bloc: (1 1 1 0 1 0 0) G^2 = (0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 0 0 0 0 1 0 1 1) 31 rang du 3 eme bloc : 0 rang du 4 eme bloc : 0 rang du 5 eme bloc : 1 générateur: 5 eme bloc: (1 1 1 1 1 1 1) G^3 = (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1) Les 3 générateurs: (1 0 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 1 1 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0) (0 0 0 0 0 0 0 1 1 1 0 1 0 0 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1 1 1 0 1 0 0) (0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1) La matrice reconstruite : [1 [0 [0 [0 [0 [0 [0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 2.3.3 1 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0 1 0 0 1 0 1 0 1 1 0 0 1 0 0 1 1 1 0 0 1 0 1 1 1 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1 1 0 0 1 0 1 1 1 1 0 0 1 0 0 1 1 0 0 0 1 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 1 0 1 1 0 1 0 0 1 1 1 1 1 1 0 0 0 1 1 1 0 1 0 1 0 1 1 1 0 1 0 1 0 1 0] 1] 0] 0] 0] 1] 1] Exemple sur F3 avec des mots de longueur 35 q:= 3 l:= 5 m:= 7 n:= 35 Elément aléatoire: (0 0 2 2 0 1 1 0 0 0 2 2 1 1 1 1 0 2 0 1 2 0 1 1 1 2 0 2 1 0 1 2 0 1 2) [35, 7, 16] Quasicyclic of degree 5 Linear Code over GF(3) Generator matrix: [1 [0 [0 [0 [0 [0 [0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 2 2 2 2 2 2 0 0 2 2 0 2 2 0 1 1 0 0 1 0 0 0 1 1 0 0 1 0 2 2 0 0 2 2 0 1 0 0 1 1 0 0 0 1 0 0 1 1 0 2 2 0 2 2 0 0 0 0 0 0 0 0 1 0 2 0 1 0 1 1 2 1 1 0 0 0 1 0 1 1 2 0 1 1 2 1 0 1 1 0 1 32 0 1 1 1 1 2 1 1 0 2 0 2 0 1 0 2 1 1 2 1 1 2 1 1 1 0 2 1 1 2 2 0 2 2 1 1 1 0 1 1 1 1 2 2 0 0 0 1 1 2 0 1 0 2 0 1 0 1 0 2 0 0 1 1 2 2 2 2 1 1 2 2 1 2 1 2 1 1 2 0 0 0 0 1 0 0 2 1 0 1 1 2 1 2 2 0 0 1 0 1 1 0 2 1 1 2] 1] 0] 1] 2] 2] 1] rang du 1 er bloc : 6 générateur 1 er bloc: (2 1 0 0 0 0 0) G^1 = (2 1 0 0 0 0 0 2 0 1 0 2 1 0 0 2 2 1 2 1 2 2 2 1 0 0 1 1 1 0 1 0 2 1 2) rang du 2 eme bloc: 0 rang du 3 eme bloc: 1 générateur: 2 eme bloc: (1 1 1 1 1 1 1) (0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1) Les deux générateurs: (2 1 0 0 0 0 0 2 0 1 0 2 1 0 1 0 0 2 0 2 0 0 0 2 1 1 2 2 2 1 2 1 0 2 0) (0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1) La matrice reconstruite : [2 [0 [0 [0 [0 [0 [0 1 2 0 0 0 0 0 2.3.4 0 1 2 0 0 0 0 0 0 1 2 0 0 0 0 0 0 1 2 0 0 0 0 0 0 1 2 0 0 0 0 0 0 1 0 2 0 1 2 0 1 0 0 2 0 1 2 0 0 1 0 2 0 1 2 0 0 1 0 2 0 1 0 2 0 1 0 2 0 0 1 2 0 1 0 2 0 0 1 2 0 1 0 0 1 0 2 0 2 0 1 0 1 0 2 0 2 1 0 0 1 0 2 0 1 2 0 0 1 0 2 1 0 2 0 0 1 0 1 2 0 2 0 0 1 1 0 2 0 2 0 0 1 0 2 2 1 1 2 1 0 0 2 2 1 1 1 2 0 0 2 2 1 1 1 2 0 0 2 2 1 1 1 2 0 0 2 1 2 1 1 2 0 0 1 2 2 1 1 2 0 1 2 0 2 0 1 2 1 1 2 0 2 0 1 1 2 1 2 0 2 0 1 1 2 1 2 0 2 1 0 1 2 1 2 0 1 2 0 1 2 1 2 1 0] 2] 0] 1] 2] 1] 1] Différentes matrices obtenus dans K n avec K = F25 m = 7; l = 5; n = 35; et w est une racine primitive de K [w^10 1 0 0 0 [ 0 w^10 1 0 0 [ 0 0 w^10 1 0 [ 0 0 0 w^10 1 [ 0 0 0 0 w^10 [ 0 0 0 0 0 0 0 0 0 1 0 [ w^5 [ 0 [ 0 [ 0 [ 0 [ 0 0 w^6 0 0 0 w^7 0 0 1 w^4 0 w^10 [ [ [ [ 1 0 0 0 1 w^5 0 0 0 0 0 1 w^5 0 0 0 0 0 1 w^5 0 0 0 0 0 1 w^5 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 w^5 w^8 0 w^5 w^2 0 1 w^2 w^7 1 w^5 w^10 1 w^6 0 w^7 0 w^5 w^7 w^8 w^5 0 w^2 1 1 w^2 w^7 1 w^8 w^7 w^5 w^8 0 w^5 w^5 w^10 w^4 0 1 w^4 w^6 1 0 w^6 w^7 0 1 w^10 w^7 0 w^4 1 w^6 w^5 0 w^4 w^5 w^12 w^12 w^5 w^6] w^2 w^6 w^4 w^5 w^12 w^12 w^5] 1 w^5 w^6 w^4 w^5 w^12 w^12] w^7 w^12 w^5 w^6 w^4 w^5 w^12] w^8 w^12 w^12 w^5 w^6 w^4 w^5] 1 w w^6 w^11 w w^6 w^11] 0 0 w^8 0 w^4 w^11 w^14] w^7 w^14 0 w^8 0 w^4 w^11] 0 w^11 w^14 0 w^8 0 w^4] w^4 w^4 w^11 w^14 0 w^8 0] 1 0 w^4 w^11 w^14 0 w^8] 1 w^8 w^3 w^13 w^8 w^3 w^13] 0 w^10 w^5 w^6 w^10 w^3 w^12 w^10 w w^3 w^12 w^4 w^5] 0 w^12 w^10 w^5 w^6 w^10 w^3 w^5 w^10 w w^3 w^12 w^4] 0 w^3 w^12 w^10 w^5 w^6 w^10 w^4 w^5 w^10 w w^3 w^12] 0 w^10 w^3 w^12 w^10 w^5 w^6 w^12 w^4 w^5 w^10 w w^3] 33 [ [ 0 0 0 0 0 0 0 0 1 0 0 1 w^6 w^10 w^3 w^12 w^10 w^5 w^5 w^6 w^10 w^3 w^12 w^10 w^3 w^12 w^4 w w^3 w^12 w^5 w^10 w] w^4 w^5 w^10] [ w^5 w^10 1 0 0 [ 0 w^5 w^10 1 0 [ 0 0 w^5 w^10 1 [ 0 0 0 w^5 w^10 [ 0 0 0 0 0 [ 0 0 0 0 0 0 w^9 w^6 0 0 w^9 0 0 0 1 w^11 0 0 w^10 1 0 0 w^10 w w^11 0 0 w^11 w^11 w^8 w^14 w^13 1] w^6 w w^11 0 1 w^11 w^11 w^8 w^14 w^13] w^9 w^6 w w^11 w^13 1 w^11 w^11 w^8 w^14] 0 w^9 w^6 w w^14 w^13 1 w^11 w^11 w^8] 0 w^10 1 0 w^4 w^13 w^2 w^4 w^13 w^2] 1 0 w^10 1 w^2 w^4 w^13 w^2 w^4 w^13] [w^10 1 0 0 0 [ 0 w^10 1 0 0 [ 0 0 w^10 1 0 [ 0 0 0 w^10 1 [ 0 0 0 0 w^10 [ 0 0 0 0 0 0 0 0 0 1 0 [ [ [ [ [ [ 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 w^13 w^9 w^6 w^4 1 0 0 w^13 w^9 w^6 w^4 0 1 0 w^13 w^9 w^6 0 w^4 1 0 w^13 w^9 1 w^6 w^4 1 0 w^13 0 1 1 1 1 1 [ [ [ [ [ [ 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 w w^6 w^14 w^8 w^10 0 w^6 1 w^6 w^2 w^4 w^9] 0 0 w w^6 w^14 w^8 w^10 w^9 w^6 1 w^6 w^2 w^4] 0 w^10 0 w w^6 w^14 w^8 w^4 w^9 w^6 1 w^6 w^2] 0 w^8 w^10 0 w w^6 w^14 w^2 w^4 w^9 w^6 1 w^6] 1 w^14 w^8 w^10 0 w w^6 w^6 w^2 w^4 w^9 w^6 1] 0 1 1 1 1 1 1 w^10 w^10 w^10 w^10 w^10 w^10] w^3 w^11 w^3 0 w 0 w^11 w^8 w^8 w^9 w 0 w^3 w^11 w^3 0 w w^7 w^11 w^8 w^8 w^9 w 0 w^3 w^11 w^3 0 w w^7 w^11 w^8 w^8 0 w 0 w^3 w^11 w^3 w^9 w w^7 w^11 w^8 w^3 0 w 0 w^3 w^11 w^8 w^9 w w^7 w^11 w^5 w^10 1 w^5 w^10 1 w^6 w^11 w w^6 w^11 34 0 w w^9 1 w^2 w w^4 w^7 w^2 w^6 w^11 w^7 w^9 0 w^11 1 w^2 w^2 w^7] w] w^9] w^8] w^8] w] 0 w^11 w^7 w^2] w^9 0 w^11 w^7] w w^9 0 w^11] w^2 w w^9 0] w^7 w^2 w w^9] w^2 w^2 w^2 w^2] Références [1] V.Pless, Introduction to the theory of error-cerrecting codes. Wiley-Interscience series in Discrete Mathematics. [2] A.Poli, L Huguet Codes correcteurs, théorie et application. Masson éditeur, 1989. [3] J.Wolfmann, O.Papini Algèbre discrète et codes correcteurs Mathématiques et applications, vol. 20, collection de la SMAI, Springer-Verlag, 1995 35