Aller au contenu

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

\[ ((...((c_n\,x + c_{n-1})\,x + c_{n-2})\,x + \ldots)\,x + c_1)\,x + c_0 \;, \]

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

  1. N'oubliez pas de rajouter self avant le ou les paramètres de la méthode.