from numpy.polynomial import Polynomial
import numpy as np

# 2)
def Calcul(n) :
    if n==0 : return np.sqrt(np.pi)
    elif n%2==1 : return 0
    else : return (n-1)/2*Calcul(n-2)

# 3)
def ps(P,Q) :
    R = P*Q
    n = len(R.coef)
    return sum([R.coef[k]*Calcul(k) for k in range(n)])

# 4)
def Poly1(n) :
    if n==0 : return Polynomial([1])
    else : return Poly1(n-1).integ(1,-Poly1(n-1).integ(2)(1))
for n in range(6) : print(Poly1(n).coef)
print('produits scalaires :')
for n in range(6) : print([ps(Poly1(n),Poly1(k)) for k in range(n+1)])
# cette question n'a pas d'autre intérêt que l'utilisation de .integ ;o)

# 5)
def Poly2(n) :
    if n==0 : return Polynomial([1])
    elif n==1 : return Polynomial([0,-2])
    else : return Poly2(n-1)*Polynomial([0,-2])-2*(n-1)*Poly2(n-2)
for n in range(6) : print(Poly2(n).coef)
print('produits scalaires :')
for n in range(6) : print([ps(Poly2(n),Poly2(k)) for k in range(n+1)])
# les polynômes de Hermite forment une base orthogonale :o)
