Skip to content
Snippets Groups Projects
Commit 7c3b173a authored by abivarma.kandiah's avatar abivarma.kandiah
Browse files

Lagrange compute don't work with mod

parent f4a4715f
No related branches found
No related tags found
1 merge request!10Resolve "Create Lagrange method"
...@@ -38,7 +38,7 @@ class polynome(): ...@@ -38,7 +38,7 @@ class polynome():
coeff_poly_res = [0] * (len(self.coefs) + len(poly_2.coefs) - 1) coeff_poly_res = [0] * (len(self.coefs) + len(poly_2.coefs) - 1)
for index_1, value_1 in enumerate(self.coefs): for index_1, value_1 in enumerate(self.coefs):
for index_2, value_2 in enumerate(poly_2.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) return polynome(coeff_poly_res)
def evaluate(self, x): def evaluate(self, x):
...@@ -46,4 +46,4 @@ class polynome(): ...@@ -46,4 +46,4 @@ class polynome():
res = 0 res = 0
for i in range(len(self.coefs) - 1, -1, -1): for i in range(len(self.coefs) - 1, -1, -1):
res = (res * x + self.coefs[i]) res = (res * x + self.coefs[i])
return res return res % self.prime_mod
...@@ -23,34 +23,27 @@ def get_possibilities(l: list): ...@@ -23,34 +23,27 @@ def get_possibilities(l: list):
return p return p
def lagrange_compute(l: list) -> polynome: def lagrange_compute(l: list) -> polynome:
poly = [0] * len(l) poly_l = [0] * len(l)
for x_i, y_i in l: poly = polynome(poly_l)
#Produit des coeffs for x_i, y_i in enumerate(l):
coeff = [0] * len(l) poly_n = polynome([1])
for x_k, y_k in enumerate(l):
denominator = 1 if x_k != x_i:
for j in range(len(l)): #print(f"value : {x_i - x_k}")
if x_i != j: d = inverse_mult(x_i-x_k, poly_n.prime_mod)
denominator *= x_i - l[j][0] #print(f"inverse : {d}")
coeff[0] = 1 / denominator #Produit de chaque denominateur #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]))
for k in range(len(l)): #poly_n.show()
new_coeff = [0] * (len(l)+1) poly_n = poly_n.mul(polynome([y_i[1] % poly_n.prime_mod]))
if x_i != k: poly = poly.add(poly_n)
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]
return poly return poly
def check_nb_error(l: list, p: polynome) -> int: def check_nb_error(l: list, p: polynome) -> int:
pass pass
if __name__ == '__main__': if __name__ == '__main__':
list_ = [(0, 1), (1, 2), (2, 3)] list_ = [(0, 2), (1, 4), (2, 8)]
poly = lagrange_compute(list_) poly = lagrange_compute(list_)
print(poly) poly.show()
print(poly.evaluate(1))
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment