Support de cours semaine 6 : polynômes

Lundi 07/03

Construction de polynômes

Avant de construire un polynôme, il définir la strcuture algébrique qui le contient, à savoir un anneau de polynômes. Pour cela, il faut choisir dans quelle structure vivent les coefficients de ces polynômes, et également un nom de variable.

Par exemple, si les coefficients sont des entiers relatifs et si l'on souhaite que la variable soit affichée comme X, alors on entre :

In [73]:
A = PolynomialRing(ZZ, "X")
A
Out[73]:
Univariate Polynomial Ring in X over Integer Ring

Observons que la variable X n'est pas encore déclarée.

In [74]:
# X

On la définit ainsi :

In [75]:
X = A.gen()
X
Out[75]:
X

Voici une manière de déclarer simultanément l'anneau de polynôme en Y et la variable Y.

In [76]:
B.<Y> = PolynomialRing(ZZ)
B
Out[76]:
Univariate Polynomial Ring in Y over Integer Ring
In [77]:
Y
Out[77]:
Y

Les opérations usuelles sur les polynômes sont déjà définies :

In [78]:
X + 2
Out[78]:
X + 2
In [79]:
P = X**3 - 2 * X + 1
P
Out[79]:
X^3 - 2*X + 1

On peut vérfifier que P est bien un élément de l'anneau A

In [80]:
print(P.parent() == A)
print(P in A)
True
True

Pour retrouver dans quel anneau les coefficients de $P$ sont définis, il y a la méthode .base_ring()

In [81]:
P.base_ring()
Out[81]:
Integer Ring

Il est également possible de composer des polynômes :

In [82]:
P(X**2 - 1)
Out[82]:
X^6 - 3*X^4 + X^2 + 2

Ou de leur appliquer des opérations arithmétiques :

In [83]:
P % (X**2 - 1)
Out[83]:
-X + 1
In [84]:
P // (X**2 - 1)
Out[84]:
X

Fonctions usuelles

Il existe une fonction générique pour obtenir les racines d'un polynôme. Cette fonction retourne les racines appartenant à l'anneau des coefficients du polynôme considéré. Dans l'exemple suivant, il est écrit que $4$ est une racine de $P(X)$ de multiplicité $1$. En revanche, les racines $1/2$ et $1/3$ sont omises, car $P$ a été défini sur l'anneau des entiers.

In [85]:
P = (X - 4) * (2*X - 1) * (3*X - 1)
print(P)
print(P.roots())
6*X^3 - 29*X^2 + 21*X - 4
[(4, 1)]

On peut évaluer un polynôme en une entrée :

In [86]:
P(1)
Out[86]:
-6
In [87]:
P(2)
Out[87]:
-30

Notons qu'on peut l'évaluer sur autre chose qu'un élément de l'anneau des coefficents de $P$ :

In [88]:
P(1/2)
Out[88]:
0

Pour obtenir davantage de racines, on peut préciser l'anneau dans lequel on souhaite des obtenir, ici les rationnels :

In [89]:
P.roots(QQ)
Out[89]:
[(4, 1), (1/2, 1), (1/3, 1)]

On peut également essayer de factoriser un polynôme dans la structure à laquelle il appartient (donc ici, dans $\mathbb{ZZ}[X]$)

In [90]:
P.factor()
Out[90]:
(X - 4) * (2*X - 1) * (3*X - 1)

Pour dériver un polynôme :

In [91]:
P.derivative()
Out[91]:
18*X^2 - 58*X + 21

Pour calculer un pgcd :

In [92]:
gcd(P, X**2-1)
Out[92]:
1

Pour retrouver les coefficients d'un polynômes, il faut faire attention. La commande de base ne retourne que les coefficients non-nuls, dans l'ordre de degré de croissant :

In [93]:
print(P)
print(P.coefficients())
6*X^3 - 29*X^2 + 21*X - 4
[-4, 21, -29, 6]

Si l'on souhaite la liste de tous les coefficients (avec les $0$), il faut ajouter l'argument  sparse=False.

In [94]:
Q = 2 * X**10 + 1
print(Q.coefficients())
print(Q.coefficients(sparse=False))
[1, 2]
[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2]

Si l'on souhaite obtenir le coefficient du monôme de degré $i = 2$ d'un polynôme :

In [95]:
P[2]
Out[95]:
-29

Les commandes pour obtenir le degré d'un polynôme, son efficient dominant, et son coefficient constant

In [96]:
print(P.degree())
print(P.leading_coefficient())
print(P.constant_coefficient())
3
6
-4

Enfin, pour tracer le graphe d'un polynôme, il y a toujours la fonction plot() :

In [104]:
plot(P, xmin=-0.5, xmax=4.5)
Out[104]:
In [ ]: