• Aucun résultat trouvé

Rapport de TER Transformation de la matrice g´en´eratrice d’un code quasi-cyclique

N/A
N/A
Protected

Academic year: 2021

Partager "Rapport de TER Transformation de la matrice g´en´eratrice d’un code quasi-cyclique"

Copied!
35
0
0

Texte intégral

(1)

Rapport de TER

Transformation de la matrice g´en´eratrice d’un code quasi-cyclique

NARDEAU Nicolas, BENMOUSSA Wafa

2006-2007

(2)

Table des mati` eres

1 Codes Correcteurs 3

1.1 Pr´eliminaires . . . 3

1.2 Codes Cycliques . . . 7

1.3 Quelques lemmes . . . 11

1.4 Codes Quasi-Cycliques . . . 13

2 Transformation de la matrice g´en´eratrice d’un code quasi-cyclique 15 2.1 Partie th´eorique . . . 15

2.1.1 Objectif et m´ethode . . . 15

2.1.2 Th´eor`eme de transformation . . . 16

2.2 Partie programmation de la transformation d’une matrice d’un code quasi- cyclique en Magma . . . 21

2.2.1 Biblioth`eque contenant les fonctions et proc´edures . . . 21

2.2.2 Algorithme de transformation de la matrice . . . 25

2.2.3 Graphe de complexit´e temps . . . 27

2.3 Diff´erents exemples obtenus avec le programme en magma . . . 28

2.3.1 Exemple sur F2 avec des mots de longueur 75 . . . 28

2.3.2 Exemple sur F2 avec des mots de longueur 35 . . . 31

2.3.3 Exemple sur F3 avec des mots de longueur 35 . . . 32

2.3.4 Diff´erentes matrices obtenus dans Kn avecK =F25 . . . 33

(3)

1 Codes Correcteurs

1.1 Pr´ eliminaires

K un ensemble fini, non vide, n un entier naturel non nul.

Kn l’ensemble desx= (x1, .., xn) tels quexi ∈K.

D´efinition 1 (Distance de Hamming) Soient x et y deux ´el´ements de Kn, la dis- tance de Hamming entre x et y est le nombre de composantes pour lesquelles ces

´

el´ements sont diff´erents six= (x1, .., xn)ety= (y1, .., yn)alorsd(x, y) :=card{i= 1,2.., n/xi 6=yi}.

a) d(x, y)∈R+

b) d(x, y) = 0⇔x=y c) d(x, y) =d(y, x)

d) d(x, y)≤d(x, z) +d(z, y)

D´efinition 2 (D´efinition d’un code) Un code surK de longueurn est un sous-ensem- ble de Kn. n est appel´e la longueur du code C et les ´el´ements de C sont appel´es 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´eaires

D´efinition 3 SoitK un corps un fini,Knun K-espace vecoriel. C est uncode lin´eaire si et seulement si c’est un sous espace vectoriel de Kn. Il est de dimension k s’il est un sous-espace vectoriel de dimension k.

D´efinition 4 (Support d’un mot) Soit x= (x1, .., xn) un mot de C. Alors : Supp(x) :={i/xi 6= 0}

.

D´efinition 5 (Poids de Hamming) Soit x= (x1, .., xn) un mot de C. Alors w(x) = card(Supp(x))

D´efinition 6 (Distance minimale d’un code lin´eaire C) SoitC un code lin´eaire, sa distance minimale est d´efinie par d:=M inx∈C w(x)

Propri´et´es 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´et´es 2 (Nombre de mots d’un code lin´eaire C) Si q est le cardinal de K et siC est un code lin´eaire de longueur n et de dimensionk. Alors le nombre de mots de C est qk.

Preuve 1 C 'Kk en tant que K-espace vectoriel.

(4)

Nombre d’erreurs commises lors d’une transmission : si x = (x1, .., xn) est un mot envoy´e et x0 = (x01, .., x0n) le mot re¸cu. Alors le nombre d’erreurs commises est d(x, x0). On suppose par exemple qued(x, x0)≤e (e est le nombre maximum d’erreurs).

Condition de d´ecodage d’ordre e, et rayon de recouvrement :

D´efinition 7 (Condition de d´ecodage) Un code C v´erifie la condition de d´ecodage d’ordre e si pour tout x0 ∈ Kn, il existe au plus un mot x∈ C tel que d(x, x0) ≤e. c-`a-d que les boules ferm´ees (pour la distance de Hamming) de rayone centr´ees sur les mots de C sont 2 `a 2 disjointes.

D´efinition 8 (Rayon de recouvrement) Soit C un code de Kn, et soit r le plus petit rayon tel que les boules de rayon r centr´ees en chaque mot de C forment un recouvrement de Kn, r est appel´e rayon de recouvrementde C.

Remarque 1 Soit dla distance minimale d’un code C : d= minx∈C w(x). Si d≥2e+ 1 alors C v´erifie la condition de d´ecodage d’ordre e.

Code Parfait

D´efinition 9 (capacit´e 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`ere de d−12 est ´egale `a e, e s’appelle alors la capacit´e de correction du code.

D´efinition 10 Un code est dit parfait si sa capacit´e de correction est ´egale `a son rayon de recouvrement.

Codes ´equivalents

- SoientCetDdeux codes de longueurn, ils sont´equivalentss’il existe une permuta- tionσde 1,2, .., ntelle queDsoit l’image deC parϕ: (x1, .., xn)7−→(xσ(1), .., xσ(n)) - Deux codes ´equivalents ont la meme capacit´e de correction et aussi les mˆemes dis-

