TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé...

31

Transcript of TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé...

Page 1: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

TIPE : Code correcteur d'erreurs

Melvyn EL KAMELMEYRIGNE

Sous la direction de Benoit Fabrèges

Page 2: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Table des matières

1 Théorie des codes correcteurs 3

1.1 Dénition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.2 Codes binaires . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.3 Codes linéaires . . . . . . . . . . . . . . . . . . . . . . . . . . 51.4 Codage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61.5 Décodage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71.6 Codes parfaits . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2 Code de Hamming 10

3 Codes cycliques 13

3.1 Fonctionnement des codes cycliques . . . . . . . . . . . . . . . 133.2 Recherche des codes cycliques . . . . . . . . . . . . . . . . . . 153.3 Algorithme de décodage . . . . . . . . . . . . . . . . . . . . . 19

4 Annexes 24

4.1 Bibliographie . . . . . . . . . . . . . . . . . . . . . . . . . . . 244.2 Code SAGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

1

Page 3: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Introduction

Lorsque deux personnes communiquent entre elles, il arrive souvent quele message reçu dière de celui émis ; que ce soit à cause de fautes d'ortho-graphes, d'une diction trop rapide ou bien de bruits perturbateurs. Toutefois,il n'est pas toujours nécessaire d'obtenir l'intégralité du message pour en de-viner le sens. Ainsi, même si on mélange l'ordre des lettres dans un mottout en laissant les lettres aux extrémités à leur place, on puet qnaud mmêecmopnrde la prshae.

On constate que le transfert d'informations numériques est très importantdans de nombreux domaines, par exemple pour les sondes spatiales qui re-çoivent des signaux parcourant une énorme distance. Il est donc primordial des'assurer que la perte d'informations soit minimale : c'est là qu'interviennentles codes correcteurs.

L'objectif est de rajouter une couche d'informations au message initialqui ne rajoute pas de sens mais qui permettront de détecter les erreurs et deles corriger. Bien évidemment, l'ajout d'informations a un prix : l'ecacitéd'un code sera donc déterminée par la quantité d'informations ajoutée et parsa capacité à conserver l'information d'un message. Nous allons nous penchersur les principaux codes correcteurs binaires et voir comment se déroule lecodage et la correction d'erreurs, notamment pour les codes cycliques.

2

Page 4: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

1 Théorie des codes correcteurs

1.1 Dénition

On appellera une lettre la plus petite information transmissible et un motcomme un ensemble de lettres. L'ensemble des lettres est l'alphabet, noté Ω ;nous travaillerons avec Ω = 0, 1.

Ainsi, on considérera qu'un mot m est une suite de lettres appartenantau corps ni à deux éléments que l'on notera F2 (ou encore Z

2Z ou GF (2)).Un mot de longueur n appartient donc à Fn2 .

Introduisons quelques dénitions an de pouvoir travailler avec ces mots.

Dénition 1.1.1. On dénit le poids d'un mot m de Fn2 comme le nombrede composantes non nulles du mot. On le note w(m).

Ainsi, si on note 0 le mot nul et 1 le mot plein (composé uniquement de1), on a w(0) = 0 et w(1) = n.

Dénition 1.1.2. La distance de Hamming entre deux mots x, y de Fn2 estle nombre de composantes distinctes de x et y. On la note d(x, y).

Proposition 1.1.3. La distance de Hamming est une distance.

Démonstration. Montrons qu'il s'agit bien d'une distance. Il est clair quepour tout x, y de Fn2 , on a,

d(x, y) = d(y, x); d(x, y) ≥ 0; d(x, y) = 0 ⇐⇒ x = y.

Vérions l'inégalité triangulaire : Soient x, y, z dans Fn2 ; On note x =x1 . . . xn, y = y1 . . . yn et z = z1 . . . zn. On dénit les ensembles U , S et Tsuivants :

U := xi 6= zi,S := (xi 6= zi) ∧ (xi = yi),T := (xi 6= zi) ∧ (xi 6= yi).

Ainsi, S∪T = U et S∩T = ∅. Donc, d(x, y) = |U | = |T |+|S| et |T | 6 d(x, z)et |S| 6 d(y, z).

Puisque l'on est dans Fn2 , d(x, y) = w(x− y) = w(x+ y).

Dénition 1.1.4. Une boule de Hamming de centre x et de rayon r estdénie comme,

BH(x, r) = y ∈ Fn2 | d(x, y) ≤ r.

On peut maintenant s'intéresser aux codes.

3

Page 5: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

1.2 Codes binaires

Dénition 1.2.1. Un code binaire de longueur n et de dimension k estune partie C de dimension k de Fn2 ; on dit que C est un code de paramètres(n, k).

