63
Notes du cours PO-503 Codes correcteurs et corps finis - 29.11.2019 2019-2020 B. Ischi (MaTheX - http://www.mathex.net) Coll` ege de Candolle

B. Ischi - MaTheX

  • Upload
    others

  • View
    2

  • Download
    0

Embed Size (px)

Citation preview

Page 1: B. Ischi - MaTheX

Notes du cours PO-503

Codes correcteurs et corps finis - 29.11.2019

2019-2020

B. Ischi(MaTheX - http://www.mathex.net)

College de Candolle

Page 2: B. Ischi - MaTheX
Page 3: B. Ischi - MaTheX

Table des matieres

Chapitre 1. Codes correcteurs 31. Introduction 32. Modelisation du canal 53. Premieres definitions 64. Premiers exemples 85. Codes lineaires 126. Extension paire 19

Chapitre 2. Corps finis 211. Definitions 212. Description des corps finis 223. Polynomes cyclotomiques 254. Decomposition des polynomes cyclotomiques dans un corps fini 285. Exemples 29

Chapitre 3. Codes correcteurs lineaires cycliques 371. Codes lineaires sur Fq 372. Demultiplication des codes sur Fps 383. Majoration du singleton 394. Codes cycliques 405. Exemples 446. Classes cyclotomiques 467. Exemples 478. Distance minimale des codes cycliques 499. Codes de Reed-Solomon 5010. Codes de Golay 5011. Conclusion 57

Appendice A. Notions de base d’arithmetique 591. Theoreme de Bezout et algorithme d’Euclide 59

3

Page 4: B. Ischi - MaTheX
Page 5: B. Ischi - MaTheX

CHAPITRE 1

Codes correcteurs

1. Introduction

La transmission de l’information numerisee s’est largement repandue et offre de nombreuxavantages, comme par exemple, la possibilite (au moins theorique) d’une conservation illimiteede documents puisque des copies exemptes de degradations de leur contenu sont realisables.L’enregistrement par des procedes analogiques de sons ou d’images exclu cette possibilite, carchaque copie deteriore la qualite comme pourront certainement en temoigner les lecteurs qui ontencore connu les videos au format VHS !

La transmission d’information numerisee par des 1 et des 0 n’est jamais exempte d’erreurs.L’enregistrement sur un support se fait au final toujours par un procede analogique ou une grandeurphysique a une valeur “proche” d’une certain valeur u representant un 1 ou “proche” d’une valeurd representant un 0. La deuxieme vertu de la numerisation de l’information est la possibilite demettre en œuvre des procedures pour detecter voire corriger les erreurs de transmission.

Certains procedes permettant de corriger des erreurs de transmission sont bien connus, commepar exemple le code aeronautique international qui facilite la transmission vocale d’une suite delettres en les remplacant par des mots:

Les mots choisis sont deux a deux facilement distinguables meme avec de la friture sur la ligne.Certains procedes de detection d’erreurs sont egalement bien connus, comme par exemple celui

utilise pour l’ancien numero AVS qui etait compose de quatre blocs de chiffres pour un total de 11chiffres. Le dernier etait un chiffre de controle obtenu en calculant le produit scalaire c du vecteurforme des 10 premiers chiffres du numero AVS avec un vecteur appele le facteur de poids. Lechiffre de controle etait le resultat de 11 moins le reste de la division entiere de c par 11. Prenons,par exemple, le numero AVS 503.70.279.117. Le chiffre de controle est 7 car

0Ces notes de cours sont fortement inspirees du livre intitule “Cours d’algebre” de Michel Demazure (Cassini,Paris, 2008

5

Page 6: B. Ischi - MaTheX

Modelisation du canal (page 6/61)

5037027911

5432765432

︸ ︷︷ ︸

facteur de poids

= 136 et 136 mod 11 = 4 et 11− 4 = 7

Les etapes communes a toutes les methodes de correction d’erreurs sont le codage et ledecodage: un emetteur commence par coder un mot ~a ecrit en binaire (constitue uniquementde 0 et de 1, appeles des bits) de maniere a pouvoir detecter voire corriger des erreurs de trans-mission. Le mot code, note ~m, est envoye par un canal de transmission a un recepteur. Le canalpeut etre une fibre optique, un faisceau hertzien ou une chaıne complexe de stockages et de lec-tures. Le canal de transmission modifie certains bits de maniere non previsible. C’est l’erreurinduite par le canal de transmission. Le canal transforme ~m en ~m′. Finalement, le recepteurapplique un algorithme de detection ou de correction des erreurs puis decode le message pourobtenir a nouveau un mot ecrit en binaire. Ces etapes peuvent etre schematisees comme suit

&%'$emetteur

-~a

&%'$codage

-~m

&%'$canal

6

erreurs

-~m′

&%'$correction

-∼ ~m

&%'$decodage

-∼ ~a

&%'$recepteur

Notons que le codage va induire une dilution de l’information et cette dilution va dependre dutaux d’erreurs induites par le canal et du contexte: entre les differents composants d’un ordina-teur, la transmission est tres rapide et fiable. Un algorithme de detection d’erreurs suffit car lesoperations de transmissions peuvent etre repetees facilement. A l’autre extremite, on peut donnercomme exemple la communication avec une sonde spatiale. Dans ce cas, une methode efficace decorrection des erreurs est necessaire.

Terminons cette introduction par un exemple historique de canal de transmission. En 1794,Claude Chappe inventa un telegraphe base sur un reseau de tours (appelees tours de Chappe)distantes les unes des autres de 10 a 15 km. Elles etaient coiffees d’un mat mobile. Une modifi-cation de la configuration du mat de la tour emettrice etait propagee de tours en tours (environneuf minutes entre Paris et Lille). Si le message recu etait incoherent, un inspecteur remontaitla canal de tours en tours pour trouver et sanctionner l’operateur qui avait induit une erreur detransmission.

NB Ces notes de cours sont illustrees de nombreux exemples ecrits en Python 3 et faisantappel aux modules numpy, scipy et matplotlib.pyplot.

Page 7: B. Ischi - MaTheX

Modelisation du canal (page 7/61)

2. Modelisation du canal

Notons F2 = {0, 1} le corps a deux elements. Le mot ~a ∈ Fk2 a k bits et le mot encode ~m ∈ Fn2a n bits avec n ≥ k. Le codage est une fonction injective (choisir une fonction non injective seraittotalement absurde !)

c : Fk2 → Fn2~a 7→ ~m = c(~a)

L’image de la fonction c est appelee le code binaire.Nous supposerons que chaque bit du mot ~m a une probabilite p < 1

2d’etre modifie et que les

evenements concernant des bits differents sont independants. On appelle un tel canal un canalbinaire symetrique sans memoire. Le nombre de bits modifies X est donc une variable aleatoirequi suit la loi binomiale B(n, p)

P (X = j) = Cnj p

j(1− p)n−j E(X) = np et σ =√np(1− p)

Le canal est represente par la fonction

C : Fn2 −→ Fn2~m 7→ C(~m) = ~m+ ~e

ou ~e est un vecteur aleatoire.Le code Python 3 qui se trouve ci-dessous comporte deux fonctions. La fonction diff calcule la

difference de deux vecteurs dans Fn2 . Remarquons que dans Fn2 la difference de deux vecteurs estegale a la somme. La fonction canal ajoute a un vecteur m∈ Fn2 un vecteur aleatoire dont chaquebit est tire au hasard avec un probabilite prob de valoir 1 et une probabilite 1−prob de valoir 0.

1 import numpy as np2 import s c ipy . s p e c i a l

3 import matp lo t l i b . pyplot as p l t

4 #5 def d i f f ( a , b ) :

6 return ( a−b)%27 #

8 def cana l (m, prob=1/3) :

9 return d i f f (m, np . random . cho i c e ( [ 1 , 0 ] , l en (m) ,p=[prob ,1−prob ] ) )10 #

11 n=100

12 p=1/413 n b t i r a g e s =10000014 s t a t =[ ]

15 m=np . z e r o s (n) . astype ( i n t )16 binomia le=lambda n , j , p : s c ipy . s p e c i a l . binom (n , j ) ∗p∗∗ j ∗(1−p) ∗∗(n−j )

17 for u in range (0 , nbt i rages , 1 ) :

18 l=sum( cana l (m, p) )19 s t a t . append ( l )20 p l t . x l a b e l ( ’Nombre de b i t s mod i f i e s ’ )21 p l t . y l a b e l ( ’ p r o b a b i l i t e ’ )22 p l t . t i t l e ( ’ Canal : nombres de b i t s mod i f i e s (n=’+s t r (n)+’ p=’+s t r (p)+’ ) ’ )

23 x=np . arange (0 ,max( s t a t ) +1 ,1)24 y=binomia le (n , x , p)

25 p l t . p l o t (x , y , ’ ro ’ , l a b e l=’ Loi b inomia le ’ )26 p l t . h i s t ( s tat , x , normed=True , c o l o r=’ blue ’ , a l i g n=’ l e f t ’ , rwidth =0.9)27 l egend = p l t . l egend ( l o c=’ upper l e f t ’ , shadow=True )28 p l t . show ( )

Page 8: B. Ischi - MaTheX

Premieres definitions (page 8/61)

Le reste du programme appel nbtirages=100000 fois la fonction canal et compte le nombre de bitsmodifies. Le vecteur m=np.zeros(n).astype(int) contient n des zeros. L’histogramme du nombre de bitsmodifies est affiche ainsi que la loi binomiale (voir figure 1).

Figure 1. Histogramme du nombre de bits modifies par le canal

3. Premieres definitions

Definition 3.1. Soit c : Fk2 → Fn2 une application injective et C = Im(c) ⊆ Fn2 un codebinaire.

(1) On appelle distance minimale de C le nombre defini par

d = inf{‖~m− ~m′‖1

∣∣∣ ~m, ~m′ ∈ C, ~m 6= ~m′}

ou

‖~m‖1 :=n∑j=1

mj

Les trois nombres (n, k, d) sont appeles les parametres du code binaire C. On appellelongueur du code le nombre n. Par ailleurs, ‖~m‖1 est appele le poids de ~m.

(2) Le code C est dit lineaire si C est un F2 sous-espace vectoriel de Fn2 .1

Remarque 3.2.

(1) Il est facile de verifier que le poids est une norme sur l’espace vectoriel Fn2 (i.e. ‖~m‖1 ≥ 0

et ‖~m‖1 = 0 ⇔ ~m = ~0, ‖λ~m‖1 = λ‖~m‖1 et ‖~m + ~m′‖1 ≤ ‖~m‖ + ‖~m′‖, ∀ ~m, ~m′ ∈ Fn2 ,∀λ ∈ F2). Par consequent, d(~m, ~m′) := ‖~m− ~m′‖1 est une distance, appelee la distancede Hamming (i.e. d(~m, ~m′) = d(~m′, ~m), d(~m, ~m′) = 0 ⇔ ~m = ~m′ et d(~m, ~m′) ≤d(~m, ~m′′) + d(~m′′, ~m′), ∀ ~m, ~m′, ~m′′ ∈ Fn2 ). On appelle boule de Hamming de centre~m ∈ Fn2 et de rayon t le sous-ensemble:

B(~m, t) = {~m′ ∈ Fn2∣∣∣ ‖~m− ~m′‖1 ≤ t}

1Dans ces notes de cours, nous allons considerer uniquement des codes lineaires.

Page 9: B. Ischi - MaTheX

Premieres definitions (page 9/61)

(2) On peut toujours detecter une erreur ~e de poids ‖~e‖1 < d. En effet, dans ce cas ~m′ =~m + ~e 6∈ C car si ~m′ appartenait a C, alors on aurait ‖~m′ − ~m‖1 = ‖~e‖1 < d, unecontradiction.

(3) Pour un code lineaire, on peut toujours corriger une erreur de poids ‖~e‖1 <d2. En effet,

soient

~m′ = ~m1 + ~e1 et ~m′ = ~m2 + ~e2 avec ‖~e1‖ <d

2> ‖~e2‖1

Alors

‖~m1 − ~m2‖1 = ‖~e1 − ~e2‖1 ≤ ‖~e1‖1 + ‖~e2‖1 <d

2+d

2= d

en vertu de l’inegalite du triangle. Par consequent, ~m1 = ~m2.(4) Si le code binaire C est lineaire, alors

d = inf{‖~m‖1

∣∣∣ ~m ∈ C, ~m 6= ~0}

Definition 3.3.

(1) Soit t un nombre entier. Un code binaire C de longueur n est t-correcteur si

∀ ~m, ~m′ ∈ C, B(~m, t) ∩B(~m′, t) = ∅

en d’autres termes si les boules de rayon t centrees en les elements de C sont disjointes.(2) Un code binaire C de longueur n est t-correcteur parfait s’il est t-correcteur et si

Fn2 =⊔~m∈C

B(~m, t)

est l’union disjointe des boules de rayon t centrees en les elements de C, en d’autrestermes si les boules de rayon t centrees en les elements de C forment une partition de Fn2 .

Theoreme 3.4. Soit C ⊆ Fn2 un code binaire de distance minimale d contenant N elements(i.e. N = #C). Alors

(1) C est t-correcteur ⇔ d ≥ 2t+ 1(2) C est t-correcteur parfait ⇔ d = 2t+ 1 et N (Cn

0 + Cn1 + · · ·+ Cn

t ) = 2n

Demonstration.

(1) Soient ~m, ~m′ ∈ C et ~e = ~m′ − ~m. Notons

supp(~e) ={j ∈ {1, · · · , n}

∣∣∣ ej 6= 0}

Soit encore D ={~a ∈ Fn2

∣∣∣ supp(~a) ⊆ supp(~e)}

. Notons d0 = ‖~m′ − ~m‖1 = ‖~e‖1. Soit

~a ∈ D avec ‖~a‖1 = t0 et ~c = ~m + ~a. Alors, ‖c − ~m‖1 = ‖~a‖1 = t0 et ‖~m′ − ~c‖ =‖~m′ − ~m− ~a‖1 = ‖~e− ~a‖1 = d0 − t0.

Supposons que C est t-correcteur. Posons t0 = t. Alors d0 − t > t, c’est-a-dired0 ≥ 2t + 1. Si ~m et ~m′ sont tels que d0 = d, cela donne d ≥ 2t + 1. Reciproquement, sid ≥ 2t+ 1, alors d0 ≥ 2t+ 1 et d0 − t ≥ t+ 1 > t ce qui montre que C est t correcteur.

(2) Supposons que C est t-correcteur parfait, et soit ~m ∈ C et ~c ∈ Fn2 tels que d(~m, ~c) = t+1.Comme le code est parfait, il existe ~m′ ∈ C tel que d(~m′,~c) ≤ t. Par consequent,d(~m, ~m′) ≤ d(~m,~c) + d(~c, ~m′) ≤ t + 1 + t = 2t + 1. Par consequent, d ≤ 2t + 1. Comme

Page 10: B. Ischi - MaTheX

Premiers exemples (page 10/61)

C est t-correcteur, nous savons que d ≥ 2t+ 1. Il suit que d = 2t+ 1. Par ailleurs, etantdonne qu’une boule de rayon t contient

Cn0 + Cn

1 + · · ·Cnt

elements, il suit queN (Cn

0 + Cn1 + · · ·Cn

t ) = 2n

Reciproquement, si d = 2t + 1, alors, en vertu du point (1), nous savons que le codeest t-correcteur. Si, de plus, l’egalite ci-dessus est verifiee, alors les boules centrees enles differents elements du code sont disjointes et leur union contient le meme nombred’elements que Fn2 , ce qui prouve le code est t-correcteur parfait.

Remarque 3.5.

(1) Pour un code binaire C 1-correcteur de longueur n contenant N elements, on a N(n+1) ≤2n. De plus, il est parfait⇔ N(n+1) = 2n⇔ il existe un entier r > 1 tel que n = 2r−1 etN = 2n−r (penser au theoreme fondamental de l’arithmetique). En effet, il faut remarquerqu’une boule de rayon 1 de Fn2 contient n + 1 elements (1 au centre et n a distance 1).Dans le cas lineaire, les parametres du code sont de la forme

(2r − 1, 2r − 1− r, 3)

c’est-a-dire, (3, 1, 3), (7, 4, 3), (15, 11, 3), ... Dans le cas r = 2, le code lineaire est donnepar C = {(0, 0, 0); (1, 1, 1)}.

(2) Nous verrons qu’il existe un seul code binaire t-correcteur parfait avec t > 1: c’est le codede Golay.

4. Premiers exemples

Les codes presentes dans cette section sont appeles codes lineaires triviaux.

Exemple 4.1. L’exemple le plus rudimentaire consiste a repeter n a fois chaque bit dumessage. Le code binaire C est donne par

C ={~0, ~m0

}ou ~m0 =

11...1

∈ Fn2

Les parametres de ce code sont (n, 1, n). Il permet de corriger toute erreur ~e ∈ Fn2 telle que‖~e‖1 < n

2. Le programme Python 3 qui suit simule la transmission d’un message encode par

repetition des bits:

1 import numpy as np2 #

3 def d i f f ( a , b ) :

4 return ( a−b)%25 #

6 def cana l (m, prob=1/3) :

7 return d i f f (m, np . random . cho i c e ( [ 1 , 0 ] , l en (m) ,p=[prob ,1−prob ] ) )8 #

9 def c o d e r e p e t i t i o n (m,m0) :

10 return np . concatenate (np . t ensordot (m,m0, axes =0) , a x i s=None )11 #

Page 11: B. Ischi - MaTheX

Premiers exemples (page 11/61)

12 def d e c o d e r e p e t i t i o n (Cm,m0) :

13 lm0=len (m0)

14 l=i n t ( l en (Cm) /lm0 )15 Cm=Cm∗1#Attent ion : i nd i s p en sa b l e ou u t i l i s e r l e module copy (Cm=copy . copy (Cm) )

16 Cm. shape=( l , lm0 )

17 pr0=np . ones ( lm0 ) . astype ( i n t )18 pr0 . shape=(lm0 , 1 )

19 a=np . round (np . matmul (Cm, pr0 ) /lm0 ) . astype ( i n t )

20 a . shape=( l )21 return a

22 #23 nbte s t e s=3

24 longueur message=4

25 lm0=526 m0=np . ones ( lm0 ) . astype ( i n t )

27 print (m0, ” −> m0” )

28 for n in range (0 , nbtes te s , 1 ) :29 a=np . random . rand int (0 , 2 , longueur message )

30 print ( a , ” −> message” )

31 m=c o d e r e p e t i t i o n ( a ,m0)32 print (m, ” −> message code ” )

33 Cm=canal (m,1 /5 )34 print (Cm, ” −> message code avec e r r e u r s ( apres cana l ) ” )

35 a f=d e c o d e r e p e t i t i o n (Cm,m0)

36 print ( af , ” −> message c o r r i g e ” )37 print ( ”nb e r r e u r s cana l /nb e r r e u r s i n i−f i n : ” , sum( d i f f (Cm,m) ) , ” / ” ,sum( d i f f ( a , a f ) ) )

Son execution donne, par exemple,

[1 1 1 1 1] -> m0

[0 0 0 1] -> message

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1] -> message code

[0 0 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 1 1 1] -> message code avec erreurs (apres canal)

[0 0 0 1] -> message corrige

nb erreurs canal/nb erreurs ini-fin: 4 / 0

[1 0 0 0] -> message

[1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] -> message code

[0 0 1 1 0 0 0 0 0 0 0 0 1 0 1 0 0 0 1 0] -> message code avec erreurs (apres canal)

[0 0 0 0] -> message corrige

nb erreurs canal/nb erreurs ini-fin: 6 / 1

[1 1 1 0] -> message

[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0] -> message code

[0 0 1 0 0 1 1 1 0 1 1 1 1 1 0 0 0 0 0 0] -> message code avec erreurs (apres canal)

[0 1 1 0] -> message corrige

nb erreurs canal/nb erreurs ini-fin: 6 / 1

Page 12: B. Ischi - MaTheX

Premiers exemples (page 12/61)

Les fonctions diff et canal ont deja ete decrites plus haut. Rappelons que le produit tensorieldes matrices est defini par

A⊗B =

a11 · · · a1n...

...am1 · · · amn

⊗b11 · · · b1q

......

bp1 · · · bpq

=

a11B · · · a1nB...

...am1B · · · amnB

=

a11b11 · · · a11b1q a1nb11 · · · a1nb1q...

... · · · ......

a11bp1 · · · a11bpq a1nbp1 · · · a1nbpq...

...am1b11 · · · am1b1q amnb11 · · · amnb1q

...... · · · ...

...am1bp1 · · · am1bpq amnbp1 · · · amnbpq

Le produit tensoriel d’une matrice m× n avec une matrice p× q est une matrice mp× nq.

La fonction code repetition renvoie le produit tensoriel ~m ⊗ ~m0. Donc chaque bit egal a 1 estremplace par n×1 et chaque bit egal a 0 est remplace par n×0 ou n = ‖~m0‖1 est la longueur de~m0. La fonction decode repetition transforme le message apres le canal, dont la longueur est egale ala longueur du message initial ( l dans le programme) ×n en une matrice l×n (par la methodeshape du module numpy). Elle est multipliee a droite par le vecteur ~m0 (par la methode matmul dumodule numpy) et chaque element du produit est divise par n et arrondi a l’entier le plus proche,soit 0 ou 1.

Remarquons que pour n impair, le code de repetition est parfait. En effet, soit ~m ∈ F52. Si

‖~m‖1 ≥ 3, alors ‖~m− ~m0‖ ≤ 2 et si ‖~m‖1 ≤ 2, alors ‖~m−~0‖ ≤ 2

Remarque 4.2. Plus generalement, pour tout ~0 6= ~m0 ∈ Fn2 , le code {~0, ~m0} est un codelineaire de parametres (n, 1, ‖~m‖1). Le script Python 3 qui suit simule la transmission d’un messageavec un tel code

1 import numpy as np

2 #3 def d i f f ( a , b ) :

4 return ( a−b)%2

5 #6 def cana l (m, prob=1/3) :

7 return d i f f (m, np . random . cho i c e ( [ 1 , 0 ] , l en (m) ,p=[prob ,1−prob ] ) )

8 #9 def c o d e r e p e t i t i o n (m,m0) :

10 return np . concatenate (np . t ensordot (m,m0, axes =0) , a x i s=None )

11 #12 def d e c o d e r e p e t i t i o n (Cm,m0) :

13 n=len (m0)14 lCm=len (Cm)

15 l=i n t (lCm/n)

16 prm0=np . t ensordot (np . ones ( l ) . astype ( i n t ) ,m0, axes =0)17 prm0 . shape=(lCm)

18 Cm=Cm∗prm0

19 Cm. shape=(l , n )20 pr0=np . ones (n) . astype ( i n t )

21 pr0 . shape=(n , 1 )

22 a=np . round (np . matmul (Cm, pr0 ) /n) . astype ( i n t )23 a . shape=( l )

Page 13: B. Ischi - MaTheX

Premiers exemples (page 13/61)

24 return a

25 #

26 nbte s t e s=327 longueur message=4

28 n=5

29 m0=np . z e ro s (n) . astype ( i n t )30 while sum(m0)==0:

31 m0=np . random . rand int (0 , 2 , i n t (n) )

32 print ( ”m0” ,m0)33 for x in range (0 , nbtes te s , 1 ) :

34 a=np . random . rand int (0 , 2 , longueur message )35 print ( a , ” −> message” )

36 m=c o d e r e p e t i t i o n ( a ,m0)

37 print (m, ” −> message code ” )38 Cm=canal (m,1 /5 )

39 print (Cm, ” −> message code avec e r r e u r s ( apres cana l ) ” )

40 a f=d e c o d e r e p e t i t i o n (Cm,m0)41 print ( af , ” −> message c o r r i g e ” )

42 print ( ”nb e r r e u r s cana l /nb e r r e u r s i n i−f i n : ” , sum( d i f f (Cm,m) ) , ” / ” ,sum( d i f f ( a , a f ) ) )

Son execution donne, par exemple,m0 [1 1 1 1 0]

[1 0 0 1] -> message

[1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0] -> message code

[1 1 1 0 0 1 0 0 0 0 0 0 1 1 0 0 0 1 1 0] -> message code avec erreurs (apres canal)

[1 0 0 0] -> message corrige

nb erreurs canal/nb erreurs ini-fin: 6 / 1

[1 1 0 0] -> message

[1 1 1 1 0 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0] -> message code

[1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0] -> message code avec erreurs (apres canal)

[1 1 0 0] -> message corrige

nb erreurs canal/nb erreurs ini-fin: 3 / 0

[1 1 1 1] -> message

[1 1 1 1 0 1 1 1 1 0 1 1 1 1 0 1 1 1 1 0] -> message code

[1 1 1 1 0 1 1 1 0 0 1 1 1 1 0 1 1 1 1 0] -> message code avec erreurs (apres canal)

[1 1 1 1] -> message corrige

nb erreurs canal/nb erreurs ini-fin: 1 / 0

La seule difference avec l’exemple qui precede se trouve dans la fonction decode repetition. Ilfaut compter les bits egaux a 1 seulement aux positions ou ~m0 ne vaut pas 0 (c’est le role dela commande Cm=Cm∗prm0 (par exemple np.array ([1,0,1]) ∗np.array ([0,1,1]) donne array ([0, 0, 1])) ou prm0=np.

tensordot(np.ones(l).astype(int),m0,axes=0)).

Exemple 4.3. Un autre exemple bien connu consiste a ajouter a chaque octet (8 bits) un bitde parite egal a la somme des 8 bits modulo 2. Les parametres d’un tel code sont (9, 8, 2). Il estcompose des 28 mots de 9 bits de poids pairs. Le script Python 3 qui suit simule la transmissiond’un message utilisant ce code:

1 import numpy as np

2 #

3 def d i f f ( a , b ) :4 return ( a−b)%2

5 #6 def cana l (m, prob=1/3) :7 return d i f f (m, np . random . cho i c e ( [ 1 , 0 ] , l en (m) ,p=[prob ,1−prob ] ) )

8 #9 def m e s s a g e s p l i t (m, nb) :

10 m=m∗1#Attent ion : i nd i s p en sa b l e ou u t i l i s e r l e module copy (Cm=copy . copy (Cm) )

11 l=i n t ( l en (m) /nb)12 m. shape=( l , nb )

13 return m

14 #15 def p a r i t e (m, nb) :

Page 14: B. Ischi - MaTheX

Codes lineaires (page 14/61)

16 m=m e s s a g e s p l i t (m, nb)

17 pr=np . ones (nb) . astype ( i n t )

18 pr . shape=(nb , 1 )19 par=np . matmul (m, pr )%2

20 return par

21 #22 def c o d e p a r i t e (m) :

23 par=p a r i t e (m, 8 )

24 m=m e s s a g e s p l i t (m, 8 )25 pr=np . concatenate ( (m, par ) , a x i s =1)

26 pr . shape=( l en (m) ∗9)27 return pr

28 #

29 nbte s t e s=430 nbocte t s=2

31 longueur message=nbocte t s ∗832 for x in range (0 , nbtes te s , 1 ) :33 a=np . random . rand int (0 , 2 , longueur message )

34 print ( a , ” −> message” )

35 m=c o d e p a r i t e ( a )36 print (m, ” −> message code ” )

37 Cm=canal (m,1 /5 )38 print (Cm, ” −> message code avec e r r e u r s ( apres cana l ) ” )

39 e r r e u r s=p a r i t e (Cm, 9 )

40 e r r e u r s . shape=(nbocte t s )41 print ( e r r eu r s , ” −> d e t e c t i o n des e r r e u r s ” )

Son execution donne, par exemple,[1 1 0 1 1 0 1 1 1 0 0 0 0 0 0 0] -> message

[1 1 0 1 1 0 1 1 0 1 0 0 0 0 0 0 0 1] -> message code

[1 1 0 1 1 0 0 1 0 0 1 1 0 0 0 1 1 1] -> message code avec erreurs (apres canal)

[1 1] -> detection des erreurs

[0 1 1 1 0 0 1 0 0 1 1 1 0 1 0 0] -> message

[0 1 1 1 0 0 1 0 0 0 1 1 1 0 1 0 0 0] -> message code

[0 1 1 1 1 0 1 0 1 0 1 1 1 1 1 1 0 0] -> message code avec erreurs (apres canal)

[0 0] -> detection des erreurs

[0 0 0 1 1 1 1 1 1 0 1 0 0 0 1 1] -> message

[0 0 0 1 1 1 1 1 1 1 0 1 0 0 0 1 1 0] -> message code

[0 1 0 1 1 1 1 0 0 0 0 0 0 0 0 1 1 1] -> message code avec erreurs (apres canal)

[1 1] -> detection des erreurs

[1 0 1 1 1 0 0 1 1 1 0 0 0 0 1 0] -> message

[1 0 1 1 1 0 0 1 1 1 1 0 0 0 0 1 0 1] -> message code

[1 0 0 1 1 0 1 0 1 1 1 0 0 0 1 1 0 1] -> message code avec erreurs (apres canal)

[1 1] -> detection des erreurs

5. Codes lineaires

Nous nous restreignons maintenant au cas ou l’application

c : Fk2 → Fn2

est linaire. Nous notons sa matrice relativement a la base canonique par G (elle est appelee lamatrice generatrice du code). C’est une matrice a n lignes et k colonnes.

5.1. Rappels d’algebre lineaire.Notons E = Fn2 . Rappelons que l’espace dual de E est l’espace vectoriel des formes lineaires

sur E

E∗ ={φ : E → F2

∣∣∣ φ lineaire}

Page 15: B. Ischi - MaTheX

Codes lineaires (page 15/61)

Soit (~f1, · · · , ~fn) une base de E. On definit la base duale (f ∗1 , · · · , f ∗n) par

f ∗i (~fj) = δij =

{1 si i = j0 si i 6= j

C’est effectivement une base, car pour tout φ ∈ E∗, on a

φ(~x) = φ

(n∑j=1

xj ~fj

)=

n∑j=1

xjφ(~fj) =n∑j=1

φ(~fj)f∗j (~x) ⇒ φ =

n∑j=1

φ(~fj)f∗j

et(n∑j=1

λjf∗j

)(~x) = 0 ∀ ~x ∈ Fn2 ⇒ λ1 = 0( remplacer ~x par ~f1), · · · λn = 0( remplacer ~x par ~fn)

Il suit en particulier que le dual de E est egalement de dimension n. Si V est un un sous-espacevectoriel de E, on definit

V ◦ ={φ ∈ E∗

∣∣∣ φ(~x) = 0 ∀ ~x ∈ V}

On a

dim(V ) + dim(V ◦) = n

En effet, soit (~f1, · · · , ~fn) une base de E telle que (~f1, · · · , ~fk) soit une base de V . Alors,(f ∗k+1, · · · , f ∗n) est une base de V ◦ car

φ =n∑j=1

µj ~f∗j ∈ V ◦ ⇒ φ(~f ∗i ) = 0 ∀ 1 ≤ i ≤ k ⇒ µ1 = · · · = µk = 0

Si W est un sous-espace vectoriel de E∗, on definit

W ◦ ={~x ∈ E

∣∣∣ φ(~x) = 0, ∀φ ∈ W}

Si V est un sous-espace vectoriel de E, alors, par definition,

V ⊆ V ◦◦

Par ailleurs,

dim(V ) + dim(V ◦) = dim(E) = dim(E∗) = dim(V ◦) + dim(V ◦◦) ⇒ dim(V ) = dim(V ◦◦)

et il suit que

V ◦◦ = V

Page 16: B. Ischi - MaTheX

Codes lineaires (page 16/61)

5.2. Matrice verificatrice.Comme l’application c est injective, son image est un sous-espace vectoriel de dimension k et

en vertu de ce que nous venons de demontrer

dim(Im(G)◦) = n− k

Soit (φ1, · · · , φn−k) une base de Im(G)◦. La matrice de chaque φj est une matrice a une ligne etn colonnes. Notons P la matrice dont les lignes sont les matrices des formes φ1 a φn−k. Alors

~x ∈ Im(G) ⇔ P~x = ~0

En d’autres termes,

Fk2G(n×k)−→ Fn2

P (n−k×n)−→ Fn−k2 et Im(G) = Ker(P )

La matrice P est appelee la matrice verificatrice. On a

PG = 0

et P est surjective, car en vertu du theoreme des dimensions,

dim(Im(P )) = n− dim(Ker(P )) = n− k

Soit ~a ∈ Fk2 un message. Il est code par

~m = G~a

Le canal induit eventuellement une erreur

canal: ~m 7→ ~m′ = ~m+ ~e

Il suit que

P ~m′ = P (~m+ ~e) = P ~m︸︷︷︸=~0

+P~e = P~e

Notons C = c(Fk2). La distance minimale du code C est ≥ d si et seulement si P~e 6= ~0 pour tout

~e ∈ Fn2 tel que 0 < ‖~e‖1 < d. En effet, si ~m ∈ C, alors ~m + ~e 6∈ C ⇔ P~e 6= ~0. Par ailleurs, lecode C est t -correcteur si et seulement si les elements de l’ensemble

S ={P~e∣∣∣ ~e ∈ Fn2 et ‖~e‖1 ≤ t

}⊆ Fn−k2

sont tous differents. En effet, si C n’est pas t-correcteur, alors il existe ~m, ~m′ ∈ C et ~e1, ~e2 ∈ Fn2avec ‖~e1‖1 ≤ t ≥ ‖~e2‖1, tels que ~m + ~e1 = ~m′ + ~e2. Alors P (~e1 − ~e2) = P (~m′ − ~m) = ~0, et doncP~e1 = P~e2. Reciproquement, si il existe ~e1, ~e2 ∈ Fn2 tels que P~e1 = P~e2 et ‖~e1‖1 ≤ t ≥ ‖~e2‖1.Alors P (~e1 − ~e2) = 0, c’est-a-dire, ~e1 − ~e2 ∈ C. Soit ~m ∈ C et ~m′ = ~m + ~e1 − ~e2 ∈ C.Alors ~m′ + ~e2 = ~m + ~e1 avec ‖~e1‖1 ≤ t ≥ ‖~e2‖1 et nous avons trouve un element qui est dansB(~m, t) ∩ B(~m′, t), ce qui montre que C n’est pas t-correcteur. Pour finir, signalons que P~e estappele le syndrome de ~e.

Page 17: B. Ischi - MaTheX

Codes lineaires (page 17/61)

5.3. Codes de Hamming.Comme nous l’avons deja mentionne, il existe qu’un seul code binaire non trivial t-correcteur

parfait avec t > 1: c’est le code de Golay que nous presenterons plus loin. Commencons donc parconstruire des codes 1-correcteurs parfaits lineaires. Notons (~e1, · · · , ~en) la base canonique de Fn2 .

Pour que le code soit 1-correcteur, il faut que P~ej 6= ~0 pour tout 1 ≤ j ≤ n et il faut que lesP~ej (pour 1 ≤ j ≤ n) soient tous differents. Or P~ej est la j-eme colonne de P . Par consequent,un code lineaire est 1-correcteur si et seulement si les colonnes de la matrice verificatrice P sonttoutes differentes et si aucune colonne n’est nulle.

Exemple 5.1. Commencons par r = n − k = 2. Alors P a au maximum 3 colonnes. Parexemple

P =

(1 0 10 1 1

)Ainsi, n = 3, k = 1 et

G =

G11

G21

G31

avec G11 +G31 = 0 et G21 +G31 = 0 c’est-a-dire G =

111

C’est le code (trivial) de repetition avec n = 3. Ses parametres sont (3, 1, 3).

Exemple 5.2. Considerons maintenant le cas r = n−k = 3. Alors P est une matrice 3×7. Sescolonnes sont tous les mots de 3 bits, sauf 000. Nous choisissons l’ordre des colonnes de manierea ce que les lignes soient des permutations cycliques les unes des autres:

P =

1 0 1 1 1 0 00 1 0 1 1 1 00 0 1 0 1 1 1

La somme d’une paire quelconque de colonnes de P n’est jamais nulle, en revanche, la somme descolonnes 1,2 et 4, par exemple, est nulle. Cela signifie que la distance entre deux mots du codeest toujours > 2 et que la distance minimale est 3. De plus, la matrice P est de rang trois, parconsequent, son noyau est de dimension 7 − 3 = 4. Les parametres de ce code sont (7, 4, 3). Ils’appelle le code de Hamming H3.

Les colonnes de G doivent etres orthogonales aux lignes de P :

G1j

G2j

G3j

G4j

G5j

G6j

G7j

et

G1j+ G3j+ G4j+ G5j = 0G2j+ G4j+ G5j+ G6j = 0

G3j+ G5j+ G6j+ G7j = 0

G1j+ G4j+ G6j+ G7j = 0G2j+ G4j+ G5j+ G6j = 0

G3j+ G5j+ G6j+ G7j = 0⇒

G1j = G4j +G6j +G7j

G2j = G4j +G5j +G6j

G3j = G5j +G6j +G7j

Page 18: B. Ischi - MaTheX

Codes lineaires (page 18/61)

Voici une solution dont les colonnes sont obtenues les unes a partir des autres egalement parpermutation cyclique:

G =

1 0 0 01 1 0 00 1 1 01 0 1 10 1 0 10 0 1 00 0 0 1

Le rang de G est 4 et la sous-matrice des 4 premieres lignes est inversible. Son inverse est donnepar

1 0 0 01 1 0 01 1 1 00 1 1 1

Le script Python 3 qui suit implemente le codage et le decodage de Hamming H3. La fonction

message() invite l’utilisateur a taper un texte sans accents et transforme chaque lettre (via le codeASCII) en un octet (8 bits). La methode reshape permet de redimensionner un tableau de nombres(la lecture du tableau initial se faisant comme un texte: de gauche a droite et du haut vers le bas).La fonction code H3 coupe le message en paquets de 4 bits (avec la methode .reshape) et multipliechaque paquet de 4 bits par le matrice G. Apres le canal (deja commente plus haut), la fonctiondecode H3 coupe le message code en paquet de 7 bits. Chaque paquet est multiplie par la matriceP ce qui donne un mot de 3 bits qui est transforme en un nombre en base 10 puis qui est associea une position du bit d’erreur par le dictionnaire tra. On ajoute ensuite a chaque paquet de 7 bitsl’erreur reconstituee pour retrouver le message code sans erreurs (comme indique, le resultat estcorrect seulement si au plus un bit par paquet de 7 bits est errone). Finalement, les paquets de 7bits sont retransformes en paquets de 4 bits par la matrice inverse de la sous-matrice constitueedes 4 premieres lignes de la matrice G.

1 import numpy as np2 #

3 def d i f f ( a , b ) :4 return ( a−b)%2

5 #

6 def cana l (m, prob=1/3) :7 #e=np . array ( l en (m) //14∗ [ 1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,1 ] )

8 e=np . random . cho i c e ( [ 1 , 0 ] , l en (m) ,p=[prob ,1−prob ] )

9 return d i f f (m, e ) , e10 #

11 def code H3 ( a ) :

12 l=l en ( a )13 G=np . array ( [ [ 1 , 0 , 0 , 0 ] , [ 1 , 1 , 0 , 0 ] , [ 0 , 1 , 1 , 0 ] , [ 1 , 0 , 1 , 1 ] , [ 0 , 1 , 0 , 1 ] , [ 0 , 0 , 1 , 0 ] , [ 0 , 0 , 0 , 1 ] ] )

14 a=a . reshape ( l //4 ,4) . t ranspose ( )15 m=np . matmul (G, a )%216 m=m. transpose ( ) . reshape ( l //4∗7)

17 return m18 #

19 def decode H3 (Cm) :

20 l=l en (Cm)21 m=Cm

22 Cm=Cm. reshape ( l //n , n) . t ranspose ( )

23 P=np . array ( [ [ 1 , 0 , 1 , 1 , 1 , 0 , 0 ] , [ 0 , 1 , 0 , 1 , 1 , 1 , 0 ] , [ 0 , 0 , 1 , 0 , 1 , 1 , 1 ] ] )24 v e r i f=np . matmul (P,Cm)%2

Page 19: B. Ischi - MaTheX

Codes lineaires (page 19/61)

25 num=np . array ( [ 1 , 2 , 4 ] )

26 t ra = { 0 : [ 0 , 0 , 0 , 0 , 0 , 0 , 0 ] , 1 : [ 1 , 0 , 0 , 0 , 0 , 0 , 0 ] , 2 : [ 0 , 1 , 0 , 0 , 0 , 0 , 0 ] , 5 : [ 0 , 0 , 1 , 0 , 0 , 0 , 0 ] ,

27 3 : [ 0 , 0 , 0 , 1 , 0 , 0 , 0 ] , 7 : [ 0 , 0 , 0 , 0 , 1 , 0 , 0 ] , 6 : [ 0 , 0 , 0 , 0 , 0 , 1 , 0 ] , 4 : [ 0 , 0 , 0 , 0 , 0 , 0 , 1 ] }28 cor r1=np . matmul (num, v e r i f )

29 cor r2 =[ ]

30 for x in co r r1 :31 co r r2=cor r2+tra [ x ]

32 m=(m+np . array ( cor r2 ) )%2

33 m=m. reshape ( l //7 ,7) . t ranspose ( )34 inv=np . array ( [ [ 1 , 0 , 0 , 0 , 0 , 0 , 0 ] , [ 1 , 1 , 0 , 0 , 0 , 0 , 0 ] , [ 1 , 1 , 1 , 0 , 0 , 0 , 0 ] , [ 0 , 1 , 1 , 1 , 0 , 0 , 0 ] ] )

35 a=np . matmul ( inv ,m)%236 a=a . t ranspose ( ) . reshape ( l //7∗4)

37 return a

38 #39 def message ( ) :

40 t ex t e=input ( ”Tapez un tex t e : ” )

41 t ex t eb in=’ ’42 for l e t t r e in t ex t e :

43 t ex t eb in=tex t eb in+np . b ina ry r ep r ( ord ( l e t t r e ) , width=8)

44 return texteb in , t ex t e45 #

46 def a f f i c h a g e e r r e u r s c a n a l ( e , texte , newtexte ) :47 l=l en ( e )

48 t e s t=e . reshape ( l //7 ,7)

49 j=150 print ( ”\nAnalyse : ” )

51 for x in t e s t :

52 i f j%2==1:53 print ( ”\n” , t ex t e [ i n t ( j /2) ] , ”−>” , newtexte [ i n t ( j /2) ] , ” : ” , end=”” )

54 e r r=sum( x )

55 print ( err , ” ” , end=”” )56 i f err >1:

57 print (x , ” ” , end=”” )

58 j=j+159 print ( )

60 #

61 def a f f i c h a g e m e s s a g e t r a n s m i s ( abin , t ex t e ) :

62 abin=abin . reshape ( l , 8 )

63 abin=np . matmul ( abin , np . array ( [ 1 2 8 , 6 4 , 3 2 , 1 6 , 8 , 4 , 2 , 1 ] ) . reshape (8 , 1 ) )64 newtexte=’ ’

65 j=0

66 e r r=067 for x in abin :

68 l e t t r e=chr ( x )

69 i f l e t t r e != tex t e [ j ] :70 e r r=e r r+1

71 newtexte=newtexte+l e t t r e

72 j=j+173 print ( ’ Texte transmis : ’ , newtexte )

74 print ( ”Nombre d ’ e r r e u r s ” , e r r )75 return newtexte

76 #77 a , t ex t e=message ( )78 l=l en ( t ex t e )79 k=4

80 n=781 a=np . array ( l i s t ( a ) , dtype=i n t )

82 m=code H3 ( a )

83 Cm, e=cana l (m, 0 . 1 )84 abin=decode H3 (Cm)

85 newtexte=a f f i c h a g e m e s s a g e t r a n s m i s ( abin , t ex t e )86 a f f i c h a g e e r r e u r s c a n a l ( e , texte , newtexte )

Voici des exemples de l’execution du code:>>python3 H3.py

Page 20: B. Ischi - MaTheX

Codes lineaires (page 20/61)

Tapez un texte: bonjour

Texte transmis: boNjour

Nombre d’erreurs 1

Analyse:

b -> b : 0 0

o -> o : 1 0

n -> N : 2 [0 0 1 1 0 0 0] 0

j -> j : 0 0

o -> o : 1 0

u -> u : 1 1

r -> r : 1 1

>>python3 H3.py

Tapez un texte: bonjour

Texte transmis: bonjour

Nombre d’erreurs 0

Analyse:

b -> b : 0 0

o -> o : 1 0

n -> n : 0 0

j -> j : 1 0

o -> o : 0 0

u -> u : 0 0

r -> r : 0 0

Remarque 5.3. Pour chaque nombre entier r, on peut proceder de maniere similaire. Onobtient un code avec les parametres

(n = 2r − 1, k = 2r − 1− r, d = 3)

En effet, il y a 2r−1 mots differents non nuls avec r bits. C’est le nombre de colonnes de la matriceP , donc le nombre n = 2r − 1. Cette matrice est de rang r (car elle contient forcement commesous-matrice la matrice identite r × r). Par consequent, en vertu du theoreme des dimensions, lenoyau de la matrice P est de dimension 2r − 1− r. C’est le nombre k = 2r − 1− r. Finalement,la somme de n’importe quelle paire de colonnes de la matrice P n’est jamais nulle. Ceci prouveque d > 2. En revanche, la somme des colonnes

1 · · · 0 · · · 10 · · · 1 · · · 10 · · · 0 · · · 0...

......

est nulle, ce qui montre que d = 3. La construction expliquee plus haut de codes lineaires 1-correcteurs mene a des codes de parametres

(3, 1, 3)

(7, 4, 3)

(15, 11, 3)

(31, 26, 3)

...

Page 21: B. Ischi - MaTheX

Extension paire (page 21/61)

Ces codes sont appeles des codes de Hamming. Deux codes sont dits equivalents si la matricegeneratrice G de l’un est obtenue en permutant les colonnes de la matrice G′ de l’autre. Deuxcodes equivalents ont les memes parametres. En resume: tous les codes lineaires 1-correcteursparfaits sont des codes de Hamming. Notons qu’il existe des codes 1-correcteurs parfaits nonlineaires.

6. Extension paire

Soit C un code lineaire de longueur n. Pour ~m ∈ C, on definit ε(~m) = ‖ ~M‖1 (mod 2). C’estune forme lineaire sur Fn2 appelee parite:

ε : Fn2 −→ F2

~m 7→ ε(~m) =

{1 si ‖~m‖1 est impaire0 si ‖~m‖1 est paire

Comme ε est lineaire, la somme de deux elements pairs est paire, la somme de deux elementsimpairs est paire et la somme d’un element pair et d’un element impair est impaire:

ε(~m) = 0 = ε(~m′) ⇒ ε(~m+ ~m′) = 0

ε(~m) = 1 = ε(~m′) ⇒ ε(~m+ ~m′) = 0

ε(~m) = 1, ε(~m′) = 0 ⇒ ε(~m+ ~m′) = 1

Par consequent, soit C contient uniquement des elements pairs (on dit que le code est pair),soit C contient autant d’elements pairs que d’elements impairs (on dit que le code est impair).En effet, soit ~m0 impair (i.e. ε(~m0) = 1). Alors, l’application ~m 7→ ~m + ~m0 est une bijection del’ensemble des elements pairs dans l’ensemble des elements impairs.

Dans le cas ou le code C est impair, on peut construire a partir de C deux codes pairs: onpeut considerer le sous-code (i.e. le sous-espace vectoriel) compose uniquement des elements pairsou ajouter a C un bit de parite.

Etant donne un code binaire C de longueur n, l’extension paire de C, est le code obtenu apartir de C an ajoutant un bit de parite. On note le code ainsi obtenu par C2:

C =

m0

m1...

mn−1∑n−1j=0 mj (mod 2)

∣∣∣ ~m =

m0...

mn−1

∈ C

Si G est une matrice generatrice de C, alors la matrice G definie par

G =

G00 · · · G0n−1

......

Gn−10 · · · Gn−1n−1∑n−1j=0 Gj0(mod 2) · · ·

∑n−1j=0 Gjn−1(mod 2)

2A partir de maintenant, nous adoptons une notation plus “informatique” en numerotant les composantes des

vecteurs de 0 a n− 1.

Page 22: B. Ischi - MaTheX

Extension paire (page 22/61)

en ajoutant une ligne dont chaque element est la somme modulo 2 des elements de la colonne quile domine, est une matrice generatrice de C.

Si P designe la matrice de verificatrice de C, alors la matrice verificatrice P de C est donneepar

P =

P00 · · · P0n−1

......

Pn−10 · · · Pn−1n−1

0...0

1 · · · 1 1

ou la sous-matrice encadree est la matrice P .

Pour les codes de Hamming, d = 3. Ils contiennent donc un element impair. Par consequent,ils sont impairs. L’extension paire d’un code de Hamming est un code dont les parametres sontdonnes par:

Hr : (2r − 1, 2r − 1− r, 3) −→ Hr : (2r, 2r − 1− r, 4)

Par exemple, le code H3 a les parametres (8, 4, 4). De plus,

G3 =

1 0 0 01 1 0 00 1 1 01 0 1 10 1 0 10 0 1 00 0 0 11 1 1 1

et P 3 =

1 0 1 1 1 0 0 00 1 0 1 1 1 0 00 0 1 0 1 1 1 01 1 1 1 1 1 1 1

Comme H3, le code H3 est 1-correcteur, ce qui signifie qu’il peut corriger des erreurs de longueur1 au maximum. En revanche il peut detecter des erreurs de longueur 3 alors que le code H3 peutdetecter au mieux des erreurs de longueur 2.

Page 23: B. Ischi - MaTheX

CHAPITRE 2

Corps finis

1. Definitions

1.1. Groupes.Commencons par quelques rappels. Un ensemble G muni d’une loi de composition ∗ : G×G→

G associative (x ∗ (y ∗ z) = (x ∗ y) ∗ z, ∀ x, y, z ∈ G) est un groupe abelien si l’operation ∗ estcommutative (x ∗ y = y ∗ x, ∀x, y ∈ G), s’il existe un element neutre (1G ∗ x = x, ∀x ∈ G) etsi tout element admet un inverse (∀x ∈ G, ∃ y ∈ G tel que x ∗ y = 1G). Lorsque l’operation estnotee +, le neutre se note 0G. Rappelons que le neutre est unique et l’inverse d’un element estunique.

Soit G un groupe fini. Comme G est fini, pour tout x ∈ G, il existe des entiers m > n tels quexm = xn, c’est-a-dire tels que xm−n = 1G. Le plus petit entier n tel que xn = 1G est appele l’ordrede l’element x. Le theoreme de Lagrange affirme que l’ordre de tout element divise le nombred’elements de G, note #G. Dans le cas abelien, la demonstration est tres courte: soit g ∈ G etsoit n l’ordre de g. L’application x 7→ g ∗ x est une bijection de G dans G. Par consequent,

a =∏{x∣∣∣ x ∈ G} =

∏{gx

∣∣∣ x ∈ G} = g#G ∗ a ⇒ g#G = 1G

Notons #G = s · n+ r. Alors 1g = g#G = (gn)s ∗ gr = 1G ∗ gr = gr. Par consequent, comme n estle plus petit entier tel que gn = 1G, il suit que r = 0.

On dit que G est cyclique s’il existe un element g d’ordre n = #G. Dans ce cas G ={1, g, g2, · · · , gn−1} et on dit que l’element g est un generateur de G.

Soit G un groupe abelien fini et soient x, y ∈ G des elements de G. Notons m l’ordre de x etn l’ordre de y. Si m et n sont relativement premiers (i.e. pgcd(m,n) = 1), alors l’ordre de x ∗ yest mn. En effet, (x ∗ y)mn = (xm)n ∗ (yn)m = 1G. De plus, si (x ∗ y)r = 1G, alors,

1G = (x ∗ y)rm = (xm)r ∗ (yrm) = 1G ∗ yrm = yrm

Par consequent, n divise rm. Mais comme m et n sont relativement premiers, il suit que n diviser. De meme,

1G = (x ∗ y)rn = (xrn) ∗ (yn)r = xrn ∗ 1G = xrn

d’ou on deduit, comme ci-dessus, que m divise r. Conclusion: r est un multiple de mn.Soit G un groupe abelien fini. Soient x, y ∈ G deux elements de G. Notons m l’ordre de x et

n l’ordre de y. Alors il existe un element de G dont l’ordre est le ppcm(m,n). En effet, notonsr = ppcm(m,n). Alors, il existe deux entiers m′ et n′ tels que r = m′n′ et tels que m′|m et n′|net tels que pgcd(m′, n′) = 1. Alors, a = x

mm′ est d’ordre m′ et b = y

nn′ est d’ordre n′. Comme m′

et n′ sont relativement premiers, en vertu du paragraphe qui precede, il suit que l’ordre de a ∗ best m′n′ = ppcm(m,n).

23

Page 24: B. Ischi - MaTheX

Description des corps finis (page 24/61)

1.2. Corps.Un anneau A est un groupe abelien (A,+) muni d’une loi de composition ∗ : A × A → A

associative, commutative, admettant un element neutre (note 1A) et distributive par rapport al’addition (x ∗ (y+ z) = x ∗ y+ x ∗ z, ∀x, y, z ∈ A). Dans un anneau A, on a 0A ∗ x = 0A ∀x ∈ A(car x = 1 ∗ x = (1 + 0) ∗ x = 1 ∗ x + 0 ∗ x = x + 0 ∗ x ⇒ 0 ∗ x = 0) et (−1) ∗ x = −x (carx + (−1) ∗ x = 1 ∗ x + (−1) ∗ x = (1 − 1) ∗ x = 0 ∗ x = 0). Un anneau est integre s’il n’est pasreduit a 0 et si le seul diviseur de 0 est 0 (x ∗ y = 0 ⇒ x = 0 ou y = 0).

Un anneau est un corps s’il n’est pas reduit a 0 et si tout element non nul est inversible. SoitK un corps. Alors, il existe un unique homomorphisme d’anneau ϕ : Z → K (i.e. ϕ(1) = 1K,ϕ(m+ n) = ϕ(m) + ϕ(n), ϕ(m · n) = ϕ(m) ∗ ϕ(n), ∀m, n ∈ Z):

ϕ(n) = 1K + 1K + · · ·+ 1K︸ ︷︷ ︸n ×

= n · 1K

Le noyau de ϕ est un ideal principal (un ideal d’un anneau A est un sous-groupe de (A,+), stablepar multiplication par les elements de de A; un ideal principal est un ideal engendre par un seulelement) engendre par un nombre p appele la caracteristique du corps K: Ker(ϕ) = pZ. End’autres termes, soit la caracteristique est nulle soit il existe un plus petit nombre p > 0 tel quep ·1K = 0K. Si la caracteristique est non nulle, alors c’est un nombre premier. En effet, raisonnonspar l’absurde et supposons que p n’est pas premier: p = m ·n avec m > 1 < n. Notons x = m · 1Ket y = n · 1K. Comme, par hypothese, p est le plus petit nombre > 0 tel que p · 1K = 0K, il suitque x 6= 0K 6= x. Or,

x ∗ y = (1K + · · ·+ 1K)︸ ︷︷ ︸m×

∗ (1K + · · ·+ 1K)︸ ︷︷ ︸n×

= (m · n) · 1K = 0 ⇒ x = 0 ou y = 0

une contradiction.Soit K un corps fini a q elements. Un element α ∈ K est un racine n-ieme de l’unite si

αn = 1K. C’est un racine primitive n-ieme de l’unite si αk 6= 1K pour tout 1 ≤ k < n. Onnote K∗ = (K\{0K}, ∗) le groupe multiplicatif de K. Alors, en vertu du theoreme de Lagrange,αq−1 = 1K pour tout α ∈ K∗ et comme tout polynome de degre q de K[X] a au plus q racines dansK, il suit que ∏

α∈K

(X − α) = Xq −X

2. Description des corps finis

Commencons par un exemple. Soit p un nombre premier. On note

Fp = Z/pZ = {0, 1, 2, · · · , p− 1}

muni de l’addition et de la multiplication modulo p. C’est un corps, car en vertu du theoreme deBezout, pour tout nombre 1 ≤ k ≤ p− 1, il existe deux nombres s et t tels que

s · k + t · p = pgcd(k, p) = 1 ⇒ s · k ≡ 1 (mod p)

Bien entendu, si p n’est pas premier, ce n’est pas un corps car dans ce cas Z/pZ admet des diviseursde zero:

p = m · n (m > 1 < n) ⇒ m · n ≡ 0 (mod p)

Page 25: B. Ischi - MaTheX

Description des corps finis (page 25/61)

Considerons maintenant un corps fini K. Comme K est fini, il existe deux nombres m et n telsque m · 1K = n · 1K, c’est-a-dire (m− n) · 1K = 0K. Sa caracteristique est donc un nombre premierp. Le sous-ensemble de K

{1K, 2 · 1K, · · · , (p− 1) · 1K}

est un sous-corps de K appele le sous-corps premier de K. Il est isomorphe a Fp.Soit K un corps de caracteristique p et Fp son sous-corps premier. Alors, pour tous x, y ∈ K,

(x+ y)p =

p∑j=0

Cpj x

pyp−j avec Cpj =

p(p− 1) · · · (p− j + 1)

j!

Comme p est premier, pour tout 1 ≤ j ≤ p− 1, p|Cpj et donc Cp

j ≡ 0 (mod p). Il suit que

(x+ y)p = xp + yp

De plus xp = x ⇔ x ∈ Fp. En effet, si x ∈ Fp, alors l’ordre de x divise p − 1 et xp−1 = 1K,c’est-a-dire, xp = x. Reciproquement, si xp = x, alors x est une racine du polynome Xp−X qui aau plus p racines. Donc Fp est l’ensemble des racines de Xp −X. Soit maintenant Q(X) ∈ K[X].Alors Q(X) ∈ Fp[X] ⇔ Q(Xp) = Q(X)p. En effet, soit Q(X) ∈ Fp[X], alors en vertu de ce quiprecede,

(Q(X))p =

(n∑j=0

ajXj

)p

=n∑j=0

apjXjp =

n∑j=0

ajXjp = Q(Xjp)

et donc (Q(X))p = Q(Xp). Reciproquement, si (Q(X))p = Q(Xp), alors il suit que apj = aj ⇒aj ∈ Fp pour tout j.

Theoreme 2.1. Soit K un corps fini.

(1) La caracteristique de K est un nombre premier p et le nombre d’elements de K est de laforme #K = ps avec s ∈ N∗.

(2) Le groupe multiplicatif K∗ est cyclique.

Demonstration.

(1) Soit p la caracteristique de K. Notons Fp son sous-corps premier. Alors K est un Fp-espace vectoriel. Notons s sa dimension et soit (b1, · · · , bs) une base. Alors, tout elementde α ∈ K s’ecrit comme combinaison lineaire des elements de la base:

α = α1b1 + · · ·+ αsbs

ou chaque αj ∈ Fp. Il y a donc bien ps elements dans K.(2) Notons

ε = ω(K∗) = ppcm{ordre(α)∣∣∣ α ∈ K∗}

l’exposant du groupe multiplicatif de K. En vertu du theoreme de Lagrange cite dans lesrappels, l’exposant divise le nombre d’elements de K∗: ε|(ps − 1). Par consequent, toutα ∈ K∗ est un racine de Xε − 1 qui a au plus ε racines. Il suit que ε = ps − 1. Commenous l’avons vu dans les rappels, l’ensemble des ordres des elements de K∗ est stable parppcm. Il suit donc qu’il existe un element de K∗ d’ordre ps− 1, ce qui prouve que K∗ estcyclique.

Page 26: B. Ischi - MaTheX

Description des corps finis (page 26/61)

Soit p un nombre premier et P (X) ∈ Fp[X] un polynome de degre s, irreductible sur Fp[X](i.e. P n’est pas divisible par un polynome non constant de degre strictement inferieur au degrede P ). Alors

K = Fp[x]/(P (X))

est un corps. Dans chaque classe d’equivalence, on peut prendre un representant de degre stricte-ment inferieur a s. Concretement, K est (a isomorphisme pres) l’ensemble des polynomes a coeffi-cients dans Fp de degre strictement inferieur a s muni de l’addition usuelle et de la multiplicationmodulo P (X):

K = F<sp [X] avec f(X) ∗ g(X) = g(X)G(X) (mod P (X))

On multiplie les polynomes et on garde le reste de la division euclidienne par P (X) du produit.Pour montrer que c’est bel et bien un corps, il suffit de verifier que tout element non nul estinversible. Soit f(X) ∈ K<s[X] 6= 0. Comme P (X) est irreductible, il suit que f(X) et P (X)sont relativement premiers. En vertu du theoreme de Bezout (voir algorithme d’Euclide etendu),il existe deux polynomes s(X), t(X) ∈ Fp[X] tels que

1 = pgcd(f(X), P (X)) = s(x)F (X) + t(X)P (X)

Par consequent,

s(X)f(X) = 1− t(X)P (X) ⇒ s(X)f(X) ≡ 1 (mod P (X))

ce qui prouve que s(X) est l’inverse de f(X).Soit K un corps a ps elements. Comme K∗ est cyclique, il existe α ∈ K d’ordre ps − 1,

c’est-a-dire une racine primitive de Xps−1 − 1. Notons

A ={Q(X) ∈ Fp[X]

∣∣∣ Q(α) = 0}

l’ensemble des polynomes annulateurs de α. Comme nous venons de le voir, A n’est pas vide. SoitP (X) ∈ A unitaire de degre minimal. Notons

u = deg(P (X))

Premierement, P (X) divise tous les polynomes de A. En effet, si Q(X) ∈ A, alors la divisioneuclidienne donne Q(X) = S(X)P (X) + r(X) avec deg(r(X)) < u. De plus,

0 = Q(α) = S(α)P (α)︸ ︷︷ ︸=0

+r(α) ⇒ r(α) = 0

Comme, par hypothese, P (X) est un polynome dans A de degre minimal, il suit que r(X) = 0.Deuxiemement, P (X) est irreductible. En effet, si P (X) = S(X)T (X), alors

deg(S(X)) < u > deg(T (X)) et 0 = Pα) = S(α)T (α) ⇒ S(α) = 0 ou T (α)

⇒ S(X) ∈ A ou T (X) ∈ A

ce qui est impossible en vertu de l’hypothese concernant la minimalite du degre de P (X). Lepolynome P (X) est unique, il est appele le polynome minimal de α.

Comme α est une racine primitive (ps−1)-ieme de l’unite, tout element de K∗ est une puissancede α. Par consequent,

K ={Q(α)

∣∣∣ Q(X) ∈ Fp[X]}

Page 27: B. Ischi - MaTheX

Polynomes cyclotomiques (page 27/61)

Par la division euclidienne, pour tout Q(X) ∈ Fp[X] on a Q(X) = S(X)P (X) + r(X) avecdeg(r(X)) < u. De plus, Q(α) = r(α). Par consequent, comme Fp-espace vectoriel,

K ={r(α)

∣∣∣ r(X) ∈ F<up [X]}

ou F<up [X] designe le sous-espace vectoriel des polynomes de degre strictement inferieur a u.Montrons que

B = (1K, α, α2, · · · , αu−1) est une base du Fp espace vectoriel K

Il est clair que les elements de B engendrent K. Par ailleurs, soit une combinaison lineaire nulledes elements de B:

λ0 ∗ 1K + λ1 ∗ α + λ2 ∗ α2 + · · ·+ λu−1αu−1 = 0

Alors, le polynomeQ(X) = λ0 + λ1X + λ2X

2 + · · ·+ λu−1Xu−1

est un polynome annulateur de α et de degre strictement inferieur a u. Par hypothese sur laminimalite du degre de P (X) , il suit que Q(X) = 0, c’est-a-dire que λ0 = λ1 = · · · = λu−1 = 0,ce qui montre que les elements de B sont lineairement independants. Il suit que ps = #K = pu,donc que u = s.

L’applicationΦ : Fp/(P (X)) −→ K

Q(X) 7→ Q(α)

est bien definie. C’est un isomorphisme de corps. En resume, nous avons demontre que:

Theoreme 2.2. Soit K un corps fini a ps elements. Alors il existe un polynome unitaireirreductible P (X) ∈ Fp[X] de degre s tel que1

K ' Fp[X]/(P (X))

Pour construire un corps fini a ps elements, nous devons donc trouver des polynomes deFp[X] irreductibles de degre s. Cette recherche passe par les polynomes cyclotomiques que nouspresentons dans la prochaine section. Les polynomes cyclotomiques nous seront egalement utilespour construire des codes correcteurs lineaires cycliques.

3. Polynomes cyclotomiques

Cette partie est consacree au polynomes cyclotomiques2. Rappelons que dans C,

Xn − 1 =n−1∏k=0

(X − e2πi k

n

)Definition 3.1. Le polynome

Φn(X) =∏

0 ≤ k ≤ n− 1pgcd(k, n) = 1

(X − e2πi k

n

)

1NB: pour s > 1, cet isomorphisme n’est pas unique.2Cyclotomie en grec signifie “division du cercle”

Page 28: B. Ischi - MaTheX

Polynomes cyclotomiques (page 28/61)

est appele le n-ieme polynome cyclotomique.

Le polynome Φn(X) est unitaire et de degre

ϕ(n) = #{j ∈ N

∣∣∣ 0 ≤ j < n et pgcd(j, n) = 1}

La fonction ϕ est appelee la fonction indicatrice d’Euler. Par exemple,

ϕ(1) = 1, ϕ(2) = 1, ϕ(3) = 2, ϕ(4) = 2, · · ·

Remarquons qu’on peut decomposer:{k

n∈ Q

∣∣∣ 0 ≤ k ≤ n− 1

}=⊔d|n

{rd

∣∣∣ 0 ≤ r < d et pgcd(r, d) = 1}

ou d|n signifie: d divise n. Par exemple,{0

12,

1

12,

2

12,

3

12,

4

12,

5

12,

6

12,

7

12,

8

12,

9

12,10

12,11

12

}= {0} ∪

{1

2

}∪{

1

3,2

3

}∪{

1

4,3

4

}∪{

1

6,5

6

}∪{

1

12,

5

12,

7

12,11

12

}Par consequent,

Xn − 1 =∏d|n

Φd(X)

Exemple 3.2. On trouveΦ1(X) = X − 1

et commeX2 − 1 = Φ2(X)Φ1(X)

il suit queΦ2(X) = X + 1

De meme,X3 − 1 = Φ3(X)Φ1(x) ⇒ Φ3(X) = X2 +X + 1

Plus generalement, pour un nombre premier p,

Xp − 1 = Φp(X)Φ1(X) = Φp(X)(X − 1) ⇒ Φp(X) = 1 +X +X2 +X3 + · · ·+Xp−1

Par ailleurs,

X4 − 1 = Φ4(X)Φ2(X)Φ1(X) = Φ4(X)(X2 − 1) ⇒ Φ4(X) = X2 + 1

etX6 − 1 = Φ6(X)Φ3(X)Φ2(X)Φ1(X) = Φ6(X)(1 +X +X2)(X2 − 1)

= Φ6(X)(X4 +X3 −X − 1)⇒ Φ6(X) = X2 −X + 1

Page 29: B. Ischi - MaTheX

Polynomes cyclotomiques (page 29/61)

Donnons un dernier exemple:

X12 − 1 = Φ12(X)Φ6(X)Φ4(X)Φ3(x)Φ2(X)Φ1(X) = Φ12(X)Φ4(X)(X6 − 1)

= Φ12(X)(X2 + 1)(X6 − 1) = Φ12(X)(X8 +X6 −X2 − 1)) ⇒ Φ12(X) = X4 −X2 + 1

Nous constatons que tous nos exemples sont des polynomes a coefficients entiers. Ce n’est pas unhasard !

Theoreme 3.3. Les polynomes cyclotomiques sont a coefficients entiers:

Φn(X) ∈ Z[X], ∀ n ≥ 1

Demonstration. Nous procedons par recurrence sur n. Premierement,

Φ1(X) = X − 1 ∈ Z[X]

Supposons queΦk(X) ∈ Z[X] pour tout 1 ≤ k ≤ n− 1

Comme nous l’avons vu, dans C nous avons

Xn − 1 = Φn(X)h(X) ou h(X) =∏

d|n, d<n

Φd(X) est unitaire

Par hypothese de recurrence, h(X) ∈ Z[X]. De plus, h(X) est unitaire. Par consequent, on peuteffecteur la division euclidienne dans Z[X]:

Xn − 1 = g(X)h(X) + r(X) avec g(X), r(x) ∈ Z[X]

Mais l’unicite de la division euclidienne dans C[X] donne r(X) = 0 et Φn(X) = g(X) ∈ Z[X]. �

Comme les polynomes cyclotomiques sont a coefficients entiers, on peut calculer Φn(a) pourtout element a d’un anneau integre.

Theoreme 3.4. Soit A un anneau integre et n ∈ N tel que n · 1A 6= 0. Alors

(1) Le polynome Xn − 1 a uniquement des racines simples.(2) L’ensemble des racines de Φn(X) dans A est l’ensemble des racines primitives n-ieme de

l’unite dans A.

Demonstration.

(1) Raisonnons par l’absurde et supposons que

Xn − 1 = Q(X)2R(X)

DerivonsnXn−1 = 2Q(X)Q′(X)R(X) +Q(X)2R′(X)

Ainsi

n1A = nXn − nQ(X)2R(X) = X[2Q(X)Q′(X)R(X) +Q(X)2R′(X)

]− nQ(X)2R(X)

= Q(X) [2XQ′(X)R(X) +XQ(X)R′(X)− nQ(X)R(X)]

Par consequent, Q(X) divise la constante non nulle n1A et donc Q(X) est constant.

Page 30: B. Ischi - MaTheX

Decomposition des polynomes cyclotomiques dans un corps fini (page 30/61)

(2) Par le point (1), nous savons qu’une racine n-ieme de l’unite dans A, c’est-a-dire uneracine de Xn − 1, est une racine d’exactement un seul polynome cyclotomique Φd(X)pour un certain d divisant n. Par consequent, si α est un racine primitive n-ieme del’unite (i.e. αn = 1A et αk 6= 1A pour tout 1 ≤ k < n), alors α est un racine de Xn − 1,mais n’est pas une racine de Xd − 1 pour tout d divisant n et strictement inferieur a n.Comme Φd(X) divise Xd − 1, il suit que α est une racine de Φn(X).

Dans la section suivantes nous allons etudier la decomposition des polynomes cyclotomiquesdans les corps finis. Pour terminer cette section, nous mentionnons un resultat du a Gauss.

Theoreme 3.5 (Gauss). Pour tout n > 0, le polynome Φn(X) est irreductible dans Q[X].3

4. Decomposition des polynomes cyclotomiques dans un corps fini

Theoreme 4.1. Soit K un corps a q elements et soit n > 0 un nombre entier premier a q.Notons r le plus petit entier tel que qr ≡ 1 (mod n). Alors

Φn(X) =

ϕ(n)/r∏j=1

Qj(X) ou pour tout j, Qj(X) ∈ K[X] est irreductible de degre r

et ou les Qj(X) sont tous differents.

Demonstration. Rappelons en preambule que, en vertu du theoreme d’Euler,

pgcd(n, q) = 1 ⇒ qϕ(n) ≡ 1 (mod n)

Comme par hypothese, r est le plus petit entier tel que qr ≡ 1 (mod n), il suit que ϕ(n) = sr + tet 1 ≡ qϕ(n) = (qr)sqt ≡ qt (mod n). Par consequent, t = 0 et r divise ϕ(n).

Comme nous avons deja montre que Φn(X) n’est pas divisible par le carre d’un polynomenon constant, nous savons que les Qj(X) sont tous differents. Il reste a montrer que tout facteurirreductible de Φn(X) dans K[X] est de degre r.

Soit P (X) un polynome irreductible de K[X] de degre s divisant Φn(X). Soit L le corpsL = K[X]/(P (X)). Nous savons que #L = qs et tout element non nul 0 6= α ∈ L satisfaitαq

s−1 = 1. Le corps L contient par construction une racine β de Φn(X) qui est, en vertu de ceque nous avons demontre plus haut, une racine primitive n-ieme de l’unite. Comme βq

s−1 = 1, ilsuit que n divise qs − 1, c’est-a-dire qs ≡ 1 (mod n). Il suit que r ≤ s.

Inversement, comme βn = 1 et que n divise qr − 1, il suit que βqr

= β. Soit

M ={α ∈ L

∣∣∣ αqr = α}

Rappelons que q = pm avec p premier. Par consequent, comme L est de caracteristique p,l’application Ψ : L → L definie par Ψ(α) = αq

rest un auto-morphisme de corps. Il suit que

M est un sous-corps de L. C’est le sous-corps de L forme des racines de Xqr − X. Il contientβ, donc il est egal a L puisque β est une racine primitive de l’unite de L. On a donc queqs = #L ≤ qr, donc s ≤ r. �

Exemple 4.2. Le cas qui nous interesse particulierement pour la suite est K = F2, c’est-a-direq = 2 . Examinons l’affirmation du theoreme pour quelque valeurs de r:

3voir: Michel Demazure, “Cours d’algebre”, p. 216

Page 31: B. Ischi - MaTheX

Exemples (page 31/61)

(1) r = 2 , 22 = 4 ≡ 1 (mod 3), n = 3 : ϕ(3) = 2, donc Φ3(X) est un polynome irreductiblede F2[X]:

Φ3(X) = 1 +X +X2

(2) r = 3 , 23 = 8 ≡ 1 (mod 7), n = 7 , ϕ(7) = 6, donc Φ7(X) se decompose en 63

= 2polynomes irreductibles de F2[X]:

Φ7(X) = 1 +X +X2 +X3 +X4 +X5 +X6 = (1 +X +X3)(1 +X2 +X3)

(3) r = 4 , 24 = 16 ≡ 1 (mod 15), n = 15 , ϕ(15) = ϕ(3)ϕ(5) = 2 · 4 = 8, donc Φ15(X) sedecompose en 8

4= 2 polynomes irreductibles de F2[X]:

X15 − 1 = Φ1(X)Φ3(X)Φ5(X)Φ15(X) = (X − 1)(1 + x+ x2)(1 +X +X2 +X3 +X4)Φ15(X)

= (1 +X +X2 +X5 +X6 +X7)Φ15(X)

et ainsi

Φ15(X) = 1 +X +X3 +X4 +X5 +X7 +X8 = (1 +X +X4)(1 +X3 +X4)

5. Exemples

Nous voulons construire un corps K a ps elements. Nous devons donc trouver un polynomeirreductible P (X) ∈ Fp[X] de degre s. Le plus simple est de prendre un polynome P (X) dont lesracines dans K sont les racines primitives (ps−1)−ieme de l’unite. Or nous savons que ce sont lesracines de Φn(X) pour n = ps− 1. Nous devons donc prendre un polynome irreductible qui diviseΦn(X). Nous savons egalement, comme n = ps−1 et p sont relativement premiers, que Φn(X) estle produit de polynomes irreductibles sur Fp[X] de degre s. Les polynomes qui nous interessentsont donc les facteur irreductibles de Φn(X) avec n = ps − 1. Ces polynomes sont appeles despolynomes primitifs.

Voici une liste de polynomes primitifs de F2[X] de degre s variant de 2 a 164

1 +X +X2 1 +X +X3 1 +X +X4

1 +X2 +X5 1 +X +X6 1 +X +X7

1 +X4 +X5 +X6 +X8 1 +X4 +X9 1 +X3 +X10

1 +X2 +X11 1 +X3 +X4 +X7 +X12 1 +X +X3 +X4 +X13

1 +X +X11 +X12 +X14 1 +X +X15 1 +X2 +X3 +X5 +X16

On peut verifier, en utilisant le script Python 3 donne ci-dessous, que le polynome de degre sdivise divise bel et bien Φ2s−1(X). Remarquons qu’ils contiennent tous le terme constant 1 (sinon,0 est une racine) et le monome Xs. Le nombre de monomes supplementaires doit etre impair,sinon, 1 est une racine.

A titre d’exemple, nous pouvons executer le programme Python 3 qui suit. Le fichier importecodCorr.py est donne plus bas.

1 import numpy as np

2 from codCorr import ∗3 #4 f 1 =[1 ,1 ]

5 f 23 =23∗ [1 ]

6 f 89 =89∗ [1 ]7 Q=[1 ]+2046∗ [ 0 ]+[1 ]

4voir: Michel Demazure, “Cours d’algebre”, p. 225

Page 32: B. Ischi - MaTheX

Exemples (page 32/61)

8 D=mulPolyFp ( f1 , f23 , 0 , 2 )

9 D=mulPolyFp (D, f89 , 0 , 2 )

10 e=d i v i s i o n E u c l i d e (Q,D, 2 )11 f2047=e [ 0 ]

12 print ( e [ 1 ] )

13 P=[1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ]14 e=d i v i s i o n E u c l i d e ( f2047 ,P, 2 )

15 print ( e [ 1 ] )

Le resultat est:

>>python3 test.py

[]

[]

Ce qui montre que 1 +X2 +X11 divise Φ2047(X). Il est donc primitif.

Exemple 5.1. Nous prenons p = 2, r = 2 et nous construisons un corps K a 22 = 4 elements.Nous avons deja trouve un polynome primitif:

P (X) = 1 +X +X2

Soit α ∈ K une racine de P (X). Alors, comme X2 = P (X) + X + 1, il suit que α2 = 1 + α. Dememe, comme X3 = P (X)X +X2 +X, il vient α3 = α2 + α = 1 + α+ α = 1. Relativement a labase (1K, α), on a α = (0, 1) et α2 = (1, 1). En resume, on a trouve

0 = (0, 0), 1 = (1, 0), α = (0, 1), α2 = (1, 1)

Ainsi, les tables de multiplication et d’addition se trouvent facilement:

* 0 1 α α2

0 0 0 0 01 0 1 α α2

α 0 α α2 1α2 0 α2 1 α

+ 0 1 α α2

0 0 1 α α2

1 1 0 α2 αα α α2 0 1α2 α2 α 1 0

Exemple 5.2. Nous prenons p = 2, r = 4 et nous construisons un corps K a 24 = 16 elements.Nous avons deja trouve un polynome primitif:

P (X) = 1 +X +X4

Page 33: B. Ischi - MaTheX

Exemples (page 33/61)

Soit α ∈ K une racine de P (X). Comme Xj = Xj−4P (X) +Xj−3 +Xj−4 nous avons une relationde recurrence pour exprimer αj dans la base (1K, α, α

2, α3):

0 = (0, 0, 0, 0)1 = (1, 0, 0, 0)α = (0, 1, 0, 0)α2 = (0, 0, 1, 0)α3 = (0, 0, 0, 1)α4 = (1, 1, 0, 0) (α4 = α + 1)α5 = (0, 1, 1, 0) (α5 = α2 + α)α6 = (0, 0, 1, 1) (α6 = α3 + α2)

α7 = (1, 1, 0, 1)...

α8 = (1, 0, 1, 0)α9 = (0, 1, 0, 1)α10 = (1, 1, 1, 0)α11 = (0, 1, 1, 1)α12 = (1, 1, 1, 1)α13 = (1, 0, 1, 1)α14 = (1, 0, 0, 1)

et α15 = (1, 0, 0, 0) = 1 comme il se doit. La table d’addition est facile a determiner. Par exemple

α5 + α11 = (0, 1, 1, 0) + (0, 1, 1, 1) = (0, 0, 0, 1) = 1

Remarquons que le polynome

Φ5(X) = 1 +X +X2 +X3 +X4 ∈ F2[X]

est irreductible. En effet, il n’a pas de racine dans F2. Donc il n’est pas divisible par un polynomede degre 1. Le seul polynome irreductible de degre 2 etant Φ3(X) = 1 + X + X2 et commeΦ3(X)2 = 1 +X2 +X4, il suit que Φ5(X) est irreductible. Mais si β ∈ K est un racine de Φ5(X),alors, comme X5 = XΦ5(X) + X4 + X3 + X2 + X = XΦ5(X) + Φ5(X) + 1, il suit que β5 = 1Kn’est pas une racine primitive 15-ieme de l’unite, comme nous le savions deja.

Pour des autres exemples, nous utilisons le programme Python 3 suivant:

1 import numpy as np

2 from codCorr import ∗3 import sys

4 #5 def a f fPo l y ( f ) :6 t=’ ’7 k=0

8 for a in f :9 i f a !=0:

10 i f k==0:11 t=t+s t r ( a )+”+”12 else :13 i f a !=1:14 f=s t r ( a )

15 else :

16 f= ’ ’17 i f k !=1:

18 e=”ˆ”+s t r ( k )19 else :20 e=’ ’

Page 34: B. Ischi - MaTheX

Exemples (page 34/61)

21 t=t+f+”X”+e+”+”

22 k=k+1

23 t=t [0 : −1 ]24 return t

25 #

26 def enterPoly (nom, p) :27 f=input ( ”Tapez un polynome ”+nom+” (X)=” )

28 f=f . s p l i t ( ” . ” )

29 k=030 for x in f :

31 f [ k]= i n t ( f [ k ] )%p32 k=k+1

33 print ( ” => ”+nom+” (X)=”+a f fPo ly ( f ) )

34 return f35 #

36 def l i s t e F p s (P, p) :

37 degP=len (P)−138 q=p∗∗degP

39 nbd ig i t=i n t (np . l og ( q ) /np . l og (10) +1)

40 l i s t e = [ [ 0 ] , [ 1 ] ]41 print ( ”0=”+( nbd ig i t +3)∗” ” , degP ∗ [ 0 ] )

42 print ( ”1=”+( nbd ig i t +3)∗” ” , [ 1 ]+( degP−1) ∗ [ 0 ] )

43 x =[0 ,1 ]44 m=1

45 while l en ( l i s t e )<q :46 e=d i v i s i o n E u c l i d e ( mulPolyFp (x , l i s t e [−1] ,P, p) ,P, p)

47 i f e [ 1 ] in l i s t e :

48 print ( ” Erreur : l a r a c i n e a de P(X) n ’ e s t pas une r a c i n e p r i m i t i v e ”+s t r (q−1)+”−iemede l ’ un i t e de F ”+s t r ( q ) )

49 sys . e x i t ( )

50 nbdigitm=i n t (np . l og (m) /np . l og (10) +1)51 print ( ”aˆ” , s t r (m)+(nbdig i t−nbdigitm ) ∗” ” , ”=” , e [ 1 ]+( degP−l en ( e [ 1 ] ) ) ∗ [ 0 ] )

52 l i s t e . append ( e [ 1 ] )

53 m=m+154 return l i s t e

55 #56 print ( ” Ca l cu l s dans F pˆ s \n\n( Exemple : pour e n t r e r l e polynome 1+xˆ2+2xˆ5 i l f aut taper

1 . 0 . 1 . 0 . 0 . 2 ) \n” )

57 p=input ( ” Entrez un nombre premier p=” )58 p=i n t (p)

59 print ( ” Entrez un polynome P(X) i r r e d u c t i b l e sur F ”+s t r (p)+”” )

60 P=enterPoly ( ’P ’ ,p )61 degP=len (P)−1

62 print ( ”\ nL i s t e des e lements de F ( ”+s t r (p)+”ˆ”+s t r ( degP )+” )=F ”+s t r (p)+” [X] / ( ”+a f fPo ly (P)+” ) \n” )

63 l i s t e F p s (P, p)

Le fichier importe codCorr.py contient les fonctions (ecrite en Pyton 3) suivantes:

1 import numpy as np

2 #3 def pgcd2 (a , b) :

4 s1=1

5 t1=06 s2=0

7 t2=1

8 r=a%b9 while r>0:

10 q=a//b11 s=s1−s2 ∗q12 t=t1−t2 ∗q13 s1=s214 t1=t2

15 s2=s

16 t2=t17 a=b

Page 35: B. Ischi - MaTheX

Exemples (page 35/61)

18 b=r

19 r=a%b

20 return [ s2 , t2 , b ]21 #

22 def invFp (a , p) :

23 e=pgcd2 (p , a )24 return e [ 1 ]

25 #

26 def en l eve rZe ro sDro i t e ( v ) :27 v=np . array ( v )

28 e=np . where ( v !=0)29 i f l en ( e [ 0 ] ) ==0:

30 return [ ]

31 else :32 return np . ndarray . t o l i s t ( v [ 0 : e [ 0 ] [ −1 ]+1 ] )

33 #

34 def d i v i s i o n E u c l i d e ( f , g , p ) :35 dg=len ( g )−1

36 r=en l eve rZe ro sDro i t e ( f )

37 dr=len ( r )−138 q=(dr−dg+1) ∗ [ 0 ]

39 u=invFp ( g [ dg ] , p )

40 while dg<=dr :41 e=dr−dg

42 q [ e ]=( r [−1]∗u)%p43 r=(r−q [ e ]∗ np . array ( e ∗ [0 ]+ g ) )%p

44 r=en l eve rZe ro sDro i t e ( r )

45 dr=len ( r )−146 return [ q , r ]

47 #

48 def matriceG ( f , k ) :49 G=[]

50 for m in range (0 , k , 1 ) :

51 G=G+m∗ [0 ]+ f +(k−m−1) ∗ [ 0 ]52 G=np . array (G)

53 G=G. reshape (k , l en ( f )+k−1)

54 G=G. t ranspose ( )55 return G

56 #

57 def mulPolyFp ( f , g ,P, p) :58 G=matriceG ( f , l en ( g ) )

59 prod=np . ndarray . t o l i s t (np . matmul (G, np . array ( g ) )%p)60 i f P!=0:

61 e=d i v i s i o n E u c l i d e ( prod ,P, p)

62 return e [ 1 ]63 else :

64 return prod

Voici quelques exemples d’execution du programme corps.py:

>>python3 corps.py

Calculs dans F_p^s

(Exemple: pour entrer le polynome 1+x^2+2x^5 il faut taper 1.0.1.0.0.2)

Entrez un nombre premier p=2

Entrez un polynome P(X) irreductible sur F_2

Tapez un polynome P(X)=1.1.0.1

=> P(X)=1+X+X^3

Liste des elements de F_(2^3)=F_2[X]/(1+X+X^3)

0= [0, 0, 0]

1= [1, 0, 0]

a^ 1 = [0, 1, 0]

Page 36: B. Ischi - MaTheX

Exemples (page 36/61)

a^ 2 = [0, 0, 1]

a^ 3 = [1, 1, 0]

a^ 4 = [0, 1, 1]

a^ 5 = [1, 1, 1]

a^ 6 = [1, 0, 1]

>>python3 corps.py

Calculs dans F_p^s

(Exemple: pour entrer le polynome 1+x^2+2x^5 il faut taper 1.0.1.0.0.2)

Entrez un nombre premier p=2

Entrez un polynome P(X) irreductible sur F_2

Tapez un polynome P(X)=1.1.0.0.1

=> P(X)=1+X+X^4

Liste des elements de F_(2^4)=F_2[X]/(1+X+X^4)

0= [0, 0, 0, 0]

1= [1, 0, 0, 0]

a^ 1 = [0, 1, 0, 0]

a^ 2 = [0, 0, 1, 0]

a^ 3 = [0, 0, 0, 1]

a^ 4 = [1, 1, 0, 0]

a^ 5 = [0, 1, 1, 0]

a^ 6 = [0, 0, 1, 1]

a^ 7 = [1, 1, 0, 1]

a^ 8 = [1, 0, 1, 0]

a^ 9 = [0, 1, 0, 1]

a^ 10 = [1, 1, 1, 0]

a^ 11 = [0, 1, 1, 1]

a^ 12 = [1, 1, 1, 1]

a^ 13 = [1, 0, 1, 1]

a^ 14 = [1, 0, 0, 1]

Et si on entre le polynome P (X) = 1 + X + X2 + X3 + X4 qui est, comme nous l’avons vu,irreductible sur F2[X] mais pas primitif:>>python3 corps.py

Calculs dans F_p^s

(Exemple: pour entrer le polynome 1+x^2+2x^5 il faut taper 1.0.1.0.0.2)

Entrez un nombre premier p=2

Entrez un polynome P(X) irreductible sur F_2

Tapez un polynome P(X)=1.1.1.1.1

=> P(X)=1+X+X^2+X^3+X^4

Liste des elements de F_(2^4)=F_2[X]/(1+X+X^2+X^3+X^4)

0= [0, 0, 0, 0]

1= [1, 0, 0, 0]

a^ 1 = [0, 1, 0, 0]

a^ 2 = [0, 0, 1, 0]

a^ 3 = [0, 0, 0, 1]

a^ 4 = [1, 1, 1, 1]

Erreur: la racine a de P(X) n’est pas une racine primitive 15-ieme de l’unite de F_16

Voici un exemple plus grand !:>>

python3 corps.py

Calculs dans F_p^s

(Exemple: pour entrer le polynome 1+x^2+2x^5 il faut taper 1.0.1.0.0.2)

Page 37: B. Ischi - MaTheX

Exemples (page 37/61)

Entrez un nombre premier p=2

Entrez un polynome P(X) irreductible sur F_2

Tapez un polynome P(X)=1.0.1.0.0.0.0.0.0.0.0.1

=> P(X)=1+X^2+X^11

Liste des elements de F_(2^11)=F_2[X]/(1+X^2+X^11)

0= [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

1= [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

a^ 1 = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

a^ 2 = [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

a^ 3 = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]

a^ 4 = [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]

a^ 5 = [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

a^ 6 = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0]

a^ 7 = [0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]

a^ 8 = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0]

a^ 9 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]

a^ 10 = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

a^ 11 = [1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

a^ 12 = [0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0]

a^ 13 = [0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0]

a^ 14 = [0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0]

a^ 15 = [0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0]

a^ 16 = [0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0]

a^ 17 = [0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0]

a^ 18 = [0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0]

.

.

.

a^ 2030 = [0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1]

a^ 2031 = [1, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1]

a^ 2032 = [1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 1]

a^ 2033 = [1, 1, 0, 1, 0, 1, 0, 1, 1, 1, 0]

a^ 2034 = [0, 1, 1, 0, 1, 0, 1, 0, 1, 1, 1]

a^ 2035 = [1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 1]

a^ 2036 = [1, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1]

a^ 2037 = [1, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0]

a^ 2038 = [0, 1, 1, 0, 1, 0, 1, 0, 1, 0, 1]

a^ 2039 = [1, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0]

a^ 2040 = [0, 1, 0, 0, 1, 0, 1, 0, 1, 0, 1]

a^ 2041 = [1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0]

a^ 2042 = [0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1]

a^ 2043 = [1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0]

a^ 2044 = [0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1]

a^ 2045 = [1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]

a^ 2046 = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1]

Page 38: B. Ischi - MaTheX
Page 39: B. Ischi - MaTheX

CHAPITRE 3

Codes correcteurs lineaires cycliques

1. Codes lineaires sur FqSoit Fq un corps a q elements. Un code lineaire C sur Fq de dimension k et de longueur n est

un Fq sous-espace vectoriel de dimension k de Fnq . On definit le poids d’un mot ~m par

~m =

m0

m1

· · ·mn−1

∈ Fq ⇒ w(~m) =n−1∑

j=0,mj 6=0

1

Le poids compte le nombre de composantes non nulles. La distance de Hamming est definiepar

d(~m, ~m′) = w(~m− ~m′)

C’est une distance. Clairement d(~a,~b) = d(~b,~a), d(~a,~b) = 0 ⇒ ~a = ~b et

d(~a,~b) = w(~a−~b) = w(~a− ~c+ ~c−~b) ≤ w(~a− ~c) + w(~c−~b) = d(~a,~c) + d(~c,~b)

La distance minimale du code C est definie par

d = min{d(~a,~b)

∣∣∣ ~a, ~b ∈ C et ~a 6= ~b}

= min{w(~m)

∣∣∣ ~m ∈ C et ~m 6= ~0}

Les parametres du code sont

(q;n, k, d)

Soit ~m ∈ Fnq un message code avant le canal de transmission et ~m′ = ~m+ ~e le meme messageapres le canal de transmission entache d’une erreur ~e ∈ Fnq . Si w(~e) < d, alors l’erreur peut etredetectee car ~m′ = ~m + ~e 6∈ C (en effet, si ~m′ ∈ C, alors ~e ∈ C car C est un espace vectoriel et

w(~e) < d = min{w(~m)∣∣∣ ~m ∈ C} ≤ w(~e), une contradiction). Par ailleurs, si w(~e) < d

2, alors

l’erreur peut etre corrigee. En effet,

~m1 = ~m+ ~e = ~m2

⇒ w(~m1 − ~m2) = w(~m1 − ~m+ ~m− ~m2) ≤ w(~m1 − ~m) + w(~m− ~m2) = w(~e) + w(~e) < d

une contradiction. Le code est dit t-correcteur s’il peut corriger toute erreur ~e telle que w(~e) ≤ t.Par consequent, le code C est t-correcteur si 2t < d.

Si le code C est t-correcteur, cela signifie que

B(~m1, t) ∩B(~m2, t) = ∅ ∀ ~m1, ~m2 ∈ C

39

Page 40: B. Ischi - MaTheX

Demultiplication des codes sur Fps (page 40/61)

ou B(~m1, t) est la boule de rayon t centree en ~m1:

B(~m1, t) ={~m ∈ Fnq

∣∣∣ d(~m1, ~m) ≤ t}

Le code C est t-correcteur parfait si les boules centrees en les differents elements du code con-stituent une partition de Fnq , en d’autres termes si Fnq est l’union disjointe des boules de rayon tcentrees en les differents elements du code:

Fnq =⊔~m∈C

B(~m, t)

Remarquons que

#B(~m, t) =t∑

j=0

Cnj (q − 1)j ou Cn

j =n!

j!(n− j)!

Par consequent, si C est t-correcteur, alors

qk

(t∑

j=0

Cnj (q − 1)j

)≤ #Fnq = qn ⇒

t∑j=0

Cnj (q − 1)j ≤ qn−k

Finalement, si un code C t-correcteur est parfait, alors on a l’egalite.

2. Demultiplication des codes sur Fps

Soit C un code lineaire de parametres (q = 2s;n, k, d). La transmission s’effectuant genera-lement avec des 0 et des 1, l’utilisation de C peut se faire via une operation de demultiplication.Comme nous l’avons vu, F2s est un F2 espace vectoriel de dimension s. Une fois une base choisie,les elements de F2s peuvent s’ecrire comme des vecteurs de Fs2:

m ∈ F2s ⇒ m = (m0 ,m1 , · · · ,ms−1), mj ∈ {0, 1}

Par consequent, un element du code peut etre ecrit comme une suite de n · s bits:

~m ∈ C ⇒ D(~m) = (m0,0 ,m0,1 , · · · ,m0,s−1 ,m1,0 , · · · ,m1,s−1 , · · · ,mn−1,0 , · · · ,mn−1,s−1) ∈ Fn·s2

et ainsi on peut, a partir du code C, definir un code C ′

C ′ = {D(~m)∣∣∣ ~m ∈ C}

De toute evidence, C ′ est un F2 sous-espace vectoriel de Fn·s2 . Le code C ′ a donc les parametres(2, n · s, k · s, d′). Cette operation est appelee operation de demultiplication.

La distance minimale de C ′ satisfait a l’inegalite

d ≤ d′ ≤ (d− 1) · s+ 1

En effet, soit ~m ∈ C. Alors, pour chaque composante non nulle mj 6= 0, il existe 0 ≤ l ≤ s − 1,tel que m

j,l6= 0. Par consequent, w(D(~m)) ≥ w(~m) et donc d′ ≥ d. Supposons maintenant que

d′ > (d− 1) · s+ 1. Cela signifie que w(D(~m)) > (d− 1) · s+ 1 pour tout ~m ∈ C, c’est-a-dire quew(~m) > d pour tout ~m ∈ C, une contradiction.

Page 41: B. Ischi - MaTheX

Majoration du singleton (page 41/61)

L’interet d’utiliser un code sur F2s demultiplie reside dans le fait que le code C ′ est solide faceaux “bouffees d’erreurs”. Soit t un entier tel que t < 2d. Imaginons que le canal de transmissioninduise (t− 1)s+ 1 erreurs consecutives (bouffee d’erreurs) sur un element transmis de C ′:

~eD ∈ Fs·n2 , w(~eD) = (t− 1)s+ 1

L’element transmis estD(~m) + ~eD = D(~mt)

Cela equivaut a t erreurs dans l’element de ~mt ∈ C recu

D(~e) = ~eD avec ~e ∈ Fn2s et w(~e) = t

Le code C peut donc corriger le message recu et redonner ~m. Notons que si w(~eD) = (t−1)s+2, iln’est pas impossible que w(~e) = t+ 1. Des bouffees d’erreurs peuvent intervenir pour de multiplesraisons (coupure de transmission, poussiere sur un support). Par exemple, des codes binairesobtenus par demultiplication de codes sur F28 = F256 sont utilises pour le codage des disquescompacts audios.

3. Majoration du singleton

Theoreme 3.1 (Majoration du singleton). Soit C un code lineaire non nul1 sur Fq deparametres (d;n, k, d). Alors

k + d ≤ n+ 1

Demonstration. Soit W le Fq sous-espace vectoriel de Fnq de dimension n− k+ 1 engendrepar les vecteurs dont les k − 1 dernieres composantes sont nulles:

W ={

(m0, · · · ,mn−k, 0, · · · , 0)∣∣∣ mj ∈ Fq ∀ 0 ≤ j ≤ n− k

}Comme dim(W ) = n − k + 1 et dim(C) = k, il suit que W ∩ C 6= {~0}. Cela signifie qu’il existe~m ∈ C tel que w(~m) ≤ n − k + 1. Or, par definition de la distance minimale, w(~m) ≥ d. Parconsequent,

d ≤ n− k + 1 ⇒ k + d ≤ n+ 1

Definition 3.2. Un code lineaire non nul de parametres (q;n, k, d) est de type MDS2 sid = n− k + 1.

Exemple 3.3. Le code “plein”3 donne par C = Fkq a les parametres (q;n, n, 1). Il est MDS maisil ne peut ni detecter ni corriger la moindre erreur ! Le code de parite dont la matrice generatriceest donnee par

G =

1 0 · · · 0

0. . .

...... 00 · · · 0 11 1 · · · 1

1Le code nul est donne par C = {~0}. Il est rarement utilise dans l’industrie !2de l’anglais: “Maximum distance separable”3qui n’a pas rencontre beaucoup de succes !

Page 42: B. Ischi - MaTheX

Codes cycliques (page 42/61)

a les parametres (q;n, n − 1, 2). Il est de type MDS. Les code de repetition pure dont la matricegeneratrice est donnee par

G =

1...1

a les parametres (q;n, 1, n) et est egalement de type MDS. Le code de Hamming H3 construit dansle premier chapitre qui a les parametres (2; 7, 4, 3), n’est pas de type MDS puisque 7−4+1 = 4 > 3.

Soit C un code de parametres (n, k, d). On lui associe un point du carre de cote 1

PC =

(xC =

d

n; yC =

k

n

)La majoration du singleton donne

d+ k ≤ n+ 1 ⇒ d

n+k

n≤ 1 + 1/n ⇒ xC + yC ≤ 1 +

1

n

Le point PC se trouve dans la zone hachuree sur la figure 1. Le rapport kn

est appele le tauxd’information.

Figure 1. La majoration du singleton

L’existence de codes MDS de longueur elevee reste une question ouverte. On ne connaıt aucuncode de type MDS de parametres (q;n, k, d) avec n > q+ 2. On connaıt uniquement deux exemplesavec n = q + 2. On conjecture que, hormis ces deux exemples, on a toujours n < q + 2.

4. Codes cycliques

Definition 4.1. Soit ~m = (m0, · · · ,mn−1) ∈ Fnq . On note σ la permutation circulaire:

σ(~m) = (mn−1,m0,m1, · · · ,mn−2)

Un code lineaire C ⊆ Fnq est cyclique si

σ(~m) ∈ C, ∀ ~m ∈ C

Page 43: B. Ischi - MaTheX

Codes cycliques (page 43/61)

Notons η l’application injective

η : Fnq −→ Fq[X]

~m =

m0...

mn−1

7→ η(~m)(X) = m0 +m1X + · · ·+mn−1Xn−1

Remarquons que

η(σ(~m))(X) = mn−1 +m0X +m1X2 + · · ·+mn−2X

n−1

= X(m0 +m1X + · · ·+mn−1X

n−1)−mn−1 (Xn − 1) = Xη(~m)(X)−mn−1 (Xn − 1)

Par consequent,η(σ(~m))(X) ≡ Xη(~m)(X) (mod Xn − 1)

Conclusion:η : Fnq −→ Fq[X]/(Xn − 1)

est un isomorphisme d’espaces vectoriels. De plus, la permutation circulaire dans Fnq corresponda la multiplication par X dans Fq[X]/(Xn − 1). Notons que

g(X) = a0 + a1X + · · ·+ an−1Xn−1 ∈ Fq[X]/(Xn − 1) ⇒ η−1(g(X)) =

a0

a1...

an−1

Theoreme 4.2. Soient n, k des nombres entiers avec k < n et soit un corps Fq.(1) Soit g(X) ∈ Fnq [X] un polynome unitaire de degre n − k qui divise Xn − 1 dans Fq[X].

Notons ~m = η−1(g(X)) ∈ Fnq . Alors, le sous-espace vectoriel de Fnq engendre par σj(~m)pour 0 ≤ j ≤ k − 1

Cg = 〈{~m, σ(~m), σ2(~m), · · · , σk−1(~m)

}〉

est un code lineaire cyclique de longueur n et de dimension k.(2) Soit C un code lineaire cyclique de longueur n et de dimension k. Alors, il existe un

unique polynome unitaire g(X) ∈ Fnq [X] de degre n− k qui divise Xn − 1 dans Fq[X] telque C = Cg.

Demonstration.

(1) Commencons par remarquer que σ est lineaire. Soit

~v = c0 ~m+ c1σ(~m) + c2σ2(~m) + · · ·+ ck−1σ

k−1(~m) ∈ Cg

Alors,σ(~v) = c0σ(~m) + c1σ

2(~m) + c2σ3(~m) + · · ·+ ck−1σ

k(~m)

Pour montrer que Cg est cyclique, il suffit donc de montrer que σk(~m) ∈ C. Comme parhypothese, g(X) divise Xn − 1 dans Fq[X], on peut ecrire

Xn − 1 = g(X)h(X)

Page 44: B. Ischi - MaTheX

Codes cycliques (page 44/61)

Notons (rappelons que g est unitaire)

h(X) = b0 + b1X + · · ·+ bk−1Xk−1 +Xk

AinsiXn − 1 = g(X)

(b0 + b1X + · · ·+ bk−1X

k−1 +Xk)

⇒ Xkg(X) = Xn − 1− g(x)(b0 + b1X + · · ·+ bk−1X

k−1)

c’est-a-dire

Xkg(X) ≡ −b0g(X)− b1Xg(X)− · · · − bk−1Xk−1g(X) (mod Xn − 1)

Par consequent,

η(σk(~m)) = Xkη(~m)(X) = Xkg(X)

= −b0η(~m)(X)− b1η(σ(~m))(X)− · · · − bk−1η(σk−1(~m))(X)

= η(−b0 ~m− b1σ(~m)− · · · − bk−1σ

k−1(~m))︸ ︷︷ ︸

∈Cg

(X)

Comme η est un isomorphisme, il suit que σk(~m) ∈ Cg.(2) Soit C un code lineaire cyclique de longueur n et de dimension k. Pour ~m ∈ C, on definit

L(~m) = min{j ∈ {0, 1, · · · , n− 1}

∣∣∣ mj+1 = mj+2 = · · · = mn−1 = 0}

Le nombre n− 1− j est le “nombre de zeros a droite de ~m”. Soit ~m ∈ C tel que

L(~m) ≤ L(~v), ∀~v ∈ C

C’est l’element de C avec un maximum de “zeros a droite”. Soit

k0 = n− L( ~m)

Remarquons que

~m = (m0,m1, · · · ,mn−k0 , 0, · · · , 0)

Quitte a diviser ~m par mn−k0 , on peut supposer que

~m = (m0,m1, · · · ,mn−k0−1, 1, 0, · · · , 0)

Le vecteur ~m est l’unique element de C tel que L(~m) ≤ L(~v) ∀~v ∈ C et dont la (n−k0−1)-ieme composante vaut 1 (i.e. mL(~m) = 1). En effet, raisonnons par l’absurde et supposonsqu’il existe un deuxieme vecteur de C, disons ~w avec les memes proprietes. Alors leurdifference ~a = ~m− ~w ∈ C est dans C et L(~a) < L(~m), une contradiction.

Comme par hypothese, C est cyclique,

~m, σ(~m), σ2(~m), · · · , σk0−1(~m) ∈ C

Page 45: B. Ischi - MaTheX

Codes cycliques (page 45/61)

Ces vecteurs sont lineairement independants car la matrice dont les colonnes sont con-stituees de ces vecteurs

m0 0 · · · 0m1 m0 · · · 0...

......

...1 mn−k0−1 mn−k0−2

0 1 mn−k0−1

0 0 1...

. . . mn−k0−1

0 · · · 0 1

contient clairement une sous-matrice k0 × k0 inversible. Il suit que k0 ≤ k. Montronsmaintenant qu’ils engendrent C. Definissons

g(X) = m0 +m1X +m2X + · · ·+mn−k0−1Xn−k0−1 +Xn−k0 = η(~m)

Ainsi, η(~m)(X) = g(X). Soit ~v ∈ C. Alors, par division euclidienne

η(~v)(X) =(b0 + b1X + b2X

2 + · · ·+ bk0−1Xk0−1)

)g(X) + r(X)

avec deg(r(X)) < n− k0. Ainsi

η(~v)(X) = b0η(~m)(X) + b1η(σ(~m)) + · · ·+ bk0−1η(σk0−1(~m)) + r(X)

= η(b0 ~m+ b1σ(~m) + · · ·+ bk0−1σ

k0−1(~m))︸ ︷︷ ︸

∈C

(X) + r(X)

Par consequent, r(X) ∈ η(C). Par definition de k0, il suit que r(X) = 0 (sinon, η−1(r(X))a moins de 0 a droite que ~m !). Nous avons montre que les vecteurs donnes ci-dessusengendrent C, donc que k0 = k et que C = Cg.

Pour finir, nous devons encore montrer que g(X) divise Xn − 1. Remarquons que

σk−1(~m) = (0, · · · , 0,m0,m1, · · · ,mn−k−1, 1)

et

σk(~m) = (1, · · · , 0,m0,m1, · · · ,mn−k−1)

Or

η(σk(~m)) = Xkg(X)− (Xn − 1)

Mais nous venons de montrer que

η(σk(~m)) = h(X)g(X)

avec deg(h) = k − 1. Par consequent,

Xn − 1 = (Xk − h(X))g(X)

ce qui montre que g(X) divise Xn − 1

Page 46: B. Ischi - MaTheX

Exemples (page 46/61)

En vertu du theoreme que nous venons de demontrer, la recherche de codes cycliques deparametres (q;n, k, d) se ramene a la recherche de polynomes unitaires de degre n−k qui divisentXn − 1 dans Fq[X]. Le polynome g est appele le generateur unitaire minimal, ou simplement legenerateur du code cyclique.

Soit g(X) unitaire de degre n − k divisant Xn − 1 dans Fq[X]. Notons ~m = η−1(g(X)). Uneapplication de codage est une application lineaire c : Fkq → Fnq . On peut, par exemple, pendre la

matrice dont les colonnes sont les vecteurs ~m, σ(~m), ..., σk−1(~m). Soit ~a ∈ Fkq . Alors,

η(c(~a)) = a0η(~m) + a1η(σ(~m)) + · · ·+ ak−1η(σk−1(~m))

= a0g(X) + a1Xg(X) + · · ·+ ak−1Xk−1g(X) =

(a0 + a1X + a2X

2 + · · ·+ ak−1Xk−1)g(X)

= η(~a)(X)g(X)

Dans Fq[X], cette application de codage se resume a une multiplication par le polynome generateurdu code.

5. Exemples

Exemple 5.1. Le code de parite est defini par

C =

{~m ∈ F2

∣∣∣ n−1∑j=0

mj ≡ 0 (mod 2)

}

Ses parametres sont (n, n−1, 2). Il est cyclique (la condition∑n−1

j=0 mj ≡ 0 (mod 2) est invariante

par permutation). Reprenons la demonstration du theoreme: le mot ayant “le plus de zeros adroite” est (−1, 1, 0, · · · , 0). Par consequent, le polynome generateur du code est

g(X) = −1 +X

Il divise Xn − 1 (en effet: Xn − 1 = (X − 1)(Xn−1 +Xn−2 + · · ·+X2 +X + 1)) et il est unitairede degre 1.

Exemple 5.2. Le code de repetition est donne par

C = 〈

1...1

〉Ses parametres sont (2;n, 1, n). Il est trivialement cyclique et son polynome generateur est donnepar

g(X) = 1 + x+X2 + · · ·+Xn−1

Il est unitaire, de degre n− 1 et divise Xn − 1 (car Xn − 1 = g(X)(X − 1)).

Page 47: B. Ischi - MaTheX

Classes cyclotomiques (page 47/61)

Exemple 5.3. Le code de Hamming H3 a ete construit de maniere cyclique:

H7 = 〈{~m, σ(~m), · · · , σ3(~m)

}〉 avec ~m =

1101000

Ses parametres sont (2; 7, 4, 3). Son polynome generateur est

g(X) = 1 +X +X3

Il est unitaire de degre 3. Il divise X7− 1 dans F2[X]: X7− 1 = (X3 +X + 1)(X4 +X2 +X + 1)

Exemple 5.4. L’orthogonal du code de Hamming H3 est appele le code du simplexe. Il estengendre par les lignes de la matrice verificatrice P :

H⊥3 = 〈{~m, σ(~m), σ2(~m)

}〉 avec ~m =

1011100

Ses parametres sont (2; 7, 3, 4). Son polynome generateur est donne par g(X) = 1+X2 +X3 +X4

il est unitaire et divise X7 − 1 dans F2[X]: X7 − 1 = (X4 +X3 +X2 + 1)(X3 +X2 + 1)Remarquons que le polynome generateur de H3 est

gH3(X) = 1 +X +X3 et X7 − 1 = gH3(X)h(X) avec h(X) = 1 +X +X2 +X4

et que

gH⊥3 (X) = X4h(1/X) = X4

(1 +

1

X+

1

X2+

1

X4

)= X4 +X3 +X2 + 1

Le polynome X4h(1/X) est appele le polynome reciproque de h (on renverse simplement la suitedes coefficients). On peut demontrer de maniere generale que4

Theoreme 5.5. Soit gC(X) le polynome de degre n−k generateur d’un code lineaire cycliqueC de parametres (n, k, d). Soit h(x) tel que

Xn − 1 = gC(X)h(X)

Alors le polynome generateur de C⊥ est le polynome reciproque de h:

gC⊥(X) = Xkh(1/X)

4voir: Michel Demazure, “Cours d’algebre”, p. 250

Page 48: B. Ischi - MaTheX

Classes cyclotomiques (page 48/61)

6. Classes cyclotomiques

Pour la suite, nous travaillons avec un corps

K = Fq et nous supposons que pgcd(n, q) = 1

Par exemple, K = F2s et n impair ou K = F3 et n n’est pas un multiple de 3. Comme nousl’avons vu, pour construire des codes lineaires cycliques sur Fq, nous devons trouver des polynomesgenerateurs, c’est-a-dire des polynomes unitaires qui divisent Xn − 1 dans Fq[X].

Soit r le plus petit entier tel que qr ≡ 1 (mod n). Nous avons vu que

M ={α ∈ Fqr

∣∣∣ αq = α}

est un sous-corps de Fqr . Il est isomorphe a Fq. Soit β une racine primitive n-ieme de l’unite dansFqr qui contient Fq comme sous-corps. Une telle racine existe car n divise qr − 1. En effet, si αest une racine primitive (qr − 1)-ieme de l’unite dans Fqr , et si qr − 1 = mn, alors β = αm est uneracine primitive n−ieme de l’unite dans Fqr . Dans Fqr [X] on a

Xn − 1 =n−1∏j=0

(X − βj)

car Xn − 1 admet au plus n racines dans Fqr . De plus, les βj pour 0 ≤ j ≤ n − 1 sont tousdifferents (car par hypothese, β est un racine primitive n-ieme de l’unite) et (βj)n = βnj = 1. Parconsequent, tout diviseur de Xn − 1 dans Fqr est de la forme

gΣ =∏j∈Σ

(X − βj)

Voici une condition necessaire et suffisante pour que les coefficients de gΣ(X) soit dans Fq.

Theoreme 6.1. Avec les notations qui precedent, on a

gΣ(X) ∈ Fq[X] ⇔ qj ∈ Σ (mod n),∀j ∈ Σ

en d’autres termes, le polynome gΣ(X) a ses coefficients dans Fq si et seulement si le sous-ensembled’indices Σ est stable par multiplication par q modulo n.

Demonstration. ⇒: Notons q = ps. Comme nous l’avons vu dans les rappels, l’applicationx 7→ xq de Fqr dans Fqr preserve l’addition. Par ailleurs, pour tout a ∈ Fq, aq = a. Il suit que sigΣ(X) ∈ Fq, alors

(gΣ(X))q =

(m∑j=0

ajXj

)q

=m∑j=0

aqjXqj =

m∑j=1

aj(Xq)j = gΣ(Xq)

Par consequent

j ∈ Σ ⇔ βj est un racine de gΣ(X) ⇔ βqj est une racine de gΣ(X) ⇔ qj ∈ Σ (mod n)

⇐: On suppose que qΣ = Σ modulo n. Alors

gΣ(Xq) =∏j∈Σ

(Xq − βj) =∏i∈Σ

(Xq − βqi) =∏i∈Σ

(X − βi)q = gΣ(X)q

Page 49: B. Ischi - MaTheX

Exemples (page 49/61)

En considerant l’egalite de la premiere partie, il suit que aqj = aj pour tout 0 ≤ j ≤ m. Oraj ∈ Fq ⇔ aqj = aj (car, rappelons-le, le polynome Xq − X a au plus q racines et tous leselements de Fq sont des racines de ce polynome). �

Sur Z/nZ on definit

j ∼ i ⇔ ∃u ∈ N∣∣∣ j = qui

C’est une relation d’equivalence: j ∼ j (prendre u = 0), j ∼ i ⇒ j = qui. Alors qr−uj =qr−u+ui = qri ≡ i (mod n) car, rappelons-le, n|(qr − 1). Finalement, si j ∼ i et i ∼ k avec j = quiet i = qvk, alors j = qu+vk, c’est-a-dire j ∼ k.

Les classes d’equivalence sont appelees les classes cyclotomiques. La classe de j ∈ Z/nZest donnee par

Σj = {j, qj, q2j, · · · , qu−1j}

ou u est le plus petit entier tel que quj = j (mod n). Par consequent,

Xn − 1 =∏

j∈(Z/(nZ))/∼

gΣj(X) avec gΣj

(X) ∈ Fq[X]

En vertu du theoreme demontre ci-dessus, les polynomes gΣj(X) sont irreductibles sur Fq[X]. Les

elements de Σj sont appeles les racines du code determine par gΣj(X).

Theoreme 6.2. Soit K un corps fini, soit Fp son sous-corps premier, soit β ∈ K et r le degrede β sur Fp (i.e. le degre de son polynome minimal). Alors,5

(1) r est le plus petit entier tel que βpr

= β,

(2) les βpj

pour j = 0, 1, · · · , r − 1 sont tous distincts,(3) le polynome minimal de β sur Fp est

Pβ(X) = (X − β)(X − βp)(X − βp2) · · · (X − βpr−1

)

Il suit que gΣj(X) est le polynome minimal de βj car

gΣj(X) =

(X − βj

) (X − βqj

) (X − βq2j

)· · ·(X − βqu−1j

)=(X − (βj)

) (X − (βj)q

1)(

X − (βj)q2)· · ·(X − (βj)q

u−1)

ou u = #Σj.

7. Exemples

Nous avons montre que la construction de codes cycliques de longueur n sur Fq, avec q et nrelativement premiers, revient a determiner les classes cyclotomiques de Z/nZ. Donnons quelquesexemples.

Exemple 7.1. Si Σ = ∅, alors g∅(X) = 1 qui genere le code plein de parametres (n, n, 0). Iln’y pas de codage. Pour continuer dans les extremes absurdes, si Σ = Z/nZ, gZ/nZ(X) = 0 genere

5voir: Michel Demazure, “Cours d’algebre”, p. 211

Page 50: B. Ischi - MaTheX

Exemples (page 50/61)

le code nul de parametres (n, 0, 0). Si Σ = {0}, alors gΣ(X) = (X−1) qui genere le code de paritede parametres (n, n− 1, 2) deja rencontre. Enfin, si Σ = (Z/nZ)\{0}, alors

gΣ(X) = (Xn − 1)/(X − 1) = 1 +X +X2 + · · ·+Xn−1

qui genere le code de repetition pure de parametres (1, k, k).

Exemple 7.2. Prenons q = 2, n = 7. Alors r = 3 car 23 = 8 ≡ 1 (mod 7). Les classescyclotomiques sont

1→ 2→ 4→ 1 ⇒ Σ1 = {1, 2, 4}

3→ 6→ 5→ 3 ⇒ Σ3 = {3, 5, 6}

⇒ Σ0 = {0}

Il suit queX7 − 1 = gΣ0(X)gΣ1(X)gΣ3(X)

etgΣ0(X) = (X − 1)

Soit α une racine primitive 7-ieme de l’unite de F23 . Alors

gΣ1(X) = (X − α)(X − α2)(X − α4) = X3 −X2(α + α2 + α4) +X(α3 + α5 + α6)− α7

Nous avons etabli plus haut la table d’addition de F23 . Il suit que

α + α2 + α4 = 0

α3 + α5 + α6 = 1

α7 = 1

Par consequent,gΣ1(X) = X3 +X + 1

De meme,

gΣ3(X) = (X−α3)(X−α5)(X−α6) = X3−X2(α3+α5+α6)+X(α8+α9+α11)−α14 = X3+X2+1

En resume, nous trouvons la decomposition

X7 − 1 = (X − 1)(X3 +X + 1)(X3 +X2 + 1)

ce que nous savons deja. Le polynome gΣ1(X) = 1 +X +X3 genere le code Hamming H3 vu dansle premier chapitre.

Exemple 7.3. Prenons q = 2, n = 5. Alors r = 4 car 24 = 16 ≡ 1 (mod 5). Les classescyclotomiques sont

1→ 2→ 4→ 3→ 1 ⇒ Σ1 = {1, 2, 3, 4}

⇒ Σ0 = {0}

Il suit queX5 − 1 = gΣ0(X)gΣ1(X)

Page 51: B. Ischi - MaTheX

Codes de Reed-Solomon (page 51/61)

et

gΣ0(X) = (X − 1)

Soit α une racine primitive 15-ieme de l’unite de F24 et β = α3. Alors β est un racine 5-ieme del’unite et

gΣ1(X) = (X − β)(X − β2)(X − β3)(X − β4) = X4 −

X3(β + β2 + β3 + β4) +X2(β3 + β4 + β5 + β5 + β6 + β7) +X(β6 + β7 + β8 + β9)− β10

Nous avons etabli plus haut la table d’addition de F24 . Il suit que

β + β2 + β3 + β4 = α3 + α6 + α9 + α12 = 1

β3 + β4 + β5 + β5 + β6 + β7 = β3 + β4 + β6 + β7 = α9 + α12 + α18 + α21 =

= α9 + α12 + α3 + α6 = 1

β6 + β7 + β8 + β9 = α18 + α21 + α24 + α27 = α3 + α6 + α9 + α12 = 1

β10 = α30 = 1

Par consequent,

gΣ1(X) = 1 +X +X2 +X3 +X4

et nous trouvons la decomposition

X5 − 1 = (X − 1)(1 +X +X2 +X3 +X4)

que nous connaissons deja. Le polynome gσ1(X) genere le code de repetition pure de parametres(1, 5, 5).

8. Distance minimale des codes cycliques

La distance minimale d’un code cyclique depend de n, q (ou n et q sont relativement premiers)et de l’ensemble de classes cyclotomiques Σ. On ne connaıt pas d’algorithme pour calculer ladistance minimale directement a partir de n, q et Σ. La determination de d dans des cas concretspeut etre extremement difficile. On dispose d’une borne inferieure:

Theoreme 8.1. S’il existe des entiers t et s > 0 tels que6

{t, t+ 1, t+ 2, · · · , t+ s− 1} ⊆ Σ ⇒ d ≥ s+ 1

Pour le code de Hamming H3, le polynome generateur correspond a la classe cyclotomiqueΣ = {1, 2, 4}. Il suit que pour t = 1 et s = 2. Le theoreme affirme que sa distance minimale est≥ s+ 1 = 3. Pour le code de repetition pure de polynome generateur gΣ(X) avec Σ = {1, 2, 3, 4},on peut prendre t = 1 et s = 4 et le theoreme affirme que sa distance minimale est ≥ 5.

6voir: Michel Demazure, “Cours d’algebre”, p. 253

Page 52: B. Ischi - MaTheX

Codes de Golay (page 52/61)

9. Codes de Reed-Solomon

Les codes de Reed-Solomon (dits de type RS) forment une classes de codes robustes face auxbouffees d’erreurs. Ils ont notamment ete utilises pour la transmission des images de Mars envoyeespar la sonde Mariner 9 en 1972. Ils sont egalement utilises pour le codage des donnees sur lesdisques compacts audios.7 Les codes de type RS ont l’avantage de posseder des algorithmes dedecodage tres simples.

Les codes de type RS sont definis par

q = ps et n = q − 1

donc r = 1. Soit α ∈ Fq une racine primitive n-ieme de l’unite. Soit un entier 1 < d < q et soit

g(X) =d−1∏j=1

(X − αj) ∈ Fq[X]

Alors g(X) est le generateur d’un code de parametres

Reed Solomon: (q; q − 1, q − d, d)

En effet, il est de longueur n = q − 1 par construction. De plus, g(X) est de degre d − 1 =n − k = q − 1 − k et donc k = d − q. En vertu du theoreme cite plus haut concernant ladistance minimale des codes cycliques (poser t = 1, s = d − 1), nous savons que que sa distanceminimale est ≥ d. Par ailleurs, la majoration du singleton nous dit que sa distance minimale est≤ n − k + 1 = q − 1 − (q − d) + 1 = d. Les codes RS sont donc MDS. Les codes MDS raccourcisrestent MDS8. Par exemple, a partir du code de type RS de parametres (256; 255, 251, 5) on obtientles codes raccourcis de parametres (256; 32, 28, 5) et (256; 28, 24, 5), tous les deux 2-correcteurs.Ils sont utilises pour le codage des disques compacts audios. Dans le code raccourci, on fixe n. Ledegre du generateur etant toujours d− 1 = n− k, on a k = n− d+ 1. Finalement, comme il resteMDS par raccourcissement, la distance minimale est donnee par n−k+1 = n− (n−d+1) +1 = d.

10. Codes de Golay

Marcel Golay est ne a Neuchatel en 1902. Il est l’auteur de codes qui portent son nom,notamment le code G23 dont le point de depart est le constat:

212

(3∑j=0

C23j

)= 212 (1 + 23 + 253 + 1771) = 212 · 2048 = 212 · 211 = 223

qui permet de supputer l’existence d’un code correcteur lineaire 3-correcteur parfait de parametres(23, 11, 7). Le code G23 et son extension paire G24 ont ete decouverts par Golay en 1949. Le codeG24 a ete utilise en 1979 et 1980 lors des missions Voyager 1 et 2 pour transmettre des images encouleurs de Jupiter et de Saturne.

7voir: Michel Demazure, “Cours d’algebre”, ch. 12, p. 2718voir: Michel Demazure, “Cours d’algebre”, p. 243

Page 53: B. Ischi - MaTheX

Codes de Golay (page 53/61)

Commencons par decrire brievement le code ternaire de Golay G11. On pose q = 3 et n = 11.Donc r = 5 car 35 = 243 = 22 · 11 + 1. Les classes cyclotomiques sont donnees par

1→ 3→ 9→ 5→ 4→ 1 ⇒ Σ1 = {1, 3, 4, 5, 9}

2→ 6→ 7→ 10→ 8→ 2 ⇒ Σ3 = {2, 6, 7, 8, 10}

⇒ Σ0 = {0}

Ces classes cyclotomiques correspondent a la decomposition

X11 − 1 = Φ1(X)Φ11(X) = (X − 1)(X5 +X4 −X3 +X2 − 1)(X5 −X3 +X2 −X − 1)

On peut verifier directement que dans F3:

(X5 +X4 −X3 +X2 − 1)(X5 −X3 +X2 −X − 1)

= 1 +X +X2 +X3 +X4 +X5 +X6 +X7 +X8 +X9 +X10 = Φ11(X)

Le code de Golay G11 est engendre par le polynome

g(X) = X5 +X4 −X3 +X2 − 1

Ses parametres sont (3; 11, 6, 5), il est 2-correcteur parfait.Le code de Golay G23 est determine par le choix: q = 2, n = 23. Par consequent, r = 11 car

211 = 2048 = 23 · 89 + 1. Les classes cyclotomiques sont

1→ 2→ 4→ 8→ 16→ 9→ 18→ 13→ 3→ 6→ 1

⇒ Σ1 = {1, 2, 3, 4, 6, 8, 9, 12, 13, 16, 18}

5→ 10→ 20→ 17→ 11→ 22→ 21→ 19→ 15→ 7→ 14→ 5

⇒ Σ5 = {5, 7, 10, 11, 14, 15, 17, 19, 20, 21, 22}

⇒ Σ0 = {0}

Il suit que dans F2[X] on a

X23 − 1 = Φ1(X)Φ23(X) = (X − 1)gΣ1(X)gΣ5(X)

Il reste a determiner gΣ1(X) ou gΣ5(X). Nous savons que

1 +X +X2 +X3 +X4 +X5 + · · ·+X20 +X21 +X22 = Φ23(X) = gΣ1(X)gΣ5(X)

Pour trouver gΣ1(X) on peut proceder comme plus haut dans les exemples. Mais cela risque deprendre du temps, c’est pourquoi nous faisons faire les calculs a la machine avec le script Python3 suivant:

1 import numpy as np

2 from codCorr import ∗3 import sys

4 #

5 def l i s t e F p s (P, p) :6 degP=len (P)−1

7 q=p∗∗degP

8 nbd ig i t=i n t (np . l og ( q ) /np . l og (10) +1)9 l i s t e = [ [ 0 ] , [ 1 ] ]

Page 54: B. Ischi - MaTheX

Codes de Golay (page 54/61)

10 x =[0 ,1 ]

11 m=1

12 while l en ( l i s t e )<q :13 e=d i v i s i o n E u c l i d e ( mulPolyFp (x , l i s t e [−1] ,P, p) ,P, p)

14 i f e [ 1 ] in l i s t e :

15 print ( ” Erreur : l a r a c i n e a de P(X) n ’ e s t pas une r a c i n e p r i m i t i v e ”+s t r (q−1)+”−iemede l ’ un i t e de F ”+s t r ( q ) )

16 sys . e x i t ( )

17 nbdigitm=i n t (np . l og (m) /np . l og (10) +1)18 l i s t e . append ( e [ 1 ] )

19 m=m+120 return l i s t e

21 #

22 def addFp(x , y , p ) :23 l x=len ( x )

24 l y=len ( y )

25 i f lx>l y :26 y=y+(lx−l y ) ∗ [ 0 ]

27 else :

28 x=x+(ly−l x ) ∗ [ 0 ]29 return np . ndarray . t o l i s t ( ( np . array ( x )+np . array ( y ) )%p)

30 def mulPolyF2048 ( f , g ,P, p) :

31 degf=len ( f )−132 degg=len ( g )−1

33 prod=(degf+degg+1) ∗ [ [ 0 ] ]34 for j in range (0 , deg f +1 ,1) :

35 for k in range (0 , degg +1 ,1) :

36 prod [ j+k]=addFp( prod [ j+k ] , mulPolyFp ( f [ j ] , g [ k ] ,P, p) ,p )37 return prod

38 #

39 cyc l o = [1 , 2 , 3 , 4 , 6 , 8 , 9 , 12 , 13 , 16 , 18 ]40 cyc lo2 =[5 ,7 , 10 ,11 ,14 ,15 ,17 ,19 ,20 ,21 ,22 ]

41 p=2

42 r=1143 n=23

44 P=[1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 ]

45 F2048=l i s t e F p s (P, p)46 poly = [ [ 1 ] ]

47 for j in cyc l o :#for j in cyc lo2 :48 monome=[F2048 [ j ∗8 9 + 1 ] , [ 1 ] ]

49 poly=mulPolyF2048 ( poly , monome ,P, p)

50 for j in range (0 , l en ( poly ) ) :51 poly [ j ]= en l eve rZe ro sDro i t e ( poly [ j ] )

52 print ( poly )

L’execution donne>> python3 golay.py

[[1], [1], [], [], [], [1], [1], [1], [], [1], [], [1]]

>>python3 golay.py

[[1], [], [1], [], [1], [1], [1], [], [], [], [1], [1]]

c’est-a-diregΣ1(X) = 1 +X +X5 +X6 +X7 +X9 +X11

gΣ5(X) = 1 +X2 +X4 +X5 +X6 +X10 +X11

Il existe un moyen plus subtil de trouver ces deux polynomes.9 Nous avons trouve la decomposition

X23 − 1 = Φ1(X)Φ23(X)

= (X − 1)(1 +X +X5 +X6 +X7 +X9 +X11)(1 +X2 +X4 +X5 +X6 +X10 +X11)

9voir: Michel Demazure, “Cours d’algebre”, p. 286

Page 55: B. Ischi - MaTheX

Codes de Golay (page 55/61)

Le code de Golay G23 est engendre par un des ces deux polynomes. Nous choisissons gΣ1(X).Cela donne la matrice generatrice G affichee ci-dessous. Nous trouvons egalement une matriceverificatrice. En executant les commandes Octave suivantes

1 g=[2 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ;

3 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ;

4 0 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ;5 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ;

6 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 ;

7 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 ;8 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 ;

9 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 ;

10 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 ;11 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 , 0 ;

12 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 0 ;

13 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 ] ;14 G=transpose ( g ) ;

15 P=[16 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 ;

17 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 ;

18 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 ;19 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 ;

20 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 1 , 1 ;

21 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 1 ;22 1 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 ;

23 1 , 1 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 ;

24 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 ;25 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 ;

26 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 , 1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 0 , 1 ;

27 ] ;28 mod(P∗G, 2 )

on obtientoctave:5> Golay

ans =

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

0 0 0 0 0 0 0 0 0 0 0 0

Le script Python 3 suivant simule un canal induisant des erreurs de transmission et un systemede codage et decodage avec le code de Golay G23.

1 import numpy as np2 from codCorr import ∗3 import sys

4 #5 def base2to10 ( l ) :

6 nb=0

7 for j in range (0 , l en ( l ) ) :8 nb=nb+l [ j ]∗2∗∗ j

9 return nb

10 #11 def a joutErreur ( e r reur , g , p , synd ) :

Page 56: B. Ischi - MaTheX

Codes de Golay (page 56/61)

12 e=d i v i s i o n E u c l i d e ( e r reur , g , p )

13 num=base2to10 ( e [ 1 ] )

14 i f synd [num] ! = 0 :15 print ( ”Le code n ’ e s t pas 3−c o r r e c t e u r : ” , e r reur , ” et ” , synd [num] , ” ont l e meme syndrome :

” ,num)

16 sys . e x i t ( )17 else :

18 synd [num]= e r r e u r

19 return synd20 #

21 def syndromes (n , g ) :22 synd =2048∗ [0 ]

23 for i in range (0 , n , 1 ) :

24 e r r e u r=n ∗ [ 0 ]25 e r r e u r [ i ]=1

26 synd=ajoutErreur ( e r reur , g , p , synd )

27 for i in range (0 , n , 1 ) :28 for j in range ( i +1,n , 1 ) :

29 e r r e u r=n ∗ [ 0 ]

30 e r r e u r [ i ]=131 e r r e u r [ j ]=1

32 synd=ajoutErreur ( e r reur , g , p , synd )

33 for i in range (0 , n , 1 ) :34 for j in range ( i +1,n , 1 ) :

35 for k in range ( j +1,n , 1 ) :36 e r r e u r=n ∗ [ 0 ]

37 e r r e u r [ i ]=1

38 e r r e u r [ j ]=139 e r r e u r [ k]=1

40 synd=ajoutErreur ( e r reur , g , p , synd )

41 return synd42 #

43 def cana l (m, prob , p , n , t ) :

44 #e=np . random . cho ice ( [ 1 , 0 ] , l en (m) ,p=[prob ,1−prob ] )45 e =[ ]

46 for j in range (0 , l en (m) //n , 1 ) :

47 ep=n ∗ [ 0 ]48 k=0

49 while k<t :

50 i=np . random . cho i c e ( range (0 , n , 1 ) )51 i f ep [ i ] ! = 1 :

52 ep [ i ]=153 k=k+1

54 e=e+ep

55 e=np . array ( e )56 #e=np . array (( l en (m)//n) ∗ [ 0 ,0 ,1 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,1 ,0 ,0 ,0 ,0 ,1 ,0 ] )

57 return (m+e )%p , e

58 #59 def codeCycl ique (a , g , p , n , k ) :

60 l=l en ( a )61 G=matriceG ( g , k )62 a=a . reshape ( l //k , k ) . t ranspose ( )

63 m=np . matmul (G, a )%p

64 m=m. transpose ( ) . reshape ( l //k∗n)65 return m

66 #67 def decodeCycl ique (Cm, g , p , n , k , synd ) :

68 l=l en (Cm)

69 Cm=Cm. reshape ( l //n , n)70 m=[]

71 for l i g n e in Cm:

72 e=d i v i s i o n E u c l i d e ( l i gne , g , p )73 nb=base2to10 ( e [ 1 ] )

74 e r r e u r=synd [ nb ]

75 mess=( l i gne−np . array ( e r r e u r ) )%p

Page 57: B. Ischi - MaTheX

Codes de Golay (page 57/61)

76 e=d i v i s i o n E u c l i d e ( mess , g , p )

77 m=m+e [0 ]+( k−l en ( e [ 0 ] ) ) ∗ [ 0 ]

78 return np . array (m)79 #

80 def message ( ) :

81 t ex t e=input ( ”Tapez un tex t e : ” )82 t ex t eb in=’ ’

83 for l e t t r e in t ex t e :

84 t ex t eb in=tex t eb in+np . b ina ry r ep r ( ord ( l e t t r e ) , width=8)85 return texteb in , t ex t e

86 #87 def a f f i c h a g e e r r e u r s c a n a l ( e , texte , newtexte , n , k , t ) :

88 l=l en ( e )

89 l t=l en ( t ex t e )90 nbb=l //n

91 t e s t=e . reshape (nbb , n)

92 jb=093 j l =0

94 print ( ”\nAnalyse : ” )

95 nbl=k//896 for jb in range (0 , nbb , 1 ) :

97 eb=t e s t [ jb ]

98 print ( ”nombre d ’ e r r e u r s dans l e b loc ” , s t r ( jb +1) , ” : ” ,sum( eb ) , ” e r r e u r : ” , eb )99 nla=( jb +1)∗k//8

100 i f nla> j l and j l< l t :101 while j l<nla :

102 te=tex t e [ j l ]

103 nte=newtexte [ j l ]104 i f te != nte :

105 print ( ”ERREUR ” , end=”” )

106 print ( te , ”−>” , nte )107 j l=j l +1

108 i f ( jb +1)∗k%8!=0 and j l< l t :

109 print ( t ex t e [ j l ] , ”−>” , newtexte [ j l ] , ” <−−−−−−−−−−−−−−−−− l e t t r e ent re deux b l o c s \n”)

110 j l=j l +1

111 print ( ”\n” )112 #

113 def af f i chageMessageTransmis ( abin , texte , i n t i ) :114 l=l en ( t ex t e )

115 abin=abin . reshape ( l , 8 )

116 abin=np . matmul ( abin , np . array ( [ 1 2 8 , 6 4 , 3 2 , 1 6 , 8 , 4 , 2 , 1 ] ) . reshape (8 , 1 ) )117 newtexte=’ ’

118 j=0

119 e r r=0120 for x in abin :

121 l e t t r e=chr ( x )

122 i f l e t t r e != tex t e [ j ] :123 e r r=e r r+1

124 newtexte=newtexte+l e t t r e125 j=j+1126 print ( i n t i , newtexte )

127 print ( ”\nNombre d ’ e r r e u r s : ” , e r r )128 return newtexte

129 #

130 def formatage (v , k ) :131 l=l en ( v )

132 i f l%k !=0:

133 r=np . array ( ( k−l%k ) ∗ [ 0 ] )134 v=np . concatenate ( ( v , r ) )

135 return v

136 #137 p=2

138 n=23

139 t=3

Page 58: B. Ischi - MaTheX

Codes de Golay (page 58/61)

140 g =[1 , 1 , 0 , 0 , 0 , 1 , 1 , 1 , 0 , 1 , 0 , 1 ]#g (X)=1+X+Xˆ5+Xˆ6+Xˆ7+Xˆ9+Xˆ11

141 #

142 synd=syndromes (n , g )143 #

144 k=n−l en ( g )+1

145 #146 a , t ex t e=message ( )

147 #

148 a=np . array ( l i s t ( a ) , dtype=i n t )149 l=l en ( a )

150 a=formatage ( a , k )151 #

152 m=codeCycl ique (a , g , p , n , k )

153 Cm, e=cana l (m, 0 . 0 1 , p , n , t )154 abin=decodeCycl ique (Cm, g , p , n , k , synd )

155 abin=abin [ 0 : l ]

156 newtexte=af f i chageMessageTransmis (Cm[ 0 : l ] , texte , ’ Texte transmis : ’ )157 newtexte=af f i chageMessageTransmis ( abin , texte , ’ Texte c o r r i g e : ’ )

158 a f f i c h a g e e r r e u r s c a n a l ( e , texte , newtexte , n , k , t )

L’execution du script donne, par exemple:10

>>python3 G23.py

Tapez un texte: Bonjour, comment allez-vous ?

Texte transmis: !§=-a~Na-OXa--±\ 14¨-¯aD-EXyTy~o~N

Nombre d’erreurs: 29

Texte corrige: Bonjour, comment allez-vous ?

Nombre d’erreurs: 0

Analyse:

nombre d’erreurs dans le bloc 1 : 3 erreur: [0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0]

B -> B

o -> o <----------------- lettre entre deux blocs

nombre d’erreurs dans le bloc 2 : 3 erreur: [0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0]

n -> n

nombre d’erreurs dans le bloc 3 : 3 erreur: [0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0]

j -> j

o -> o <----------------- lettre entre deux blocs

nombre d’erreurs dans le bloc 4 : 3 erreur: [0 0 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0]

u -> u

nombre d’erreurs dans le bloc 5 : 3 erreur: [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0]

r -> r

, -> , <----------------- lettre entre deux blocs

nombre d’erreurs dans le bloc 6 : 3 erreur: [0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0]

->

nombre d’erreurs dans le bloc 7 : 3 erreur: [0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0]

c -> c

o -> o <----------------- lettre entre deux blocs

nombre d’erreurs dans le bloc 8 : 3 erreur: [0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0]

m -> m

nombre d’erreurs dans le bloc 9 : 3 erreur: [0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0]

m -> m

e -> e <----------------- lettre entre deux blocs

nombre d’erreurs dans le bloc 10 : 3 erreur: [0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0]

n -> n

10Certains caracteres du message transmis non corrige ne s’affichant pas au format PDF, ils ont ete remplacesa la main par des -

Page 59: B. Ischi - MaTheX

Conclusion (page 59/61)

nombre d’erreurs dans le bloc 11 : 3 erreur: [0 0 1 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0]

t -> t

-> <----------------- lettre entre deux blocs

nombre d’erreurs dans le bloc 12 : 3 erreur: [0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0]

a -> a

nombre d’erreurs dans le bloc 13 : 3 erreur: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1]

l -> l

l -> l <----------------- lettre entre deux blocs

nombre d’erreurs dans le bloc 14 : 3 erreur: [0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1]

e -> e

nombre d’erreurs dans le bloc 15 : 3 erreur: [0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0]

z -> z

- -> - <----------------- lettre entre deux blocs

nombre d’erreurs dans le bloc 16 : 3 erreur: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0]

v -> v

nombre d’erreurs dans le bloc 17 : 3 erreur: [0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0]

o -> o

u -> u <----------------- lettre entre deux blocs

nombre d’erreurs dans le bloc 18 : 3 erreur: [1 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

s -> s

nombre d’erreurs dans le bloc 19 : 3 erreur: [0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0]

->

? -> ? <----------------- lettre entre deux blocs

nombre d’erreurs dans le bloc 20 : 3 erreur: [0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1]

La fonction syndromes(n,g) commence par calculer le reste r(X) de la division par gΣ1(X) de tousles polynomes dans F<23

2 [X] de degre ≤ 22 comprenant 1, 2 ou 3 monomes. Comme nous l’avonsdeja mentionne, il y en a

3∑j=1

C23j = 211 − 1 = 2047

Le reste r(X) est appele le syndrome. Le programme verifie qu’ils sont tous differents. Celamontre au passage que G23 est au moins 3-correcteur. Remarquons que

r1(X) = 1 +X +X2 +X3, r2(X) = X9 +X12 +X21

⇒ gΣ1(X)(1 +X2 +X5 +X8 +X10) + r1(X) = r2(X)

Cela signifie que les erreurs

[1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] et

[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0]

ont le meme syndrome. Par consequent, le code de Golay G23 n’est pas 4-correcteur. Il a lesparametres (2; 23, 12, 7). Une demonstration plus elegante se trouve par exemple chez MichelDemazure, “Cours d’algebre”, p. 287.

11. Conclusion

Pour conclure, citons un theoreme important concernant les codes parfaits:

Page 60: B. Ischi - MaTheX

Conclusion (page 60/61)

Theoreme 11.1. 11 Soit C ⊆ Fnq un code t-correcteur parfait (non necessairement lineaire),

qui contient ~0 ∈ C. Alors, une des quatre affirmations suivantes est vraie:

(1) C = {~0} ou C est le code plein ou C est un code de repetition pure de longueur impaire.(2) t = 1, n = qm−1

q−1et C possede qn−m elements.

(3) t = 2, q = 3 et C est equivalent au code ternaire de Golay G11.(4) t = 3, q = 2 et C est equivalent au code binaire de Golay G23.

Les parametres du points (2) sont les memes que ceux des codes de Hamming. En effet, pourq = 2, cela donne n = 2m− 1 et k = n−m = 2m− 1−m. Mais ici C n’est pas forcement lineaire.Remarquons que dans les cas (1), (3) et (4), le code C est lineaire.

Figure 2. Resume

11voir: Michel Demazure, “Cours d’algebre”, p. 289

Page 61: B. Ischi - MaTheX

APPENDICE A

Notions de base d’arithmetique

1. Theoreme de Bezout et algorithme d’Euclide

Theoreme 1.1 (Bezout). Soient a, b ∈ Z. Alors, il existe s, t ∈ Z tels que

pgcd(a, b) = a · s+ b · t

Demonstration. Notons d = pgcd(a, b). L’ensemble

H = aZ + bZ ={am+ bn

∣∣∣ m, n ∈ Z}

est clairement un ideal de Z. Comme Z est un anneau principal, H est principal. Par consequent,il existe d′ ∈ N tel que H = d′Z et donc il existe des nombres s et t tels que d′ = as+ bt. Comme,par hypothese, d divise a et b, il suit d divise d′. Par ailleurs, a et b ∈ H, par consequent d′ divisea et b et aussi d′ ≤ d = pgcd(a, b). On conclut que d = d′. �

Algorithme d’Euclide etendu.L’algorithme d’Euclide etendu permet de trouver rapidement les nombres s et t. On suppose

que a > b.Partie A: On definit

s1 = 1, t1 = 0,s2 = 0, t2 = 1,a1 = a, b1 = b .

Ainsi,a1 = s1a+ t1bb1 = s2a+ t2b

De plus, on note a1 = q1 · b1 + r1, s = s1 − q1s2 et t = t1 − q1t2. Par consequent,

r1 = a1 − q1b1 = s · a+ t · b

Remarquons que,pgcd(a, b) = pgcd(a1, b1) = pgcd(b1, r1)

En effet, si k divise a1 et b1, alors k divise r1 = a1 − q1b1 et si l divise r1 = a1 − q1b1 et b1, alors ldivise egalement a1.Partie B: On pose

s1 = s2, t1 = t2,s2 = s, t2 = t,a1 = b1, b1 = r1 ,

et on recommence l’etape A.L’algorithme s’arrete quand r1 = 0. A ce moment, pgcd(a, b) = b1 et s = s2 et t = t2.

61

Page 62: B. Ischi - MaTheX

Theoreme de Bezout et algorithme d’Euclide (page 62/61)

Exemple 1.2. Calculons de pgcd de 2322 et 654:

2322 = 1 · 2322+ 0 · 654654 = 0 · 2322+ 1 · 654360 = (1 · 1− 3 · 0)·︸ ︷︷ ︸

=1

2322+ (1 · 0− 3 · 1)·︸ ︷︷ ︸=−3

654 (2322 = 3 · 654 + 360)

294 = (1 · 0− 1 · 1)·︸ ︷︷ ︸=−1

2322+ (1 · 1− 1 · (−3))·︸ ︷︷ ︸=4

654 (654 = 1 · 360 + 294)

66 = (1 · 1− 1 · (−1))·︸ ︷︷ ︸=2

2322+ (1 · (−3)− 1 · 4)·︸ ︷︷ ︸=−7

654 (360 = 1 · 294 + 66)

30 = (1 · (−1)− 4 · 2)·︸ ︷︷ ︸=−9

2322+ (1 · 4− 4 · (−7))·︸ ︷︷ ︸=32

654 (294 = 4 · 66 + 30)

6 = (1 · 2− 2 · (−9))·︸ ︷︷ ︸=20

2322+ (1 · (−7)− 2 · 32)·︸ ︷︷ ︸=−71

654 (66 = 2 · 30 + 6)

0 = (30 = 5 · 6 + 0)

Par consequent, nous trouvons que

pgcd(2322, 654) = 6 = 20 · 2322− 71 · 654

Complexite de l’algorithme d’Euclide etendu.La suite des nombres “a gauche” est a1, b1, r1, r2, · · · , rn = 0, ou n est le nombre de lignes.

On peut la renumeroter comme suit: R0 = rn, R1 = rn−1, · · · , Rn−3 = r1, Rn−2 = b1 et Rn−1 = a1.On constate que

Rk ≥ Rk−1 +Rk−2 donc Rk ≥ Fk · pgcd(a, b)

ou Fk est le keme terme de la suite de Fibonacci:

0, 1, 1, 2, 3, 5, 8, · · · , Fk = Fk−1 + Fk−2

Rappelons maintenant quelques resultats bien connus concernant la suite de Fibonacci. Oncherche x tel que Fk = xk et Fk+2 = Fk+1 + Fk, c’est-a-dire xk+2 = xk+1 + xk. En divisant par xk,on trouve x2 = x+ 1, ou x2 − x− 1 = 0, c’est-a-dire

x = ϕ :=1 +√

5

2(le nombre d’or) ou x =

−1

ϕ=

1−√

5

2

On pose

Fk = αϕk + β

(−1

ϕ

)kAlors, {

k = 0 ⇒ α + β = 0

k = 1 ⇒ αϕ− βϕ

= 1⇒ α

(ϕ+

1

ϕ

)= 1

⇒ α =ϕ

ϕ2 + 1=

ϕ

ϕ+ 2=

1 +√

5

5 +√

5=

1 +√

5√5(√

5 + 1)=

1√5⇒ β = − 1√

5

De plus, asymptotiquement, la suite de Fibonacci est une suite geometrique:

limk→∞

(Fk − αϕk

)= 0

Page 63: B. Ischi - MaTheX

Theoreme de Bezout et algorithme d’Euclide (page 63/61)

Par consequent, le nombre de lignes de l’algorithme d’Euclide etendu est proportionnel alog(max(a, b)).