tances entres les mots, la mˆeme longueur et le mˆeme cardinal.

Matrice g´en´eratrice d’un code lin´eaire

D´efinition 11 Une matrice g´en´eratrice d’un code lin´eaire C sur le corps K est une matrice sur K dont les lignes forment une base de C.

Remarque 2 Un code poss`ede en g´en´eral plusieurs matrices g´en´eratrices.

Exemple 2

M=

1 0 0 1 0 0 1 0 1 1 0 0 1 0 1

La matriceM est de rang3, c’est la matrice d’un codeC de longueur5et 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).

(5)

Propri´et´es 3 Si G est une matrice g´en´eratrice de C, un code lin´eaire(n, k), alors : a) Les autres matrices g´en´eratrices de C sont de la forme A∗G o`u A est une matrice

carr´ee inversible k×k.

b) Le code C est l’ensemble des mots de la forme :

xk = (u1, .., uk)∗G o`u U = (u1, .., uk)∈Kk

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 ∈ Kk et < ., . > est le produit scalaire usuel sur Kk.

Remarque 3 Une matrice G0 obtenue par permutation des colonnes de G serait une matrice g´en´eratrice d’un code C0 ´equivalent `a C.

D´efinition 12 (matrice g´en´eratrice normalis´ee) Une matrice g´en´eratrice d’un code C (n, k) est normalis´ee si la matrice form´ee par les k premi`eres colonnes est la matrice unit´e.

D´efinition 13 (Codages des messages au moyen d’un code lin´eaire) Le codage des messages au moyen d’une matrice g´en´eratrice G d’un code C se r´esume : M essage7−→

u= (u1, .., uk)7−→xk = (u1, .., uk)∗G la matrice G est choisie comme matrice g´en´eratice d’un code e-correcteur, et e est choisi en fonction des statistiques d’erreurs commmises lors de la transmission. Si G est normalis´ee, alors on trouve :

u= (u1, .., uk)7−→(u1, .., uk, xk+1, xk+2, .., xn)

u1, .., uk sont appel´es symboles d’information et xk+1, xk+2, .., xn symboles de controles.

D´efinition 14 (Code Syst´ematique) Un code poss´edant une matrice g´en´eratrice nor- malis´ee entraine un code syst´ematique.

Orthogonal d’un code C

D´efinition 15 Soit C un code (n, k), le code orthogonal de C est l’espace vectoriel orthogonal `aC pour le produit scalaire usuel de Kn. (le code orthogonal de C est un code lin´eaire (n, n−k))

D´efinition 16 (Matrice de Controle) On appelle matrice de controle de C, toute matrice g´en´eratrice de son orthogonal.

Propri´et´es 4 Soit H une matrice de controle de C et x= (x1, .., xn). Le mot x∈C ssi Htx= 0.

Codes de Hamming binaires

D´efinition 17 On appelle code de Hamming (binaire) de longueur 2k−1 tout code ad- mettant comme matrice de controle H, une matrice dont les 2k−1colonnes sont tous les vecteurs de Fk2\ {0}, il est appel´e code Hamming de param`etre k.

(6)

Exemple 3 Matrice de controle du code de Hamming de longueur 7.

H=

1 0 0 0 1 1 1 0 1 0 1 0 1 1 0 0 1 1 1 0 1

(7)

1.2 Codes Cycliques

D´efinition 18 Un code C est dit cyclique si : a) C est un code lin´eaire.

b) Si (x1, .., xn)∈C, alors (xn, x1, .., xn−1)∈C.

Exemple 4 Soit C le code de matrice g´en´eratrice :

G=

1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 1

Ce code poss`ede 23 = 8 ´el´ements.

On peut v´erifier que pour chacun de ses mots, un d´ecalage `a droite donne un autre mot du code C.

Par exemple le mot (110110110) qui est ´egal `a la somme des deux premi`eres lignes de G donne (011011011) qui est ´egal `a la somme de la 2eme et 3eme lignes de G.

Repr´esentation polynomiale des codes cycliques

- Soit C un code lin´eaire de longueur n, pour chaque motm de C,m:= (a0, .., an−1) on lui associe le polynˆome m(X) :=a0+a1X+..+an−1Xn−1.

Un d´ecalage `a droite correspond donc `a faire :Xm(X)mod(Xn−1).

- C est donc cyclique Ssi∀m ∈C xm(X)mod(Xn−1) est un polynˆome associ´e `a un mot deC.

D´efinition 19 Soit K un corps fini, et soit n∈N. a) On appelle repr´esentation polynomiale de Kn,

l’application Θ de Kn dans K[X]/(Xn−1): Θ : Kn −→K[X]/(Xn−1)

(a0, .., an−1)7−→a0+a1x+..+an−1xn−1

b) On appellerepr´esentation polynomialed’un codeC, l’ensemble des repr´esentations polynomiales des mots de C : Θ(C).

Remarque 4 La repr´esentation polynomiale Θ de Kn, est un isomorphisme d’espace vectoriel sur K.

Th´eor`eme 1 SoitCun code lin´eaire surK, le codeCestcycliquessi sarepr´esentation polynomiale Θ(C) est un id´eal de K[X]/(Xn−1).

