Algo & Prog 1 Python : TP séance 04
- Rendu du TP sur Ametice :
- Suivez les instructions pour le rendu du TP en mettant le bon numéro de séance dans le nom du répertoire.
- N'oubliez pas de rendre votre travail à la fin de la séance comme indiqué, même si vous n'avez pas fini la planche de TP, puis de rendre la version finale avant le début de la séance suivante.
Exercice 1. Classe polynôme
On se propose d'écrire une classe de façon à représenter et manipuler un polynôme
\(c_0 + c_1 x + c_2 x^2 + \ldots + c_n x^n\),
à l'aide d'une liste coeffs
telle que coeffs[i]
= \(c_i \;\forall i\).
Pour chaque question, écrire aussi un programme principal permettant de tester la méthode. On ne rendra qu'un seul fichier comprenant : la classe comprenant toutes les méthodes, et un programme principal fonctionnel dans lequel il y aura tous les tests.
1.a. Déclaration
Écrire une classe Polynome
dont le constructeur reçoit en
paramètre une liste coeffs
de coefficients, puis la stocke en attribut.
Exemple de test :
>>> p = Polynome([-1,0,2,1])
>>> p.coeffs
[-1, 0, 2, 1]
1.b. Représentation
Rajouter une méthode __str__
qui renvoie une chaîne de caractères
représentant le polynôme, sous la forme
"
\(c_n\)x^n + ... +
\(c_1\)x +
\(c_0\)"
,
en remplaçant les coefficients \(c_i\) par leur valeur.
Ceci permettra d'avoir un affichage correct avec print()
.
Exemple d'usage :
>>> p = Polynome([-1,0,2,1])
>>> str(p) # ceci appelle p.__str__()
1 x^3 + 2 x^2 + 0 x + -1
>>> print(p) # ceci appelle print(p.__str__())
1 x^3 + 2*x^2 + 0 x + -1
1.c. Degré
Définissez une méthode get_degre
qui renvoie le degré du polynôme,
qui est la longueur de la liste coeffs
diminuée de 1.
Définissez une méthode set_degre(n)
1 qui écrase l'attribut coeffs
actuel par une liste d'éléments à zéro de longueur n+1
.
Exemple d'usage :
>>> p = Polynome([-1,0,2,1])
>>> p.get_degre()
3
>>> p.set_degre(2)
>>> p.get_degre()
2
>>> print(p)
0 x^2 + 0 x + 0
1.d. Coefficient
Définissez le méthode __getitem__
pour obtenir un coefficient du polynôme.
Émettez une exception ValueError
si l'indice passé en paramètre
n'est pas de type entier.
Renvoyez 0 (sans émettre d'exception) si l'indice n'est pas entre 0 et le degré
du polynôme (cela simplifiera le code dans la suite).
Définissez ensuite la méthode __setitem__
pour modifier un coefficient du
polynôme.
Émettez une exception ValueError
si l'indice passé en paramètre
n'est pas de type entier, ou si l'indice
n'est pas entre 0 et le degré du polynôme.
Exemple d'usage :
>>> p = Polynome([-1,0,2,1])
>>> p[3] # ceci appelle p.__getitem__(3)
1
>>> p[6] # ceci appelle p.__getitem__(6)
0
>>> p[3] = 4 # ceci appelle p.__setitem__(3, 4)
>>> print(p)
4 x^3 + 2 x^2 + 0 x + -1
>>> p[4] = 1 # ceci appelle p.__setitem__(4, 1)
ValueError: mauvais indice 4, doit être entre 0 et 3
1.e. Évaluation
Rajouter une méthode evaluer(x)
1 qui reçoit en paramètre une
valeur x
, évalue le polynôme en x
avec la méthode de Horner, puis
renvoie le résultat.
On rappelle que la méthode de Horner consiste à calculer dans cet ordre
depuis les parenthèses les plus intérieures, en effectuant donc \(n\) multiplications et \(n\) additions.
Exemple d'usage :
>>> p = Polynome([-1,0,2,1])
>>> p.evaluer(0) # -1
>>> p.evaluer(1) # 2
>>> p.evaluer(5) # 174
1.f. Dérivation
Rajouter une méthode deriver()
qui calcule les coefficients de la
dérivée du polynôme, instancie un nouveau polynôme avec ces coefficients
puis le renvoie.
Exemple d'usage :
>>> p = Polynome([-1,0,2,1])
>>> print(p)
1 x^3 + 2*x^2 + 0 x + -1
>>> q = p.deriver()
>>> print(q)
3 x^2 + 4 x + 0
1.g. La dérivée s'annule
Rajouter une méthode derivee_s_annule(x)
1 qui calcule la dérivée
à l'aide de la méthode précédente, l'évalue en x
puis renvoie True
si
elle vaut 0, sinon False
.
Exemple d'usage :
>>> p = Polynome([-1,0,2,1])
>>> p.derivee_s_annule(1)
False
>>> p.derivee_s_annule(0)
True
>>> p.derivee_s_annule(-4/3)
True
1.h. Addition et soustraction
Surchargez les méthodes __add__
et __sub__
de manière à pouvoir additionner
ou soustraire 2 polynômes.
Rajoutez une garde pour vérifier que le membre de droit est bien une instance
de Polynome
.
Attention au cas où les polynômes n'ont pas le même degré.
Exemple d'usage :
>>> p = Polynome([-1, 0, 2, 1])
>>> q = Polynome([ 3, 1,-5, 7, 9])
>>> r = p+q
>>> print(r)
9 x^4 + 8 x^3 + -3 x^2 + 1 x + 2
>>> print(r-q)
0 x^4 + 1 x^3 + 2 x^2 + 0 x + -1
1.i. Auto-addition et soustraction
Même question avec les méthodes __iadd__
et __isub__
.
Exemple d'usage :
>>> p = Polynome([-1, 0, 2, 1])
>>> q = Polynome([ 3, 1,-5, 7, 9])
>>> p += q
>>> print(p)
9 x^4 + 8 x^3 + -3 x^2 + 1 x + 2
>>> p -= q
>>> print(p)
0 x^4 + 1 x^3 + 2 x^2 + 0 x + -1
1.j. Multiplication
Même question avec les méthodes __mul__
et __imul__
pour permettre
la multiplication par un scalaire (entier ou réel) ou par un autre polynôme.
Exemple d'usage :
>>> p = Polynome([-1, 0, 2, 1])
>>> print(p*2)
2 x^3 + 4*x^2 + 0 x + -2
>>> p *= -1
>>> print(p)
-1 x^3 + -2*x^2 + 0 x + 1
>>> p = Polynome([-1, 0, 2, 1])
>>> q = Polynome([ 3, 1,-5, 7, 9])
>>> print(p*q)
9 x^7 + 25 x^6 + 9 x^5 + -18 x^4 + -2 x^3 + 11 x^2 + -1 x + -3
>>> p *= q
>>> print(p)
9 x^7 + 25 x^6 + 9 x^5 + -18 x^4 + -2 x^3 + 11 x^2 + -1 x + -3