Séance 8#
Objectifs
Polynômes
Réduction matricielle
Polynômes#
Anneau de polynômes#
Avant de construire un polynôme, il faut définir la structure algébrique qui le contient, à savoir un anneau de polynômes. Le constructeur de cet anneau se nomme PolynomialRing. Pour l’utiliser, il faut choisir dans quelle structure vivent les coefficients de ces polynômes, et également un nom d’affichage pour la 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 :
A = PolynomialRing(ZZ, "X")
print(A)
Univariate Polynomial Ring in X over Integer Ring
Observons que, dans ce cas, la variable X n’est pas encore déclarée. On doit donc la définir nous-même :
X = A.gen()
print(X)
X
Remarque. Par commodité (mais pas par simplicité…), il existe une manière de déclarer simultanément un anneau de polynômes et sa variable :
B.<Y> = PolynomialRing(ZZ)
print(B)
print(Y)
Univariate Polynomial Ring in Y over Integer Ring
Y
Construction de polynômes#
Il existe essentiellement deux manières de construire un polynôme :
en appliquant des opérations élémentaires sur la variable
X(somme, puissances, etc.),en fournissant une liste de coefficents au constructeur de l’anneau de polynômes
A.
Méthode 1. Les opérations usuelles sur les polynômes permettent de définir un polynôme dans SageMath. Par exemple pour le polynôme \(P(X) = X^3 - 2X + 1\) :
P = X**3 - 2 * X + 1
print(P)
X^3 - 2*X + 1
Méthode 2. En construisant la liste de coefficients de \(P\) (dans l’ordre croissant des degrés), et la donnant en paramètre du constructeur de A, on obtient le même résultat :
P = A([1, -1, 0, 1])
print(P)
X^3 - X + 1
Observons que la classe parente de P est bien l’anneau de polynômes créé précédemment, et ses coefficients sont bien des entiers (on accède à l’anneau des coefficients par la méthode base_ring()).
print(P.parent())
print(P.base_ring())
Univariate Polynomial Ring in X over Integer Ring
Integer Ring
Remarque : un meilleur affichage graphique peut être obtenu avec la commande show.
# show(P)
Opérations usuelles#
On peut calculer des sommes, des produits, et multiplier des polynômes entre eux ou par des scalaires par les opérateurs usuels :
P1 = X**3 - 2 * X + 1
P2 = X**2 - 5
print(P1 + P2)
print(P1 * P2)
print( - 3 * P1**2)
X^3 + X^2 - 2*X - 4
X^5 - 7*X^3 + X^2 + 10*X - 5
-3*X^6 + 12*X^4 - 6*X^3 - 12*X^2 + 12*X - 3
Il est également possible de composer des polynômes et de leur appliquer des opérations arithmétiques comme le reste de la division euclidienne :
Q = P(X**2 - 1)
R = Q % (X**2 - 1)
print("Q =", Q)
print("R =", R)
Q = X^6 - 3*X^4 + 2*X^2 + 1
R = 1
Observons que l’opérateur // effectue bien la division euclidienne des polynômes, tandis que / calcule une fraction rationnelle :
print(Q // (X**2 - 1))
print(Q / (X**2 - 1))
X^4 - 2*X^2
(X^6 - 3*X^4 + 2*X^2 + 1)/(X^2 - 1)
Les calculs de pgcd et de ppcm sont également possibles :
P = (X-1)*(X-2)
Q = (X-1)*(X-3)
print(gcd(P, Q))
print(lcm(P, Q))
X - 1
X^3 - 6*X^2 + 11*X - 6
Accès aux coefficients et autres propriétés#
Pour retrouver les coefficients d’un polynôme, il faut faire attention. La commande de base ne retourne que les coefficients non-nuls, dans l’ordre de degré croissant :
P = X**12 - 3*X**3 + 1
print(P)
print(P.coefficients())
X^12 - 3*X^3 + 1
[1, -3, 1]
Si l’on souhaite la liste de tous les coefficients (y compris les \(0\) intermédiaires), il faut ajouter l’argument sparse=False.
print(P.coefficients(sparse=False))
[1, 0, 0, -3, 0, 0, 0, 0, 0, 0, 0, 0, 1]
Ensute, on peut accéder au coefficient associé au monôme d’un certain degré, comme si on raisonnait avec une liste :
P[2]
0
Enfin, il existe des méthodes pour obtenir le degré d’un polynôme, son coefficient dominant, et son coefficient constant.
print(P.degree())
print(P.leading_coefficient())
print(P.constant_coefficient())
12
1
1
Opérations plus avancées#
Dérivation. Pour dériver un polynôme, on utilise la méthode derivative().
P = X**4 - X
P.derivative()
4*X^3 - 1
Factorisation. On peut également essayer de factoriser un polynôme dans la structure à laquelle il appartient (donc ici, dans \(\mathbb{Z}[X]\)).
P.factor()
(X - 1) * X * (X^2 + X + 1)
Évaluation. On peut évaluer un polynôme en une entrée, c’est-à-dire substituer la variable par une valeur et effectuer le calcul correspondant. Pour cela, on utilise la syntaxe naturelle :
P(1)
0
Notons qu’on peut évaluer un polynôme sur un élément d’un type autre que celui de l’anneau de ses coefficents. Il faut néanmoins que Sagemath sache effectuer les opérations entre les coefficients et la valeur de substitution.
P(1/2)
-7/16
Racines. Il existe une fonction générique pour obtenir les racines d’un polynôme. Cette fonction retourne la liste des racines appartenant à l’anneau des coefficients du polynôme considéré, avec leur multiplicité d’annulation.
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, et non le corps des rationnels.
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)]
Pour obtenir davantage de racines, on peut préciser l’anneau dans lequel on souhaite des obtenir. Par exemple, pour avoir toutes les racines rationnelles, on ajouter le corps des rationnels en argument optionnel de la méthode roots :
P.roots(QQ)
[(4, 1), (1/2, 1), (1/3, 1)]
Affichage graphique. Enfin, pour tracer le graphe d’un polynôme, il y a toujours la fonction plot() :
plot(P, xmin=-0.5, xmax=4.5)
Application : réduction matricielle, algèbre matricielle#
Soit \(M\) la matrice \(3 \times 3\) à coefficients entiers (donc rationnels) suivante :
On veut étudier si \(M\) est diagonalisable, et si c’est le cas, la diagonaliser.
M = matrix(QQ, 3, 3, [8, -2, -7, -12, 3, 12, 2, -2, -1 ])
print(M)
[ 8 -2 -7]
[-12 3 12]
[ 2 -2 -1]
Pour cela, on peut calculer son polynôme caractéristique, puis chercher ses racines :
P = M.characteristic_polynomial()
print(P)
print(P.roots())
x^3 - 10*x^2 + 27*x - 18
[(6, 1), (3, 1), (1, 1)]
On observe que le polynôme caractéritique a \(3\) racines simples distinctes : la matrice est donc diagonalisable. Notons que l’on aurait pu tester si \(M\) est diagonalisable directement avec la méthode is_diagonalizable(), et calculer ses valeurs propres directement avec la méthode eigenvalues().
print(M.is_diagonalizable())
valeurs_propres = M.eigenvalues()
print(valeurs_propres)
True
[6, 3, 1]
Diagonalisation effective. La diagonalisation peut se faire « à la main » (en calculant une base de vecteurs propres avec les méthodes d’algèbre linéaire de la semaine passée), mais on va se l’épargner. En effet, la méthode diagonalization() nous donne directement le résultat sous la forme d’un couple de matrices \((D, A)\), de sorte que \(D\) est diagonale et \(M = A D A^{-1}\).
D, A = M.diagonalization()
print("A =")
print(A)
print("\nD =")
print(D)
print("\nVérification :")
print(A * D * A**(-1))
A =
[ 1 1 1]
[-4/3 -1 0]
[ 2/3 1 1]
D =
[6 0 0]
[0 3 0]
[0 0 1]
Vérification :
[ 8 -2 -7]
[-12 3 12]
[ 2 -2 -1]
Remarque. Il est également possible d’obtenir la liste des sous-espaces propres :
print(M.eigenspaces_right())
[
(6, Vector space of degree 3 and dimension 1 over Rational Field
User basis matrix:
[ 1 -4/3 2/3]),
(3, Vector space of degree 3 and dimension 1 over Rational Field
User basis matrix:
[ 1 -1 1]),
(1, Vector space of degree 3 and dimension 1 over Rational Field
User basis matrix:
[1 0 1])
]
Récapitulatif des instructions à connaître#
Tableau récapitulatif de quelques instructions à connaître sur les polynômes :
Méthode, fonction, instruction |
Description |
|---|---|
|
Crée et stocke dans |
|
Stocke dans |
|
Crée le polynôme dont les coefficients sont donnés par |
|
Opérations arithmétiques élémentaires |
|
Pgcd et ppcm de deux polynômes |
|
Liste des coefficients du polynômes |
|
Coefficient de degré |
|
Degré du polynôme |
|
Dérivé d’ordre |
|
Évaluation du polynôme |
|
Racines du polynôme |
Tableau récapitulatif des instructions à connaître pour la réduction de matrices :
Méthode, fonction, instruction |
Description |
|---|---|
|
Polynômes caractéristique d’une matrice |
|
Valeurs propres d’une matrice |
|
Retourne |
|
Retourne la diagonalisation de |