Preuve 2 Si C est cyclique, Xm(X) est dans Θ(C) pour tout ´el´ement m(X) de Θ(C), il en est de mˆeme pour les Xim(X) et puisque C est lin´eaire les polynˆomes (d0+d1X+ ...)m(X) aussi et donc tous les multiples quelconques de m(X).

(8)

Inversement, si tous les multiples quelconques d’un ´el´ement 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´eal de K[X]/(Xn−1) est principal (la preuve de ce r´esultat repose sur l’existence de la division euclidienne).

Th´eor`eme 2 Soit Θ(C) l’id´eal de K[X]/(Xn−1)associ´e `a un code lin´eaire cyclique C.

Soit g(X) un polynˆome unitaire de plus petit degr´e dans Θ(C).

Soit r :=deg(g(X)). Alors on a les propositions suivantes : a) g(X) est l’unique polynˆome unitaire de degr´e r dans Θ(C).

b) g(X) g´en`ere Θ(C) comme id´eal principal de K[X]/(Xn−1).

c) g(X) divise xn−1

d) {Xig(X), i= 0, .., n−r−1} est une base de Θ(C), consid´er´ee comme sous-espace vectoriel, alors pour tout P(X)deΘ(C), on peut trouver un ensemble de coefficients {ai ∈ K, i = 0, .., n−r −1} tels que P(X) = Pn−r−1

i=0 aiXig(X) c-`a-d P(X) = a(X)g(X) avec a(X) =Pn−r−1

i=0 aiXi.

Preuve 3 1) Si on suppose qu’il existe g0(X), un autre polynˆome unitaire de degr´e r

dansΘ(C)alorsg(X)−g0(X)∈Θ(C), ce qui est impossible cardeg(g(X)−g0(X))≤r−1.

2) Supposons que g(X) ne g´en`ere pas Θ(C), cela revient a dire qu’il existe P(X) de Θ(C) tel que P(X) = q(X)g(X) +r(X) o`u deg(r(X))≤ r−1, Comme Θ(C) est un id´eal 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`ese faite sur g(X).

3) Supposons que g(X) ne divise pas xn−1. Alors :

Xn−1 = q(X)g(X) +r(X) avec deg(r(x))≤r−1

et de meme le fait quer(X)appartienne `aΘ(C)est en contradiction avec l’hypoth`ese sur le degr´e de g.

4) Comme g(X) est un g´en´erateur de Θ(C), alors tout polynˆome de Θ(C) est de la forme a(X)g(X) avec deg(a)≤n−1.

Les polynˆomes g(X), Xg(X), .., Xn−1g(X) forment donc une famille g´en´eratrice de Θ(C), on veut en extraire une base.

Soit a(X)g(X) un ´el´ement de Θ(C) et soith(X) tel que Xn−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`u r(X) = 0, le reste r(X) est donc de la forme r(X) = r0 +r1X +..+rn−r−1Xn−r−1 d’o`u : a(X)g(X) = h(X)q(X)g(X) +r(X)g(X).

Donc a(X)g(X) = (Xn−1)q(X) +r(X)q(X), en passant `a K[X]/(Xn−1) on a : a(X)g(X) = r(X)g(X) =r0g(X) +r1Xg(X) +..+rn−r−1Xn−r−1g(X) La famille g(X), Xg(X), .., Xn−r−1g(X) est donc aussi une famile g´en´eratrice de Θ(C).

(9)

Montrons maintenant qu’elle est aussi libre :

Dans K[X]/(Xn−1), supposons λ0g(X) +λ1Xg(X) +..+λn−r−1Xn−r−1g(X) = 0 ceci implique dans K[X] que (λ01X+..+λn−r−1Xn−r−1)g(X)≡0[Xn−1].

Soit P(X) :=λ01X+..+λn−r−1Xn−r−1.

Le polynˆome P est soit nul soit de degr´e inf´erieur `an−1et en mˆeme temps divisible par Xn −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`u P(X) = 0 d’o`u λ01 =

· · · = λn−r−1Xn−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´en´erateur est g(X), est k=n−deg(g(X)).

Th´eor`eme 3 Soit g(X) = g0 +g1X+..+grXr le g´en´erateur d’un code cyclique C de longueurnsurK, la matriceG`aklignes etncolonnes suivante o`ur =deg(g(X)) = n−k, est une matrice g´en´eratrice de C.

G=

g0 g1 g2 . . . gr 0 . . . 0 0 g0 g1 g2 . . . gr . . . 0 ... . .. ... ... ... . . .. ...

0 . . . 0 g0 g1 g2 . . . gr

Preuve 4 Une matrice g´en´eratrice est obtenue en choisissant comme lignes les n-uplets correspondants aux polynˆomes de la base pr´ec´edente. Soit :

g(X), Xg(X), .., Xn−r−1g(X)

Ce sont tous les d´ecalages successifs du premier, d’ou le r´esultat.

Exemple 5 La d´ecomposition de X7−1 en diviseurs irr´eductibles de F2 est : X7−1 = (X−1)(X3+X+ 1)(X3+X2+ 1)

Les codes cycliques de longueur 7 sur F2 diff´erents de{0} sont donc ceux g´en´er´es comme suit :

C0 : g0(X) = X7−1 = 0 C0 ={0, ..,0}

C1 : g1(X) = X−1 C2 : g2(X) = X3+X+ 1 C3 : g3(X) = X3+X2+ 1