En associant à l'action d'encoder une application injective ϕ (l'injectivitéassure que le décodage soit possible), on a C = Im(ϕ).

Un exemple particulièrement simple est le bit de parité : on ajoute à lan du message un bit correspondant à la parité de la somme des éléments dumessage. Si la somme est paire, le bit vaut 0 sinon il vaut 1. Pour un mot delongueur k, le code associé a donc pour paramètres (k + 1, k). Exemple :

0011010→ 00110101

Lorsqu'il y a au plus une erreur, ce code permet de détecter s'il y a euune erreur ou non ; mais il ne permet pas de trouver sa position et donc dela corriger. De plus, s'il y a un nombre pair d'erreurs, elles se compensent etsont donc indétectables. On peut pallier partiellement ce dernier problèmeen divisant le mot en plusieurs petits mots de longueur 2 que l'on encoderaséparément.

0011010→ 000110101

Ainsi, tant que les erreurs ne se produisent pas sur des bits appartenantà la même paire, on peut les détecter.

Une autre idée qui pourrait venir à l'esprit serait de répéter plusieurs foischaque bit. En répétant n fois chaque bit d'un mot de longueur k, le codeassocié a pour paramètres (nk, k). Exemple : On répète deux fois chaque bit,

010→ 000111000

Si une erreur se produit, il est possible de la localiser et de la corrigerfacilement :

000111000→ 000111001 (erreur sur la dernière lettre).

On constate que le dernier trio de bits n'est pas composé de lettres iden-tiques, donc l'erreur provient probablement de la lettre diérentes des deuxautres. Malheureusement, ce code reste lui aussi assez limité : s'il y a deuxerreurs dans le même trio de bits, cela donnera lieu à une mauvaise correc-tion ; s'il y en a 3, on ne peut même pas détecter l'erreur. On constate qu'enrépétant chaque bit n fois, le code permet de retrouver le bon mot tant qu'ily a au plus bn−1

2c erreurs (b·c désignant la partie entière). Cela peut sembler

correct, mais la quantité d'informations ajoutée est particulièrement élevée.

4

Page 6: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Dénition 1.2.2. La distance minimale dC d'un code C est dénie comme,

dC = mind(x, y)|x ∈ C, y ∈ C, x 6= y.

Dénition 1.2.3. La capacité de correction eC d'un code est le plus grandentier tel qu'il soit toujours possible de corriger eC erreurs ou moins.

Un mot erroné peut donc être corrigé s'il existe un unique mot du code leplus proche ; de ce fait, les boules de Hamming centrées en un mot du codeet de rayon eC sont disjointes. Il en découle que eC = bdC−1

2c (le −1 permet

de lever l'incertitude lorsqu'il y a dC2erreurs).

La capacité de détection d'erreurs d'un code est naturellement plus éle-vée : on peut détecter toute erreur e vériant w(e) < dC . En eet, si le mot ducode m est perturbé par l'erreur e, m′ = m+e 6∈ C car sinon e = m−m′ ∈ Cce qui contredit la dénition de dC .

Dénition 1.2.4. Le taux d'information d'un code C de paramètres (n, k)est le rapport k

n.

On veut maximiser ce taux d'informations (qu'il soit le plus proche pos-sible de 1) an de ne pas rajouter des données inutilement ; le taux d'infor-mation d'un code de répétition vaut 1

nce qui est loin d'être désirable.

Intéressons nous à un type de code particulier qui ore des algorithmesde décodage ecaces : les codes linéaires.

1.3 Codes linéaires

Dénition 1.3.1. Un code C de paramètres (n, k) est dit linéaire si pour toutm,m′ de C, m+m′ est dans C. C est un sous-espace vectoriel de dimensionk de Fn2

Cette nouvelle condition permet d'établir un lien entre le poids et ladistance minimale :

Proposition 1.3.2. Soit C un code linéaire,

dC = minw(m)|m ∈ C,m 6= 0.

Démonstration. Soient x, y dans C tels que dC = d(x, y). On sait qued(x, y) = w(x+y). Comme C est linéaire, il existem dans C tel que x+y = mdonc w(x+ y) = w(m).

5

Page 7: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Désormais, nous inclurons la distance minimale du code dans ses para-mètres ; un code C a pour paramètres (n, k, dC). Comment déterminer ladistance minimale d'un code ? On pourrait calculer le poids de tous les élé-ments mais ce serait laborieux. Il est possible d'obtenir une majoration dedC en fonction de n et de k.

Proposition 1.3.3. Soit C un code linéaire de paramètres (n, k, dC). Alors,

dC ≤ n− k + 1.

C'est la borne de Singleton.

Démonstration. Il sut de montrer qu'il existe un mot du code dont les k−1dernières composantes sont nulles. Soit E le sous-espace vectoriel de Fn2 dontles k − 1 dernières composantes sont nulles, on a dim(E) = n − (k − 1) =n− k + 1. Donc, dim(C) + dim(E) = n+ 1 > n donc C ∩E 6= ∅. Il existebien un mot du code dont les k− 1 dernières composantes sont nulles ce quiprouve que dC ≤ n− k + 1.

1.4 Codage

Soit C un code linéaire de paramètres (n, k, dC). Il existe ϕ une appli-cation linéaire injective de F k

2 dans F n2 telle que Im(ϕ) = C. On peut le

représenter matriciellement par ϕ(x) = xG;G étant la transposée de la ma-trice représentative de ϕ par rapport aux bases canoniques de F k

2 et de F n2 .

Les mots sont donc considérés comme des vecteurs lignes. On dit que G estla matrice génératrice de C et que C est le code engendré par G.

Exemple : x = (101) , G =

1 0 0 10 1 0 10 0 1 1

ϕ(x) =

(1 0 1

)*

1 0 0 10 1 0 10 0 1 1

= (1010)

Il s'agit du codage par bit de parité vu précédemment.

Dénition 1.4.1. Un codeC linéaire de paramètres (n, k, dC) est dit systé-matique si l'encodage consiste à rajouter n − k bits à la n du mot. Pourun code linéaire, sa matrice génératrice G est de la forme (Ik|B), Ik étant lamatrice unité à k lignes et k colonnes et B une matrice à k lignes et n − kcolonnes.

6

Page 8: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Travailler avec un code systématique nous simpliera quelques calculs parla suite.

1.5 Décodage

Dénition 1.5.1. On appelle matrice de contrôle d'un code linéaire C deparamètres (n, k, dC) la matrice H ∈ Mn−k,n à coecients dans F2 telle queker(H) = C. Ainsi, ∀m ∈ C,H tm = 0 et H tG = 0.

Proposition 1.5.2. : S'il existe dans C un mot de poids r, il existe r co-lonnes de H linéairement dépendantes.

Démonstration. Soit m = m0m1...mn−1 un mot du code de poids r, on noteCi la i-ème colonne de H et mi1 ,mi2 , ...mir les composantes non nulles de m.

0 = H tm = Hn−1∑i=0

0...mi...0

= Hr∑p=1

0...mip...0

=r∑p=1

mipCip donc il existe bien r

colonnes de H étant linéairement dépendantes.

