diff --git a/polynome.py b/polynome.py index 6d28631c74b38f487501928222de40153c487b2f..2f8be27262a6a75eb5588d80c73ed755629eb62f 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 b2f1aba4e4f248f9a34e87ec2f8aba20e4675863..cd7c2f3a8044c1e6957257beb014d0caa310375e 100644 --- a/reed_solomon.py +++ b/reed_solomon.py @@ -1,5 +1,6 @@ # Created on 09/12/2021 from polynome import * +from inverse_mult import * from itertools import combinations def get_possibilities(l: list): @@ -22,7 +23,17 @@ def get_possibilities(l: list): return p def lagrange_compute(l: list) -> polynome: - pass + 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: + d = inverse_mult((x_i-x_k) % poly_n.prime_mod, poly_n.prime_mod) + poly_n = poly_n.mul(polynome([-x_k * d % poly_n.prime_mod, d % poly_n.prime_mod])) + 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: @@ -31,4 +42,4 @@ def check_nb_error(l: list, p: polynome) -> int: if (item % p.prime_mod) != (p.evaluate(_) % p.prime_mod): print(f"DEBUG PURPOSES ONLY {item} != p.evaluate({_}) = {p.evaluate(_)}") nbr_error += 1 - return nbr_error \ No newline at end of file + return nbr_error