C4 : g4(X) = (X−1)(X3+X+ 1) =X4+X3+X2+ 1 C5 : g5(X) = (X−1)(X3+X2 + 1) =X4+X2+X+ 1

C6 : g6(X) = (X3+X+ 1)(X3+X2+ 1) =X6+X5 +X4+X3+X2+X+ 1 Pour C4, on a : G4 est une matrice g´en´eratrice

G4 =

1 0 1 1 1 0 0 0 1 0 1 1 1 0 0 0 1 0 1 1 1

(10)

En appliquant le th´eor`eme 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.

(11)

1.3 Quelques lemmes

Lemme 1 Soit C un code cyclique de longueur m, soit Θ(C) sa repr´esentation polyno- miale et M une matrice g´en´eratrice de C de taille m×m0.

Alors, le pgcd de Xm−1 et des polynˆomesLi(X) dont les coefficients sont respectivement les ´el´ements des lignes de M est le polynˆome g(X) g´en´erateur de l’id´eal Θ(C).

Preuve 5 On posed(X) = pcgd(L1(X), L2(X). . . , Lm0(X), Xm−1). D’abord on ag(X)| d(X), car g(X)|Li(X) ∀i= 1...m0 et g(X)|Xm−1.

De plus g(X)∈Θ(C) et donc :

g(X) =

m0

X

i=1

yi(X)Li(X) car (Li(X)mi=10 ) est une base de Θ(C).

=

m0

X

i=1

yi(X)Li(X) + 0×(Xm−1)

= (

m0

X

i=1

yi(X)ai(X))×d(X).

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−→ M0 avec r ≤ m telle que :

M0 = rl m−rl

M 0

L’application ϕ ne change pas le code engendr´e par les lignes de la matrice.

Preuve 6 Soient Li(X), i= 1...m, les polynˆomes correspondants aux lignes de M0. Pm

i=1λi(X)Li(X) =Pr

i=1λi(X)Li(X) +Pm

i=r+1λi(X)Li(X) Car Pm

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´en´eratrice norma- lis´ee de C, r le rang de M (c’est aussi son nombre de lignes), et soit g(X) le polynˆome g´en´erateur de l’id´eal Θ(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´e ∈Mr,r

Alors G0 =G∗ϕ(M) = (g0, g1, ..., gm−r,0, ...,0) M

0

(12)

Et donc :

G0 = (g0, g1, ..., gm−r,0, ...,0)

Ir | A 0 | 0

= (g0, g1, ..., gr, gr+10 , ..., gm0 )

On a G et G0 deux ´el´ements de C. Or W =G−G0 = (0,0, ...,0, g”r+1, ..., g”m)∈C etW s’´ecrit donc en combinaison lin´eaire des vecteurs de la base de C. Alors :

W =Pr

i=1λiLi = (λ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 = Pr

i=1λiLi alors W = 0,d’o`u G=G0, et donc G∗ϕ(M) = G.

(13)

1.4 Codes Quasi-Cycliques

Soit σ la permutation circulaire (l’op´erateur de d´ecalage d’un rang vers la droite) Un code lin´eaire C de longueur n, de dimension k et de distance d, est dit quasi-cyclique s’il v´erifie :

∃l ∈Nl ∈C, ∀c∈C.

Le plus petit entier naturel v´erifiant ceci est appel´e l’indice du code.

On r´eordonne les ´el´ements SoitCun code quasi-cyclique de longueurn, de dimension k, de distanced et d’indice l surFq, posons n=r×l.

C = (x0, .., xl−1 |xl, .., x2l−1 |x2l, .., x3l−1 |...|xl(r−1), .., xlr−1) On r´eorganise 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 :

Φ : (A0, A1, .., Aj = ((xjl+i)l−1i=0), .., Ar−1)7−→(C0, C1, .., Cj = ((xil+j)r−1i=0), .., Cl) o`u :

C0 = (x0, xl, x2l, ..., xl(r−1)), C1 = (xl, xl+1, ..., xl(r−1)+1), ..., Cl= (xl−1, x2l−1, .., xlr−1) Or le codeC est quasi-cyclique d’indicel donc par construction, lesCi sont bien des codes cycliques.

Dans toute la suite de notre travail, nous utiliserons des codes quasi-cycliques organis´es comme pr´esent´e ci-dessus apr´es le passage par l’application Φ.

Notation : D´esormais, 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 ´egale `a 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´en´eratrice d’un code quasi-cyclique : Soit V un espace vectoriel de dimensionn =m×l sur Fq.

V :={(x1, .., xn)/xi ∈Fq pour xi = 1..n}

Soit v un ´el´ement de V tir´e au hasard.

v = (x1, x2.., xm |xm+1, xm+2.., x2m |...|x(l−1)m+1, .., xlm)

(14)

Soit σ la permutation d´efinie 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´efinir va nous permettre de construire une matrice g´en´eratrice du code.

Travaillons sur notre ´el´ementv, `a partir de cet ´el´ement nous allons construire une famille dem 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 `a partir de σ car (σm =Id).

On obtient donc une famille de m vecteurs. On v´erifie 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 :

M= 0 B B B B B

@

x1 x2 . . . xm xm+1 xm+2 . . . x2m . . . x(l−1)m+1 x(l−1)m+2 . . . xlm

xm x1 . . . xm−1 x2m xm+1 . . . x2m−1 . . . xlm x(l−1)m+1 . . . xlm−1

.. .

.. . . . .

.. .

.. .

..