Proposition 1.5.3. S'il existe r colonnes linéairement dépendantes de H,alors il existe un mot du code de poids r′ ≤ r.

Démonstration. Il existe r scalaires non tous nuls tels quer∑p

mipCip = 0.

Soit m ∈ F n2 dont les composantes de rang i1, i2, ...ir sont mi1 ,mi2 , ...mir et

les autres sont nulles. On a w(m) ≤ r.

On en déduit que la distance minimale dC (c'est-à-dire le poids minimal)est égale au nombre minimum de colonnes linéairement dépendantes de H.

Dénition 1.5.4. Soit m ∈ F n2 , on appelle syndrome s du mot m le vecteur

s = H tm.

Supposons que w soit un mot erroné, w = m+ e avec m un mot du codee l'erreur. Ainsi, H tw = H t(m+ e) = H te ; le mot erroné et l'erreur ont doncle même syndrome s. L'ensemble des mots de syndrome s est appelé classelatérale (ou coset) de w. Corriger w revient donc à trouver le mot dont lepoids w(m) vérie w(m) ≤ eC dans la classe latérale de w ; cela n'est possibleque si ce mot est unique, on suppose donc qu'il y a moins d'erreurs que lacapacité de correction du code.

7

Page 9: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Proposition 1.5.5. Chaque syndrome s est associé à un unique motm ∈ F n2

dont le poids w(m) vérie w(m) ≤ eC.

Démonstration. Supposons qu'il existe m′ ∈ F n2 tel que w(m′) ≤ eC et

H tm = H tm′ donc H t(m−m′) = 0 et donc m−m′ est un mot du code.w(m−m′) ≤ w(m)+w(m′) ≤2eC ≤ dC−1. Le seul mot du code x qui vériew(x) ≤ dC − 1 est le mot nul donc m−m = 0 et m = m′.

Il sut maintenant de dresser une liste des syndromes de chaque élémentde F n

2 pour pouvoir retrouver l'erreur et à fortiori le mot codé.

S'il n'y a qu'une erreur : soit ei le mot contenant un 1 à la i-ème placeet des 0 ailleurs. Alors, il existe i tel que w = m+ ei. Le syndrome de ei estdonc la i-ème colonne de H, on peut donc facilement localiser l'erreur.

Proposition 1.5.6. Si C est un code systématique et G = (Ik|B), alorsH = (−tB|In−k).

Démonstration. H tG =t B −t B = 0.

Exemple : Prenons G =

(1 0 1 00 1 1 1

).

Ainsi, H =

(1 1 1 00 1 0 1

).

Codons le mot m = (01), w = (01)

(1 0 1 00 1 1 1

)= (0111).

Ajoutons lui d'abord une erreur en troisième position : z = (0101).

Calculons le syndrome de z : s = H tz =

(1 1 1 00 1 0 1

)0101

=

(10

).

Cela correspond à la troisième colonne de H, l'erreur provient donc dutroisième bit.

1.6 Codes parfaits

Intéressons-nous à C en tant qu'espace vectoriel.

Proposition 1.6.1. #BH(x, r) =r∑i=0

Cin.

8

Page 10: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Démonstration. Pour tout i ∈ 0, 1, ..., r, il existe Cin mots y ∈ F n

2 tels qued(x, y) = i.

Proposition 1.6.2. Inégalité de Hamming :ec∑i=0

Cin ≤ 2n−k.

Démonstration. Les boules BH(m, eC) centrées en les mots du codes de rayoneC sont deux à deux disjointes donc :∑

m∈C#BH(m, eC) =

∑m∈C

eC∑i=0

Cin ≤ |0, 1n| = 2n.

Il y a 2k boules de Hamming dans le code donc :

2keC∑i=0

Cin ≤ 2n et donc

eC∑i=0

Cin ≤ 2n−k.

La situation optimale serait donc que les boules de Hamming formentune partition de F n

2 , ce qui est le cas lorsque l'inégalité de Hamming est uneégalité.

Figure 1 Situation où chaque mot est associé à un unique mot du code.

Dénition 1.6.3. Un code C de paramètres (n, k, dC) est dit parfait lorsqueles boules de Hamming centrées en les mots du code de rayon eC forment unepartition de F n

2 .

Ainsi,eC∑i=0

Cin = 2n−k et ∀ m ∈ F n

2 , il existe m qui minimise d(r,m). On

remarquera que dC est forcément impair.

9

Page 11: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

2 Code de Hamming

Créons un code qui satisfait l'égalité de Hamming et qui soit capablede corriger une erreur ; on prend donc la distance minimale la plus petitepossible, dC = 3.

Posons r = n− k.1∑i=0

Cin = 2n−k ⇒ 1 + n = 2k

n = 2r − 1 et k = 2r − r − 1.

Les codes ayant ces paramètres sont appelés codes de Hamming.

Dénition 2.0.1. Un code de Hamming est un code de paramètres (2r −1, 2r − r − 1, dC) avec r ≥ 2 ; c'est un code parfait.

Les codes parfaits ayant une capacité de correction 1 sont donc nécessai-rement des codes de Hamming. Pour r = 2, le code parfait de paramètres(3, 1, 3) est le code de répétition.

Exemple : Étudions le cas r = 3.Considérons un code linéaire systématique C(7, 4, 3). Soit x ∈ F4

2 , x =d1d2d3d4 et soit ϕ : F 4

2 → F 72 telle que ϕ(x) = d1d2d3d4p1p2p3 avec p1 =

d1 + d2 + d4 , p2 = d1 + d3 + d4 et p3 = d2 + d3 + d4 . On obtient la matricegénératrice

G =

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

.

Essayons d'encoder un mot, de modier un de ses bits et de le décoder. Pre-nons m = (1010).

mG = (1010)

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

= (1010101).

Modions le 4ème bit (1010101) −→ (1011101) Puisque le code est sys-tématique, on peut rapidement trouver la matrice de contrôle H.

H =

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

On a bien H tG = 0.

10

Page 12: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Calculons le syndrome du message erroné :

(1011101)tH = (1011101)

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

= (111).

On obtient trois 1, il y a donc une erreur sur les trois bits de parité ; l'er-reur provient donc du bit qui intervient dans la construction des trois bitsde parité : le quatrième. On aurait bien sûr reprendre l'algorithme vu précé-demment et retrouver le même résultat.

Figure 2 Illustration montrant comment repérer facilement la provenanced'une erreur.

Ainsi, ce code est plus ecace qu'un simple code linéaire. Voilà une com-paraison en image (avec un taux d'erreur de 0.01) :

