-
Notifications
You must be signed in to change notification settings - Fork 13
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
publication code d'erreur reed-solomon
- Loading branch information
sacha
committed
Sep 30, 2024
1 parent
b581f1a
commit 1b4062a
Showing
4 changed files
with
70 additions
and
49 deletions.
There are no files selected for viewing
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,90 +1,111 @@ | ||
Title: Code d'erreur de Reed-Solomon | ||
Slug: reed-solomon | ||
Date: 2024-09-22 19:30:31 | ||
Modified: 2024-09-22 19:30:31 | ||
Date: 2024-09-30 19:30:31 | ||
Modified: 2024-09-30 19:30:31 | ||
Tags: algorithme | ||
Category: informatique | ||
Author: Sacha schutz | ||
SIDEBARIMAGE:images/common/term_banner.jpeg | ||
Status: draft | ||
|
||
Le code de Reed-Solomon est un algorithme qui va vous permettre de corriger des erreurs dans | ||
une séquence en utilisant des symboles surnuméraires. C'est un système de correction | ||
d'erreur qui permet par exemple de lire vos vieux CD-ROM tout rayé. | ||
Pour comprendre, imaginiez que je vous transmette lettre par lettre le mot "c-h-a-t" mais que vous n'avez pas | ||
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". | ||
Mais en vous communiquant un symbole surnuméraire, par exemple c-h-a-t-z, vous allez pouvoir identifier et corriger l'erreur | ||
peut importe ou elle se trouve. | ||
Nous allons donc voir comment fonctionne cette algorithme avec le mot 'c-h-a-t' en évitant tout définition mathémtique complexe. | ||
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. | ||
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. | ||
|
||
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/). | ||
|
||
## Representation du mot chat dans un espace de gallois | ||
## Representation du mot chat dans un espace discret | ||
|
||
Nous allons representer chat lettre du mot chat sur un graphique ou l'axe des ordonnées correspond à la position de la lettre | ||
dans l'alphabet et l'axes des absisses corespond à la position dans le mot. Par exemple le C est la première lettre | ||
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). | ||
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). | ||
|
||
<div class="figure"> | ||
<img src="images/reed_solomon/graph1.png"> | ||
<div class="legend"> | ||
|
||
{graph} | ||
Representation du mot chat dans un espace ou l'axe X represente la position d'une lettre dans le mot | ||
et l'axe Y la position de la lettre dans l'alphabet. L'index des positions commence à zero. | ||
|
||
2 choses à comprendre sur ce graphique. Tout d'abord le domaine d'application des valeurs. Celui ci est discret. | ||
En effet, les positions sont des nombres entiers car il n'est pas possible d'avoir la position 1.5. | ||
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. | ||
</div> | ||
</div> | ||
|
||
|
||
## Interpolation lagrangienne | ||
L'objectif à présent est de trouver une fonction mathématique passant par ces 4 points. Plus exactement, | ||
nous allons chercher un polynome de degré 3 ( nombre de lettre - 1 ) en realisant une interpolation lagrangienne. | ||
Cette méthode, simple à comprendre, peut être réalisé en python avec `scipi.interpolate.lagrange`. | ||
|
||
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. | ||
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. | ||
|
||
```python | ||
|
||
``` | ||
|
||
Nous obtenons alors le graphique suivant. | ||
## Interpolation lagrangienne | ||
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). | ||
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```. | ||
|
||
```python | ||
|
||
{ graph } | ||
from scipy.interpolate import lagrange | ||
|
||
x = [0,1,2,3] | ||
y = [2,7,0,19] | ||
polynome = lagrange(x,y) | ||
|
||
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 | ||
passe par ces 4 points. C'est sur ce principe que se base la correction d'erreur de Reed-solomon. | ||
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. | ||
polynome(4) | ||
|
||
``` | ||
|
||
## Ajout des symboles de redondance | ||
Nous obtenons alors le graphique suivant: | ||
|
||
Pour trouver le symbole de rédondance à utiliser à la 5 positions du mot, il suffit de calculer polynome(5) = 102. | ||
Le symbole de rédondance est donc la 102 lettres de l'alphabet. | ||
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 | ||
tout à fait vrai. En réalité, le polynome est recherché dans un espace de Galois ou régne l'arithmétique modulaire. | ||
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. | ||
La 102 ème lettres de l'alphabet est donc à la position `102 % 26 = 24`, soit la lettre y. | ||
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 | ||
correction d'erreur, vous avez besoin de connaitre N-1 symbol pour valider le code de Reed-solomon. Et si vous rajouter 3 symboles, | ||
ca veux dire que vous pouvez perdre 3 symboles et les retrouver. | ||
|
||
<div class="figure"> | ||
<img src="images/reed_solomon/graph2.png"> | ||
<div class="legend"> | ||
|
||
## En pratique | ||
En pratique, il y a une librarie python qui fait très bien l'affaire. | ||
Polynome de degré 3 passant par les 4 points. Ce polynome a été obtenu grâce à une interpolation lagrangienne. | ||
|
||
</div> | ||
</div> | ||
|
||
|
||
Il est important de comprendre que ce polynôme est unique. Il n'y a qu'un seul polynome de degré 3 qui | ||
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 | ||
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. | ||
|
||
|
||
## Ajout du symbole de correction | ||
|
||
Pour déterminer le symbole de correction à utiliser à la cinquième position du mot, il suffit de calculer | ||
**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. | ||
|
||
|
||
<div class="figure"> | ||
<img src="images/reed_solomon/graph3.png"> | ||
<div class="legend"> | ||
|
||
## Remerciements | ||
Il suffit d'utiliser le polynome pour identifier le symbole de correction d'erreur. | ||
Sur les 5 points representés, seul 4 sont nécessaires pour trouver le polynôme. | ||
|
||
- Merci à @lourdes pour la découverte | ||
</div> | ||
</div> | ||
|
||
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. | ||
|
||
https://odsc.medium.com/9-open-source-tools-to-generate-synthetic-data-b642cb10dd9a | ||
## En pratique | ||
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 : | ||
|
||
https://medium.com/@MarkAiCode/linux-ai-data-anonymization-protect-user-privacy-e60a96d2f898 | ||
```python | ||
from reedsolo import RSCodec | ||
rsc = RSCodec(10) | ||
message = rsc.encode(b'hello') | ||
print(message) # bytearray(b'hello\xec\x8e') | ||
|
||
# Alteration du message | ||
message[0] = 0 | ||
message[2] = 0 | ||
|
||
# Retrouver le message original | ||
correction , _, _= rsc.decode(message) | ||
print(correction) # bytearray(b(hello)) | ||
``` | ||
|
||
## Conclusion | ||
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. | ||
|
||
|
||
Maskfile | ||
## Références | ||
- [ Vidéo youtube ](https://www.youtube.com/watch?v=1pQJkt7-R4Q&themeRefresh=1) | ||
- [infoscience](https://infoscience.epfl.ch/server/api/core/bitstreams/238e2ed1-6e61-4a8f-8454-82a08557316d/content) | ||
- [reedsolo](https://github.com/tomerfiliba-org/reedsolomon) |