These Theorie de Codage
These Theorie de Codage
These Theorie de Codage
Mémoire
présenté
à la Faculté des études supérieures
de l’Université Laval
pour l’obtention
du grade de maı̂tre ès Sciences (M.Sc.)
Septembre 2000
Hans
c Bherer, 2000
Résumé
i
Avant-propos
J’aimerais remercier mon directeur de recherche, le professeur Claude Levesque, pour son
excellente supervision et son soutien pédagogique. Je tiens aussi à remercier mon collègue
Jean-Norbert, non seulement pour son aide mais aussi pour son amitié. Enfin je veux sou-
ligner le grand soutien de mon entourage et de ma famille et plus particulièrement celui de
Nathalie et de Anne car c’est aussi grâce à eux si j’ai pu poursuivre plus avant mes études.
ii
Table des matières
Résumé i
Avant-propos ii
1 Introduction 1
4 Codes linéaires 15
iii
TABLE DES MATIÈRES iv
4.2 Décodage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.3.2 Une propriété de la distribution des poids d’un code linéaire binaire . 23
5.1 Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
5.2 Codage-décodage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6 Conclusion 61
A Programmes MAPLE 62
Bibliographie 94
Table des figures
vi
Liste des tableaux
1.1 Répétition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
3.1 A2 (n, d) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5.3 F 24 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.5 F 23 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
vii
Chapitre 1
Introduction
Le transfert d’informations prend de plus en plus d’importance dans notre société. Que ce
soit pour la transmission de photographies de planètes éloignées, pour des communications
entre ordinateurs ou encore pour la lecture de nos disques lasers, le besoin de communi-
cations efficaces et sans erreurs est plus important que jamais. Nous savons tous que des
communications sans erreurs sont physiquement impossibles. Les codes ne sont pas là pour
éliminer les erreurs mais plutôt pour les détecter et si possible les corriger. Afin d’illustrer
sommairement un code, exploitons une idée intuitive qui consiste à répéter l’information un
certain nombre de fois.
Supposons que l’on ait quatre messages à envoyer, soit 00, 01, 10 et 11, dans un canal
qui produit une erreur de temps en temps. Pour résister au bruit du canal, on peut coder
l’information en la répétant trois fois comme le montre le tableau 1.1.
S’il survient une erreur dans la transmission, elle n’affectera que l’un des trois couples
1
CHAPITRE 1. INTRODUCTION 2
formant le mot du code. Le décodage pourra alors se faire par vote majoritaire sur ces trois
couples de bits. Une question naturelle nous vient à l’esprit : Peut-on faire mieux ? C’est dans
le but de répondre à cette question que nous doterons nos codes de structures mathématiques
permettant de les analyser et même de les créer. Nous voudrons alors obtenir des codes
permettant de coder le maximum de mots, de détecter et de corriger le maximum d’erreurs
tout en ayant la longueur la plus petite possible (rapidité de transmission). Plusieurs de ces
caractéristiques sont en conflit et l’élaboration de bons modèles mathématiques permet de
maximiser la satisfaction globale. Peut-on vraiment améliorer la fiabilité des communications
à l’aide d’un code ? Afin de répondre à cette question, nous préférons présenter un exemple
qui, nous l’espérons, saura convaincre le lecteur de l’utilité du codage de l’information.
Supposons que nous ayons un code binaire de longueur 11 ayant 211 = 2048 mots. Comme
notre code contient toutes les chaı̂nes de longueur 11, il ne détecte aucune erreur. Supposons
que la probabilité qu’un bit soit transmis sans erreur soit de 1 − 1
108
et supposons que la
transmission se fasse à un taux de 107 bits par seconde. Alors la probabilité qu’un mot soit
transmis de façon incorrecte est
11
1 11
1 − P (0 erreur) = 1 − 1 − 8 ≈ .
10 108
Cela implique qu’il y aura approximativement
11 107
× = 0.1
108 11
mot par seconde qui sera transmis incorrectement sans être détecté. Cela représente donc
8640 mots incorrects par jour. Supposons maintenant que l’on ajoute à chaque mot un bit
dit bit de parité (le bit de parité vaut 1 si le nombre de bits égaux à 1 est impair, sinon il
vaut 0). On doit avoir au moins 2 erreurs dans notre mot afin que celui-ci soit mal interprété.
Cette probabilité est
12 11 1
1 12 1 1 66
1 − P (0 erreur) − P (1 erreur) = 1 − 1 − 8 − 1− 8 ≈ .
10 1 10 108 1016
Cela implique qu’il y aura approximativement
66 107
16
× = 5.5 × 10−9
10 12
mot par seconde qui sera transmis incorrectement sans être détecté. Cela représente donc
une seule erreur à tous les 2000 jours !
CHAPITRE 1. INTRODUCTION 3
Soit A = {a1 , ..., aq } un ensemble fini que nous appellerons un alphabet de code et soit
An l’ensemble de toutes les chaı̂nes de longueur n sur A.
Nous dirons que chaque sous-ensemble C ⊂ An s’appelle un code. Chacune des chaı̂nes
c de C est appelée mot du code. De plus, nous dirons qu’un code C ⊂ An est de cardinalité
M si M = |C|. La dimension n de An est appelée la longueur du code. Un code de longueur
n contenant M mots sera appelé un (n, M)−code. Le corps fini à q éléments sera noté F.q
4
CHAPITRE 2. REMARQUES GÉNÉRALES EN THÉORIE DU CODAGE 5
À titre d’exemple, citons un des plus importants C.D.S.M., le canal symétrique binaire :
0 1-p
p
0
p
1 1-p 1
Fig. 2.1: Le canal symétrique binaire
P (c) = P (X = c),
P (d) = P (Y = d),
P (c|d) = P (X = c|Y = d),
P (d|c) = P (Y = d|X = c),
P (c, d) = P (X = c, Y = d).
f : O n −→ C
de l’ensemble des chaı̂nes de sortie vers l’ensemble des mots du code. Ainsi, l’ensemble
sera l’ensemble des chaı̂nes de sortie que nous associerons au mot c du code. De plus, si f (d)
n’est pas le mot qui avait été envoyé, nous dirons qu’une erreur de décision a été commise.
CHAPITRE 2. REMARQUES GÉNÉRALES EN THÉORIE DU CODAGE 6
Pour tout schéma de décisions, un mot c étant envoyé, la probabilité d’une erreur de
décision est
X
P (erreur|c) = p(d|c);
d6∈f −1 (c)
décisions. Pour une distribution d’entrées donnée, tout schéma de décisions f pour lequel
Avant d’énoncer le théorème de Shannon, qui est à la base même de la théorie du codage,
nous avons besoin de deux théorèmes ainsi que d’une définition appartenant à la théorie de
l’information et dont le lecteur trouvera démonstration dans [9].
Théorème 2.1 Pour toutes les distributions d’entrées et parmi tous les schémas de
décisions, un schéma de décisions d’observateur idéal minimise Pe .
Pour la suite, nous assumerons que la distribution d’entrées de notre canal est uniforme.
Définition 2.1 La capacité d’un canal binaire symétrique avec probabilité d’erreur p
est
C(p) = 1 + p log2 p + (1 − p) log2 (1 − p).
Théorème 2.3 (Shannon Noisy Coding Theorem) ∀ε > 0, si R < C(p) et pour
un n assez grand, il existe un code binaire de longeur n de taux k/n ≥ R avec Pe < ε.
Bien entendu nous avons des résultats similaires pour les codes non binaires mais dans
ces cas, la définition de la capacité diffère. Nous sommes donc assurés de l’existence de bons
codes dans la mesure où nous sommes prêts à diminuer le taux.
CHAPITRE 2. REMARQUES GÉNÉRALES EN THÉORIE DU CODAGE 8
Nous aimerions adopter un schéma de décisions qui serait en accord avec un schéma
décisionnel de maximum de vraisemblance. En effet, en supposant une distribution uniforme
d’entrées, on obtiendrait ainsi un schéma équivalent à celui d’un observateur idéal et Pe serait
donc minimisé. Nous allons montrer que c’est précisement ce que nous fournit le principe de
la distance minimale.
Définition 2.2 Soient x et y deux chaı̂nes de même longueur définies sur le même
alphabet. La distance de Hamming d(x, y) est le nombre de positions où x et y diffèrent.
d : An × An → N
est bien une métrique et qu’ainsi (An , d) devient un espace métrique. Montrons que ∀ x,y,z
∈ An nous avons :
(1) d(x, y) ≥ 0 et d(x, y) = 0 ⇐⇒ x = y,
(2) d(x, y) = d(y, x),
(3) d(x, z) ≤ d(x, y) + d(y, z).
Les points 1 et 2 sont immédiats. Prouvons le point 3. Soient
x = x1 x2 . . . xn ,
y = y 1 y2 . . . yn ,
z = z1 z2 . . . zn ,
U = {i|xi 6= zi },
S = {i|xi 6= zi ∧ xi = yi },
T = {i|xi 6= zi ∧ xi 6= yi }.
S ∪ T = U,
S ∩ T = ∅;
CHAPITRE 2. REMARQUES GÉNÉRALES EN THÉORIE DU CODAGE 9
ceci implique alors que d(x, z) = |U| = |T | + |S|. De plus, comme |T | ≤ d(x, y) et que
|S| ≤ d(y, z) le résultat est immédiat.
Définition 2.3 Le poids wt(x) d’une chaı̂ne x ∈ Vn (q) est le nombre de symboles
différents de 0 que contient x. Le poids minimal wt(C) est min wt(c).
c∈C
c6=0
Un (n, M)−code avec distance minimale d sera appelé un (n, M, d)−code. Considérons
maintenant un canal binaire symétrique avec p < 12 . Si le mot x est envoyé et que la chaı̂ne
y est reçue, alors
p(y|x) = pd(x,y) (1 − p)n−d(x,y) .
Comme p < 12 , cette probabilité sera maximale lorsque d(x, y) sera minimale. Ainsi, décoder
en utilisant un schéma de maximum de vraisemblance revient à choisir le mot x du code qui
est le plus près de y. C’est ce que nous appelons le principe du décodage à distance
minimale. C’est le principe qui nous guidera dans nos procédures de décodages.
Définition 2.5 Soit x une chaı̂ne de An , où |A| = q et soit r un entier non négatif. La
boule de rayon r centrée en x notée Sq (x, r) est l’ensemble
Définition 2.6 Le volume de la boule Sq (x, r) noté Vq (n, r) est le nombre d’éléments
de Sq (x, r). Le volume est indépendent de x et est donné par
r
X n
Vq (n, r) = (q − 1)k .
k=0
k
CHAPITRE 2. REMARQUES GÉNÉRALES EN THÉORIE DU CODAGE 10
Définition 2.7 Soit t ≥ 1. Nous dirons qu’un code C détecte t erreurs si pour x ∈ C,
les chaı̂nes y ∈ An vérifiant x 6= y et d(x, y) ≤ t ne sont pas dans C.
Définition 2.8 Soit t ≥ 1. Nous dirons qu’un code C corrige t erreurs si pour tout
y ∈ An , il existe au plus un x ∈ C tel que x 6= y et d(x, y) ≤ t.
Pour ce qui est de la détection, il est clair qu’un code C détectera t erreurs si et seulement
si t < d. Pour ce qui est de la correction, le résultat est moins évident et fera l’objet du
prochain théorème.
Preuve
⇐
Soit d ≥ 2t + 1. Soit y ∈ An . Nous aimerions montrer qu’il existe au plus un mot x ∈ C tel
que x 6= y et d(x, y) ≤ t. Soit z ∈ C où z 6= x, d(x, y) ≤ t et d(y, z) ≤ t. Alors nous avons
que d(x, z) ≤ 2t. Ce qui contredit le fait que d ≥ 2t + 1.
⇒
Soit d ≤ 2t. Soit x, z ∈ C où x 6= z et où d(x, z) ≤ 2t. On peut alors choisir un y ∈ An tel
que d(x, y) ≤ t et d(z, y) ≤ t. Nous avons donc deux mots du code dont la distance à y est
≤ t. Ceci implique que le code ne corrige pas t erreurs.
CHAPITRE 2. REMARQUES GÉNÉRALES EN THÉORIE DU CODAGE 11
Définition 2.9 Deux (n, M)−codes q-aires C1 et C2 sont équivalents s’il existe une
permutation σ des n coordonnées de chaque mot et des permutations π1 , π2 , . . . , πn de l’alpha-
bet telles que
Autrement dit, deux codes C1 et C2 sont équivalents si nous pouvons obtenir l’un à
partir de l’autre en permutant les coordonnées de chacun des mots ou encore les symboles
de l’alphabet dans chacunes des positions de chacun des mots. Deux codes équivalents ont
évidemment les même paramètres.
Chapitre 3
Pour un (n, m, d)−code donné, nous aimerions que sa distance minimale d soit aussi
grande que possible tout en ayant une cardinalité M maximale. Ces deux exigences sont
évidemment en conflit. On note Aq (n, d) la plus grande cardinalité M pour laquelle un
(n, M, d)−code sur F q existe. Un code pour lequel M = Aq (n, d) sera dit optimal. Détermi-
ner Aq (n, d) est appelé le problème central en théorie du codage. À titre indicatif, on
a quelques résultats connus pour A2 (n, d) dans le tableau 3.1.
Afin d’étudier Aq (n, d), nous présentons ici les quatres principales bornes utilisées en
théorie du codage. L’utilisation de certaines bornes de concert avec l’identité de MacWilliams
nous permettra d’étudier l’existence ou la non-existence de certains codes linéaires de pa-
ramètres donnés.
12
CHAPITRE 3. LE PROBLÈME CENTRAL EN THÉORIE DU CODAGE 13
A2 (n, d)
n d=3 d=5 d=7 n d=3 d=5 d=7
5 4 2 - 11 144-158 24 4
6 8 2 - 12 256 32 4
7 16 2 2 13 512 64 8
8 20 4 2 14 1024 128 16
9 40 6 2 15 2048 256 32
10 72-79 12 2 16 2560-3276 256-340 36-37
Aq (n, d) ≤ q n−d+1 .
Preuve
Preuve
Soit C un (n, M, d)−code. Il est clair que M ·Vn (q, t) ≤ q n . Le résultat est alors immédiat.
Un code C pour lequel nous avons égalité dans la borne de l’empilement des sphères est
appelé un code parfait.
q−1
Théorème 3.3 (La borne de Plotkin) Soit θ = q
. Si d > θn. Alors
d
Aq (n, d) ≤ .
d − θn
q−1
Théorème 3.4 (La borne d’Élias) Soit θ = q
. Si r est un entier positif satisfaisant
r < θn et r 2 − 2θnr + θnd > 0, alors
θnd · q n
Aq (n, d) ≤ .
r 2 − 2θnr + θnd · Vq (n, r)
Chapitre 4
Codes linéaires
Rappelons que notre alphabet de code A ne possède aucune structure particulière. Si nous
voulons doter nos codes d’une certaine structure nous devons préalablement doter A d’une
structure. Nous imposerons à A la structure de corps fini. Le but d’une telle imposition
est qu’alors nous pourrons considérer les mots du code comme des vecteurs de l’espace
F
vectoriel Vn ( q ). On remarque alors que la longueur du code est en fait la dimension de
l’espace vectoriel qui lui est associé. Comme il est primordial que la somme de deux mots
ou encore la multiplication d’un mot par un scalaire soit encore un mot du code, nous nous
F
intéresserons aux codes qui sont en fait des sous-espaces vectoriels de Vn ( q ). Cela nous
conduit à la définition suivante.
F
Définition 4.1 Un code C ⊂ Vn ( q ) est un code linéaire si C est un sous-espace vec-
F
toriel de Vn ( q ). Si la dimension de C est k on dit que C est un [n, k]−code. De plus, si la
distance minimale du code C est d on dit alors que C est un [n, k, d]−code (on utilise les
crochets pour un code linéaire alors qu’on utilise les parenthèses pour un code en général).
15
CHAPITRE 4. CODES LINÉAIRES 16
Comme un code linéaire est en fait un espace vectoriel, il devient naturel de le représenter
par une base. En théorie du codage on présente habituellement la base comme des vecteurs
lignes d’une matrice. Nous respecterons cette convention.
Définition 4.2 Soit C un [n, k]−code. Une matrice G de dimension k × n ayant pour
lignes une base de C est appelée la matrice génératrice du code (bien que nous disions
la matrice de génératrice, il faut comprendre qu’elle est unique à équivalence près).
Il est immédiat de vérifier que le code C peut être représenté de la façon suivante :
F
C = {xG|x ∈ Vk ( q )}.
La procédure de codage est alors triviale. Il suffit de coder le vecteur x de longueur k par le
mot xG du code.
Il peut s’avérer utile d’avoir une matrice génératrice sous une forme spéciale. Nous dirons
que G est sous la forme standard si G = (Ik |A). On peut aisément montrer que toute
matrice G peut être transformée sous la forme standard sans changer le code (à équivalence
près).
F
L’espace vectoriel Vn ( q ) peut être muni d’un produit scalaire de la façon suivante. Soient
x = x1 · · · xn et y = y1 · · · yn , alors le produit scalaire de x et y nous est donné par :
hx, yi = x1 y1 + · · · + xn yn .
À l’aide de ce produit scalaire nous allons définir l’un des concepts fondamentaux de la
théorie du codage, soit le concept de code dual.
C ⊥ = {x ∈ Vn (q)|hx, ci = 0 ∀c ∈ C}
Preuve
(1) Découle du fait que x ⊥ C ⇐⇒ x est perpendiculaire à tous les vecteurs d’une base
de C.
Soit G = (Ik |A) une matrice génératrice du code C sous sa forme standard. Définissons
la matrice H = (−At |In−k ) et montrons que H est la matrice génératrice de C ⊥ .
C’est donc dire que les lignes de H sont orthogonales aux lignes de G. De plus, comme
rang(H) = n − k = dim(C ⊥ ), on en déduit que H est en fait une matrice génératrice du code
C ⊥ . La matrice H est aussi appelé la matrice de contrôle du code C. Cette dénomination
découle du fait suivant :
(4.1) x ∈ C ⇐⇒ xH t = 0.
Il est à noter que la notion de matrice de contrôle et la propriété 4.1 s’avèreront fondamentales
dans le processus de décodage.
CHAPITRE 4. CODES LINÉAIRES 18
On sait que la distance minimale d d’un code C est un paramètre fondamental afin
de caractériser un code. De plus, comme la capacité d’un code à corriger les erreurs est
directement reliée à d, il est intéressant de remarquer qu’il est possible de déterminer d si on
connaı̂t la matrice de contrôle H du code. C’est le but du prochain théorème.
Preuve
F
Soit x = x1 . . . xn ∈ Vn ( q ) et soit Hj la j-ième colonne de H. Alors
x∈C ⇐⇒ xH t = 0
⇐⇒ x1 H1 + x2 H2 + · · · + xn Hn = 0.
Ainsi pour chaque mot de poids d, il existe un ensemble de d colonnes linéairement dépendan-
tes. D’un autre coté, s’il existait un ensemble de d − 1 colonnes linéairement dépendantes,
il existerait un mot de poids = d − 1 < d dans notre code. Cela contredirait le fait que
d = wt(C).
4.2 Décodage
Une méthode efficace de décodage peut être construite à l’aide de la matrice de contrôle.
Cette méthode s’appelle le décodage avec syndrômes.
Définition 4.4 Soit C un [n, k]−code ayant H comme matrice de contrôle. Alors pour
F
tout x ∈ Vn ( q ) on définit le syndrôme de x, noté syn(x), par
syn(x) = xH t .
syn(x) = 0 ⇐⇒ x ∈ C.
CHAPITRE 4. CODES LINÉAIRES 19
Voyons cette méthode en détails. Rappelons tout d’abord que l’espace quotient Vn ( q )/C F
est aussi un espace vectoriel sur Fq . Nous savons aussi que x + C = y + C ⇐⇒ x − y ∈ C.
Nous pouvons alors établir un lien entre les classes modulo C et les syndrômes de la façon
suivante.
Théorème 4.3 Soit C un [n, k]−code ayant H comme matrice de contrôle. Alors
x + C = y + C ⇐⇒ x − y ∈ C ⇐⇒ (x − y)H t = 0 ⇐⇒ xH t = yH t .
Nous allons maintenant utiliser l’ensemble de nos résultats précédents afin d’établir une
méthode de décodage en accord avec le principe de la distance minimale.
Supposons qu’un vecteur x (pas nécessairement un mot du code) soit reçu. Le principe
de la distance minimale nous demande de décoder x par c ∈ C où c est le mot du code
C le plus près (au sens de notre métrique) de x. Si e représente l’erreur de transmission,
nous obtenons alors que e = x − c. Chercher la distance minimale est alors équivalent à
minimiser wt(e). Comme syn(e) = syn(x − c) = syn(x) − syn(c) = syn(x), on en déduit
alors que e et x appartiennent à la même classe modulo C. Si nous choisissons le mot de
poids minimal comme représentant de chaque classe, e est alors le représentant de la classe
de x. Nous pouvons alors décoder x comme le mot c du code où c = x + e . Il suffit donc de
garder en mémoire une table des représentants de chaque classe modulo C ainsi que de leur
syndrôme respectif.
Bien que cette méthode puisse s’appliquer à tous les codes linéaires, il est souvent sou-
haitable de la modifier pour certains codes en particulier. On devine déjà que plus le taux
R d’un code sera faible, plus le nombre de classes sera élevé. Maintenir une table de chaque
représentant et de son syndrôme peut ne s’avérer d’aucune utilité en pratique. Pensons sim-
plement à un code de dimension k = 12 sur V24 ( F ). Le nombre de classes serait alors de
2
224 12
212
=2 = 4096 ce qui ne serait d’aucune efficacité (nous verrons qu’un tel code existe ; c’est
le code de Golay). Dans la pratique on s’intéressera non seulement aux codes ayant certains
paramètres donnés mais aussi et surtout aux codes admettant des procédures de décodage
simples et rapides.
CHAPITRE 4. CODES LINÉAIRES 20
F
De plus, pour u ∈ Vn ( q ), on définit
Il est important de noter que si on connaı̂t (A0 , . . . , An ) pour un certain code linéaire,
alors la distance devient facile à trouver car A0 = 1, Ai = 0 pour 1 ≤ i ≤ d − 1 et Ad ≥ 1.
Un des plus intéressants résultats en regard de l’énumérateur de poids est certes l’identité
de MacWilliams qui relie l’énumérateur de poids d’un code linéaire C à l’énumérateur de poids
de son code dual C ⊥ .
Bien que l’identité de MacWilliams s’applique aux codes linéaires définis sur F , nous
q
ne nous intéresserons ici qu’au cas où le code linéaire est défini sur F . Afin de démontrer
2
u ∈ Vn , définissons
X
gn (u) = (−1)hu,vi P (v).
v∈Vn
CHAPITRE 4. CODES LINÉAIRES 21
Preuve
Nous avons
X XX
gn (u) = (−1)hu,vi P (v)
u∈C u∈C v∈Vn
X
= P (v)S(v)
v∈Vn
(
P hu,vi
|C| si v ∈ C ⊥ ,
où S(v) = u∈C (−1) , pour v ∈ Vn . Montrons que S(v) =
0 si v 6∈ C ⊥ .
S
Pour v 6∈ C ⊥ , nous avons |C0 (v)| = |C1 (v)| et comme C = C0 (v) C1 (v), nous avons
X X
S(v) = (−1)hu,vi + (−1)hu,vi = 0.
u∈C0 (v) u∈C1 (v)
Ainsi
X X X
gn (u) = P (v)S(v) + P (v)S(v)
u∈C v∈C ⊥ v6∈C ⊥
X
= |C| P (v).
v∈C ⊥
Preuve
Nous allons procéder par induction. Par définition, lorsque nous avons u ∈ Vn , nous avons
X
gn (u) = (−1)hu,vi P (v).
v∈Vn
Supposons que c’est vrai pour n = k. Montrons alors que cela est vrai pour n = k + 1. Soient
u = (u1 , . . . , uk+1), v = (v1 , . . . , vk+1 ), u0 = (u1 , . . . , uk ), v0 = (v1 , . . . , vk ). Alors nous avons
X X
gk+1 (u) = (−1)hu,vi P (v) + (−1)hu,vi P (v)
v∈Vk+1 v∈Vk+1
vk+1 =0 vk+1 =1
X 0 0 0 0
X 0 0 0 0
= (−1)hu ,v i xk+1−w(v ) y w(v ) + (−1)hu ,v i+uk+1 xk−w(v ) y w(v )+1
v0 ∈Vk v0 ∈Vk
Alors
1
WC ⊥ (x, y) = WC (x + y, x − y).
2k
Preuve
CHAPITRE 4. CODES LINÉAIRES 23
X 1 X
P (u) = gn (u) (d’après le lemme 4.1)
|C| u∈C
u∈C ⊥
1 X
= (x + y)n−w(u)(x − y)w(u) (d’après le lemme 4.2)
|C| u∈C
1 X
n
= Ai (x + y)n−i (x − y)i
|C| i=1
1
= WC (x + y, x − y) (d’après l’équation 4.2)
|C|
et comme d’après l’équation 4.2,
X
P (u) = WC⊥ (x, y),
u∈C ⊥
Nous allons montrer une propriété intéressante des codes linéaires binaires. Pour ce faire,
nous utiliserons le théorème suivant.
Théorème 4.5 Soit (G, +) un groupe abélien contenant un sous-ensemble A non vide
tel que
(1) a1 , a2 ∈ A ⇒ a1 − a2 ∈ A,
(2) b1 , b2 ∈
/ A ⇒ b1 − b2 ∈ A.
Preuve
L’implication (1) nous dit que A est un sous-groupe. L’implication (2) nous dit que
[G : A] = 2.
Ainsi nous sommes en mesure d’énoncer le théorème suivant.
CHAPITRE 4. CODES LINÉAIRES 24
Théorème 4.6 Les mots d’un code linéaire binaire sont soit tous de poids pair ou soit
en nombre égal de poids pair et impair.
Preuve
(1, 0, 0, 0, 0, 1, 1, 1),
(1, 0, 0, 0, 0, 2, 1, 0),
ce qui nous donne respectivement les deux polynômes de distribution de poids suivants :
Wc (x, y) = x7 + x2 y 5 + xy 6 + y 7,
Wc (x, y) = x7 + 2x2 y 5 + xy 6 .
Comme on sait que le dual d’un code linéaire est aussi un code linéaire, on en déduit la
non-existence de notre [7, 2, 5]−code simplement en remarquant que les coefficients de Wc⊥
ne sont pas tous positifs.
CHAPITRE 4. CODES LINÉAIRES 25
On peut enfin remarquer que ce résultat est en accord avec la valeur de A2 (7, 5). Si un
tel code avait existé, il aurait contenu 4 mots ce qui impliquerait A2 (7, 5) ≥ 4 alors que nous
savons que A2 (7, 5) = 2.
Le problème central en théorie du codage est de déterminer Aq (n, d). Si nous nous
intéressons à Aq [n, d], nous disons alors que c’est le problème central en théorie du co-
dage linéaire. Nous avons évidemment que Aq [n, d] ≤ Aq (n, d). De plus, nous savons que
Aq [n, d] = q k où k est le plus grand entier pour lequel il existe un [n, k, d]−code sur F . C’est
q
donc dans le but de déterminer Aq [n, d] que l’identité de MacWilliams peut nous venir en
aide. En effet, pour chacune des distributions possibles d’un code linéaire nous savons que
la distribution de son dual, qui nous est donnée par l’identité de MacWilliams, doit être
la distribution d’un code linéaire. Si, étant donnée une distribution initiale, la distribution
du dual que nous donne MacWilliams n’est pas valide, on en déduit alors qu’il n’existe pas
de code linéaire ayant comme distribution la distribution initiale. En utilisant l’ordinateur
(voir le programme MAPLE en annexe) nous avons donc, pour un k donné, généré toutes
les distributions valides et pour chacune d’elles, nous avons obtenu la distribution du dual.
En rejetant toutes les distributions pour lesquelles la distribution du dual n’était pas valide,
nous avons obtenu une borne supérieure pour k. Nos résultats sont présentés au tableau
4.1. En plus de nous aider à déterminer Aq [n, d], notre méthode nous donne aussi l’ensemble
des seules distributions possibles pour un [n, k, d]−code. Concrètement, nous avons dans un
premier temps calculer une borne supérieure pour k en nous basant sur les théorèmes du
chapitre 3. Nous avons amélioré ces bornes dans quelques cas comme le montre le tableau
4.1. Nous avons même fait quelques tests en forçant une valeur de k supérieure aux bornes
théoriques et notre méthode s’est encore avérée efficace. Soulignons enfin que notre méthode
ne nous garantit pas l’existence d’un code même si elle nous permet éventuellement de sup-
poser son existence. Il serait intéressant dans un travail futur d’explorer les liens entre une
distribution valide et l’existence concrète d’un code ayant cette distribution.
CHAPITRE 4. CODES LINÉAIRES 26
Il est justifié de nous demander comment MacWilliams peut nous aider dans la recherche
de distribution de poids (qui nous donne immédiatement la distance minimale) d’un code
linéaire. L’idée est la suivante. Si le taux R d’un code est bas, il devient facile de faire la
liste des codes et ainsi obtenir la distribution de poids. Si par contre le taux R d’un code est
élevé (c’est d’ailleurs ce que nous recherchons), alors la dimension de son dual est petite. Il
devient alors facile d’énumérer les mots du dual et ainsi facilement obtenir le polynôme de
distribution de poids du code dual. Comme C ⊥⊥ = C, on applique l’identité de MacWilliams
à WC ⊥ afin d’obtenir WC . Si le taux R est près de 12 , notre méthode sera sans succès car les
dimensions du code et de son dual sont alors sensiblement les mêmes. Comme notre intention
est de trouver des codes pour lesquels le taux R est élevé, notre méthode mérite l’attention.
Appliquons notre méthode à un exemple simple mais qui en illustre bien la philosophie.
Il est facile de faire la liste des mots ainsi que leur poids respectif. Le tableau 4.2 présente
cette liste. Ainsi on obtient facilement que C = (1, 0, 0, 0, 7, 0, 0, 0).
Code [7,3, ?]
MOT POIDS
0000000 0
1010101 4
0110011 4
0001111 4
1100110 4
1011010 4
0111100 4
1101001 4
Wc (x, y) = x7 + 7x3 y 4.
Les codes de Hamming sont des codes linéaires qui corrigent une seule erreur. Bien qu’ils
peuvent être définis sur F , nous ne présenterons ici que la version binaire (q = 2). La façon
q
traditionnelle de les présenter est de le faire via la matrice de contrôle ; c’est la façon que
nous allons utiliser. Le lecteur trouvera en annexe un programme MAPLE pour les codes de
Hamming.
Définition 4.7 Soir r un entier positif et soit H une matrice dont les colonnes sont les
vecteurs différents de zéro de Vr ( F ). Alors le code ayant H comme matrice de contrôle est
2
Exemple.
Ce n’est pas par hasard que nous avons placé les colonnes dans l’ordre naturel (la colonne
i est la représentation dyadique du nombre i). Nous justifierons ce choix un peu plus tard
lorsque nous parlerons du décodage des codes H2 (r). Si nous avions voulu exhiber la matrice
génératrice du code, il est évident que nous aurions opté pour la représentation sous forme
standard de H. Le théorème suivant rend explicite les propriétés de H2 (r).
Preuve
(1) Comme nous avons que H2 (r)⊥ est un [2r − 1, r]−code, le résultat suit.
(2) Comme H ne contient pas de colonne égale à zéro et qu’il n’y a pas deux colonnes
identiques, on en déduit que d ≥ 3. Si on additionne les colonnes qui représentent les nombres
1,2 et 3 en binaire, on obtient 0 ce qui implique que d = 3.
(3) Montrons que nous avons égalité pour la borne de l’empilement des sphères. Comme
nous avons que t = 1, n = 2r − 1 et que M = 2n−r , on obtient
n
2 n−r
1+ = 2n−r (1 + n) = 2n−r (1 + 2r − 1) = 2n .
1
Ainsi, C est bien un code parfait.
En ordonnant les colonnes de la matrice de contrôle H selon l’ordre naturel et en suppo-
sant qu’au plus une seule erreur de transmission s’est produite, on obtient une méthode de
décodage très élégante. En effet, si d est reçu alors son syndrôme dH t sera évidemment la
CHAPITRE 4. CODES LINÉAIRES 29
représentation binaire de la position où l’erreur s’est produite ; (on sait que si dH t = 0 alors
aucune erreur ne s’est produite). Illustrons le tout par un exemple.
En 1948, Marcel Golay a introduit quatre codes linéaires notés G23 , G24 , G11 et G12 qui
sont maintenant appelés des codes de Golay. Nous nous intéresserons, pour le moment,
seulement à G24 . C’est le code qui a été utilisé pour la mission Voyager afin de transmettre des
photographies couleurs de Jupiter et de Saturne. Nous le définirons de la manière classique en
donnant sa matrice génératrice. Notre but n’est pas de démontrer les propriétés de G24 mais
plutôt de présenter le code ainsi qu’une méthode de décodage tirant profit de la structure
du code. Comme nous l’avons mentionné précédemment, le principe de décodage nécessitant
le calcul du syndrôme de chaque classe modulo G24 s’avère souvent inutilisable en pratique.
Nous verrons que l’on peut décoder G24 d’une façon élégante, et ce, avec un nombre réduit de
calculs de syndrômes. Pour la justification des paramètres de G24 nous renvoyons le lecteur
à [7] et pour la justification de la méthode de décodage, nous renvoyons le lecteur à [11].
Définition 4.9 Le code de Golay G24 est un code binaire ayant comme matrice géné-
CHAPITRE 4. CODES LINÉAIRES 30
On obtient alors que le code de Golay G24 est un [24, 12, 8]−code binaire auto-dual.
La famille des codes de Golay n’est pas aussi vaste que la famille des codes de Hamming,
mais son intérêt vient surtout du fait que les codes de Golay se prêtent bien au décodage.
Comme nous l’avons déjà mentionné, le décodage classique de G24 nécessiterait une table
contenant 212 lignes. Voici maintenant un algorithme de décodage n’utilisant pas une telle
table. Nous allons bien entendu illustrer notre méthode à l’aide de quelques exemples.
Voici la notation que nous utiliserons. La matrice génératrice est notée G et G = [I12 B].
La colonne i de B sera notée ci et la ligne i de B sera notée ri . Un 12-uplet binaire où la
seule composante différente de zéro est la composante i sera noté x(i) ou y(i) . Le mot envoyé
sera noté c et r sera le vecteur reçu. Le vecteur nul de longueur 12 sera noté 0 et la notation
(x, y) représentera le vecteur de longueur 24 obtenu par la concaténation de x et y.
(4) Calculer B T s.
(5) Si wt(B T s) ≤ 3, alors e = (0, (B T s)T ) et aller à (8).
(6) Si wt(B T s + rTi ) ≤ 2 pour un certain ri (1 ≤ i ≤ 12), alors e = (x(i) , (B T s)T + ri ) et
aller à (8).
(7) Imprimer <Au moins 4 erreurs se sont produites> et fin.
(8) Décoder r comme r − e = c et fin.
Exemple 1.
Exemple 2.
Soit c = 001100010000111011111001 le mot du code formé par la somme des rangées 3,4
et 8 de G. Supposons alors que le vecteur reçu est r = 101100010000110011110001 (3 erreurs).
On calcule s = GrT = (110010101011)T . Comme wt(s) > 3 et qu’il n’y a aucune colonne ci de
B telle que wt(s+ci ) ≤ 2, on calcule alors B T s = (010111110111)T . Comme wt(B T s) > 3, on
cherche alors une rangée ri de B telle que wt(B T s+rTi ) ≤ 2. Pour i = 1 on obtient B T s+rT1 =
(001000001000)T = yT . Ainsi, on choisit e = (x(1) , y) = 100000000000001000001000 et on
décode simplement par r − e = 001100010000111011111001, qui est bien le mot c envoyé.
Remarquons que nous avons eu besoin de seulement 15 calculs de syndrômes ce qui est encore
loin de 212 .
CHAPITRE 4. CODES LINÉAIRES 32
Définition 4.10 Le code de Reed-Muller du premier ordre, noté RM(1, r), est le
sous-espace vectoriel engendré par les vecteurs 1, v1 , v2 , . . . , vr . La matrice génératrice de
RM(1, r) est alors
1 1
G= = .
Br Hr 0
Exemple 1.
Nous pouvons alors facilement vérifier que RM(1, 3) est un [8, 4, 4]−code.
Nous aimerions maintenant montrer que le paramètre r détermine tous les autres pa-
ramètres du code. C’est l’objet du prochain théorème.
Preuve
où rij est la ij -ième rangée de G, 1 ≤ h ≤ r + 1. Supposons qu’aucun rij n’est égal à 1 et
considérons alors la matrice
ri1
ri2
A= .. .
.
rih
Maintenant, la composante t de c sera 0 si la t-ième colonne de A possède un nombre pair
de 1 et sera 1 si cette colonne de A contient un nombre impair de 1. Remarquons que pour
CHAPITRE 4. CODES LINÉAIRES 34
Si par contre nous avons que rij = 1, alors il suffit de considérer c − 1. Ainsi le même
argument peut être appliqué (il s’applique à tout mot différent de 0) et on obtient alors
wt(c − 1) = 2r−1 (pour c 6= 1). On obtient alors que wt(c) = 2r−1 simplement en changeant
les 1 et les 0 dans c − 1.
Passons maintenant à la définition des codes de Reed-Muller d’ordre m.
RM(r, r) = V2r ( F ),
2
RM(m, r) = {(x, x + y)|x ∈ RM(m, r − 1), y ∈ RM(m − 1, r − 1)}, (0 < m < r).
Plutôt que d’utiliser cette description du code, nous allons donner une méthode récursive
permettant de construire la matrice génératrice de RM(m, r). Nous noterons cette matrice
G(m, r). Pour 0 < m < r, on définit
" #
G(m, r − 1) G(m, r − 1)
G(m, r) = .
0 G(m − 1, r − 1)
Exemple 2.
Utilisons cette méthode afin de déterminer G(1, 3) (c’est la matrice G de l’exemple 1).
On obtient
" #
G(1, 2) G(1, 2)
G(1, 3) =
0 G(0, 2)
où " #
G(1, 1) G(1, 1) h i
G(1, 2) = et G(0, 2) = 1 1 1 1
0 G(0, 1)
avec " #
1 1 h i
G(1, 1) = et G(0, 1) = 1 1 .
0 1
On obtient alors
1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1
G(1, 3) =
0 0 1 1 0 0 1 1
0 0 0 0 1 1 1 1
qui est bien (à équivalence près) la matrice G de l’exemple 1.
Chapitre 5
5.1 Structure
Une des classes de codes linéaires les plus importantes est la classe des codes cycliques.
Afin de bien les définir, le concept de sous-espace cyclique nous sera nécessaire.
F
Définition 5.1 Un sous-espace S de Vn ( q ) est un sous-espace cyclique si
Définition 5.2 Un code linéaire C est cyclique s’il est un sous-espace cyclique.
F
v = a1 a2 . . . an ∈ Vn ( q ) 7−→ v(x) = a1 + a2 x + · + an xn−1 ∈ F (n)
q [x],
36
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 37
F
Théorème 5.1 Un sous-ensemble non-vide S de Vn ( q ) est un sous-espace cyclique si
et seulement si l’ensemble des polynômes I associés à S est un idéal dans l’anneau des
polynômes F (n)
q [x] F
associé à Vn ( q ).
Preuve
Par hypothèse, S est cyclique. Le fait que (I, +) est un groupe abélien découle du fait
que S est un sous-espace.
Montrons que I est fermé sous la multiplication. Soit v = (a0 , . . . , an−1 ) ∈ S. Alors
v(x) ∈ I implique (an−1 , a0 , . . . , an−2 ) ∈ S car S est cyclique. Alors xv(x) ∈ I.
Comme S est un espace vectoriel, si v ∈ S alors λv ∈ S pour tout λ ∈ q . Ainsi λxi v(x) ∈
Pn−1
F
F
I pour tout λ ∈ q , pour 0 ≤ i ≤ n − 1. Ainsi a(x)v(x) ∈ I où a(x) = j=0
(n)
λj xj ∈ q [x]. F
⇐
Preuve
Le fait que I =< g(x) > découle du fait que F (n)
q [x] est un anneau principal. Montrons
que g(x)|xn − 1. Soit f (x) = h(x)g(x) + r(x) où deg(r(x)) < deg(g(x)) ou r(x) = 0. Alors
[f (x)] = [h(x)g(x) + r(x)] = [h(x)][g(x)] + [r(x)]. Comme [f (x)] = [0], nous obtenons
[r(x)] = [−h(x)][g(x)] ∈ I.
Preuve
Soit g(x) et h(x) ∈ F [x] de plus petit degré et unitaires tels que
q
Alors [h(x)] = [a(x)g(x)] pour un certain a(x). Comme deg h(x) = deg g(x) et que h(x) et
g(x) sont unitaires le résultat suit.
Ainsi nous parlerons maintenant du polynôme unitaire g(x) de plus petit degré qui
engendre I.
Théorème 5.4 Soit h(x) un polynôme unitaire diviseur de f (x) = xn − 1. Alors h(x)
est le générateur de l’idéal I = {a(x)h(x) : a(x) ∈ Rn } .
Preuve
Soit g(x) le générateur de I. Nous savons que g(x)|f (x). De plus, comme g(x) ∈ I, il
existe un polynôme a(x) tel que
[g(x)] = [a(x)h(x)].
Nous avons g(x) = a(x)h(x) + l(x)f (x) pour un certain polynôme l(x) ; comme h(x)|f (x),
cela implique que h(x)|g(x). De plus, g(x)|h(x) car g(x) est le générateur. Comme les deux
sont unitaires, on conclut que g(x) = h(x).
Comme on sait qu’un code C peut être engendré par un polynôme différent de son po-
lynôme générateur, la notation C =< g(x) > n’impose pas que g(x) soit l’unique polynôme
unitaire de degré minimal qui génère C. Nous introduisons alors la notation C = g(x) qui
signifie que dans ce cas on impose à g(x) d’être l’unique polynôme unitaire de degré minimal
qui génère C. Il est clair que g(x) et < g(x) > représentent en fait le même code C.
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 39
Ainsi en combinant nos résultats précédents, nous obtenons notre résultat principal à
savoir :
Comme nous l’avons fait pour les codes linéaires, nous aimerions exhiber une base de
chacun de nos sous-espaces vectoriels cycliques et ainsi obtenir la matrice génératrice du
code associé. Le théorème suivant répond à cette attente.
Théorème 5.5 Soit g(x) un polynôme unitaire qui divise xn −1 sur F q et où deg g(x) =
n − k. Alors g(x) est le polynôme générateur d’un sous-espace vectoriel cyclique de Vn ( q ) F
de dimension k.
Preuve
F
Soit S un sous-espace vectoriel de Vn ( q ) généré par g(x). Soit
B = g(x), xg(x), . . . , xk−1 g(x) .
Afin d’obtenir notre résultat nous allons montrer que B est une base.
X
k−1
λi xi g(x) = 0, λi ∈ F.
q
i=0
De cette équation, on voit facilement que le seul terme pouvant avoir xn−1 est λk−1 xk−1 g(x)
et comme le degré de xk−1 g(x) est inférieur à n, cela implique que λk−1 = 0. On en déduit
que λi = 0, 0 ≤ i ≤ k − 1. Donc B est linéairement indépendant.
Deuxièmement. Soit h(x) ∈ S. Alors h(x) = a(x)g(x) où sans perte de généralité
deg a(x) < k. Alors
X
k−1 X
k−1
a(x) = λi xi et h(x) = λi xi g(x),
i=0 i=0
Soit g(x) le polynôme générateur de degré r d’un code linéaire cyclique de paramètres
[n, n − r]. Aussi, nous savons que xn − 1 = g(x)h(x) où h(x) est un polynôme de degré n − r.
Le polynôme h(x) est appelé le polynôme de contrôle du code C ayant comme générateur
g(x). Le théorème suivant montre comment à l’aide de h(x) nous pouvons obtenir la matrice
de contrôle.
Théorème 5.6 Soit h(x) le polynôme de contrôle d’un code linéaire cyclique C dans
Rn .
(1) Le code C peut être représenté par
(2) Soit h(x) = h0 + h1 x + · · · + hn−r xn−r . Alors une matrice de contrôle du code C est
donnée par
hn−r ··· h0 0 0 ··· 0
0 hn−r ··· h0 0 ··· 0
..
H= 0 0 hn−r · · · h0 ··· . .
.. .. .. .. ..
. 0
. . . . ···
0 0 ··· 0 hn−r · · · h0
(3) Le code dual C ⊥ est un code cyclique de dimension r et son polynôme générateur est
donné par
h⊥ (x) = h−1
0 x
n−r
h(x−1 ) = h−1
0 (h0 x
n−r
+ h1 xn−r−1 + . . . + hn−r ).
Preuve
(1) Soit g(x) le polynôme générateur de C. Si p(x) ∈ C, alors p(x) = f (x)g(x) pour un
certain f (x) ∈ Rn . Ainsi
De plus, si p(x) ∈ Rn et que p(x)h(x) ≡ 0, alors nous pouvons écrire que p(x) =
q(x)g(x) + r(x) où deg(r(x)) < r. Nous obtenons alors
Avant d’aborder le codage et le décodage des codes linéaires cycliques ainsi que les codes
eux-mêmes, il nous faut voir une autre façon de représenter un code linéaire cyclique, soit à
travers la notion de zéros d’un code.
Définition 5.4 Les zéros d’un code linéaire cyclique sont les racines de son polynôme
générateur.
où les mi (x) sont des polynômes irréductibles sur F . Si ω est une racine primitive n-ième
q
de l’unité sur F , nous savons que les racines du polynôme m (x) sont conjuguées. Elles sont
q i
iq d−1
de la forme {ω , ω , . . . , ω
i iq
} où d est le plus petit entier positif tel que iq d ≡ i mod n.
L’ensemble Ci = {i, iq, . . . , iq d−1 } est alors appelé la i-ième classe cyclotomique de q
modulo p. On obtient alors
Y
mi (x) = (x − ω j ).
j∈Ci
α une racine de mi (x) dans un corps de décomposition de F . Ainsi m (x) est le polynôme
q i
minimal de α sur F . Si f (x) ∈ F [x] et que f (α) = 0 alors f (x) = a(x)m (x) pour un certain
q q i
Voyons comment appliquer cela aux codes linéaires cycliques. Soit g(x) = q1 (x) · · · qt (x)
(où les qi (x) sont des facteurs irréductibles de xn − 1). Soient {α1 , . . . , αu } l’ensemble des
racines de g(x). Alors
De plus, il suffit de prendre une seule racine pour chacun des qi (x). Soit βi une racine de
qi (x). Alors
g(x) = {f (x) ∈ Rn |f (β1) = f (β2 ) = . . . = f (βt ) = 0}.
et ainsi " #
X X
aj [xji ] = aj αij = 0.
j j
f (αi ) = 0 pour i = 1, . . . , u ⇐⇒ f H T = 0.
En supprimant les lignes linéairements dépendantes, nous obtenons ainsi une matrice de
contrôle pour le code ayant {α1 , . . . , αu } comme zéros.
Cette représentation nous sera fort utile lors de la définition des codes BCH, RS et des
codes de Goppa.
Avant de passer à un exemple illustrant toute la théorie développée jusqu’ici pour les
codes liéaires cycliques, nous allons voir comment coder et décoder avec un code cyclique.
5.2 Codage-décodage
Soit C = g(x) un [n, n − r]−code q-aire cyclique (le degré de g(x) est alors égal
à r). Ainsi, nous pouvons coder des messages de longueur n − r auxquels seront ajoutés
r symboles de vérification. Soit le message a0 a1 · · · an−r−1 auquel on associe le polynôme
ā(x) = a0 xn−1 + a1 xn−2 + . . . + an−r−1 xr . Ensuite on calcule r(x) où ā(x) = q(x)g(x) + r(x).
Enfin, on envoie c(x) = ā(x) − r(x).
On voit facilement que deg(r(x)) < r et comme ā(x) et r(x) n’ont pas de terme de même
degré, le codage est alors systématique. Par codage systématique on entend qu’en lisant le
mot en partant de la plus grande puissance de r, on vérifie facilement que les n − r premières
positions contiennent l’information alors que les r dernières contiennent les symboles de
vérification.
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 44
Comme un code cyclique est un code linéaire, nous pouvons utiliser la même procédure
de décodage que celle utilisée pour nos codes linéaires à savoir la méthode du syndrôme.
Ainsi si c(x) ∈ C est le mot envoyé et que u(x) est reçu, err(x) = u(x) − c(x) est le
polynôme erreur. Nous définirons le poids d’un polynôme comme le nombre de coefficients
différents de zéro. Il nous reste maintenant à voir ce que l’on entend par le syndrôme d’un
polynôme.
Exemple
Nous voulons contruire un code cyclique de paramètres [7, 4] = [7, 7 − 3] sur F 2 (si c’est
possible !). (On reconnaı̂t ici les paramètres du code de Hamming H2 (3)). Ce code linéaire
est-il cyclique ? Oui !
Pour obtenir un code de paramètres [7, 4], il nous faut donc un facteur irréductible de degré 3
qui divise x7 − 1. Nous avons alors deux choix pour le polynôme générateur. Choisissons
g(x) = x3 + x + 1. Nous obtenons alors un code cyclique C = g(x) de dimension
7 − 3 = 4 et ayant pour matrice génératrice la
matrice suivante
1 1 0 1 0 0 0
0 1 1 0 1 0 0
G=
.
0 0 1 1 0 1 0
0 0 0 1 1 0 1
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 45
Afin d’obtenir notre matrice de contrôle, calculons h⊥ (x). (Nous savons que dim(C ⊥ ) = 3.)
Il nous faut alors le polynôme h(x) satisfaisant x7 − 1 = g(x)h(x). Ainsi h(x) = (x + 1)(x3 +
x2 + 1) = x4 + x2 + x + 1. On en déduit alors que h⊥ (x) = x4 + x3 + x2 + 1. Nous obtenons
ainsi la matrice de contrôle H suivante
1 0 1 1 1 0 0
H= 0 1 0 1 1 1 0 .
0 0 1 0 1 1 1
qui est équivalente à celle calculée avec notre autre méthode. Le code H2 (3) est donc cyclique !
Montrons explicitement comment coder avec ce code. Supposons que l’on désire envoyer
le mot 1001. Ce mot correspond au polynôme 1 + x3 = a(x). Formons ā(x) = x6 + x3 .
Maintenant
x6 + x3 = (x3 + x)(x3 + x + 1) + (x2 + x).
Ainsi
Maintenant comme nous savons que H2 (3) corrige seulement une erreur, introduisons une
erreur et vérifions notre méthode de décodage. Pour cela, formons une table de syndrômes
et de représentants de classes. Comme H2 (3) corrige une seule erreur, il corrige les err(x)
de poids égaux à 1. Le tableau 4.1 présente cette table.
Supposons alors que ayant transmis c(x) = x + x2 + x3 + x6 , nous ayons reçu u(x) =
x + x3 + x6 . Calculons son syndrôme. Or
x6 + x3 + x = (x3 + x)(x3 + x + 1) + x2 .
c(x) = u(x) − x2 = x + x2 + x3 + x6
= 0111001,
Tel que nous l’avions mentionné avec les codes linéaires, un tel principe de décodage
nécessite la tenue d’une table de représentants de classes qui peut devenir très longue. Ainsi
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 47
nous sommes en droit de nous demander si une méthode de décodage tirant profit de la
structure cyclique du code n’aurait pas pour effet d’améliorer le décodage. La réponse est
évidemment oui. Explicitons cette méthode que nous appliquerons à notre exemple.
Voici le principe de cette nouvelle méthode. Supposons que l’on est capable de décoder
le coefficient de xn − 1. On pourrait, décoder ce coefficient, puis effectuer une permutation
circulaire, et décoder à nouveau le coefficient dominant qui serait en fait le coefficient de xn−1
de u(x). Ainsi, nous n’avons besoin que des lignes de la table pour lesquelles le représentant
de la classe est de degré égal à n − 1.
Appliquons cette méthode à notre exemple. La table en devient alors une qui ne compte
La théorie portant sur les codes linéaires cycliques ayant été exposée et illustrée par un
exemple, passons maintenant à la descriptions des cinq principaux codes linéaires cycliques.
Les codes BCH (Bose, Ray-Chaudhuri, Hocquenghem 1960) forment une très importante
classe de codes linéaires cycliques. Leur distance est facile à minorer, les mots peuvent être
encodés et les vecteurs, décodés de façon relativement simple. Le lecteur trouvera en annexe
un programme MAPLE pour les codes BCH.
Définition 5.6 Soit ω une racine n-ième primitive de l’unité sur F q et soit g(x) le
polynôme unitaire de plus petit degré sur F q ayant les δ − 1 nombres
ω b , ω b+1, . . . , ω b+δ−2
parmi ses racines (où b ≥ 0 et δ ≥ 1). Un code cyclique C = g(x) de longueur n noté
Bq (n, δ, ω, b) est appelé un code BCH avec distance planifiée δ. De plus, lorsque b = 1
nous dirons que nous avons un code BCH strict et nous le noterons par Bq (n, δ, ω). Si
n = q s − 1 pour un certain s ≥ 1 nous dirons alors que le code BCH est un code BCH
primitif (car ω est alors un élément primitif de F q s ).
Nous allons maintenant montrer que le choix de δ nous donne une borne inférieure pour
la distance d du code.
Théorème 5.7 (La borne BCH) Soit ω une racine n-ième primitive de l’unité sur
F . Soit C un code cyclique et soit g(x) son polynôme générateur. Si pour un certain b ≥ 0
q
Preuve
Le déterminant de la matrice de gauche doit alors être nul. Ce déterminant est cependant
égal à ω (a1 +···+aw )b multiplié par le déterminant de la matrice,
1 1 ··· 1
ω a1 ω a2 ··· ω aw
.. .. .. ,
. . .
ω a1 (w−1
ω a2 (w−1
· · · ω aw (w−1)
qui est une matrice de Vandermonde. Il est facile de voir que le déterminant de cette matrice
n’est pas nul et qu’ainsi le résultat suit.
La construction d’un code BCH revient à exhiber son polynôme générateur g(x). Nous
devons être en mesure de trouver g(x) à partir des racines n-ièmes de l’unité utilisées pour
le définir. Nous expliciterons la démarche par deux exemples de construction de codes BCH.
Nous avons choisi nos exemples de façon à ce que le corps de décomposition soit F 24 . Nous
avons alors construit F 24 avec le polynôme primitif f (x) = x4 + x + 1 où α est une racine de
f (x). Le tabeau 5.3 présente ce corps.
Exemple 1.
Nous voulons construire un code BCH strict de longueur égale à 15 et de distance planifiée
égale à 7 sur F . Remarquons que nous sommes en présence d’un code BCH primitif car
2
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 50
α, racine de x4 + x + 1 F 24
0 0
0
α 1
1
α α
α2 α2
α3 α3
α4 α+1
α5 α2 + α
α6 α3 + α2
α7 α3 + α + 1
α8 α2 + 1
α9 α3 + α
α10 α2 + α + 1
α11 α3 + α2 + α
α12 α3 + α2 + α + 1
α13 α3 + α2 + 1
α14 α3 + 1
Tab. 5.3: F 24
C0 = {0}
C1 = {1, 2, 4, 8}
C3 = {3, 6, 9, 12}
C5 = {5, 10}
C7 = {7, 11, 13, 14}.
g(x) = (x − ω)(x − ω 2 )(x − ω 4 )(x − ω 8 )(x − ω 3 )(x − ω 6 )(x − ω 9 )(x − ω 12 )(x − ω 5 )(x − ω 10 ),
où ω est une racine primitive 15-ième de l’unité. Comme notre code est primitif, nous pouvons
prendre ω = α où α est un élément primitif de F 24 . On obtient alors
g(x) = (x − α)(x − α2 )(x − α4 )(x − α8 )(x − α3 )(x − α6 )(x − α9 )(x − α12 )(x − α5 )(x − α10 ).
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 51
Exemple 2.
Nous voulons construire un code BCH strict de longueur égale à 5 et de distance planifiée
égale à 3 sur F . Remarquons que nous sommes en présence d’un code BCH qui n’est pas
2
primitif. Calculons en premier lieu les classes cyclotomiques de 2 modulo 5. Nous obtenons :
C0 = {0}
C1 = {1, 2, 3, 4}.
où ω est une racine primitive 5-ième de l’unité. Comme le plus petit entier r satisfaisant
5|2r − 1 est 4, on en déduit que ω ∈ F 24 . De plus, comme 24 −1
= 3, on en déduit que l’on
F
5
peut prendre ω = α3 où α est un élément primitif de 24 . On obtient alors
g(x) = 1 + x + x2 + x3 + x4 .
Il est intéressant de remarquer que nous avions δ = 3 mais que δ = 5 produit le même
code. Comme wt(g(x)) = 5, on en déduit que la distance d est égale à 5. Nous avons alors
construit un code BCH qui est un [5, 1, 5]−code (bien entendu tout cela était prévisible en
regardant la factorisation de x5 − 1 en facteurs irréductibles sur F ).
2
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 52
Les codes de Reed-Solomon (RS) forment une classe particulière des codes BCH. La
NASA les utilise depuis 1977 dans différentes missions spatiales. Ils ont, par exemple, été
utilisés dans les missions de Galilée, Magellan et Ulysse. La sonde Voyager II les a utilisés
en janvier 1986 afin de transmettre des photographies de Uranus. Sony et Philips utilisent
les code RS depuis 1980 pour l’enregistrement des disques compacts. Nous verrons aussi
comment les codes RS peuvent être utilisés afin de corriger un éclat d’erreurs (ce qui explique
leur choix pour l’enregistrement des disques compacts).
Ainsi, si ω est une racine (q − 1)-ième primitive de l’unité, on obtient alors que le code RS
de distance planifiée δ admet comme polynôme générateur le polynôme
où b ≥ 0.
Dans le cas des codes RS, la distance planifiée présente une caractéristique intéressante.
Cette caractéristique fait l’objet du prochain théorème.
Théorème 5.8 La distance minimale d d’un code RS est égale à sa distance planifiée δ.
Preuve
Soit g(x) le polynôme générateur d’un code RS de distance planifiée δ. Nous avons alors
que deg(g(x))= δ − 1 et donc que la dimension k du code est égale à n−deg(g(x))= n − δ + 1.
La borne BCH nous dit que d ≥ δ = n − k + 1 et la borne de Singleton nous dit que
d ≤ n − k + 1 = δ d’où d = δ.
Corollaire 5.1 Les codes RS sont des codes séparables de distance maximale.
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 53
Preuve
(d = δ = n − k + 1).
La principale caractéristique des codes RS est qu’ils permettent de corriger un éclat
d’erreurs. Nous n’avons qu’à penser à une égratignure sur un disque compact afin de nous
convaincre que dans ces cas, les éclats d’erreurs sont fréquents. Voyons comment utiliser un
code RS afin de corriger un éclat d’erreurs.
Les codes RS pour lesquels q = 2m sont des codes C définis sur F 2m . Ce sont donc des
[n, k]−codes q-aires. Voyons maintenant F 2m comme F m
2 . Le même code C devient alors un
[mn, mk]−code binaire C + . Dans le premier cas, le code C est un espace vectoriel de dimension
k sur F 2m alors que dans le deuxième cas, le code C + est un espace vectoriel de dimension
mk sur F 2 (notons que C + peut ne plus être cyclique). En résumé, si C est un [n, m, d]−code
2m -aire alors C + est un [mn, mk, ≥ d]−code binaire. Illustrons nos propos par un exemple.
Exemple.
Considérons maintenant {1, ω} comme une base ordonnée de F 4 sur F . On obtient alors que
2
Il est alors évident que si le code original C corrige t erreurs alors le code C + corrigera
des éclats d’erreurs pouvant atteindre une longueur b = (t − 1)m + 1.
Comme nous l’avons vu, les codes cycliques peuvent être définis avec la notion de zéros
d’un code. En choisissant les zéros d’une façon particulière nous avons obtenu, par exemple,
les codes BCH. Les codes Résidus Quadratiques sont des codes linéaires cycliques pour
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 54
C (sur F)
4 C + (sur F)
2
000 000000
ω10 011000
2
ω ω0 110100
1ω 20 101100
0ω1 000110
2
0ω ω 001101
01ω 2 001011
ωω 21 011110
2
ω 01 110010
111 101010
ωωω 010101
2
ω 1ω 111001
10ω 100001
ωωω 2 010111
2 2 2
ω ω ω 111111
2
ω ω0 110100
1ωω 2 100111
lesquels un choix particulier de zéros est imposé. Comme son nom l’indique, ce choix reposera
sur la notion de résidu quadratique.
Définition 5.8 Soit p un nombre premier impair. Si (a, p) = 1 alors a est un résidu
quadratique modulo p s’il existe un x tel que x2 ≡ a mod p. Si aucun x ne satisfait cette
congruence alors on dira que a est un non-résidu quadratique modulo p.
Par la suite, nous noterons RQ l’ensemble des résidus quadratiques modulo p de l’en-
semble ZZ∗p = {1, . . . , p − 1} et l’ensemble des non-résidus quadratiques de ZZ∗p sera noté
NRQ. Nous nous permettons de rappeler au lecteur les propriétés suivantes des résidus
quadratiques :
p−1 2
(1) RQ = {12 , 22 , . . . , 2
};
(2) RQ ∪ NRQ = ZZ∗p ;
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 55
Cette condition impose donc à q d’être un résidu quadratique modulo p. Ainsi, pour un tel
q, nous obtenons des polynômes q(x) et n(x) à coefficients dans F q où
xp − 1 = (x − 1)q(x)n(x)
avec
Y Y
q(x) = (x − ω r ) et n(x) = (x − ω u ).
r∈RQ u∈N RQ
Définition 5.9 Soit p un nombre premier impair et soit q un premier qui est un résidu
quadratique modulo p. Alors, les codes cycliques q-aires
de longueur p dans Rp = F [x]/ < x −1 > sont appelés des codes Résidus Quadratiques.
q
p
Avant de présenter un code Résidu Quadratique, nous allons nous intéresser à sa distance
minimale. A cet égard nous avons le théorème suivant.
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 56
Théorème 5.9 (Borne de la racine carrée) La distance minimale d des codes Ré-
sidus Quadratiques Q(p) et N (p) satisfait
d2 ≥ p.
d2 − d + 1 ≥ p.
Preuve
Soit a(x) 6= 0 un mot de poids minimal d dans Q(p). Si n ∈ NRQ, alors a∗ (x) = a(xn ) est
un mot de poids minimal dans N (p). Ainsi le mot a(x)a∗ (x) doit appartenir à Q(p) ∩ N (p).
Alors a(x)a∗ (x) est alors un multiple de
Y Y Y
p−1
Y
p−1
(x − ω )
r
(x − ω ) =
n
(x − ω ) =
i
xi .
r∈RQ n∈N RQ i=1 i=0
Nous obtenons donc que wt(a(x)a∗ (x)) = p. Comme wt(a(x)) = d alors le nombre maximum
de coefficients différents de zéro dans a(x)a∗ (x) est d2 , d’où d2 ≥ p.
Exemple.
Comme nous voulons travailler sur F , nous aimerions que 2 soit un résidu quadratique.
2
Pour ce faire, nous allons choisir p = 8m − 1 où m = 1. Pour p = 7 on obtient alors les deux
ensembles suivants :
RQ = {1, 2, 4};
et
n(x) = (x − ω 3 )(x − ω 5 )(c − ω 6 )
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 57
où ω est une racine primitive septième de l’unité. Comme p = 23 − 1 nous pouvons prendre
ω = α où α est un élément primitif de F 8 (tel que présenté au tableau 5.5). Cette remarque
nous permet d’exprimer q(x) (par exemple) comme un polynôme irréductible sur F 2 de la
façon suivante :
Ainsi notre code RQ est le code q(x) = x3 + x + 1 . Comme nous savons que le
code H2 (3) est aussi un code cyclique BCH avec ω comme zéro, notre code est en fait le code
H2 (3). Autrement dit, nous avons vu que le code de Hamming H2 (3) était un code linéaire,
puis nous avons vu qu’il était un code cyclique BCH et maintenant nous venons de montrer
qu’il peut aussi être vu comme un code RQ.
Bien que les codes de Goppa ne sont pas en général des codes cycliques, ils sont néanmoins
une généralisation des codes BCH. C’est pourquoi nous les présentons ici. Leur construction
et l’établissement de leurs paramètres étant plutôt longs, nous nous contenterons de bien les
définir et d’exhiber la forme générale de la matrice de contrôle. Enfin, nous fournirons un
exemple détaillé de construction d’un code de Goppa. Pour ce qui est de la justification de
la construction de la matrice de contrôle, nous référons le lecteur à [9].
Sm =
F q m [x]
< G(x) >
l’anneau des polynômes à coefficients dans F qm modulo < G(x) >. Si G(α) 6= 0, alors le
polynôme x − α est inversible dans Sm . En effet, si on divise G(x) par x − α on obtient
On en déduit alors que q(x)(x − α) ≡ −G(α) mod < G(x) > et donc que
G(x) − G(α)
q(x) = ,
x−α
nous obtenons finalement que
1 G(x) − G(α)
=− G(α)−1.
x−α x−α
Avec cette définition de (x − α)−1 nous sommes en mesure de définir les codes de Goppa.
G(α1 )−1 G(α2 )−1 ··· G(αn )−1
α1 G(α1 )−1 α2 G(α2 )−1 · · · αn G(αn )−1
H = α12 G(α1 )−1 α22 G(α2 )−1 · · · αn2 G(αn )−1
.. .. ..
. . .
α1r−1 G(α1 )−1 α2r−1 G(α2 )−1 · · · αnr−1 G(αn )−1
où r = deg(G(x)).
Notons enfin que pour la distance minimale d d’un code de Goppa nous avons d ≥ r+1. On
peut donc, seulement à partir du polynôme G(x) (appelé polynôme de Goppa), minorer
la distance minimale du code.
CHAPITRE 5. CODES LINÉAIRES CYCLIQUES 59
α, racine de x3 + x + 1 F 23
0 0
α0 1
1
α α
α2 α2
α3 α+1
4
α α2 + α
α5 α2 + α + 1
α6 α2 + 1
Tab. 5.5: F 23
Exemple.
Comme G(x) ne possède aucun zéro dans F (son corps de décomposition étant F ), nous
8 22
" #
G(0)−1 G(1)−1 G(α1 )−1 G(α2 )−1 ··· G(α5 )−1 G(α6 )−1
H=
0G(0)−1 1G(1)−1 αG(α1 )−1 α2 G(α2 )−1 · · · α5 G(α5 )−1 α6 G(α6 )−1
G(0)−1 = 1−1 = 1,
G(1)−1 = (1 + 1 + 1)−1 = 1,
G(α)−1 = (α2 + α + 1)−1 = α−5 = α2 ,
G(α2 )−1 = (α4 + α2 + 1)−1 = (α + 1)−1 = α−3 = α4 ,
G(α3 )−1 = (α6 + α3 + 1)−1 = (α2 + α + 1)−1 α−5 = α2 ,
G(α4 )−1 = (α8 + α4 + 1)−1 = (α2 + 1)−1 α−6 = α,
G(α5 )−1 = (α10 + α5 + 1)−1 = (α2 + 1)−1 α−6 = α,
G(α6 )−1 = (α12 + α6 + 1)−1 = (α + 1)−1 α−3 = α4 .
1 1 0 0 0 0 0 0
0 0 0 1 0 1 1 1
0 0 1 1 1 0 0 1
.
H=
0 1 1 1 1 1 1 1
0 0 1 0 1 1 0 1
0 0 0 1 1 1 1 0
Enfin, nous pourrions vérifier que le rang de la matrice H est égal à 6, ce qui implique donc
que la dimension de notre code est 8 − 6 = 2.
Chapitre 6
Conclusion
Les objectifs de ce mémoire ont été d’investiguer les structures algébriques associées
aux codes linéaires. Pour chacune des principales classes de codes, nous avons présenté les
principaux codes utilisés. Pour certains codes, nous avons abordé leur création de différentes
façons afin d’illustrer que la méthode de construction d’un code n’est, en général, pas unique.
L’important problème qui consiste à établir l’existence d’un code de paramètres donnés a
été abordé, nous le croyons, d’une façon originale sous l’angle de l’identité de MacWilliams.
A cet effet, nous avons montré comment utiliser l’identité de MacWilliams afin d’exhiber les
seules distributions possibles pour un code de paramètres donnés.
En termes de perspectives, on peut signaler que dans un travail futur, nous aimerions
établir des conditions nécessaires et suffisantes pour l’existence de certains codes linéaires
pour lesquels l’identité de MacWilliams nous permet de supposer leur existence. Afin de
combler l’écart entre Aq (n, d) et Aq [n, d], l’étude des codes de géométrie algébrique semble
être des plus prometteuses. Soulignons à cet effet que la façon la plus intéressante de définir
et d’analyser les codes de Goppa, c’est de les voir comme des codes de géométrie algébrique.
Toujours en termes de perspectives, notons enfin que le fait de supposer une distribution
uniforme en entrées nous a permis de justifier notre méthode de décodage basée sur un
schéma de maximum de vraisemblance, mais nous croyons fermement que la connaissance
pratique de la distribution d’entrées pourrait conduire à des méthodes de décodage encore
plus efficaces.
61
Annexe A
Programmes MAPLE
# ------------------
# Utilisation de
# l’identite de MacWilliams
# -----------------
# Programme permettant d’exhiber
# les seules possibilites pour les
# distributions d’un code lineaire
# de parametres [ n , k , d ].
#
> restart;
# Determination de q,n,d
>
> q:=2:
> n:=11:
> d:=5:
>
# Calculs des 3 bornes
62
ANNEXE A. PROGRAMMES MAPLE 63
# 1 - de Singleton
# 2 - empilement des spheres
# 3 - Elias
>
> k[1]:=evalf(floor(evalf(log[q](q^(n-d+1)))));:t:=floor((d-1)/2):
> k[2]:=evalf(floor(evalf(log[q](q^n/sum(’binomial(n,k)*(q-1)^k’,’k’=0..
> t)))));
>
> Theta:=(q-1)/q:
> if(d>Theta*n)
> then k[3]:=evalf(floor(evalf(log[q](d/(d-Theta*n)))));
> else k[3]:=999;
> fi;
>
>
> kmin:=min(k[1],k[2],k[3]):
>
>
> print(’DEBUT’);
>
> A[0]:=1:
> A[1]:=0:
> A[2]:=0:
> A[3]:=0:
> A[4]:=0:
> for k from kmin to 1 by -1 do : M:=q^k:print(’debut_k’=k);
>
> for A[5] from 1 to (M-1) do
>
> for A[6] from 0 to (M-1-A[5]) do
>
> for A[7] from 0 to (M-1-A[5]-A[6]) do
>
ANNEXE A. PROGRAMMES MAPLE 64
>
> if (
> (A[1]+A[3]+A[5]+A[7]+A[9]+A[11]=0)or
>
> (A[0]+A[2]+A[4]+A[6]+A[8]+A[10]=A[1]+A[3]+A[5]+A[7]+A[9]+A[11])
> )
>
> then
> P:=sum(A[j]*(x^(n-j))*(y^j),j=0..n);
> Q:=expand(subs(x=v+w, y=v-w,P));
> Q:=Q*(1/(q^k));
> LC := [coeffs(Q)];
> Entier := 0;
> for L from 1 to nops(LC) do
> if frac(LC[L]) <> 0
> then
> Entier :=1;
> fi;
> od;
>
> if ((min(coeffs(expand(Q)))>=0) and ( Entier = 0 ))
> then
> print(’n’=n,’k’=k,’d’=d,’q’=2);
> print(P);
ANNEXE A. PROGRAMMES MAPLE 65
> print(simplify(Q));
> fi;
> fi;
>
> od:od:od:od:od:od:
> print(’fin_k’=k):od:
> print(’FIN’);
>
ANNEXE A. PROGRAMMES MAPLE 66
# CODES DE HAMMING
# ======================================================================
# But : (1) Construire la matrice de controle ainsi que la matrice
# generatrice d’un code de Hamming
# de longueur 15 (r = 4).
# (2) Illustrer la procedure de codage et de decodage
# ======================================================================
> restart:
> with(linalg):
> r:=4:
# -----------------------
# construction de la matrice de controle
# -----------------------
> H:=[]:
> for j from 1 to 2^r-1 do
> cb := convert(j,base,2):
> bv := vector(r,0):
> for i from 1 to vectdim(cb) do
> bv[r-i+1] := cb[i]:
> od:
> H := augment(op(H),bv):
> od:
>
> evalm(H);
> nH := Nullspace(H) mod 2;
# -----------------------------------
# Construction de la matrice generatrice
# -----------------------------------
> G:= []:
> for i from 1 to nops(nH) do
ANNEXE A. PROGRAMMES MAPLE 67
# -------------------
# correction de l’erreur en position "cn"
# e : vecteur erreur
> e:= vector ( 2^r-1,0):
> e[cn]:=1:
> vd:=map(x -> x mod 2, evalm (vr + e)):
>
> print(‘Le mot envoye est :‘,c):
> print(‘Le vecteur recu est :‘,vr):
> print(‘Le vecteur erreur est :‘,e):
> print(‘Le mot envoye etait :‘,vd):
ANNEXE A. PROGRAMMES MAPLE 69
# CODES BCH
# ========================================================
# But : exhiber le polynome generateur pour un code BCH binaire de
# longueur 15
# ayant les 6 premieres puissances d’une racine primitive 15
# ieme de l’unite comme racines
# ========================================================
#
# ---------------------------
# Construction du corps a 16 elements
# ---------------------------
> restart:
> with(linalg):
> p:=x -> x^4+x+1:
> Primitive(p(x)) mod 2;
> fs:=2^(degree(p(x)));
> field := vector(fs);
> for i from 1 to fs-1 do
> field[i] := Powmod(alpha,i,p(alpha),alpha) mod 2:
> od:
> field[fs] :=0:
> evalm(field);
> ftable := table():
> for i from 1 to fs-1 do
> ftable[ field[i] ] := alpha^i:
> od:
> ftable [ field[fs] ] := 0:
>
# ----------------------------------
# construction du polynome generateur
# ----------------------------------
ANNEXE A. PROGRAMMES MAPLE 70
# ------------------
# Utilisation de
# l’identite de MacWilliams
# -----------------
# Programme permettant d’exhiber
# les seules possibilites pour les
# distributions d’un code lineaire
# de parametres [ n , k , d ].
#
> restart;
# Determination de q,n,d
>
> q:=2:
> n:=11:
> d:=5:
>
71
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 72
k[1] := 7.
k[2] := 4.
k[3] := 999
>
>
> print(’DEBUT’);
>
> A[0]:=1:
> A[1]:=0:
> A[2]:=0:
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 73
> A[3]:=0:
> A[4]:=0:
> for k from kmin to 1 by -1 do : M:=q^k:print(’debut_k’=k);
>
> for A[5] from 1 to (M-1) do
>
> for A[6] from 0 to (M-1-A[5]) do
>
> for A[7] from 0 to (M-1-A[5]-A[6]) do
>
> for A[8] from 0 to (M-1-A[5]-A[6]-A[7]) do
>
> for A[9] from 0 to (M-1-A[5]-A[6]-A[7]-A[8]) do
>
> for A[10] from 0 to (M-1-A[5]-A[6]-A[7]-A[8]-A[9]) do
>
> A[11]:=M-1-A[5]-A[6]-A[7]-A[8]-A[9]-A[10];
> #
>
> if (
> (A[1]+A[3]+A[5]+A[7]+A[9]+A[11]=0)or
>
> (A[0]+A[2]+A[4]+A[6]+A[8]+A[10]=A[1]+A[3]+A[5]+A[7]+A[9]+A[11])
> )
>
> then
> P:=sum(A[j]*(x^(n-j))*(y^j),j=0..n);
> Q:=expand(subs(x=v+w, y=v-w,P));
> Q:=Q*(1/(q^k));
> LC := [coeffs(Q)];
> Entier := 0;
> for L from 1 to nops(LC) do
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 74
DEBUT
debut_k = 4.
n = 11, k = 4., d = 5, q = 2
11 6 5 5 6 4 7 3 8
x + 6 x y + 6 x y + 2 x y + x y
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 75
11 4 7 6 5 7 4 9 2 8 3
v + 26. w v + 24. w v + 20. w v + 4. w v + 13. w v
3 8 5 6
+ 12. w v + 28. w v
n = 11, k = 4., d = 5, q = 2
11 6 5 5 6 3 8 2 9
x + 7 x y + 6 x y + x y + x y
11 2 9 4 7 6 5 7 4 9 2
v + w v + 27. w v + 19. w v + 19. w v + 3. w v
8 3 3 8 5 6
+ 16. w v + 9. w v + 33. w v
fin_k = 4.
debut_k = 3.
n = 11, k = 3., d = 5, q = 2
11 6 5 5 6 4 7
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 76
x + x y + 3 x y + 3 x y
11 2 9 4 7 6 5 7 4 9 2
v + 4. w v + 44. w v + 58. w v + 46. w v + 6. w v
10 8 3 3 8 5 6
+ 2. w v + 19. w v + 26. w v + 50. w v
n = 11, k = 3., d = 5, q = 2
11 6 5 5 6 4 7 3 8
x + 2 x y + 2 x y + 2 x y + x y
11 2 9 4 7 6 5 7 4 9 2
v + 5. w v + 42. w v + 58. w v + 40. w v + 8. w v
10 8 3 3 8 5 6
+ w v + 21. w v + 24. w v + 56. w v
n = 11, k = 3., d = 5, q = 2
11 6 5 5 6 4 7 2 9
x + 2 x y + 3 x y + x y + x y
11 2 9 4 7 6 5 7 4 9 2
v + 6. w v + 46. w v + 48. w v + 44. w v + 4. w v
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 77
10 8 3 3 8 5 6
+ 2. w v + 25. w v + 20. w v + 60. w v
n = 11, k = 3., d = 5, q = 2
11 6 5 5 6 4 7 3 8
x + 3 x y + x y + x y + 2 x y
11 2 9 4 7 6 5 7 4 9 2
v + 6. w v + 40. w v + 58. w v + 34. w v + 10. w v
8 3 3 8 5 6
+ 23. w v + 22. w v + 62. w v
n = 11, k = 3., d = 5, q = 2
11 6 5 5 6 3 8 2 9
x + 3 x y + 2 x y + x y + x y
11 2 9 4 7 6 5 7 4 9 2
v + 7. w v + 44. w v + 48. w v + 38. w v + 6. w v
8 3 3 8 10 5 6
+ 27. w v + 18. w v + w v + 66. w v
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 78
n = 11, k = 3., d = 5, q = 2
11 6 5 5 6 4 7 10
x + 3 x y + 2 x y + x y + x y
11 2 9 4 7 6 5 7 4 9 2
v + 8. w v + 58. w v + 48. w v + 52. w v + 12. w v
8 3 3 8 5 6
+ 13. w v + 12. w v + 52. w v
n = 11, k = 3., d = 5, q = 2
11 6 5 5 6 11
x + 3 x y + 3 x y + 1. y
11 2 9 4 7 6 5 8 3 10
v + 10. w v + 90. w v + 108. w v + 45. w v + 2. w v
n = 11, k = 3., d = 5, q = 2
11 6 5 5 6 4 7
x + 3 x y + 3 x y + x y
11 10 2 9 4 7 6 5 7 4
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 79
9 2 8 3 3 8 10 5 6
+ 7. w v + 23. w v + 22. w v + w v + 56. w v
n = 11, k = 3., d = 5, q = 2
11 6 5 5 6 3 8
x + 4 x y + 2 x y + x y
11 10 2 9 4 7 6 5 7 4
v + w v + 4. w v + 46. w v + 52. w v + 36. w v
9 2 8 3 3 8 5 6
+ 9. w v + 25. w v + 20. w v + 62. w v
fin_k = 3.
debut_k = 2.
n = 11, k = 2., d = 5, q = 2
11 6 5 3 8 2 9
x + x y + x y + x y
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 80
11 2 9 4 7 6 5 7 4 9 2
v + 19. w v + 78. w v + 106. w v + 76. w v + 12. w v
8 3 3 8 10 5 6
+ 49. w v + 36. w v + 3. w v + 132. w v
n = 11, k = 2., d = 5, q = 2
11 6 5 4 7 10
x + x y + x y + x y
11 2 9 4 7 6 5 7 4 9 2
v + 21. w v + 106. w v + 106. w v + 104. w v + 24. w v
8 3 3 8 10 5 6
+ 21. w v + 24. w v + w v + 104. w v
n = 11, k = 2., d = 5, q = 2
11 6 5 4 7 3 8
x + x y + x y + x y
11 10 2 9 4 7 6 5 7 4
v + w v + 14. w v + 78. w v + 120. w v + 76. w v
9 2 8 3 3 8 10 5 6
+ 17. w v + 41. w v + 44. w v + 2. w v + 118. w v
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 81
n = 11, k = 2., d = 5, q = 2
11 6 5 5 6 11
x + x y + x y + 1. y
11 2 9 4 7 6 5 8 3 10
v + 25. w v + 170. w v + 226. w v + 85. w v + 5. w v
n = 11, k = 2., d = 5, q = 2
11 6 5 5 6 2 9
x + x y + x y + x y
11 10 2 9 4 7 6 5 7 4
v + w v + 16. w v + 86. w v + 100. w v + 84. w v
9 2 8 3 3 8 10 5 6
+ 9. w v + 49. w v + 36. w v + 4. w v + 126. w v
n = 11, k = 2., d = 5, q = 2
11 6 5 5 6 4 7
x + x y + x y + x y
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 82
11 10 2 9 4 7 6 5 7 4
v + 2. w v + 11. w v + 86. w v + 114. w v + 84. w v
9 2 8 3 3 8 10 5 6
+ 14. w v + 41. w v + 44. w v + 3. w v + 112. w v
n = 11, k = 2., d = 5, q = 2
11 6 5 10
x + 2 x y + x y
11 10 2 9 4 7 6 5 7 4
v + w v + 20. w v + 110. w v + 100. w v + 100. w v
9 2 8 3 3 8 5 6
+ 25. w v + 25. w v + 20. w v + 110. w v
n = 11, k = 2., d = 5, q = 2
11 6 5 3 8
x + 2 x y + x y
11 10 2 9 4 7 6 5 7 4
v + 2. w v + 13. w v + 82. w v + 114. w v + 72. w v
9 2 8 3 3 8 10 5 6
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 83
n = 11, k = 2., d = 5, q = 2
11 6 5 5 6
x + 2 x y + x y
11 10 2 9 4 7 6 5 7 4
v + 3. w v + 10. w v + 90. w v + 108. w v + 80. w v
9 2 8 3 3 8 10 5 6
+ 15. w v + 45. w v + 40. w v + 2. w v + 118. w v
fin_k = 2.
debut_k = 1.
n = 11, k = 1., d = 5, q = 2
11 6 5
x + x y
11 10 2 9 3 8 4 7 5 6
v + 6. w v + 25. w v + 80. w v + 170. w v + 236. w v
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 84
6 5 7 4 8 3 9 2 10
+ 226. w v + 160. w v + 85. w v + 30. w v + 5. w v
fin_k = 1.
FIN
>
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 85
# CODES DE HAMMING
# =====================================================================
# But : (1) Construire la matrice de controle ainsi que la matrice
# generatrice d’un code de Hamming
# de longueur 15 (r = 4).
# (2) Illustrer la procedure de codage et de decodage
# ======================================================================
> restart:
> with(linalg):
> r:=4:
# -----------------------
# construction de la matrice de controle
# -----------------------
> H:=[]:
> for j from 1 to 2^r-1 do
> cb := convert(j,base,2):
> bv := vector(r,0):
> for i from 1 to vectdim(cb) do
> bv[r-i+1] := cb[i]:
> od:
> H := augment(op(H),bv):
> od:
>
> evalm(H);
[0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1]
[0 , 0 , 0 , 1 , 1 , 1 , 1 , 0 , 0 , 0 , 0 , 1 , 1 , 1 , 1]
[0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1 , 0 , 0 , 1 , 1]
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 86
[1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 1]
nH := {[1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1],
[1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0],
[1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0],
[0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0],
[0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
[1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0]}
# -----------------------------------
# Construction de la matrice generatrice
# -----------------------------------
> G:= []:
> for i from 1 to nops(nH) do
> G := stackmatrix(op(G), nH[i]):
> od:
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 87
>
> evalm(G);
[1 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0]
[0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0]
[1 , 1 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 1]
[1 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0]
[1 , 0 , 0 , 1 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0]
[1 , 1 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0]
[0 , 1 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0]
[0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0]
[1 , 0 , 0 , 1 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 1 , 0 , 0]
[1 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 1 , 0 , 0 , 0 , 0]
[0 , 1 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 1 , 0 , 0 , 0 , 0 , 0]
>
# --------------------------------
# Codage et decodage
#
# w = vecteur a coder
# c = mot du code correspondant a wG
# vr = vecteur recu
# --------------------------------
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 88
c := [0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1]
>
# -----------------
# Introduisons une erreur
# -----------------
> vr:= vector ([0,0,1,1,1,1,1,1,0,1,1,1,1,1,0]):
# ---------------
# calcul du syndrome
# ---------------
#
> syn := map( x -> x mod 2, evalm(H &* vr));
syn := [0, 1, 0, 1]
> fc:=0:
> cn := 0:
> while (fc <> 1) and (cn < 2^r-1) do
> cn := cn +1:
> if equal(col(H,cn),syn) = true then
> fc := 1:
> fi:
> od:
> print(‘Erreur en position:‘,cn):
Erreur en position:, 5
# -------------------
# correction de l’erreur en position "cn"
# e : vecteur erreur
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 89
[0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1]
[0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0]
[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0]
>
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 90
# CODES BCH
# ========================================================
# But : exhiber le polynome generateur pour un code BCH binaire de
# longueur 15
# ayant les 6 premieres puissances d’une racine primitive 15
# ieme de l’unite comme racines
# ========================================================
#
# ---------------------------
# Construction du corps a 16 elements
# ---------------------------
> restart:
> with(linalg):
> p:=x -> x^4+x+1:
> Primitive(p(x)) mod 2;
true
> fs:=2^(degree(p(x)));
fs := 16
[ 2 3 2 3 2
[alpha, alpha , alpha , alpha + 1, alpha + alpha, alpha + alpha ,
3 2 3
alpha + alpha + 1, alpha + 1, alpha + alpha,
2 3 2
alpha + alpha + 1, alpha + alpha + alpha,
3 2 3 2 3
alpha + alpha + alpha + 1, alpha + alpha + 1, alpha + 1,
]
1, 0]
(fs - 1)
f := x -> x - 1
4 3 2 4 2
factf := (x + x + x + x + 1) (x + x + 1) (x + x + 1) (x + 1)
4 3
(x + x + 1)
# -------------------
# t est le nombre d’erreurs que notre code peut corriger
# -------------------
#
> t:=3:
> for i from 1 to 2*t do
> for j from 1 to nops(factf) do
> fj := op(j,factf):
> fj := unapply(fj,x):
> if Rem(fj(alpha^i),p(alpha),alpha) mod 2 = 0 then
> print(omega^i,‘ est une racine de ‘, fj(x)):
> break:
> fi:
> od:
> od:
>
4
omega, est une racine de , x + x + 1
2 4
omega , est une racine de , x + x + 1
3 4 3 2
omega , est une racine de , x + x + x + x + 1
ANNEXE B. PROGRAMMES MAPLE AVEC SORTIES 93
4 4
omega , est une racine de , x + x + 1
5 2
omega , est une racine de , x + x + 1
6 4 3 2
omega , est une racine de , x + x + x + x + 1
4 4 3 2 2
g := (x + x + 1) (x + x + x + x + 1) (x + x + 1)
2 8 5 10 4
Le polynome generateur est :, 1 + x + x + x + x + x + x
Bibliographie
[1] Courteau, B., Mathématiques d’hier et d’aujourd’hui : Les codes correcteurs d’erreurs,
Modulo,1999.
[2] Dummit, D.S. and Foote, R.M., Abstract Algebra, Prentice-Hall, 1999.
[3] Fraleigh, J.B. and Beauregard, R.A., Linear Algebra, Addison-Wesley, Reading, 1995.
[4] Hill, R., A First Course in Coding Theory, Oxford applied mathematics and computing
science series, Oxford, 1986.
[5] Hoffman, D.G., Leonard, D.A., Lindner, C.C., Phelps, K.T., Rodger, C.A. and Wall,
J.R., Coding Theory, Marcel Dekker, Inc., New York, 1991.
[6] Klima, R.E., Sigmon, N. and Stitzinger, E., Applications of Abstract Algebra with
MAPLE, CRC Press, 2000.
[7] MacWilliams, F.J. and Sloane, N.J.A., The Theory of Error-Correcting Codes, North-
Holland, Amsterdam, 1977.
[8] Pretzel, O., Error-Correcting Codes and Finite Fields, Oxford applied mathematics and
computing science series, London, 1992.
[9] Roman, S., Coding and Information Theory, Springer-Verlag, New-York, 1992.
[10] van Lint, J.H., Introduction to Coding Theory, Springer-Verlag, Berlin, 1992.
[11] Vanstone, S.A. and van Oorschot, P.C., An Introduction to Error Correcting Codes with
Applications, Kluwer Academic Publishers, Boston, 1989.
[12] Vermani, L.R., Elements of Algebraic Coding Theory, Chapman and Hall Mathematics
Series, London, 1996.
[13] Walker, J.L., Codes and Curves, American Mathematical Society, Volume 7, 2000.
94
BIBLIOGRAPHIE 95