Figure 3 Code de Hamming/ Code linéaire généré aléatoirement

Ces codes ont été réalisés sur Cocalc https://cocalc.com/ (ancienne-

11

Page 13: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

ment nommé Sage) et sont disponibles dans l'annexe. J'ai utilisé le Jupi-ter Notebook et le kernel le plus récent (SageMath Dev). Cocalc permet detravailler facilement avec plusieurs types de codes correcteurs (linéaires, deHamming, cycliques) et permet de simuler l'apparition d'erreurs.

12

Page 14: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

3 Codes cycliques

3.1 Fonctionnement des codes cycliques

Dénition 3.1.1. Un code linéaire est dit cyclique s'il est stable par déca-lage circulaire.

Plus formellement, soit C un code de paramètres (n, k, dC) et m ∈ F n2 ,

m = m0m1...mn−1. On note σ(m) = mn−1m0...mn−2.Alors, C est cyclique si ∀m ∈ C, σ(m) ∈ C.

Ainsi, ∀k ∈ N , σk(m) ∈ C et σn(m) = m.Exemple Le code C = 000, 110, 011, 101 est cyclique.

Dénition 3.1.2. Soit m = m0m1...mn−1 un mot, m(X) = m0 + m1X +...+mn−1X

n−1 est la représentation polynomiale associée à m. On notera PCla représentation polynômiale d'un code (on pourra aussi utiliser C s'il n'y apas de risque de confusion).

En reprenant le code précédent, on a PC = 0, 1 +X,X +X2, 1 +X2.

Regardons à quoi correspond un décalage circulaire vers la droite entermes de polynôme.

σ(m)(X) = mn−1 +m0X + ...+mn−2Xn−1

= Xm(X) +mn−1(1−Xn).

Donc, σ(m)(X) = X(m)X (mod Xn − 1).C'est ce qui nous motive à travailler dans l'anneau des polynômes à coe-cients dans F2 modulo (Xn − 1) : F2[X]

Xn−1.

Rappelons la dénition d'un idéal :

Dénition 3.1.3. Un sous-ensemble non-vide I d'un anneau commutatif Aest un idéal si ∀a, b ∈ I, a+ b ∈ I et ∀x ∈ A, x · a ∈ I.

Proposition 3.1.4. C est un code cyclique si PC est un idéal de F2[X]Xn−1

.

Démonstration. Si PC est un idéal de F2[X]Xn−1

alors ∀m ∈ C,Xm(X) ∈ PCetXm(X) = σ(m)(X)⇒ σ(m) ∈ C.Inversement, si C est un code cyclique, σk(m) ∈ C∀k ∈ N donc Xkm(X) ∈PC . Puisque C est un code linéaire, P (X)m(X) ∈ PC ∀P [X] ∈ F2[X]

Xn−1donc

PC est un idéal.

13

Page 15: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Dénition 3.1.5. Le polynôme générateur g(X) d'un code cyclique C estle polynôme non nul unitaire de plus bas degré de C.

Proposition 3.1.6. Le polynôme générateur est unique.

Démonstration. Supposons que g1 et g2 soient deux polynômes générateursdistincts et diérents de 0 de C. Alors, g1 - g2 est un polynôme de C de degréstrictement inférieur à celui de g1 et g2, ce qui entraîne une contradiction.

Proposition 3.1.7. Tout mot du code est un multiple de g.

Démonstration. Soit m ∈ C. Par division euclidienne, on a :m(X) = q(X)g(X)+r(X) avec q(X), r(X) ∈ F2[X] et deg(r(X)) < deg(g(X)).r(X) = q(X)g(X) − m(X) donc r est un mot du code d'après les proprié-tés précédentes (multiple de g(X) et linéarité). Si r(X) 6= 0, cela contre-dit l'hypothèse que g(X) soit le polynôme générateur. Donc, r(X) = 0 etm(X) = q(X)g(X).

Proposition 3.1.8. g(X) divise Xn − 1.

Démonstration. On sait que Xkg(X) = gk(X) où gk(X) est le polynômeobtenu en décalant les composantes de g(X)k fois vers la droite, c'est donc unmot du code. Ce qui implique qu'il existe a(X) tel que Xkg(X) = a(X)g(X)et donc (Xk + a(X))g(X) = Xn − 1.

Dénition 3.1.9. Un idéal I de A est dit principal s'il existe i ∈ I tel queI = i ∗ a|a ∈ A.

C est donc un idéal principal de F2[X]X

n−1et C = m(X)g(X)|m(X) ∈ F2[X]

Xn−1.

Proposition 3.1.10. dim(C) = n−deg(g(X)) et (g(X), Xg(X), ..., Xn−1−deg(g(X))g(X))est une base de C.

Démonstration. Soit m ∈ C, deg(m(X)) ≤ n − 1 par dénition. Sim(X) =q(X)g(X) alors deg(q(X)) ≤ n− 1− deg(g(X)). Cela montre que m(X) estune combinaison linéaire des polynômes g(X), Xg(X), ..., Xn−1−deg(g(X))g(X)).Donc, dim(C) = n − deg(g(X)) et comme chaque combinaison linéaireest de degré au plus n − 1, ces polynômes forment une famille libre deF2[X]Xn−1

.(X,Xg(X), ..., Xn−1−deg(g(X))) est bien une base de C.

De ce fait, on en déduit que la matrice génératrice G liée à C est de la

