# -*- coding: utf-8 -*-
"""
Created on Fri Dec  5 10:02:20 2025

@author: arnau
"""
import numpy as np
from numpy.polynomial import Polynomial

import matplotlib.pyplot as plt


#%% Polynomes avec Python

P = Polynomial([-3,2,0,1]) # défini -3+2X+X^3
print('La commande P.coef donne ' , P.coef)
print('La commande P.degree() donne ' , P.degree())

Q = Polynomial([1,0,-2,0,1]) # defini 1-2X^2+X^4
print('La commande Q.coef donne ' , Q.coef)
print('La commande Q.degree() donne ' , Q.degree())


print('Les coefficients de PQ sont' , (P*Q).coef)
print('Les coefficients de P+Q sont' , (P+Q).coef)

print('La commande Q(np.array([-1,0,1])) donne :',Q(np.array([-1,0,1])))

#%% Les maths du décodage

def Poly_elem(a,b):
    return Polynomial([-b/(a-b),1/(a-b)])

L0 = Poly_elem(0,1)*Poly_elem(0,4)
L1 = Poly_elem(1,0)*Poly_elem(1,4)
L2 = Poly_elem(4,0)*Poly_elem(4,1)


def Lagrange(X,i):
    L = 1
    for k in range(len(X)):
        if k != i:
            L = L*Poly_elem(X[i],X[k])
    return L

print((L0-Lagrange([0,1,4],0)).coef) # on constate qu'on obtient le polynome nul
print((L1-Lagrange([0,1,4],1)).coef) # on constate qu'on obtient le polynome nul
print((L2-Lagrange([0,1,4],2)).coef) # on constate qu'on obtient le polynome nul


def test(X,i):
    L = Lagrange(X,i)
    return [L(X[k]) for k in range(len(X))]

def comb_lin(X,a,b,c):
    P = Polynomial([c,b,a])
    Q = 0
    for k in range(3):
        Q = Q+P(X[k])*Lagrange(X,k)
    return (P-Q).coef
#%% Decodage

Fragments = [[k,P(k)] for k in range(0,12)]

def decode(Fragments):
    n = len(Fragments)
    X = [ frag[0] for frag in Fragments]
    Y = [ frag[1] for frag in Fragments]
    P = 0
    for k in range(n):
        P = P+ Y[k]*Lagrange(X,k)
    return P.coef




#%% Code du coffre


def codage(code,n):
    P = Polynomial(code)
    Fragments = []
    X = [0.5+k*0.5 for k in range(-n,n+1)]
    for x in X:
        Fragments.append([x,P(x)])
    return Fragments

Fragments_coffre = codage([3,1,4],24)