. . . .

..

. . . .

.. .

..

. . . .

.. .

x2 x3 . . . x1 xm+2 xm+3 . . . xm+1 . . . x(l−1)m+2 x(l−1)m+3 . . . x(l−1)m+1

1 C C C C C A

Cette matrice est la matrice g´en´eratrice d’un code quasi-cyclique.

(15)

2 Transformation de la matrice g´ en´ eratrice d’un code quasi-cyclique

2.1 Partie th´ eorique

2.1.1 Objectif et m´ethode

Notre objectif est de r´ealiser la transformation d’une matrice g´en´eratrice d’un code quasi-cyclique en une forme canonique unique.

Supposons que l’on poss`ede la matrice M g´en´eratrice d’un code quasi-cyclique. Cette matrice peut ˆetre 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´ealiser la transformation de cette matrice, nous effectuons les

´

etapes suivantes :

– On applique `a la matriceM un pivot de gauss. On obtient alors une nouvelle matrice M.

– Par suite, on travaille sur la matrice M1. On r´ecup`ere le g´en´erateur g1 du code C1 et le rang r1 de la matrice M1. On effectue la multiplication g1×ϕ(M) (o`u ϕ est l’application d´efinie dans le lemme 2). On r´ecup`ere alors le premier g´en´erateur G1 de la matrice. Ce g´en´erateur engendrera les r1 premi`eres lignes.

– Puis on r´eit`ere le mˆeme proc´ed´e avec la matrice M2 en enlevant les r1 premi`eres lignes (on note le rang de cette matricer2). On obtient ainsi le deuxi`eme g´en´erateur G2. On continue comme cela jusqu’`a ce queP

ri =m0.

– A partir de maintenant, on travaille uniquement sur les g´en´erateursGi. Nous allons effectuer une r´eduction. Pour r´eduire un g´en´erateurGi, on utilise les g´en´erateursGj tels que j > i. Regardons les g´en´erateurs comme suit :

G1 = g1 f11 f12 . . . f1l G2 = 0 g2 f22 . . . f2l

Chaque ´el´ement de Gi est en faite un vecteur de longueur m qui selon sa position appartient `a un des codesCi. Dans ce cas, on travaille dans le codeC2. En utilisant la repr´esentation polynomiale, on effectue la division de f11 par g2. On a f11 = g2∗q+r11 et doncr11 =f11−g2∗q. On remplace alorsf11 parr11. Pour que le mot appartienne toujours au code quasi-cyclique, il faut reporter l’op´eration sur le reste du mot en posant r1i =f1i −f2i∗q, ∀i = 2. . . l et en rempla¸cant f1i par r1i. Puis on recommence cette op´eration sur G1 avec les autres vecteurs Gj tel que j > 2.

Ensuite on effectue le mˆeme type d’op´eration surG2 avec lesGj tels quej >2. Puis surG3, G4 , . . . , et ceux juqu’`a ´epuisement des Gi.

(16)

– On peut alors construire la nouvelle matrice `a l’aide de la permutation σ d´efinie 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 :

M0 =

A1 B1 . . . . 0 A2 . . . . 0 0 . .. . . .

0 0 0 Ak

Tels que les Ai sont de la forme en posant si :=m−ri o`uri est le rang de la matrice :

Ai=

gi,0 gi,1 gi,2 . . . gi,si 0 . . . 0 0 gi,0 gi,1 gi,2 . . . gi,si . . . 0 ... . .. ... ... ... . . .. ... 0 . . . 0 gi,0 gi,1 gi,2 . . . gi,si

Les Ai sont des matrices g´en´eratrices de codes cycliques et le g´en´erateur de ce code est le mot gi = (gi,0, gi,1, gi,2, . . . , gi,si, 0, . . . , 0) .

La matrice obtenu par ce proc´ed´e est unique et canonique.

2.1.2 Th´eor`eme de transformation

Th´eor`eme 4 SoitCun code quasi-cyclique, alors il existe une unique matriceM g´en´eratrice de forme canonique (forme d´efinie pr´ec´edement) qui g´en´eralise 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´en´eratrice de ce code de taille m0×n.

On r´ealise un pivot de Gauss sur cette matrice et on obtient une autre matrice g´en´eratrice du code quasi-cyclique que l’on note toujours M. Apr`es cela, on proc`ede aux op´erations suivantes :

Modification de la matrice : Regardons maintenant les blocs concat´en´es qui forment la matrice, ils sont tous de taille m0×m. Chacun d’entre eux repr´esente 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´ecup`ere le rang r1 de la matrice M1.

Extraction du polynˆome g´en´erateur deC1 : On veut trouver le g´en´erateur du code cyclique C1 que l’on note g1(X). On connait maintenant le degr´e du polynˆome recherch´e deg(g1(X)) = s1 =m−r1 o`u r1 est le rang de la matrice M1.

(17)

