Feuille d’exercices 8 – avancé#
Objectifs
Polynômes
Réduction matricielle
Avertissement
Ces exercices sont prévus pour les étudiant·e·s ayant déjà réussi la feuille d’exercices « classiques ».
Exercice 5 : représentation symbolique de racines#
Question 1. Construire le polynôme \(P(X) = X^2 - 2\) à coefficients entiers, puis vérifier qu’il n’a aucune solution rationnelle (dans \(\mathbb{Q}\)) mais deux solutions réelles que l’on réprésentera comme des flottants de RR.
Poly_ZZ = PolynomialRing(QQ, "X")
X = Poly_ZZ.gen()
P = X**2 - 2
Poly_QQ = PolynomialRing(QQ, "X")
Poly_RR = PolynomialRing(RR, "X")
P_QQ = Poly_QQ(P)
P_RR = Poly_RR(P)
print(P_QQ.roots())
print(P_RR.roots())
[]
[(-1.41421356237310, 1), (1.41421356237310, 1)]
On souhaite maintenant voir les racines de \(P\) comme \(\pm \sqrt{2}\) en manipulant la valeur exacte de cette expression. Pour cela, Sagemath possède un anneau particulier, noté SR (pour Symbolic Ring) : celui des expressions symboliques.
Question 2. Calculer les racines de \(P\) dans SR. Stocker l’une de ces racines dans une variable r, puis l’élever au carré, et vérifier qu’on obtient bien la valeur exacte \(2\).
L = P.roots(SR)
print(L)
r = L[0][0]
print(r)
print(r.parent())
d = r**2
print(d)
[(-sqrt(2), 1), (sqrt(2), 1)]
-sqrt(2)
Symbolic Ring
2
Question 3. Même question avec \(Q(X) = X^2 + 2\).
Q = X**2 + 2
L = Q.roots(SR)
L
[(-I*sqrt(2), 1), (I*sqrt(2), 1)]
Question 4. Soit \(A(X) = X^4 - X^2 + X - 1\). Trouver une expression symbolique des racines de \(A\). On pourra obtenir une meilleure visualisation de cette expression grâce à la fonction show().
A = X**4 - X**2 + X - 1
L = A.roots(SR)
# show(L)
Exercice 6 : décomposition de polynôme pair/impair#
Un polynôme est pair si tous ses coefficients de degré impair sont nuls. Il est impair si ses coefficients de degré pair sont tous nuls.
Question 1 : Écrire une fonction est_pair(P) qui teste si un polynôme P est pair.
def est_pair(P):
return all(P[i] == 0 for i in range(1, P.degree()+1, 2))
R.<X> = PolynomialRing(ZZ, "X")
print(est_pair(X**2 + X + 1))
print(est_pair(X**6 -3*X**2))
False
True
Question 2 : Tracer le graphe de plusieurs polynômes pairs sur un même graphique. Puis, expliquer quelle propriété géométrique ces polynômes respectent.
Voici une manière « automatisée » de produire ce genre de graphique :
# on définit une liste de 4 couleurs
colors = [ "blue", "red", "green", "orange"]
# on part du graphique vide
graphique = plot([])
# on va rajouter 4 tracés
for i in range(4):
# on tire un polynôme aléatoirement,
# et on le compose avec X^2 pour avoir un polynome pair
P = R.random_element()
Q = P(X**2)
# on vérifie que Q(X) est pair (au cas où)
if not(est_pair(Q)):
print("Erreur")
# on ajoute au graphique le graphe du i-ème polynôme avec la i-ème couleur
graphique += plot(Q, xmin =-2, xmax=2, ymin=-10, ymax=10, color=colors[i])
graphique.show()
On observe que tous les graphes sont symétriques par rapport à l’axe des ordonnées.
Question 3 : Reprendre les questions précédentes avec des polynômes impairs.
def est_impair(P):
return all(P[i] == 0 for i in range(0, P.degree()+1, 2))
R.<X> = PolynomialRing(ZZ, "X")
print(est_impair(X**3 + X))
print(est_impair(X**5 -3*X**2 + 2*X))
# on part du graphique vide
graphique = plot([])
# on va rajouter 4 tracés
for i in range(4):
# on tire un polynôme aléatoirement,
# et on le compose avec X^2 puis on le multiplie par X pour avoir un polynome pair
P = R.random_element()
Q = X * P(X**2)
# on vérifie que Q(X) est pair (au cas où)
if not(est_impair(Q)):
print("Erreur")
# on ajoute au graphique le graphe du i-ème polynôme avec la i-ème couleur
graphique += plot(Q, xmin =-2, xmax=2, ymin=-10, ymax=10, color=colors[i])
graphique.show()
True
False
On observe que tous les graphes sont symétriques par rapport à l’origine.
Décomposition paire/impaire. Tout polynôme \(F(X) \in \mathbb{R}[X]\) admet une unique décomposition sous la forme d’une somme d’un polynôme pair et d’un polynôme impair. Cette décomposition est donnée par : \(F(X) = P(X) + Q(X)\) où
Question 4 : Écrire une fonction decomposition(F) qui prend en entrée un polynôme F, et qui retourne sa décompositon en polynômes pair et impair sous la forme d’une liste de deux polynômes.
def decomposition(F):
return [ (F(X) + F(-X))/2, (F(X) - F(-X))/2 ]
F = R.random_element(11)
P, Q = decomposition(F)
print(est_pair(P) and est_impair(Q))
True