forme

a0 a1 · · · an−k 0 0 · · · 00 a0 a1 · · · an−k 0 · · · 0

...0 · · · · · · 0 a0 a1 · · · an−k

∈Mk,n(F2), deg(g(X)) =

14

Page 16: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

n− k.

Proposition 3.1.11. Soit C un code cyclique et g(X) son polynôme géné-rateur de degré r, g(X) = a0 + a1X + ...ar−1X

r−1 +Xr. Alors, a0 = 1.

Démonstration. Supposons que a0 = 0.g(X) = a1X + ...an−1X

n−1 +Xr

g(X) = X(a1 + ...an−1Xn−2 +Xr−1)

Si on décale g(X)n−1 fois vers la droite (ou 1 fois vers la gauche), on obtientle polynôme ci-dessus de degré < r ce qui génère une contradiction.

Dénition 3.1.12. On appelle polynôme de contrôle le polynôme h(X)qui vérie g(X)h(X) = Xn − 1.

Son existence est garantie par g(X) | Xn − 1.En outre, si m ∈ C et m(X) = q(X)g(X),

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

= 0 dans F2[X]X

n−1.

h(X) remplit bien un rôle similaire à celui de la matrice de contrôle ; onconsidérera d'ailleurs la matrice de contrôle H associée. Si h(X) = b0 +b1X+

...+ bkXk , H =

hk hk−1 · · · h0 0 · · · 00 hk · · · h1 h0 · · · 0...

...0 0 · · · 0 hk · · · h0

∈ Mn−k,n(F2).

On a bien H tG = 0.

3.2 Recherche des codes cycliques

Soit C un code cyclique. Puisque le polynôme générateur divise Xn − 1,rechercher les polynômes générateurs possibles pour un code de longueur nrevient à trouver les facteurs de Xn − 1 à coecients dans F2.

Soit α une racine primitive n-ième de l'unité, on a Xn− 1 =n−1∏i=0

(X −αi)

dans C[X].

15

Page 17: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Si g(X) est un polynôme générateur, il est de la forme g(X) =∏i∈Σ

(X−αi)

où Σ est une partie convenable de Fn.

Proposition 3.2.1. Les coecients de g(X) =∏i∈Σ

(X −αi) sont dans F2 ssi

Σ est stable par multiplication par 2 modulo n.

Démonstration. Si g est à coecients dans F2, chaque coecient de g eststable par élévation au carré. Comme cette opération respecte aussi l'addi-tion, on voit que g(X2) = (g(X))2. Ainsi, l'ensemble des racines de g eststable par élévation au carré, ce qui signie que Σ est stable par multiplica-tion par 2. Inversement, si Σ est stable par multiplication par 2 :

g(X2) =∏i∈Σ

(X2 − αi)=∏i∈Σ

(X2 − α2i) =∏i∈Σ

(X − αi)2 = (g(X))2

et donc les coecients de g sont dans F2.

La recherche de polynômes générateurs revient donc à trouver les partiesstables par multiplication par 2 de Fn. Soit j ∈ Fn, on note Σj la plus petitepartie stable contenant j. Alors, il existe un plus petit entier s > 0 tel que2sj ≡ j[n], on peut ainsi prendre Σj=j, 2j, ..., 2s−1j qui est bien stable parmultiplication par 2 modulo n.

Dénition 3.2.2. La classe cyclotomique de j (relative à 2 modulo n) estΣj=j2k mod n|k ∈ N.

Le degré du polynôme irréductible associé gj =∏i∈Σj

(X − αi) est égal à

card(Σj) = s.Cherchons les codes cycliques de longueur 7 an d'illustrer tout cela.

Exemple : 2sj ≡ j[7]. Pour j = 1, s = 3 convient.Σ1 = 1, 2, 4. De même, pour j = 3, s = 3 convient à nouveau : Σ3 =3, 5, 6Enn pour j = 0, Σ0 = 0.

X7 − 1 peut donc être décomposé comme produit de 3 facteurs irréduc-tibles :

g0 = X − 1g1 = (X − α)(X − α2)(X − α4)g3 = (X − α3)(X − α5)(X − α6)

16

Page 18: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

α étant une racine primitive 7-ième de l'unité.

On peut tester manuellement les polynômes de degré 3 se terminant par 1(sinon 0 est une racine) à coecients dans F2 qui conviennent : X3+X2 + 1 ;X3 +X + 1 ; X3 + 1 et X3+X2 +X + 1.Les deux derniers admettent une racine en 1 et X3 +1 = (X−1)(X2 +X+1)et X3 +X2 +X + 1 = (X − 1)3, il n'y a donc que deux choix possibles.Supposons que α soit racine primitive de P (X) = X3 + X + 1, on obtientplusieurs informations concernant α :α3 = α + 1α4 = α2 + αα5 = α4 + 1α6 = α2 + 1

g1 = (X − α)(X − α2)(X − α4)= X3+X2( α+α2+α4)+X(α3+α5+α6)= X3 +X + 1.

De même, on trouve que g3 = X3 + X2 + 1 et X7 − 1 = (X − 1)(X3 +X + 1)(X3 +X2 + 1).

On obtient ainsi 23 = 8 codes cycliques diérents :

C0 = 〈X7 + 1〉 Code nul.C1 = 〈X + 1〉C2 = 〈X3 +X + 1〉C3 = 〈X3 +X2 + 1〉C4 = 〈(X3 +X + 1)(X + 1)〉 = 〈X4 +X3 +X2 + 1〉C5 = 〈(X3 +X2 + 1)(X + 1)〉 = 〈X4 +X2 +X + 1〉C6 = 〈(X3 +X + 1)(X3 +X2 + 1)〉 = 〈X6 +X5 +X4 +X3 +X2 +X + 1〉C7 = 〈1〉 Ne change pas le mot.

Les code C2 et C3 ont pour paramètres (7, 4, 1), ce sont des codes deHamming. Le code C6 correspond au bit de répétition.