On sait que g1(X) divise Xm−1 ainsi que tout les polynˆomes Li(X) dont les coefficients sont les ´el´ements de la i-`eme ligne de la matrice M1.

On effectue donc un calcul de pgcd : . pgcd1 = pgcd(L1(X), Xm−1) . pgcd2 = pgcd(L2(X), pgcd1)

...

. pgcdi = pgcd(Li(X), pgcdi−1) tant que deg(pgcdi)deg(g1(X)) On en d´eduit alors :

1 Le degr´e 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’`a la m0 `eme ´etapes alors : pgcdm0 = pgcd(pgcdm0−1, L0m(X))

pgcdm0 = pgcd(pgcd(pgcdm0−2, Lm0−1), Lm0(X)) ...

pgcdm0 = pgcd(pgcd(. . . pgcd(pgcd(L1(X), Xm−1)L2(X))L3(X). . . Lm(X)) En appliquant B´ezout on trouve :

pgcd(L1(X), Xm−1) =U1(X)L1(X) +U2(X)(Xm−1)

Si on le r´eapplique `a 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)(Xm−1)) +U4(X)L2(X)). . . pgcdm0 = U00(X)(Xm−1) +U10(X)L1(X) +. . .+Um0 0(X)Lm0(X)

Donc puisqu’il existe U00(X), U10(X). . . Um0 0(X) tels que :

pgcdm0 =U00(X)(Xm−1) +U10(X)L1(X) +. . .+Um0 0(X)Lm0(X).

Alors pgcdm0 =pcgd(L1(X) +L2(X). . .+Lm0(X), Xm−1).

D’apr`es le lemme 1 on sait que :

g1(X) = pcgd(L1(X), L2(X). . . , Lm0(X), Xm−1) Donc on trouve bien que pgcdm0 =g1(X).

Donc mˆeme au pire, si l’agorithme va jusqu’`a la m0 `eme ´etape on tombe sur le polynˆome g´en´erateur g1(X).

(18)

R´ecup´eration des vecteurs g´en´erateurs Gi : On effectue le produit de

G= (g0, g1, ..., gm−r1,0, ...,0)∈M1,m(Fq)parϕ(M) = (M1|M2|...|Ml)o`u M est la matrice du code quasi-cyclique, et ϕ est l’application d´efinie dans le Lemme 2 :

On fait : (g0, g1, ..., gm−r1,0, ...,0)(M1|M2|...|Ml) En tenant compte du Lemme 3, on trouve :

G1 = (g1, g2.., gm−r1,0, ...,0|f11, f21, .., fm1|f12, f22, .., fm2|...|f1l−1, f2l−1, .., fml−1) C’est le premier vecteur g´en´erateur qu’on r´ecup`ere.

Pour le2i`eme vecteur g´en´erateur on r´eapplique la mˆeme chose `a la matriceM0 constitu´ee par les m0−r1 derni`eres lignes de M (on a bien vu dans le Lemme 2 que l’application ϕ ne change pas le code engendr´e par la matrice)

On cherche par le mˆeme algorithme le polynˆome g´en´erateur g2(X) du code cyclique C20 dont la matrice g´en´eratrice est M20 constitu´ee par les m0−r1 derni`eres 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 ϕ(M0) , 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´en´erateur le vecteur G2.

Et ainsi de suite on r´ecup´ere tous les vecteurs g´en´erateurs on s’arrˆete lorsque P

ri =m0. Dor´enavant, on va travailler exclusivement sur ces vecteurs g´en´erateurs.

R´eduction des Gi :

Le principe : On r´eduit chaque g´en´erateur Gi par tous les Gj qui le suivent (pour les j ≥i+ 1)

R´eduction de G1 par G2 : on a :

G1 = (g1, g2.., gm−r1,0, ...,0|f11, f21, .., fm1|f12, f22, .., fm2|...|f1l−1, f2l−1, .., fml−1) 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´eduire G1 par G2 :

Soit f1(X) le polynˆome dont les coefficients sont (f11, f21, .., fm1).

On effectue la division euclidienne de f1(X) par g2(X) : On trouve : f1(X) =q1(X)g2(X) +r1(X)

Donc, r1(X) = f1(X)−q1(X)g2(X)

Montrons que r1(X)∈Θ(C2) (Θ(C2) la repr´esentation polynomiale du code cyclique C2) On sait que f1(X)∈Θ(C2) car :

(19)

G1 = (g1, g2.., gm−r1,0, ...,0|f11, f21, .., fm1|f12, f22, .., fm2|...|f1l−1, f2l−1, .., fml−1)

appartient au code quasi-cyclique C = (C1|C2|...|Cl) en tant que code quasi-cyclique constitu´e par des codes cycliques concat´en´es.

On sait aussi queq1(X)g2(X)∈Θ(C20) =< g2(X)>et puisqueC20 ⊆C2alorsq1(X)g2(X)∈ Θ(C2) et donc r1(X)∈Θ(C2) pour tout i= 2...l−1.

On pose : ri(X) = fi(X)−q1(X)Pi−1(X) Les ri(X) appartiennent bien `a Θ(Ci+1) car :

. fi(X)∈Θ(Ci+1)

. q1(X)Pi−1(X)∈Θ(Ci+1) [car Pi−1(X)∈Θ(Ci+1) et Ci+1 est un code cyclique].

On r´ecup`ere donc un vecteur :

G01 := (g1, g2.., gm−r1,0, ...,0|r11, r21, .., rm1|r12, r22, .., rm2|...|rl−11 , r2l−1, .., rl−1m ) qui appartient bien au code quasi-cyclique C = (C1|C2|...|Cl).

On a donc effectu´e la r´eduction de G1 par G2, on aura alors `a r´eduire G01 par G3 et ainsi de suite..

Ceci est en ce qui concerne la r´eduction du vecteur g´en´erateur G1. On r´ecup`ere `a la fin le premier vecteur g´en´erateur r´eduit :

