Le projet
(BCH.tar.gz, 17564 bytes)
a été écrit en langage Java 1.1 sur
Linux. Pour compiler les sources, donner la commande javac *.java.
Une documentation de toutes les classes en format javadoc
a eté aussi engendrée.
NB: Dans ce rapport, j'ai indiqué en police fixe gras
les
noms de méthodes et de classes et en police fixe simple les
noms de variable.
Un élément primitif d'un corps Fq est un élément
alfa tel que tout élément non nul du corps s'écrit
comme puissance de alfa. L'élément alfa est primitif ssi
l'ordre de alfa divise q-1: ceci équivaut à dire que,
pour tout i diviseur de q-1, alfa^i est différent de 1. On remarque
que alfa^(q-1) est toujours égal à 1, pour les proprietés
d'un corps fini.
A partir d'un élément primitif alfa, on peut engendrer
la
table des logarithmes, qui liste toutes les puissances de alfa^0
à alfa^(q-1). Alors, alfa est appelé un générateur.
Enfin, pour trouver l'inverse d'un élément B de Fq en
connaissant un générateur alfa, il faut rechercher n tel
que alfa^n = B (un tel n existe car on se trouve dans un corps fini). alfa^(q-1)
= 1 et donc B = alfa^n = alfa^(n-(q-1)), ce qui nous donne B^(-1) = alfa^((q-1)-n).
Les méthodes suivantes agissent sur les entiers dans Fp (c'est à dire Z/pZ ): int add(int a, int b) et int mult(int a, int b) retournent réspectivement le résultat de l'addition et de la multiplication de a et b (en faisant une opération modulo p). Ces deux méthodes sont utilisés par void affichetableAdd() et void affichetableMult() qui affichent respectivement la table de l'addition et la table de la multiplication.
public Polynome adjusteCoeffsPolynome(Polynome polyz)
Transforme dans Fp tous les coefficients du polynome polyz,
en leur appliquant l'opération modulo p.
public Polynome[] divise(Polynome dividende, Polynome diviseur)
Divise deux polynômes. Avant de demarrer chaque cycle de la division,
une boucle ajoute p au coefficient de la plus grande puissance de x du
dividende,
jusqu'il est multiple du coefficient de la plus grande puissance de x du
diviseur;
ceci pour assurer que le resultat de la division des deux nombres soit
entier.
A chaque cycle, adjusteCoeffsPolynome est appelé
sur le dividende partiel et le diviseur.
La méthode retourne un array de deux éléments
qui sont, réspectivement, le resultat et le reste de la division.
public Polynome adjustePuissancesPolynome(Polynome polyz)
Transforme le polynôme polyz (dans Z) en un polynôme
dans Fp^m (donc, de degré strictement inférieur à
m); d'aprés la théorie, ce dernier n'est que le reste de
la division de polyz par le polynôme irreductible.
public int adjuste(int exposant)
Adjuste une puissance en lui appliquant l'opération modulo q-1.
Polynome[] tousLesPolynomes()
Engendre tous les m*p polynômes du corps (qui ont pour coefficients
toutes les combinaisons des entiers de Fp).
public void afficheTableAddPolynomes(Polynome[] tousPolys)
Affiche la table de l'addition des polynômes du corps, en appliquant
la méthode add de la classe Polynome.
La méthode adjusteCoeffsPolynome est en suite appelée
pour retransformer en base p les coefficients du polynôme somme.
public void afficheTableMultPolynomes(Polynome[] tousPolys)
Affiche la table de la multiplication des polynômes du corps.
La multiplication est effectuée par mult de la classe
Polynome,
qui travaille dans Z; le resultat, qui est donc plus géneralément
un polynôme dans Z, est en suite transformé dans Fq par adjustePuissancesPolynome.
public Polynome[] recherchePrimitifs(Polynome[] tousPolys)
Retourne un array de polynômes contenant tous les primitifs du
corps. Un polynôme P est primitif pour Fq si P^k0, P^k1, ..., P^kn
sont tous differents de 1, où les ki sont les diviseurs (1 inclus,
q-1 exclus) de q-1.
Les P sont cherchés parmi les éléments de tousPolys,
l'array de tous les polynômes du corps retourné par tousLesPolynomes().
private Polynome[] tableLogs()
Engendre la table des logarithmes du corps, c'est à dire toutes
les puissances (de 0 à q-1) d'un élément primitif.
Le primitif qu'on utilise est le premier polynôme trouvé par
recherchePrimitifs.
La méthode utilise adjustePuissancesPolynome
pour
réduire dans Fq la puissance trouvée.
public int reverseTableLogs(Polynome polynome)
Recherche dans la table des logarithmes, qui contient toutes les puissances
du polynôme primitif générateur alfa, l'élément
alfa^i = polynome, et retourne la valeur de i.
Si une telle puissance n'existe pas (ce qui est le cas si polynome
est nul), la méthode retourne -1.
Cette méthode est beaucoup utilisé dans decoded
et
calculeSyndromes de class CodeBCH, qui l'utilisent
pour retrouver les puissances du primitif qui composent le syndrome, et
pour convertir les syndromes en puissances du primitif pour l'affichage
du polynôme correcteur.
public Polynome enversPolynome(Polynome poly)
Trouve l'envers du polynôme poly.
La méthode utilise adjustePuissancesPolynome pour
réduire dans Fq le polynôme trouvé.
public Polynome polynomeMinimal(Vector classeCyc)
Calcule le polynôme minimal d'un élément primitif,
à partir de sa classe cyclotomique classeCyc.
Dans la suite, on simplifiera le problème en considerant que le code soit engendré sur F2. Les messages seront donc composés de bits = {0, 1}.
Le codage est effectué grace à public Polynome code(Polynome message) qui multiplie le message reçu, par x elévé au degré du polynôme générateur g(x) (le décalage dont j'ai parlé auparavant), et lui ajoute le reste de la division du message même par g(x).
Pour le décodage, la méthode public Polynome decode(Polynome messageCode) est appelée. Elle calcule les syndromes du message et ensuite appelle public int[] decode1(Polynome[] syndromes), public int[] decode2(Polynome[] syndromes) ou public int[] decode3(Polynome[] syndromes) selon la valeur de d corréspondante. Ces méthodes retournent la position de(s) l'erreur(s) trouvé(s). Pour corriger un erreur en position i dans r(x), on ajoute alors à r(x) la valeur x^i, en faisant donc changer son coefficient de 0 à 1 ou viceversa et en corrigeant l'erreur.
Chacun des trois méthodes decoded calcule les valeurs de tous les sigma et fait appel à corps.reverseTableLogs pour trouver dans la table des logarithmes la puissance du primitif alfa corréspondante. Le polynôme correcteur est finalement crée et calculé pour tous les valeurs nécessaires. A fur et à mesure que ce calcul procéde, les valeurs de l'indice i qui donnent un résultat nul (ce qui signifie un erreur en position i), sont stockés dans un array d'entiers erreurs , qui est à la fin retourné par la méthode.
Les syndromes nécessaires au décodage sont calculés,
pour chaque messageCode, par private Polynome[] calculeSyndromes(Polynome
messageCode). Pour clarté, je calcule toutes les syndromes
même s'il n'a besoin que de celles d'ordre impair (car on travaille
dans F2 et donc g(alfa^2) = g(alfa)^2 ).
Les méthodes de cette classe implémentent toutes les opérations
principales sur les polynômes, dans Z. J'ai suivi le style de programmation
de créer plusieurs méthodes élementaires (parfois
triviales), en partageant les tâches en plusieurs sous-tâches;
ceci afin d'obtenir un code soit plus simple à écrire, soit
plus simple à examiner dans un deuxiéme temps.
Les méthodes suivantes sont déclarés:
public int degre()
Cette méthode trouve le degré d'un polynôme, c'est
à dire la puissance la plus grande de x qui possède un coefficient
non nul.
public Polynome addKXn(int k, int n)
Additionne la valeur k*x^n à un polynôme.
public Polynome add(Polynome poly)
Additionne deux polynômes.
public Polynome multKXn(int k, int n)
Multiplie un polynôme par k*x^n.
public Polynome mult(Polynome poly)
Multiplie deux polynômes.
public Polynome pow(int g)
Eleve un polynôme à la puissance g, au moyen
de multiplication succéssives par soi-même.
public boolean equals0()
Retourne true si le polynôme sur lequel on a appelé
la méthode est le polynôme nul.
public boolean equals1()
Retourne true si le polynôme sur lequel on a appelé
la méthode est P(x) = 1.
public boolean equals(Polynome poly)
Vérifie si deux polynômes sont égaux, en vérifiant
l'egalité de leurs coefficients.
public String toString()
Rédefinition de la méthode toString qui
donne un affichage du type, pour exemple, 4X^7 6X^4 X^3 2X^2 1.
public String affiche(int degreMax)
Retourne une chaîne contenante la suite des coefficients du polynôme,
sans espaces vides entre eux, selon l'ordre decroissante des puissances
à partir du degré degreMax. (La chaîne contiendra
donc degreMax+1 coefficients.) L'appel de cette méthode
sur le polynôme précédente donnerait donc 40061201.
Ce format rends plus lisible certains affichages (comme les tables
de l'addition/multiplication), mais présénte des inconvenients
(notamment pour valeurs de p >= 11, car à ce moment les coefficients
ne sont plus constitués d'une seule chiffre).
java Main corps <p> <m> <polynôme irréductible>Dans le programme, on entrera un polynômes de degré m comme une chaîne de m+1 caractéres, corréspondants à ses coefficients par ordre décroîssant des puissances de x.
Construit un corps fini Fq = F<p>^<m> avec <polynôme irréductible> comme générateur.java Main bch <n> <d> <polynôme irréductible>
Construit un code BCH de longueur <n> sur F2, <d>-correcteur, basé sur un corps fini généré par <polynôme irréductible>.java Main berlekamp <p> <polynôme á factoriser>
(Permet de tester un morceau de code qui implemente l'algorithme de Berlekamp, pour un <polynôme á factoriser> sur F<p>. Non terminé.)En outre, si on ajoute un argument supplementaire quelconque, le programme sera utilisé en "mode verbeux" (verbose), c'est à dire avec des affichages trés détaillés sur les calculs pendant les différentes étapes.
Si on a choisi de construire un corps fini, le programme affichera:
Si on a choisi l'option BCH, le programme affiche des informations rélatives
au BCH et un invite qui permet de saisir un message binaire à coder
/ décoder.
Pour coder un message (de longueur égale à la dimension
du code), taper code ou c suivi du message.
Pour décoder un message (de longueur égale à n)
et en corriger les erreurs eventuels, taper decode ou d suivi
du message.
Taper quit ou q pour sortir.
$ java Main
================= Codes BCH =================
Daniele Raffo <draffo@etudiant.univ-mlv.fr>
projet de Codage et Cryptographie
Université de
Marne la Vallée
11 FEV 2001
=============================================
Utilisation:
java Main corps <p> <m> <polynôme irréductible>
[verbose]
crée le corps fini Fq (q=p^m),
ayant comme générateur
le polynôme irreductible
java Main bch <n> <d> <polynôme irréductible>
[verbose]
costruit un code BCH de longueur
n sur F2, d-correcteur,
en utilisant un corps fini généré
par le polynôme irreductible
Exemples:
java Main corps 2 4 10011 engendre F16 (2^4)
par X^4 + X + 1
java Main bch 15 2 10011 construit un code
BCH (15, x, 2)
sur un corps fini généré par X^4 + X + 1
$ java Main corps 2 4 11111
================= Codes BCH =================
Daniele Raffo <draffo@etudiant.univ-mlv.fr>
projet de Codage et Cryptographie
Université de
Marne la Vallée
11 FEV 2001
=============================================
Génération du corps fini F16 (2^4), polynôme irreductible générateur P(X) = X^4 X^3 X^2 X 1
Table de l'addition sur F2
0 1
1 0
Table de la multiplication sur F2
0 0
0 1
Ensemble de tous les polynômes du corps
0000 0
0001 1
0010 X
0011 X 1
0100 X^2
0101 X^2 1
0110 X^2 X
0111 X^2 X 1
1000 X^3
1001 X^3 1
1010 X^3 X
1011 X^3 X 1
1100 X^3 X^2
1101 X^3 X^2 1
1110 X^3 X^2 X
1111 X^3 X^2 X 1
Table de l'addition des polynômes
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100
1101 1110 1111
0001 0000 0011 0010 0101 0100 0111 0110 1001 1000 1011 1010 1101
1100 1111 1110
0010 0011 0000 0001 0110 0111 0100 0101 1010 1011 1000 1001 1110
1111 1100 1101
0011 0010 0001 0000 0111 0110 0101 0100 1011 1010 1001 1000 1111
1110 1101 1100
0100 0101 0110 0111 0000 0001 0010 0011 1100 1101 1110 1111 1000
1001 1010 1011
0101 0100 0111 0110 0001 0000 0011 0010 1101 1100 1111 1110 1001
1000 1011 1010
0110 0111 0100 0101 0010 0011 0000 0001 1110 1111 1100 1101 1010
1011 1000 1001
0111 0110 0101 0100 0011 0010 0001 0000 1111 1110 1101 1100 1011
1010 1001 1000
1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011 0100
0101 0110 0111
1001 1000 1011 1010 1101 1100 1111 1110 0001 0000 0011 0010 0101
0100 0111 0110
1010 1011 1000 1001 1110 1111 1100 1101 0010 0011 0000 0001 0110
0111 0100 0101
1011 1010 1001 1000 1111 1110 1101 1100 0011 0010 0001 0000 0111
0110 0101 0100
1100 1101 1110 1111 1000 1001 1010 1011 0100 0101 0110 0111 0000
0001 0010 0011
1101 1100 1111 1110 1001 1000 1011 1010 0101 0100 0111 0110 0001
0000 0011 0010
1110 1111 1100 1101 1010 1011 1000 1001 0110 0111 0100 0101 0010
0011 0000 0001
1111 1110 1101 1100 1011 1010 1001 1000 0111 0110 0101 0100 0011
0010 0001 0000
Table de la multiplication des polynômes
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0000 0000 0000
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100
1101 1110 1111
0000 0010 0100 0110 1000 1010 1100 1110 1111 1101 1011 1001 0111
0101 0011 0001
0000 0011 0110 0101 1100 1111 1010 1001 0111 0100 0001 0010 1011
1000 1101 1110
0000 0100 1000 1100 1111 1011 0111 0011 0001 0101 1001 1101 1110
1010 0110 0010
0000 0101 1010 1111 1011 1110 0001 0100 1001 1100 0011 0110 0010
0111 1000 1101
0000 0110 1100 1010 0111 0001 1011 1101 1110 1000 0010 0100 1001
1111 0101 0011
0000 0111 1110 1001 0011 0100 1101 1010 0110 0001 1000 1111 0101
0010 1011 1100
0000 1000 1111 0111 0001 1001 1110 0110 0010 1010 1101 0101 0011
1011 1100 0100
0000 1001 1101 0100 0101 1100 1000 0001 1010 0011 0111 1110 1111
0110 0010 1011
0000 1010 1011 0001 1001 0011 0010 1000 1101 0111 0110 1100 0100
1110 1111 0101
0000 1011 1001 0010 1101 0110 0100 1111 0101 1110 1100 0111 1000
0011 0001 1010
0000 1100 0111 1011 1110 0010 1001 0101 0011 1111 0100 1000 1101
0001 1010 0110
0000 1101 0101 1000 1010 0111 1111 0010 1011 0110 1110 0011 0001
1100 0100 1001
0000 1110 0011 1101 0110 1000 0101 1011 1100 0010 1111 0001 1010
0100 1001 0111
0000 1111 0001 1110 0010 1101 0011 1100 0100 1011 0101 1010 0110
1001 0111 1000
Elements primitifs
X 1
X^2 1
X^2 X
X^2 X 1
X^3 1
X^3 X
X^3 X 1
X^3 X^2 X
Table des logarithmes
(X 1 )^0 = 1
(X 1 )^1 = X 1
(X 1 )^2 = X^2 1
(X 1 )^3 = X^3 X^2 X 1
(X 1 )^4 = X^3 X^2 X
(X 1 )^5 = X^3 X^2 1
(X 1 )^6 = X^3
(X 1 )^7 = X^2 X 1
(X 1 )^8 = X^3 1
(X 1 )^9 = X^2
(X 1 )^10 = X^3 X^2
(X 1 )^11 = X^3 X 1
(X 1 )^12 = X
(X 1 )^13 = X^2 X
(X 1 )^14 = X^3 X
(X 1 )^15 = 1
F16 (2^4) Polynôme à inverser > 0100
Invers de X^2 =
X^3
F16 (2^4) Polynôme à inverser > q
$ java Main bch 15 2 10011 verbose
================= Codes BCH =================
Daniele Raffo <draffo@etudiant.univ-mlv.fr>
projet de Codage et Cryptographie
Université de
Marne la Vallée
11 FEV 2001
=============================================
Classe cyclotomique: [1, 2, 4, 8]
Polynôme minimal associé: X^4 X 1
Classe cyclotomique: [3, 6, 12, 9]
Polynôme minimal associé: X^4 X^3 X^2 X 1
Génération du code BCH (longueur 15, dimension 7,
2-correcteur) sur F2,
polynôme générateur G(X) = X^8 X^7 X^6 X^4
1
On utilise le corps F16 (2^4), polynôme irreductible générateur
P(X) = X^4 X 1
BCH (15, 7, 2) Commande > code 0111001
Message : 0111001
X^5 X^4 X^3 1
Message codé: 011100110000010 X^13 X^12
X^11 X^8 X^7 X
BCH (15, 7, 2) Commande > decode
0111001
Erreur: Ce message est de dimension 7, on attend un message à
decoder de dimension 15
BCH (15, 7, 2) Commande > decode 011100110000010
Calcul des 4 syndromes de X^13 X^12 X^11 X^8 X^7 X
syndrome #1: + alfa^13 + alfa^12 + alfa^11 + alfa^8 + alfa^7 +
alfa^1 = 0000
syndrome #2: + alfa^26 + alfa^24 + alfa^22 + alfa^16 + alfa^14
+ alfa^2 = 0000
syndrome #3: + alfa^39 + alfa^36 + alfa^33 + alfa^24 + alfa^21
+ alfa^3 = 0000
syndrome #4: + alfa^52 + alfa^48 + alfa^44 + alfa^32 + alfa^28
+ alfa^4 = 0000
Polynôme correcteur: X^2
Recherche exaustive des solutions:
sigma(alfa^0) = 0001
sigma(alfa^1) = 0100
sigma(alfa^2) = 0011
sigma(alfa^3) = 1100
sigma(alfa^4) = 0101
sigma(alfa^5) = 0111
sigma(alfa^6) = 1111
sigma(alfa^7) = 1001
sigma(alfa^8) = 0010
sigma(alfa^9) = 1000
sigma(alfa^10) = 0110
sigma(alfa^11) = 1011
sigma(alfa^12) = 1010
sigma(alfa^13) = 1110
sigma(alfa^14) = 1101
sigma(alfa^15) = 0001
Message : 011100110000010
X^13 X^12 X^11 X^8 X^7 X
0 erreur(s) trouvé(s)
Correction : 011100110000010
X^13 X^12 X^11 X^8 X^7 X
Message decodé: 0111001
X^5 X^4 X^3 1
BCH (15, 7, 2) Commande > d 011100110010010
Calcul des 4 syndromes de X^13 X^12 X^11 X^8 X^7 X^4 X
syndrome #1: + alfa^13 + alfa^12 + alfa^11 + alfa^8 + alfa^7 +
alfa^4 + alfa^1 = 0011 = alfa^4
syndrome #2: + alfa^26 + alfa^24 + alfa^22 + alfa^16 + alfa^14
+ alfa^8 + alfa^2 = 0101 = alfa^8
syndrome #3: + alfa^39 + alfa^36 + alfa^33 + alfa^24 + alfa^21
+ alfa^12 + alfa^3 = 1111 = alfa^12
syndrome #4: + alfa^52 + alfa^48 + alfa^44 + alfa^32 + alfa^28
+ alfa^16 + alfa^4 = 0010 = alfa^1
Polynôme correcteur: X^2 + (alfa^4)X
Recherche exaustive des solutions:
sigma(alfa^0) = 0010
sigma(alfa^1) = 0010
sigma(alfa^2) = 1111
sigma(alfa^3) = 0111
sigma(alfa^4) = 0000 erreur en position 4
sigma(alfa^5) = 1101
sigma(alfa^6) = 1000
sigma(alfa^7) = 0111
sigma(alfa^8) = 1101
sigma(alfa^9) = 0101
sigma(alfa^10) = 1111
sigma(alfa^11) = 1010
sigma(alfa^12) = 1000
sigma(alfa^13) = 1010
sigma(alfa^14) = 0101
sigma(alfa^15) = 0010
Message : 011100110010010
X^13 X^12 X^11 X^8 X^7 X^4 X
^ 1 erreur(s) trouvé(s)
Correction : 011100110000010
X^13 X^12 X^11 X^8 X^7 X
Message decodé: 0111001
X^5 X^4 X^3 1
BCH (15, 7, 2) Commande > d 001100110000011
Calcul des 4 syndromes de X^12 X^11 X^8 X^7 X 1
syndrome #1: + alfa^12 + alfa^11 + alfa^8 + alfa^7 + alfa^1 + alfa^0
= 1100 = alfa^6
syndrome #2: + alfa^24 + alfa^22 + alfa^16 + alfa^14 + alfa^2 +
alfa^0 = 1111 = alfa^12
syndrome #3: + alfa^36 + alfa^33 + alfa^24 + alfa^21 + alfa^3 +
alfa^0 = 1011 = alfa^7
syndrome #4: + alfa^48 + alfa^44 + alfa^32 + alfa^28 + alfa^4 +
alfa^0 = 1010 = alfa^9
Polynôme correcteur: X^2 + (alfa^6)X + alfa^13
Recherche exaustive des solutions:
sigma(alfa^0) = 0000 erreur en position 0
sigma(alfa^1) = 0010
sigma(alfa^2) = 1011
sigma(alfa^3) = 1011
sigma(alfa^4) = 1111
sigma(alfa^5) = 0100
sigma(alfa^6) = 1101
sigma(alfa^7) = 1001
sigma(alfa^8) = 0110
sigma(alfa^9) = 0100
sigma(alfa^10) = 1001
sigma(alfa^11) = 0010
sigma(alfa^12) = 1111
sigma(alfa^13) = 0000 erreur en position 13
Message : 001100110000011
X^12 X^11 X^8 X^7 X 1
^ ^
2 erreur(s) trouvé(s)
Correction : 011100110000010
X^13 X^12 X^11 X^8 X^7 X
Message decodé: 0111001
X^5 X^4 X^3 1
BCH (15, 7, 2) Commande > d 010100010000010
Calcul des 4 syndromes de X^13 X^11 X^7 X
syndrome #1: + alfa^13 + alfa^11 + alfa^7 + alfa^1 = 1010 = alfa^9
syndrome #2: + alfa^26 + alfa^22 + alfa^14 + alfa^2 = 1000 = alfa^3
syndrome #3: + alfa^39 + alfa^33 + alfa^21 + alfa^3 = 0110 = alfa^5
syndrome #4: + alfa^52 + alfa^44 + alfa^28 + alfa^4 = 1100 = alfa^6
Polynôme correcteur: X^2 + (alfa^9)X + alfa^5
Recherche exaustive des solutions:
sigma(alfa^0) = 1101
sigma(alfa^1) = 0101
sigma(alfa^2) = 1011
sigma(alfa^3) = 0101
sigma(alfa^4) = 1110
sigma(alfa^5) = 1000
sigma(alfa^6) = 1000
sigma(alfa^7) = 1101
sigma(alfa^8) = 0000 erreur en position 8
sigma(alfa^9) = 0110
sigma(alfa^10) = 0011
sigma(alfa^11) = 1011
sigma(alfa^12) = 0000 erreur en position 12
Message : 010100010000010
X^13 X^11 X^7 X
^ ^
2 erreur(s) trouvé(s)
Correction : 011100110000010
X^13 X^12 X^11 X^8 X^7 X
Message decodé: 0111001
X^5 X^4 X^3 1
BCH (15, 7, 2) Commande > d 011100110000111
Calcul des 4 syndromes de X^13 X^12 X^11 X^8 X^7 X^2 X 1
syndrome #1: + alfa^13 + alfa^12 + alfa^11 + alfa^8 + alfa^7 +
alfa^2 + alfa^1 + alfa^0 = 0101 = alfa^8
syndrome #2: + alfa^26 + alfa^24 + alfa^22 + alfa^16 + alfa^14
+ alfa^4 + alfa^2 + alfa^0 = 0010 = alfa^1
syndrome #3: + alfa^39 + alfa^36 + alfa^33 + alfa^24 + alfa^21
+ alfa^6 + alfa^3 + alfa^0 = 1101 = alfa^13
syndrome #4: + alfa^52 + alfa^48 + alfa^44 + alfa^32 + alfa^28
+ alfa^8 + alfa^4 + alfa^0 = 0100 = alfa^2
Polynôme correcteur: X^2 + (alfa^8)X + alfa^2
Recherche exaustive des solutions:
sigma(alfa^0) = 0000 erreur en position 0
sigma(alfa^1) = 1010
sigma(alfa^2) = 0000 erreur en position 2
Message : 011100110000111
X^13 X^12 X^11 X^8 X^7 X^2 X 1
^ ^ 2 erreur(s) trouvé(s)
Correction : 011100110000010
X^13 X^12 X^11 X^8 X^7 X
Message decodé: 0111001
X^5 X^4 X^3 1
BCH (15, 7, 2) Commande > q
$