From 7c3b173a1b72792bb1c2845a403d091aeb10d257 Mon Sep 17 00:00:00 2001
From: Abivarman <abivarman.kandiah@etu.hesge.ch>
Date: Tue, 14 Dec 2021 11:20:19 +0100
Subject: [PATCH] Lagrange compute don't work with mod

---
 polynome.py     |  4 ++--
 reed_solomon.py | 41 +++++++++++++++++------------------------
 2 files changed, 19 insertions(+), 26 deletions(-)

diff --git a/polynome.py b/polynome.py
index 6d28631..843614b 100644
--- a/polynome.py
+++ b/polynome.py
@@ -38,7 +38,7 @@ class polynome():
         coeff_poly_res = [0] * (len(self.coefs) + len(poly_2.coefs) - 1)
         for index_1, value_1 in enumerate(self.coefs):
             for index_2, value_2 in enumerate(poly_2.coefs):
-                coeff_poly_res[index_1 + index_2] += value_1 * value_2
+                coeff_poly_res[index_1 + index_2] += value_1 * value_2 % self.prime_mod
         return polynome(coeff_poly_res)
     
     def evaluate(self, x):
@@ -46,4 +46,4 @@ class polynome():
         res = 0
         for i in range(len(self.coefs) - 1, -1, -1):
             res = (res * x + self.coefs[i])
-        return res
+        return res % self.prime_mod
diff --git a/reed_solomon.py b/reed_solomon.py
index 5f50f0b..c40a79a 100644
--- a/reed_solomon.py
+++ b/reed_solomon.py
@@ -23,34 +23,27 @@ def get_possibilities(l: list):
 	return p
 
 def lagrange_compute(l: list) -> polynome:
-	poly = [0] * len(l)
-	for x_i, y_i in l:
-		#Produit des coeffs
-		coeff = [0] * len(l)
-		
-		denominator = 1
-		for j in range(len(l)):
-			if x_i != j:
-				denominator *= x_i - l[j][0]
-		coeff[0] = 1 / denominator #Produit de chaque denominateur
-
-		for k in range(len(l)):
-			new_coeff = [0] * (len(l)+1)
-			if x_i != k:
-				for j in range(k+1 if k<x_i else k, 0, -1):
-					new_coeff[j+1] += coeff[j]
-					new_coeff[j] -= l[k][0] * coeff[j]
-			coeff = new_coeff
-
-		#Somme des coeffs
-		for s in range(len(l)):
-			poly[s] += y_i * coeff[s]
+	poly_l = [0] * len(l)
+	poly = polynome(poly_l)
+	for x_i, y_i in enumerate(l):
+		poly_n = polynome([1])
+		for x_k, y_k in enumerate(l):
+			if x_k != x_i:
+				#print(f"value : {x_i - x_k}")
+				d = inverse_mult(x_i-x_k, poly_n.prime_mod)
+				#print(f"inverse : {d}")
+				#poly_n = poly_n.mul(polynome([-x_k / (x_i-x_k), 1 / (x_i-x_k)]))
+				poly_n = poly_n.mul(polynome([-x_k * d % poly_n.prime_mod, d % poly_n.prime_mod]))
+				#poly_n.show()
+		poly_n = poly_n.mul(polynome([y_i[1] % poly_n.prime_mod]))
+		poly = poly.add(poly_n)
 	return poly
 
 def check_nb_error(l: list, p: polynome) -> int:
 	pass
 
 if __name__ == '__main__':
-	list_ = [(0, 1), (1, 2), (2, 3)]
+	list_ = [(0, 2), (1, 4), (2, 8)]
 	poly = lagrange_compute(list_)
-	print(poly)
+	poly.show()
+	print(poly.evaluate(1))
-- 
GitLab