#####################################################################
     # DEFINITION ET REPRESENTATION DES POLYNÔMES EN LANGAGE PYTHON
#####################################################################


# Vous trouverez dans ce fichier quelques points de programmation en Python, qui pourront être utiles pour le PBS9

# ILLUSTRATION 1 - Deux manières de définir un polynôme
# ILLUSTRATION 2 - Opérations sur les polynômes
# ILLUSTRATION 3 - Définir un polynôme par la liste de ses racines
# ILLUSTRATION 4 - Tracer la courbe représentative d'un polynôme

# Préambule: avant toute chose...

import matplotlib.pyplot as plt # Import de la bibliothèque "graphique" de Python (pour tracer des courbes représentatives)
import numpy as np # Import de la bibliothèque numpy (pour les polynômes)


######### ILLUSTRATION 1 - Deux manières de définir un polynôme

# Méthode 1 - Avec la liste des coefficients

P = np.poly1d([2,3,4]) # Définit: P = 2X^2 + 3X + 4
# Dans le shell, on obtient alors:
#>>> P
#   poly1d([2, 3, 4])


# Méthode 2 - Avec la liste de ses racines

Q = np.poly1d([2,3,4],True) # Définit: Q = (X-2)(X-3)(X-4)
# Dans le shell, on obtient alors:
#>>> Q
#   poly1d([  1.,  -9.,  26., -24.])
# Ce qui signifie que Q = X^3 - 9X^2 + 26X - 24 ("la machine retourne la forme développée de Q")

######### ILLUSTRATION 2 - Opérations sur les polynômes (syntaxe)

# Somme de deux polynômes P et Q:  P + Q
# Multiplication d'un polynôme P par un scalaire (3 par exemple): 3 * P
# Evaluation d'un polynôme P en un réel (2 par exemple): P(2)

######### ILLUSTRATION 3 - Définir un polynôme par la liste de ses racines

# Généralisation de la méthode 2
# On construit une liste, par exemple la liste des carrés des entiers entre 0 et 6

liste_rac = [k**2 for k in range(7)] # Ainsi: liste_rac = [0, 1, 4, 9, 16, 25, 36]

# On définit le polynôme (unitaire) R ayant pour racines les éléments de liste_rac en posant:

R = np.poly1d(liste_rac,True)

######### ILLUSTRATION 4 - Tracer la courbe représentative d'un polynôme

# Dans cet exemple, on se propose de tracer la courbe représentative de S = X(X-1)(X-2)(X-3)(X-4)
# sur l'intervalle [-1,5] par exemple


# 1/ Définition de S

liste_racS = [k for k in range(5)]
S = np.poly1d(liste_racS,True)


# 2/ Préparation du graphique

NPTS = 1000 # Nombre de points sur la "courbe" représentative
xmin = -1 # Comme son nom le suggère assez bien...
xmax = 5 #
h = (xmax-xmin)/NPTS # Définition du pas
plt.clf(); # Initialisation de la fenêtre graphique
axes = plt.gca() # Style des axes
plt.grid(True) # Grille de fond
axes.set_xlim(xmin, xmax) # Valeurs limites de l'abscisse
axes.set_ylim(-4, 4) # Valeurs limites de l'ordonnée


# 3/ Création de la liste des abscisses (subdivision de l'intervalle [xmin, xmax])

x = xmin
LABS = [x]
for k in range(NPTS):
    x = x+h
    LABS = LABS + [x]


# 4/ Création de la liste des ordonnées (images de S aux points de la subdivision)

LORD = []
for k in range(len(LABS)):
    LORD = LORD + [ S(LABS[k]) ]


# 5/ Affichage du graphique

plt.plot(LABS, LORD)
plt.show();


############ FIN ############