"""
RMS 2023 - 1095 - Structure euclidienne sur un espace de polynômes
"""

import numpy as np
import numpy.linalg as alg
from numpy.polynomial import Polynomial
import scipy.integrate as integr            

# projeté orthogonal de X**3 sur R_2[X]

def p_scal(P, Q):
    def f(t):
        return P(t)*Q(t)
    ps = integr.quad(f, 0, 1)[0]
    return ps
    
BCan = [ Polynomial([0]*i+[1]) for i in range(3) ]
P3 = Polynomial([0,0,0,1])

Gram = np.zeros((3,3))
for i in range(3):
    for j in range(3):
        Gram[i,j] = p_scal(BCan[i], BCan[j])
        
B = np.zeros(3)
for i in range(3):
    B[i] = p_scal(P3, BCan[i])
    
proj_P3 = Polynomial(alg.solve(Gram, B))

print(proj_P3.roots())

# le calcul des racines montre que ce polynôme de degré 2 est scindé sur R

# évaluation

def evaluer(Y, Lambda, Q):
    return np.sum(Lambda*Q(Y))