On peut déterminer les polynômes générateurs d'une autre façon :

Dénition 3.2.3. On appelle polynôme cyclotomique le polynôme Φn

déni par Φn(X) =n∏k=1k∧n=1

(X − exp(2kiπn

)).

Proposition 3.2.4. Xn − 1 =∏d|n

Φd(X).

17

Page 19: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Démonstration. On sait que Xn − 1 =n−1∏i=0

(X − αi). De plus, 1, ...n =⊔d|nk ∈ 1, ...n|k ∧ n = d.

Xn − 1 =∏d|n

n∏k=1k∧n=1

(X − αk) =∏d|n

nd∏

k=1k∧(n

d)=1

(X − αkd)

=∏d|n

d∏k=1k∧d=1

(X − αnkd ) =

∏d|n

Φd(X).

La dernière égalité venant du fait que si α est une racine primitive n-ièmede l'unité, α

nd est une racine primitive d-ième de l'unité.

Proposition 3.2.5. Les polynômes cyclotomiques sont à coecients dans Z.

Démonstration. On montre qu'ils sont à coecients entier par récurrence.C'est vrai pour φ1(X) = X − 1. On suppose que c'est vrai jusqu'au rangn − 1. On a Xn − 1 =

∏d|nφd(X) = φn(X)h(X) dans C[X] où h(X) est

un polynôme à coecients entier par hypothèse de récurrence. En faisantla division euclidienne dans Z[X] de Xn − 1 par h(X) on a : Xn − 1 =g(X)h(X) + r(X) avec deg(r) < deg(h) et g(X) dans Z[X]. Par unicité dela division euclidienne dans C[X], on a φn = g et donc φn est à coeciententier.

Le calcul des polynômes cyclotomiques permet donc aussi de retrouverles polynômes générateurs.

Nous allons désormais introduire une minoration de la distance minimaled'un code cyclique.

Proposition 3.2.6. S'il existe des entiers a et s > 0 tels que∑

contiennea+ 1, a+ 2, ..., a+ s, la distance minimale du code construit est ≥ s+ 1.

Démonstration. Il faut montrer qu'un polynôme R ∈ F2[X] de degré < n quia au plus s coecients non nuls (et donc de poids < s+ 1) est identiquementnul. Cela revient donc à montrer le lemme suivant :

Lemme Soient d1, ...ds des entiers avec 0 ≤ d1 < · · · < ds < n, etλ1, ..., λs des éléments de F2. Posons R(X) =

∑λjX

dj . Si R(αi) = 0 pouri = a+ 1,...,a+ s, alors tous les λj sont nuls.

18

Page 20: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Démonstration. Le déterminant des αidj est un déterminant de Vandermonde.Mais comme α est une racine primitive n-ième de l'unité, les αdj sont deuxà deux distincts.

Pour le code cyclique de longueur 7 vu précédemment,∑

contient 1, 2(ou 5, 6), la distance minimale de ce code est donc ≥3.

Les diérents codes cycliques désormais déterminés, on peut passer àl'étape du codage : il sut de multiplier la représentation polynomiale d'unmot par le polynôme générateur modulo Xn − 1.

Exemple : On prend g(X) = X3 +X + 1 et m(X) = 1 +X +X2.g(X)m(X) = (X3 +X + 1)(1 +X +X2) = 1 +X +X5.

3.3 Algorithme de décodage

De façon analogue aux codes linéaires, le décodage se fait par la détermi-nation du syndrome.

Dénition 3.3.1. Le syndrome d'un mot S(m)(X) est le reste de la divisioneuclidienne de ce mot par le polynôme générateur modulo Xn − 1.

Cette dénition vérie bien que si un mot appartient au code, son syn-drome est nul.

Proposition 3.3.2. Soit C un code cyclique de longueur n et de dimensionk. Soit w(X) = q(X)g(X) + s(X), s(X) étant le syndrome de w(X). Alors,le syndrome de Xw(X) est :Xs(X) si deg(s(X)) < n− k − 1.Xs(X)− g(X) si deg(s(X)) = n− k − 1.

Démonstration. Si deg(s(X)) < n − k − 1 alors deg(Xs(X)) < n − k =deg(g(X)) et on a bien Xw(X) = Xq(X)g(X) + Xs(X) par unicité de ladivision euclidienne.Si deg(s(X)) = n−k−1, s(X) = s0 +s1X+ ...+Xn−k−1. On note s(X)=s0 +s1X + ... + Xn−k−2. De même, g(X) = g0 + g1X + ... + Xn−k et g(X) =g0 + g1X + ...+Xn−k−1.

Xs(X) = Xs(X)+Xn−k = Xs(X)+g(X)− g(X) = g(X)+(Xs(X)− g(X))

19

Page 21: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

et deg(Xs(X) − g(X)) < n − k − 1. Comme Xs(X) = X(X) − Xn−k etg(X) = g(X)−Xn−k, le syndrome de w(X) vaut bien Xs(X)− g(X).

Soit C un code cyclique de paramètres(n, k, dC), g(X) son polynôme gé-nérateur et w un mot erroné. Ainsi, w(X) = m(X) + e(X) où m est un motdu code et e l'erreur associée à w. On rappelle que le mot peut être corrigé siw(e) ≤ eC = bdC−1

2c, w désignant le poids du mot (le nombre de composantes

non nulles). L'objectif du décodage est donc de déterminer le polynôme e(X).

Déterminons la forme de l'erreur. Soit e′ = (ts,0) où 0 désigne le vecteurà k 0 et s le syndrome de w. Le degré de e′(X) étant strictement inférieurà celui du polynôme générateur par dénition, son syndrome est le mêmeque celui de e. De plus, si on suppose que w(s) ≤ eC alors w(e′) ≤ eC celaimplique que e′ = e car il n'existe qu'un seul vecteur de poids ≤ eC associéà chaque syndrome. L'erreur est donc de la forme (ts,0).