G1 = (g1, g2.., gm−r1,0, ...,0|R11, R12, .., Rm1 |R12, R22, .., R2m|...|Rl−11 , Rl−12 , .., Rl−1m ) On passe alors `a la r´eduction du vecteur g´en´erateur G2 par tous les Gj qui le suivent (pour les j ≥3), on commencera donc par le r´eduire par G3, mˆeme d´emarche et ainsi de suite..

Lorsqu’on sera arriv´e au bout de la r´eduction de G2, on r´ecup`erera le 2 i`eme vecteur g´en´erateur r´eduit :

G2 = (0,0, ...,0|g2,0, g2,1, ..., g2,m−r2,0, ...,0|S11, S21, .., Sm1|, ..,|S1l−2, S2l−2, .., Sml−2) On r´eduira de la mˆeme mani`ere les autres vecteurs g´en´erateurs.

Reconstruction d’une matrice g´en´eratrice du code quasi-cyclique C `a partir des vecteurs g´en´erateurs r´eduits : A l’issue de l’op´` eration de r´eduction, on aura obtenu des vecteurs :

G1= (g1, g2.., gm−r1,0, ..,0|R11, R12, ..., Rm1 |R21, R22, .., R2m|...|Rl−11 , Rl−12 , .., Rl−1m ) G2= (0,0, ...,0|g2,0, g2,1, ..., g2,m−r2,0, ...,0|S11, S21, ..., S1m|...|S1l−2, S2l−2, .., Sml−2) G3= (0,0, ...,0|0,0, ...,0|g3,0, g3,1, ..., g3,m−r3,0, ...,0|T11, T21, .., Tm1|..|T1l−3, T2l−3, .., Tml−3)

...

Soit σ la permutation qui correspond `a un shift. On effectue sur chaque Gi : ri shifts successifs. Et on r´ecup`ere ainsi pour chaque Gi, la matrice :

ri l

 Gi σ(Gi)

... σri(Gi)

(20)

Supposons qu’on avait r´ecup´er´e k vecteurs Gi.

La famille(G1, σ(G1), .., σr1(G1), G2, σ(G2), .., σr1(G2), .., Gk, σ(Gk), .., σrk(Gk))est une fa- mille libre, car d´eja lesGi pour(i= 1..k)sont libres entre eux par construction (voir leurs formes ci-dessus, l’emplacement des z´eros au d´ebut de chaque vecteur empeche le fait qu’ils soient li´es)

Ensuite, en faisant des shifts, le mˆeme argument tient. C’est donc une famille libre du code quasi-cyclique C qui est de cardinal Pk

i=1ri, Or par construction, on sait que Pk

i=1ri =m0 donc c’est bien une base de C.

Nous allons donc prendre pour nouvelle matrice P g´en´eratrice du code quasi-cyclique C la matrice :

P=

 G1 σ(G1)

... σr1(G1)

G2 σ(G2)

... σr2(G2)

... Gk σ(Gk)

... σrk(Gk)

En forme plus d´etaill´ee peut ˆetre :

P=

A1 B1 . . . . 0 A2 . . . . 0 0 . .. . . . 0 0 . . . Ak

Tels que les Ai sont de la forme (on pose si :=m−ri) :

Ai =

gi,0 gi,1 gi,2 . . . gi,si 0 . . . 0 0 gi,0 gi,1 gi,2 . . . gi,si . . . 0 ... . .. ... ... ... . . .. ... 0 . . . 0 gi,0 gi,1 gi,2 . . . gi,si

La matrice P ainsi obtenu est unique car apr`es l’´etape du pivot de Gauss, chaque ´etape effectuer entraine un r´esultat unique. En effet, lorsqu’on l’on cherche les g´en´erateurs g, il n’en existe qu’un `a chaque fois. De plus lorsque l’on effectue les r´eductions `a l’aide des diff´erents vecteurs, l’unicit´e d´ecoule directement de la division euclidienne. Les diff´erentes

´

etapes entrainent donc l’unicit´e de la matrice obtenue et cette forme est canonique quelque soit le code quasi-cyclique sur lequel on travaille.

(21)

2.2 Partie programmation de la transformation d’une matrice d’un code quasi-cyclique en Magma

2.2.1 Biblioth`eque contenant les fonctions et proc´edures

/************************************************************************/

/*** proc´edure qui r´ealise la permutation dans un code quasi-cyclique ***/

/*** de longueur n, d’indice l et ayant des codes cycliques engendr´es ***/

/*** par des polyn^omes qui divise X^m-1 avec m=n/l ***/

/************************************************************************/

procedure sigma(~x,m,l)

// x : ´el´ement 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’´el´ement tirer au hasard ***/

/*******************************************************/

procedure list(x,~L,k,l) // x : ´el´ement al´eatoire

// L : liste o`u l’on stocke les permutations // k : nombres de permutations effectu´ees // 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;

(22)

/***************************************************************/

/*** proc´edure de cr´eation de la matrice g´en´eratrice du code ***/

/***************************************************************/

function matrice_du_code(L,m,n,Fq)

// L: liste `a 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´ecupere 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´ecupere 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];

(23)

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´ecesssaire ***/

/*** `a la multiplication pour recuperer la premiere ligne d’un "bloc" ***/

/************************************************************************/

function extractvect(v,d)

// v g´en´erateur d’un code cyclique

// d nombre de lignes restant dans la matrice g´en´eratrice du code u:=[**]; // initialisation chaine vide

