|
1 | 1 | Title: Code d'erreur de Reed-Solomon
|
2 | 2 | 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 |
5 | 5 | Tags: algorithme
|
6 | 6 | Category: informatique
|
7 | 7 | Author: Sacha schutz
|
8 | 8 | SIDEBARIMAGE:images/common/term_banner.jpeg
|
9 |
| -Status: draft |
10 | 9 |
|
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. |
19 | 12 |
|
| 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/). |
20 | 14 |
|
21 |
| -## Representation du mot chat dans un espace de gallois |
| 15 | +## Representation du mot chat dans un espace discret |
22 | 16 |
|
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). |
26 | 18 |
|
| 19 | +<div class="figure"> |
| 20 | +<img src="images/reed_solomon/graph1.png"> |
| 21 | +<div class="legend"> |
27 | 22 |
|
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. |
29 | 25 |
|
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> |
33 | 28 |
|
34 | 29 |
|
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. |
40 | 32 |
|
41 |
| -```python |
42 | 33 |
|
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```. |
46 | 37 |
|
| 38 | +```python |
47 | 39 |
|
48 |
| -{ graph } |
| 40 | +from scipy.interpolate import lagrange |
49 | 41 |
|
| 42 | +x = [0,1,2,3] |
| 43 | +y = [2,7,0,19] |
| 44 | +polynome = lagrange(x,y) |
50 | 45 |
|
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) |
54 | 47 |
|
| 48 | +``` |
55 | 49 |
|
56 |
| -## Ajout des symboles de redondance |
| 50 | +Nous obtenons alors le graphique suivant: |
57 | 51 |
|
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. |
67 | 52 |
|
| 53 | +<div class="figure"> |
| 54 | +<img src="images/reed_solomon/graph2.png"> |
| 55 | +<div class="legend"> |
68 | 56 |
|
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. |
71 | 58 |
|
| 59 | +</div> |
| 60 | +</div> |
72 | 61 |
|
73 | 62 |
|
| 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. |
74 | 66 |
|
75 | 67 |
|
| 68 | +## Ajout du symbole de correction |
76 | 69 |
|
| 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. |
77 | 72 |
|
78 | 73 |
|
| 74 | +<div class="figure"> |
| 75 | +<img src="images/reed_solomon/graph3.png"> |
| 76 | +<div class="legend"> |
79 | 77 |
|
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. |
81 | 80 |
|
82 |
| -- Merci à @lourdes pour la découverte |
| 81 | +</div> |
| 82 | +</div> |
83 | 83 |
|
| 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. |
84 | 85 |
|
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 : |
86 | 88 |
|
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. |
88 | 106 |
|
89 | 107 |
|
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