On veut maintenant se ramener au cas où w(s) ≤ eC an de pouvoirdéterminer l'erreur. Supposons que e possède k 0 à la suite et que w(e) ≤ eC .Alors, il existe i ∈ 0, 1, .., n − 1 tel que les k 0 de σi(e) soient situés à lan du mot. Ainsi, σi(e) est de la forme(β,0), β étant un vecteur de longueurn-k ; donc deg(β(X))≤ n − k − 1 =deg(g(X)) − 1. Le syndrome de β(X)est donc β(X) lui-même. Comme w(β(X)) ≤ eC , w(si(X)) ≤ eC où si(X)est le syndrome de X ie(X) modulo Xn − 1. D'après l'argument précédent,e(X)X i = (tsi,0) donc e(X) = Xn−i(tsi,0).

On peut donc expliciter l'algorithme de décodage :

1. On détermine le syndrome de w(X) par division euclidienne.2. On prend i = 0 et si w(si(X)) ≤ eC , e(X) = Xn−i(si,0) etm(X) = w(X)− e(X).3. Sinon, i = i+ 1 et on calcule si(X) ;on recommence jusqu'à ce que i = n.

Si i = n la correction est impossible.

Exemple Soit C un code cyclique de paramètres (15, 7, 5) de polynômegénérateur g(X) = X8 + X7 + X6 + X4 + 1 ; sa capacité de correction estdonc de 2.Prenons m(X) = 1 +X +X3 et w(X) = m(X)g(X).w(X) = (1 +X +X3)(1 +X4 +X6 +X7 +X8) = 1 +X +X3 +X4 +X5 +X6 +X7 +X10 +X11.

20

Page 22: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Modions deux de ses composantes, disons la quatrième et la huitième etnotons ce nouveau polynôme z(X) = 1 + X + X3 + X5 + X6 + X7 + X8 +X10 +X11.Par division euclidienne, on obtient z(X) = (X3 +X)(1 +X4 +X6 +X7 +X8) +X7 +X6 + 1.Le syndrome est donc s(X) = X7 +X6 + 1 de poids 3 > 2.

deg(s(X)) = 7 = deg(g(X))− 1 donc s1(X) = Xs(X)− g(X).

s1(X) = X8 +X7 +X − (X8 +X7 +X6 +X4 + 1) = X6 +X4 +X + 1.s2(X) = X(X6 +X4 +X + 1) = X7 +X5 +X2 +X.s3(X) = X8+X6+X3+X2−(X8+X7+X6+X4+1) = X7+X4+X3+X2+1.

...

...s10(X) = X7 +X6 +X5.s11(X) = X8 +X7 +X6 − (X8 +X7 +X6 +X4 + 1) = X4 + 1.

w(s11(X)) = 2 , c'est ce que l'on recherchait.e(X) = Xn−11s11(X) = X4(X4 + 1) = X8 +X4.

Les erreurs sont bien en position 4 et 8, là où on les avait placées. Il sutensuite de diviser le mot obtenu par le polynôme générateur an deretrouver le mot initial.Toutefois, l'algorithme de décodage n'aurait pas fonctionné si e(X) necomportait pas au moins k zéros à la suite (ce qui arrive forcément pour uncode de longueur 15 et de dimension 7 lorsqu'il n'y a que deux erreurs).

Dénition 3.3.3. Un "burst" de longueur λ est un mot de Fn2 dont lescomposantes non nulles sont connées dans λ positions consécutives.

Exemple m = (00100110000) est un "burst"de longueur 5 dans F112 .

Un code est dit λ-burst-correcteur s'il peut corriger toutes les erreurs deburst< λ.

Proposition 3.3.4. Tout code cyclique peut détecter les erreurs "burst" delongueur ≤ deg(g(X)).

Démonstration. Montrons qu'il n'existe pas d'erreur "burst" de longueur ≤deg(g(X)) appartenant au code.

21

Page 23: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Par dénition, ce "burst" est de la forme e(X) = X iβ(X) avec deg(β(X)) ≤deg(g(X)) et β(X) 6= 0. Le coecient constant de g(X) est 1 donc g(X) - X i.Si e(X) est un mot du code alors g(X) - X iβ(X) donc g(X) | β(X) maisdeg(β(X)) ≤ deg(g(X)) d'où la contradiction.

Les codes cycliques permettent donc non seulement de corriger eC er-reurs mais aussi d'en détecter deg(g(X)) pour peu qu'elles apparaissent aubon endroit ; c'est ce qui explique leur popularité ; ils sont notamment utilisésdans certains codes barres, dans les disques durs an de corriger les erreursprovoquées par les rayures ou bien encore lors du vol spatial de Voyager 1 et 2

22

Page 24: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Conclusion

Nous avons pu voir quels étaient les mécanismes qui régissaient le codageet le décodage d'informations binaires, mais ce n'était qu'un bref aperçudu monde des codes correcteurs d'erreurs : les codes BCH , Reed-Solomon,de Golay sont tous d'autres codes fréquemment utilisés. De plus, nous nesommes pas penchés sur le cas de l'eacement d'un bit qui aurait ajouté unenouvelle dimension à notre sujet.La protection de l'information reste un secteur en pleine expansion dontl'avancement ore des possibilités insoupçonnées dans de multiples domaineset qui continue de donner naissance à de nouvelles théories.

23

Page 25: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

4 Annexes

4.1 Bibliographie

Ce travail se base principalement sur le livre de Michel Demazure, Cassini,Cours d'algèbre. Primalité. Divisibilité. Codes.

Et quelques cours disponibles en ligne :

1. Massoud Malek , Linear Cyclic Codes, http://www.mcs.csueastbay.edu/~malek/Class/Cyclic.pdf

2. A.A. Pantchichkine, Mathématiques des codes correcteurs d'erreurshttps://www-fourier.ujf-grenoble.fr/~panchish/04cc

