Skip to content

Commit 1b4062a

Browse files
author
sacha
committed
publication code d'erreur reed-solomon
1 parent b581f1a commit 1b4062a

File tree

4 files changed

+70
-49
lines changed

4 files changed

+70
-49
lines changed
14.5 KB
Loading
25.2 KB
Loading
27.5 KB
Loading

content/reed_solomon.md

Lines changed: 70 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,90 +1,111 @@
11
Title: Code d'erreur de Reed-Solomon
22
Slug: reed-solomon
3-
Date: 2024-09-22 19:30:31
4-
Modified: 2024-09-22 19:30:31
3+
Date: 2024-09-30 19:30:31
4+
Modified: 2024-09-30 19:30:31
55
Tags: algorithme
66
Category: informatique
77
Author: Sacha schutz
88
SIDEBARIMAGE:images/common/term_banner.jpeg
9-
Status: draft
109

11-
Le code de Reed-Solomon est un algorithme qui va vous permettre de corriger des erreurs dans
12-
une séquence en utilisant des symboles surnuméraires. C'est un système de correction
13-
d'erreur qui permet par exemple de lire vos vieux CD-ROM tout rayé.
14-
Pour comprendre, imaginiez que je vous transmette lettre par lettre le mot "c-h-a-t" mais que vous n'avez pas
15-
entendu la 3ème lettre. Vous ne pourrez pas interpréter le message. Il pourrait s'agir aussi bien du mot "chut" que du mot "chot".
16-
Mais en vous communiquant un symbole surnuméraire, par exemple c-h-a-t-z, vous allez pouvoir identifier et corriger l'erreur
17-
peut importe ou elle se trouve.
18-
Nous allons donc voir comment fonctionne cette algorithme avec le mot 'c-h-a-t' en évitant tout définition mathémtique complexe.
10+
Le code de [Reed-Solomon](https://fr.wikipedia.org/wiki/Code_de_Reed-Solomon) est un algorithme conçu pour corriger des erreurs dans une séquence de données en utilisant des symboles supplémentaires. C'est un système de [correction d'erreurs](https://fr.wikipedia.org/wiki/Code_correcteur) utilisé par exemple pour lire vos vieux [CD-ROM](https://en.wikipedia.org/wiki/Cross-interleaved_Reed%E2%80%93Solomon_coding) rayés.
11+
Pour mieux comprendre, imaginez que je vous transmets lettre par lettre le mot **c-h-a-t**, mais que la troisième lettre se corrompt en chemin pour devenir **c-h-x-t**. Vous ne pourrez pas interpréter le message correctement. Cependant, en ajoutant un symbole supplémentaire à mon message, par exemple **c-h-a-t-y**, vous allez pouvoir identifier et corriger un erreur peut importe ou elle se trouve grâce au code de Reed-Solomon.
1912

13+
Nous allons donc explorer le fonctionnement de cet algorithme à travers l'exemple du mot *c-h-a-t* et voir comment réaliser cette operation avec notre language préféré [Python](https://www.python.org/).
2014

21-
## Representation du mot chat dans un espace de gallois
15+
## Representation du mot chat dans un espace discret
2216

23-
Nous allons representer chat lettre du mot chat sur un graphique ou l'axe des ordonnées correspond à la position de la lettre
24-
dans l'alphabet et l'axes des absisses corespond à la position dans le mot. Par exemple le C est la première lettre
25-
du mot chat et la 3 ème lettre de l'alphabet. Ses coordonnés seront (0,2). De même on aura H (1,x), A(2,y), T(3,y).
17+
Tout d'abord, representons les lettres du mot *chat* sur un graphique où l'axe des ordonnées indique la position de chaque lettre dans l'alphabet, tandis que l'axe des abscisses correspond à leur position dans le mot. Par exemple, le **C** est la première lettre du mot *chat* et la troisième lettre de l'alphabet, donc ses coordonnées seront (0, 2). De même, nous aurons **H** (1, 7), **A** (2, 0) et **T** (3, 19).
2618

19+
<div class="figure">
20+
<img src="images/reed_solomon/graph1.png">
21+
<div class="legend">
2722

28-
{graph}
23+
Representation du mot chat dans un espace ou l'axe X represente la position d'une lettre dans le mot
24+
et l'axe Y la position de la lettre dans l'alphabet. L'index des positions commence à zero.
2925

30-
2 choses à comprendre sur ce graphique. Tout d'abord le domaine d'application des valeurs. Celui ci est discret.
31-
En effet, les positions sont des nombres entiers car il n'est pas possible d'avoir la position 1.5.
32-
Regardez ensuite la borne superieur de l'axes des ordonnées qui est egal à 26 . Il s'agit du nombre de symbol dans l'alphabet.
26+
</div>
27+
</div>
3328

3429

35-
## Interpolation lagrangienne
36-
L'objectif à présent est de trouver une fonction mathématique passant par ces 4 points. Plus exactement,
37-
nous allons chercher un polynome de degré 3 ( nombre de lettre - 1 ) en realisant une interpolation lagrangienne.
38-
Cette méthode, simple à comprendre, peut être réalisé en python avec `scipi.interpolate.lagrange`.
39-
30+
Deux éléments importants à comprendre concernant ce graphique. Tout d'abord, le domaine des valeurs est discret. En effet, les positions sont des nombres entiers, car il est impossible d'avoir une position comme 1,5.
31+
Ensuite, observez la borne supérieure de l'axe des ordonnées, qui est égale à 26. Cela correspond au nombre de lettres dans l'alphabet. Nous verrons plus tard, que nous pouvons utiliser l'algèbre modulaire pour avoir une lettre à la position 27.
4032

41-
```python
4233

43-
```
44-
45-
Nous obtenons alors le graphique suivant.
34+
## Interpolation lagrangienne
35+
Maintenant trouvons une fonction mathématique qui passe par ces quatre points. Plus précisément, nous allons rechercher un [polynôme](https://fr.wikipedia.org/wiki/Polyn%C3%B4me) de degré 3 (correspondant au nombre de lettres moins un) en effectuant une [interpolation Lagrangienne](https://fr.wikipedia.org/wiki/Interpolation_lagrangienne).
36+
Cette méthode est relativement simple à comprendre, et je vous invite à l'explorer par vous-même. Nous réaliserons cette interpolation directement en Python en utilisant ```scipy.interpolate.lagrange```.
4637

38+
```python
4739

48-
{ graph }
40+
from scipy.interpolate import lagrange
4941

42+
x = [0,1,2,3]
43+
y = [2,7,0,19]
44+
polynome = lagrange(x,y)
5045

51-
Ce qui est très important à comprendre avec ce polynome, c'est qu'il est unique. Il n'y a qu'un seul polynome de degré 3 qui
52-
passe par ces 4 points. C'est sur ce principe que se base la correction d'erreur de Reed-solomon.
53-
Si vous connaissez au minimum 3 points vous pouvez déduire le polynome de degré 4 et prédire n'importe n'importe quel point manquant.
46+
polynome(4)
5447

48+
```
5549

56-
## Ajout des symboles de redondance
50+
Nous obtenons alors le graphique suivant:
5751

58-
Pour trouver le symbole de rédondance à utiliser à la 5 positions du mot, il suffit de calculer polynome(5) = 102.
59-
Le symbole de rédondance est donc la 102 lettres de l'alphabet.
60-
Mais attendez, nous avons que 26 lettres dans l'alphabet ? C'est là que vous devez savoir que ce que j'ai dit n'est pas
61-
tout à fait vrai. En réalité, le polynome est recherché dans un espace de Galois ou régne l'arithmétique modulaire.
62-
C'est comme si vous comptier l'alphabet sur un cercle ou après la lettre Z il y a le A qui est donc la 27 ème lettre de l'alphabet.
63-
La 102 ème lettres de l'alphabet est donc à la position `102 % 26 = 24`, soit la lettre y.
64-
Vous pouvez ajouter autant de symboles de correction d'erreur que vous le souhaitez. Pour un mot de N lettres avec 1 seul symbol de
65-
correction d'erreur, vous avez besoin de connaitre N-1 symbol pour valider le code de Reed-solomon. Et si vous rajouter 3 symboles,
66-
ca veux dire que vous pouvez perdre 3 symboles et les retrouver.
6752

53+
<div class="figure">
54+
<img src="images/reed_solomon/graph2.png">
55+
<div class="legend">
6856

69-
## En pratique
70-
En pratique, il y a une librarie python qui fait très bien l'affaire.
57+
Polynome de degré 3 passant par les 4 points. Ce polynome a été obtenu grâce à une interpolation lagrangienne.
7158

59+
</div>
60+
</div>
7261

7362

63+
Il est important de comprendre que ce polynôme est unique. Il n'y a qu'un seul polynome de degré 3 qui
64+
passe par ces 4 points. Si vous connaissez au minimum 3 points vous pouvez déduire le polynome de degré 4 et prédire n'importe
65+
quel point manquant. C'est sur ce principe que se base la correction d'erreur de Reed-solomon. Vous allez utiliser suffisament de symboles surnuméraires pour prédire le polynome et par conséquence prédire les symboles pour n'importe quelles positions.
7466

7567

68+
## Ajout du symbole de correction
7669

70+
Pour déterminer le symbole de correction à utiliser à la cinquième position du mot, il suffit de calculer
71+
**polynome(5) = 102**. Ainsi, le symbole de de correction à utilisé est la 102ème lettre de l'alphabet. Mais attendez, il n'y a que 26 lettres dans l'alphabet ! En effet, ce que je vous ai dit n'est pas tout à fait exact. En réalité, le polynôme de Lagrange est recherché dans un [espace de Galois](https://fr.wikipedia.org/wiki/Groupe_de_Galois) où l'arithmétique modulaire s'applique. Imaginez que l'alphabet est disposé en cercle : après la lettre Z, vous revenez à la lettre A et recommencer le comptage. Dans cette espace tous les opérateurs mathématiques sont respectés. Z + 3 = C par exemple. Ainsi, la 102ème lettre de l'alphabet est la lettre Y.
7772

7873

74+
<div class="figure">
75+
<img src="images/reed_solomon/graph3.png">
76+
<div class="legend">
7977

80-
## Remerciements
78+
Il suffit d'utiliser le polynome pour identifier le symbole de correction d'erreur.
79+
Sur les 5 points representés, seul 4 sont nécessaires pour trouver le polynôme.
8180

82-
- Merci à @lourdes pour la découverte
81+
</div>
82+
</div>
8383

84+
Vous pouvez ajouter autant de symboles de correction d'erreur que vous le souhaitez. Pour un mot de N lettres avec un seul symbole de correction d'erreur, vous devez connaître N-1 symboles pour valider le code de Reed-Solomon. Si vous ajoutez trois symboles, cela signifie que vous pouvez perdre jusqu'à trois symboles et les retrouver.
8485

85-
https://odsc.medium.com/9-open-source-tools-to-generate-synthetic-data-b642cb10dd9a
86+
## En pratique
87+
En pratique, vous pouvez utiliser la bibliothèque Python [reedsolo](https://github.com/tomerfiliba-org/reedsolomon), disponible sur [PyPI](https://pypi.org/project/reedsolo/), pour encoder une chaine de caractères. Par exemple, pour encoder le mot *hello* en utilisant 10 symboles de correction d'erreurs :
8688

87-
https://medium.com/@MarkAiCode/linux-ai-data-anonymization-protect-user-privacy-e60a96d2f898
89+
```python
90+
from reedsolo import RSCodec
91+
rsc = RSCodec(10)
92+
message = rsc.encode(b'hello')
93+
print(message) # bytearray(b'hello\xec\x8e')
94+
95+
# Alteration du message
96+
message[0] = 0
97+
message[2] = 0
98+
99+
# Retrouver le message original
100+
correction , _, _= rsc.decode(message)
101+
print(correction) # bytearray(b(hello))
102+
```
103+
104+
## Conclusion
105+
Le code de correction d'erreur Reed-Solomon est remarquable pour sa capacité à corriger et à identifier des erreurs, peu importe leurs positions dans le message. Vous trouverez également d'autres codes correcteurs, tels que le [code de Hamming](https://fr.wikipedia.org/wiki/Code_de_Hamming) et le [code de Golay](https://fr.wikipedia.org/wiki/Code_de_Golay), chacun ayant ses propres avantages et inconvénients.
88106

89107

90-
Maskfile
108+
## Références
109+
- [ Vidéo youtube ](https://www.youtube.com/watch?v=1pQJkt7-R4Q&themeRefresh=1)
110+
- [infoscience](https://infoscience.epfl.ch/server/api/core/bitstreams/238e2ed1-6e61-4a8f-8454-82a08557316d/content)
111+
- [reedsolo](https://github.com/tomerfiliba-org/reedsolomon)

0 commit comments

Comments
 (0)