import numpy as np
import random as rd

P=[3,2,1]
Q=[-4,1]

#création d'un polynôme de R_n[X] :
def Creer(n):
    return [0]*(n+1)

#degré d'un polynôme :
def Degre(P):
    #P est une liste contenant les coefficients d'un polynôme
    d=len(P)-1
    while d>=0 and P[d]==0:
        d=d-1
    if d==-1:
        return -np.inf
    return d

#multiplier une polynôme par un scalaire :
def Scalaire(P,s):
    R=Creer(Degre(P))
    for k in range(len(R)):
        R[k]=P[k]*s
    return R

#somme de deux polynômes :
def Additionner(P,Q):
    long=max(len(P),len(Q))
    S=Creer(long-1)
    #polynôme de la même taille que S qui coïncide avec P :
    P1=Creer(long-1)
    for k in range(len(P)):
        P1[k]=P[k]
    #polynôme de la même taille que S qui coïncide avec Q :
    Q1=Creer(long-1)
    for k in range(len(Q)):
        Q1[k]=Q[k]
#Addition :
    for k in range(long):
        S[k]=P1[k]+Q1[k]
    return S

#Produit de deux polynômes:

def Multiplier(P,Q):
    if Degre(P)==-np.inf or Degre(Q)==-np.inf:
        return [0]
    M=Creer(Degre(P)+Degre(Q))
    for i in range(Degre(P)+1):
        for j in range(Degre(Q)+1):
            M[i+j]=M[i+j]+P[i]*Q[j]
    return M

#Variante :

def Produit(P,Q):
    if Degre(P)==-np.inf or Degre(Q)==-np.inf:
        return [0]
    #degré du produit :
    deg=Degre(P)+Degre(Q)
    R=Creer(deg)
    #polynôme de la même taille que R qui coïncide avec P :
    P1=Creer(deg)
    for k in range(len(P)):
        P1[k]=P[k]
    #polynôme de la même taille que R qui coïncide avec Q :
    Q1=Creer(deg)
    for k in range(len(Q)):
        Q1[k]=Q[k]

    for i in range(deg+1):
        for j in range(i+1):
            R[i]=R[i]+P1[j]*Q1[i-j]
    return R

#intégration d'un polynôme :
def Integrer(P):
    if Degre(P)==-np.inf:
        return [1]
    Q=Creer(Degre(P)+1)
    for k in range(1,len(Q)):
        Q[k]=P[k-1]/k
    return Q

#évaluation d'un polynôme en un réel x :
def Evaluer(P,x):
    p=1 #pour calculer la puissance de x
    R=0
    for k in range(len(P)):
        R=R+P[k]*p
        p=p*x
    return R



