3. Pierre Abbrugati, Introduction aux codes correcteurs d'erreurs, http://www.lirmm.fr/~chaumont/download/cours/codescorrecteur/Cours_

Pierre_Abbrugiati.pdf

4. Pierre Wassef, Cours d'arithmétique http://www.edu.upmc.fr/maths/wassef_LM220/documents/arithmetique.pdf

24

Page 26: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

4.2 Code SAGE

Hamming :

In [1]: from PIL import Image, ImageFilter;

import scipy.ndimage

import matplotlib.image

import matplotlib.pyplot

import numpy as np

In [3]: im = Image.open('Mario.png')

In [5]: data = list(im.getdata());

In [6]: data3 = np.array(data, dtype=np.uint8

In [7]: data[4]=[0]*90000

In [8]: data4=np.unpackbits(data3)

In [10]: data5=list(data4)

In [26]: len(data5)

Out[26]: 2160000

La première étape consiste à extraire l'information contenue dans l'image(de taille 300*300) qui est sous la forme de triplet de nombres compris entre0 et 255, chaque triplet correspondant à la couleur d'un pixel. Il faut ensuitela convertir dans un format où elle pourra être encodée par un code binaire,chaque valeur est donc convertie en un vecteur de 8 bits. On obtient donc8*3*300*300=2160000 éléments à coder que l'on place dans une liste

In [2]: C=codes.HammingCode(GF(2),7); C

Out[2]: [127, 120] Hamming Code over GF(2)

In [12]: Z=GF(2)^120

Y=GF(2)^127

In [11]: datac=[0]*2160000*7

25

Page 27: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Ensuite, on crée un code de Hamming de paramètres (120,127) à l'aide dulogiciel ; on encodera donc les bits par groupe de 120 (2160000/120=18000) eton obtiendra des mots de longueur 127. On prépare un tableau qui contiendrades vecteurs à 127 éléments qui appartiennent à F2.

In [13]: p=0.01;

Chan=channels.QarySymmetricChannel(GF(2)^127,p);

On introduit 1% d'erreurs, ce qui est considérablement élevé mais metbien en évidence la diérence d'ecacité entre les deux codes.

In [14]: for i in range(0,17999):

P=Z(data5[120*i:120*(i+1)])

X=C.encode(P)

datac[127*i:127*(i+1)]=X

On peut maintenant passer à l'encodage des vecteurs.

In [15]: datae=[0]*2160000*7

In [16]: for i in range(0,17999):

U=Y(datac[127*i:127*(i+1)])

K=Chan.transmit(U)

datae[127*i:127*(i+1)]=K

On ajoute des erreurs sur chaque mot de longueur 127.

In [17]: datam=[0]*2160000

In [18]: for i in range(0,17999):

P=Y(datae[127*i:127*(i+1)])

X=C.decode_to_message(P)

datam[120*i:120*(i+1)]=X

La fonction de décodage présente dans le logiciel permet de retrouver nosvecteurs à 120 éléments pour peu qu'ils n'aient pas été trop modiés.

In [19]: datap=np.array(datam,dtype=np.uint8)

In [20]: datar=np.packbits(datap)

In [21]: datar=datar.reshape(90000,3)

26

Page 28: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

In [22]: datah=tuple(map(tuple,datar))

On reconvertit chaque vecteur de 8 éléments en un nombre entre 0 et 255et on regroupe ces nombres par triplet (il y a donc 90000 triplets de nombres).On remet enn tous ces triplets dans une liste.

In [23]: imf = Image.new("RGB",(300,300),"white")

In [24]: imf.putdata(datah)

On crée une image vierge et l'on y insère les données obtenues.

In [25]: imf

Out[25]:

On obtient une image quelque peu diérente de la version originale maisparfaitement reconnaissable.

27

Page 29: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

Code linéaire aléatoire :

In [1]: from PIL import Image, ImageFilter;

import scipy.ndimage

import matplotlib.image

import matplotlib.pyplot

import numpy as np

In [2]: C=codes.random_linear_code(GF(2),127,120); C

On utilise cette fois un code linéaire généré aléatoirement

Out[2]: [127, 120] linear code over GF(2)

In [3]: im = Image.open('Mario.png')

In [4]: data = list(im.getdata());

In [5]: data3 = np.array(data, dtype=np.uint8)

In [6]: data[4]=[0]*90000

data4=np.unpackbits(data3)

In [7]: data5=list(data4)

datac=[0]*2160000*7

datae=[0]*2160000*7

datam=[0]*2160000

In [8]: Z=GF(2)^120

Y=GF(2)^127

In [9]: p=0.01;

Chan=channels.QarySymmetricChannel(GF(2)^127,p);

Chan

Out[9]: q-ary symmetric channel with error probability 0.0100000000000000, of input and output space Vector space of dimension 127 over Finite Field of size 2

In [10]: for i in range(0,17999):

P=Z(data5[120*i:120*(i+1)])

X=C.encode(P)

datac[127*i:127*(i+1)]=X

28

Page 30: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

In [11]: for i in range(0,17999):

U=Y(datac[127*i:127*(i+1)])

K=Chan.transmit(U)

datae[127*i:127*(i+1)]=K

In [12]: for i in range(0,17999):

P=Y(datae[127*i:127*(i+1)])

X=C.decode_to_message(P)

datam[120*i:120*(i+1)]=X

In [13]: datap=np.array(datam,dtype=np.uint8)

datar=np.packbits(datap)

datar=datar.reshape(90000,3)

In [ ]: datah=tuple(map(tuple,datar))

In [15]: imf = Image.new("RGB",(300,300),"white")

imf.putdata(datah)

In [16]: imf

Out[16]:

29

Page 31: TIPE : Code correcteur d'erreursmath.univ-lyon1.fr/~caldero/Melvyn.pdf · Introduisons quelques dé nitions a n de pouvoir traaillerv avec ces mots. Dé nition 1.1.1. On dé nit le

On obtient une image qui bien que reconnaissable est d'une très mauvaisequalité.

30