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