// on r´ecupere les coordonn´ees du vecteur g´en´erateur 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´edure de construction d’un polyn^ome `a 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´ecup`ere 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);

(24)

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´ecup´eration des coefficients du polyn^ome // remplacement dans le vecteur par les coefficients du polyn^ome // puis par des z´ero pour compl´eter

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´edure qui r´ealise 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´en´erateur de la matrice // m longueur des codes cycliques

// l indice du code quasi-cyclique

// k ´el´ement de la liste que l’on veut modifier

// h ´el´ement de la liste gr^ace auquel on effectue la r´eduction // p variable qui permet de savoir dans quel bloc on travail F<x>:=PolynomialRing(Fq);

// on trouve le quotient et le reste

(25)

fi:=0;g:=0;

polyn^ome(~fi,G[k],m,p,Fq); // on r´ecup`ere le polyn^ome `a modifier print"fi:=",fi;

polyn^ome(~g,G[h],m,p,Fq); // on r´ecup`ere le polyn^ome par lequel on divise print"g:=",g;

r:=fi mod g; // r´ecup`eration du reste de la division print"r:=",r;

q:=fi div g; // r´ecup`eration du quotient de la division print"q:=",q;

remplace(~G[k],m,r,p); // remplacement de f par le reste r // r´ep´ercution 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´ecup`ere le polyn^ome `a modifier print"fi:=",fi;

polyn^ome(~g,G[h],m,e,Fq); // on r´ecup`ere le polyn^ome qui sert `a la modification print"g:=",g;

r:=((fi-(g*q))mod (x^m+1)); // on r´epercute 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´erentes valeurs n´ecessaires ***/

/**********************************************************/

// chargement de la biblioth`eque qui contient les fonctions et les proc´edures load"bibliotheque_final.mag";

// d´eclartion des diff´erentes 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);

(26)

print"q:=",q,"\tl:=",l,"\tm:=",m,"\tn:=",n;

v:=Random(V);

print "\nElement al´eatoire:\n";

print v,"\n";

// construction et r´ealisation de la mise sous forme canonique de la matrice du code L:=[**];list(v,~L,m,l); // on g´en`ere la liste contenant les permutations

MAT:=matrice_du_code(L,m,n,Fq); // on construit la matrice du code m1:=Rank(MAT); // on r´ecup`ere 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´erents rang

// j : permet de connaitre le nombre de vecteur g´en´erateur G:=[**];RANG:=[**];pos:=[**]; // initialisation des listes

// G : liste des g´en´erateurs

// RANG : liste des diff´erents rang

// pos : liste permettant de se placer dans la matrice while(r lt m1) do

j:=j+1;

// r´ecup´eration 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 `a la boucle suivante j:=j-1;

continue;

end if;

gene:=generateur(A,m,Fq); // on r´ecup`ere le g´en´erateur du code cyclique print"generateur:",j,"eme bloc:",gene;

A:=SubmatrixRange(MAT,r+1,1,m1,n); // on recupere la sous matrice `a modifier v:=extractvect(gene,m1-r); // on met le vecteur `a taille pour la multiplication G[j]:=v*A;G[j]; // on r´ecup`ere le vecteur generateur du j eme bloc

RANG[j]:=rang; // on r´ecup`ere le rang de ce bloc

pos[j]:=i; // on recup`ere la position de ce bloc dans la matrice r:=rang + r ; // on fait la somme des rangs des diff´erents blocs i:=i+1;

end while;

// Reduction des diff´erents g´en´erateurs for k:=1 to j-1 do

(27)

for h:=k+1 to j do

reduct_ligne(~G,m,l,k,h,pos[h]-1,Fq);

end for;

end for;

// on r´ealise l’affichage des g´en´erateurs r´eduits for i:=1 to j do

G[i];

end for;

print "\n";

// on reconstruit la matrice qui a la forme canonique souhait´ee 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´e temps

0 50 100 150 200 250 300 350 400 450

10 100 1000 10000 100000

Temps en seconde

Longueur des mots du code

Temps de calul en fonction de la longueur des mots du code

”complexite.txt” using 1 :2

Références

Documents relatifs

Histoire récente 2002 extension par Karu aux polytopes éventails non simples mais plus relié au f -vecteur 2012 Panina présente l’algèbre des polytopes à Lyon 2015

Une remarque fondamentale : lorsque I est un segment, c’est-` a-dire lorsque les int´ egrales utilis´ ees sont ordinaires, si f est continue sur A × I , dans le th´ eor` eme pr´

Quelle est la matrice de cette application lin´ eaire dans les bases canoniques?. Quelle est l’image par f du deuxi` eme vecteur de la

Ces règles sont en fait autant d’instances différentes d’une seule et même règle qui associe à deux doublons de booléens un troisième doublon dont les coordonnées sont

Dans cet exercice, nous allons ´ etudier le d´ eplacement al´ eatoire d’un pion se d´ epla¸ cant dans l’ensemble des

Dans cet exercice, nous allons ´ etudier le d´ eplacement al´ eatoire d’un pion se d´ epla¸ cant dans l’ensemble des

En effet, C poss` ede un nombre infini d’´ el´ ements... C’est une liste g´

Montrons l’autre inclusion.. En effet, C poss`ede un nombre infini d’´el´ements. Par cons´equent, tous les ´el´ements λv pour λ ∈ C sont diff´erents.. Donc tout