# TP numéro 1 : Polynômes et Reed-Solomon (modulo un nombre premier)
Cours : IT 122 – 2021-2022
Cours : ISC 122 – 2021-2022
Groupe : Florian BURGENER, Gawen ACKERMANN, Quentin FASLER, Dario GENGA
Groupe : Gawen ACKERMANN, Florian BURGENER, Quentin FASLER, Dario GENGA
## Structure du projet
Afin de réaliser ce travail pratique, nous avons créé une classe `Polynomial`, contenant des méthodes permettant
d'ajouter, multiplier et faire une division modulaire sur des polynômes. Cette classe peut également afficher le
polynôme dans la console et calculer le résultat du polynôme en passant une valeur à x.
d'ajouter, multiplier et d'appliquer un modulo sur un polynôme. Cette classe peut également afficher le
polynôme dans la console et d'obtenir y en passant x par le polynôme (faire P(x) = y).
En plus de cette classe le programme contient les méthodes suivantes :
En plus de cette classe le programme contient les fonctions suivantes :
-`get_bezout_coefficients(a, b)` : Calcule les coefficients de bézout pour les valeurs `a` et `b`
-`modular_inverse(a, n)` : Calcule l'inverse modulaire de `a` par `n`
-`compute_lagrange_polynomial(points, prime_number)` : Calcule le polynôme de lagrange à partir des `points` en
utilisant un inverse modulaire obtenu avec le `prime_number`.
-`reed_solomon(...)` : Décode le message via reed solomon.
-`get_bezout_coefficients(a, b)` : Calcule les coefficients de bézout pour les valeurs `a` et `b` ;
-`modular_inverse(a, n)` : Calcule l'inverse modulaire de `a` dans les modulos `n` ;
-`compute_lagrange_polynomial(points, prime_number)` : Calcule le polynôme de Lagrange dans un modulo `prime_number` passsant par tous les `points` ;
-`reed_solomon(...)` : Corrige le message en appliquant la méthode de Reed-Solomon.
## Démarche de décodage
## Explication de notre démarche pour corriger le message
Afin de décoder le message, nous utilisons la méthode `reed_solomon` qui fonctionne de la manière suivante :
1) On parcourt toutes les combinaisons de points possiblement juste.
2) On crée une liste qui regroupe une combinaison de points avec tous les points justes que l'on connait.
3) On ajoute x points qui sont probablement juste. (Dans notre cas 2 car la longueur du message (25) - le nombre de points juste a partir de l'index fournis (23) = 2)
4) On construit le polynôme de Lagrange avec la méthode `compute_lagrange_polynomial`.
5) On parcourt l'intégralité des points afin de vérifier si le polynôme est correct.
1) On injecte x dans le polynôme et on regarde que le résultat soit égale à y.
Afin de corriger le message, nous utilisons la méthode `reed_solomon` qui fonctionne de la manière suivante :
1) On parcourt toutes les combinaisons dans la liste 0 à index - 1 (de longueur 2 = 25 - 23 (le nombre de points juste a partir de l'index fournis)) ;
2) On crée une liste qui regroupe la combinaison avec les points de index à longueur de la liste - 1 ;
3) On construit le polynôme de Lagrange avec la méthode `compute_lagrange_polynomial` ;
4) On parcourt l'intégralité des points afin de vérifier si le polynôme est correct ;
4.A) On injecte x dans le polynôme et on regarde que le résultat soit égale à y ;
5) Si on a suffisamment de points justes (m + n points), alors on a trouvé le seul et unique polynôme qui passe par tous les points du message sans erreur ce qui nous permet de corriger le message.
6) Si on a suffisamment de points justes (m+n points) , alors on a trouvé le bon et unique polynôme qui passe par tous les points du message sans erreur si que nous permet de corriger notre message.