• Aucun résultat trouvé

Systèmes polynomiaux et idéaux

Dans le document Calcul mathématique avec Sage (Page 195-200)

Systèmes polynomiaux 9

9.2 Systèmes polynomiaux et idéaux

Nous abordons à présent le sujet central de ce chapitre. Les sections 9.2.1et 9.2.2offrent un panorama des manières de trouver et de comprendre les solutions d’un système d’équations polynomiales avec l’aide de Sage. La section9.2.3 est consacrée aux idéaux associés à ces systèmes. Les sec-tions suivantes reviennent de façon plus détaillée sur les outils d’élimination algébrique et de résolution de systèmes.

9.2.1 Un premier exemple

Reprenons le système polynomial de la section 2.2,

x2yz= 18 xy3z= 24 xyz4 = 6.

(9.1)

La fonction solve() deSagenous avait permis de trouver numériquement 17 solutions distinctes. Pour l’une d’elles, il est facile de deviner la valeur exacte (3,2,1), dont on vérifie immédiatement qu’elle est bien solution.

Quid des seize solutions restantes ? Voyons commentSage parvient à résoudre le système de façon exacte, et, avec un peu d’aide de l’utilisateur, à trouver des formes closes simples pour toutes les solutions3.

Énumérer les solutions. Commençons par traduire le problème en termes plus algébriques, en construisant l’idéal deQ[x, y, z] engendré par les équa-tions :

sage: R.<x,y,z> = QQ[]

sage: J = R.ideal(x^2 * y * z - 18,

... x * y^3 * z - 24,

... x * y * z^4 - 6);

Comme nous le verrons dans la section 9.2.3, la commande suivante nous permet de vérifier que l’idéal J est de dimension zéro, c’est-à-dire que le système (9.1) possède un nombre fini de solutions dansC3 :

sage: J.dimension() 0

3. Le propos étant d’illustrer les outils de résolution de systèmes polynomiaux, nous négligeons la possibilité de ramener (9.1) à des équations linéaires en passant au logarithme !

BR

OUILLON

Ceci établi, le premier réflexe est d’utiliser la méthodevariety, qui calcule toutes les solutions du système. Sans paramètre, elle donne les solutions dans le corps de base de l’anneau de polynômes :

sage: J.variety() [{y: 2, z: 1, x: 3}]

La solution (3,2,1) déjà trouvée est donc l’unique solution rationnelle.

L’étape suivante est d’énumérer les solutions complexes. Afin de le faire de façon exacte, nous travaillons dans le corps des nombres algébriques. Nous retrouvons les 17 solutions :

sage: V = J.variety(QQbar) sage: len(V)

17

Explicitement, les trois dernières ont l’allure suivante : sage: V[-3:]

[{z: 0.9324722294043558? - 0.3612416661871530?*I, y: -1.700434271459229? + 1.052864325754712?*I, x: 1.337215067329615? - 2.685489874065187?*I}, {z: 0.9324722294043558? + 0.3612416661871530?*I,

y: -1.700434271459229? - 1.052864325754712?*I, x: 1.337215067329615? + 2.685489874065187?*I}, {z: 1, y: 2, x: 3}]

Chaque point solution est donné par un dictionnaire dont les clés sont les générateurs de QQbar['x,y,z'] (et non de QQ['x,y,z'], d’où un petit détour pour y accéder ci-dessous), et les valeurs associées, les coordonnées du point. Hors celle de la solution rationnelle identifiée précédemment, les premières coordonnées sont toutes des nombres algébriques de degré 16 :

sage: (xx, yy, zz) = QQbar['x,y,z'].gens() sage: [ pt[xx].degree() for pt in V ]

[16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 1]

Calculer avec les solutions et identifier leur structure. Nous avons obtenu une représentation exacte des solutions complexes du système (9.1), mais cette représentation n’est pas franchement explicite. Ce n’est pas grave : disposer des coordonnées comme éléments deQQbarsuffit à poursuivre les calculs exacts dessus.

Par exemple, il n’est pas difficile de voir que si (x, y, z) est solution du système (9.1), alors (|x|,|y|,|z|) aussi. Inversement, construisons l’ensemble des (|x|,|y|,|z|) pour (x, y, z) solution :

sage: Set(tuple(abs(pt[i]) for i in (xx,yy,zz)) for pt in V) {(3, 2, 1)}

Toutes les valeurs de x(resp. y,z) sont donc de même module. Mieux, on

BR

OUILLON

peut vérifier que la substitution

(x, y, z)7→(ωx, ω9y, ω6z)ω=e2πi/17 (9.2) laisse le système invariant. En particulier, les dernières coordonnées des solutions sont exactement les racines dix-septièmes de l’unité, ce dont on s’assure à nouveau grâce à la possibilité de calculer exactement sur les nombres algébriques :

sage: w = QQbar.zeta(17); w # racine primitive de 1 0.9324722294043558? + 0.3612416661871530?*I

sage: Set(pt[zz] for pt in V) == Set(w^i for i in range(17)) True

Les solutions du système sont donc les triplets (3ω,2ω9, ω6) pour ω17= 1.

Voilà qui est plus parlant !

Exercice 33. Chercher les solutions réelles (et non seulement rationnelles) de (9.1), pour vérifier directement qu’il n’y a que (3,2,1). Retrouver la substitution (9.2), y compris la valeur 17 pour l’ordre de ω comme racine de l’unité, par un calcul avecSage.

Nous aurions pu arriver au même résultat en examinant les polynômes minimaux des coordonnées des points deV. On observe en effet qu’une même coordonnée a le même polynôme minimal pour tous les points solutions autres que (3,2,1). Le polynôme minimal commun de leurs troisièmes coordonnées n’est autre que le polynôme cyclotomique Φ17 :

sage: set(pt[zz].minpoly() for pt in V[:-1])

set([x^16 + x^15 + x^14 + x^13 + x^12 + x^11 + x^10 + x^9 + x^8 + x^7 + x^6 + x^5 + x^4 + x^3 + x^2 + x + 1])

Ceux des première et deuxième coordonnées sont respectivement 316·Φ17(x/3) et 216·Φ17(x/2).

Des formules closes. Une expression explicite des solutions est donc possible en ayant recours à la notation exponentielle des complexes :

sage: def polar_form(z):

... rho = z.abs(); rho.simplify()

... theta = 2 * pi * z.rational_argument() ... return (SR(rho) * exp(I*theta))

sage: [tuple(polar_form(pt[i]) for i in [xx,yy,zz]) ... for pt in V[-3:]]

[(3*e^(-6/17*I*pi), 2*e^(14/17*I*pi), e^(-2/17*I*pi)),

(3*e^(6/17*I*pi), 2*e^(-14/17*I*pi), e^(2/17*I*pi)), (3, 2, 1)]

Naturellement, si nous avions eu l’idée d’écrire les éléments deV en notation exponentielle, cela aurait suffi à conclure.

Simplifier le système. Une approche différente est possible. Plutôt que de chercher les solutions, essayons de calculer une forme plus simple du

BR

OUILLON

système lui-même. Les outils fondamentaux qu’offreSagepour ce faire sont la décomposition triangulaire et les bases de Gröbner. Nous verrons plus loin ce qu’ils calculent exactement ; essayons déjà de les utiliser sur cet exemple :

sage: J.triangular_decomposition()

[Ideal (z^17 - 1, y - 2*z^10, x - 3*z^3) of Multivariate Polynomial Ring in x, y, z over Rational Field]

sage: J.transformed_basis()

[z^17 - 1, -2*z^10 + y, -3*z^3 + x]

On obtient dans un cas comme dans l’autre le système équivalent z17= 1 y= 2z10 x= 3z3,

soitV ={(3ω3,10, ω)|ω17= 1}. C’est un reparamétrage immédiat de la description compacte des solutions trouvée manuellement plus haut.

9.2.2 Qu’est-ce que résoudre ?

Un système polynomial qui possède des solutions en a souvent une infinité.

L’équation toute simplex2y= 0 admet une infinité de solutions dans Q2, sans parler deR2 ouC2. Il n’est donc pas question de les énumérer. Le mieux qu’on puisse faire est décrire l’ensemble des solutions « aussi explicitement que possible », c’est-à-dire en calculer une représentation dont on puisse facilement extraire des informations intéressantes. La situation est analogue à celle des systèmes linéaires , pour lesquels (dans le cas homogène) une base du noyau du système est une bonne description de l’espace des solutions.

Dans le cas particulier où les solutions sont en nombre fini il devient possible de « les calculer ». Mais même dans ce cas, cherche-t-on à énumérer les solutions dansQ, ou encore dans un corps fini Fq? À trouver des approxi-mations numériques des solutions réelles ou complexes ? Ou encore, comme dans l’exemple de la section précédente, à représenter ces dernières à l’aide de nombres algébriques, c’est-à-dire par exemple à calculer les polynômes minimaux de leurs coordonnées ?

Ce même exemple illustre que d’autres représentations de l’ensemble des solutions peuvent être bien plus parlantes qu’une simple liste de points, surtout quand les solutions sont nombreuses. Ainsi, les énumérer n’est pas forcément la chose la plus pertinente à faire même quand c’est possible.In fine, on ne cherche pas tant à calculer les solutions qu’à calculer avec les solutions, pour en déduire ensuite, suivant le problème, les informations auxquelles on s’intéresse vraiment. La suite de ce chapitre explore différents outils utiles pour ce faire.

9.2.3 Idéaux et systèmes

Si spolynômesp1, . . . , psK[x] s’annulent en un point xà coordonnées dansKou dans une extension deK, tout élément de l’idéal qu’ils engendrent

BR

OUILLON

-1 -0.5 0.5 1 -1

-0.5 0.5 1

(a) (S1)

-1 -0.5 0.5 1 -1

-0.5 0.5 1

(b)(S2)

sage: opts = {'axes':True, 'gridlines':True, 'frame':False, ... 'aspect_ratio':1, 'axes_pad':0, 'fontsize':8, ... 'xmin':-1.3, 'xmax':1.3, 'ymin':-1.3, 'ymax':1.3}

sage: (ideal(J.0).plot() + ideal(J.1).plot()).show(**opts)

Figure 9.1– Intersection de deux courbes planes, voir équation (9.3).

s’annule aussi enx. Il est donc naturel d’associer au système polynomial p1(x) =p2(x) =· · ·=ps(x) = 0

l’idéal J =hp1, . . . , psi ⊂K[x]. Deux systèmes polynomiaux qui engendrent le même idéal sont équivalents au sens où ils ont les mêmes solutions. Si L est un corps contenantK, on appellesous-variété algébrique de Ln associée àJ l’ensemble des solutions à coordonnées dans L du système,

VL(J) ={x∈Ln| ∀p∈J, p(x) = 0}={x∈Ln|p1(x) =· · ·=ps(x) = 0}.

Des idéaux différents peuvent avoir la même variété associée. Par exemple, les équationsx= 0 et x2 = 0 admettent la même unique solution dans C, alors que l’on a hx2i(hxi. Ce que l’idéal engendré par un système polynomial capture est plutôt la notion intuitive de « solutions avec multiplicités ».

Ainsi, les deux systèmes suivants expriment chacun l’intersection du cercle unité et d’une courbe d’équationα x2y2 = 1, réunion de deux hyperboles équilatères (voir figure9.1) :

(S1)

(x2+y2 = 1

16x2y2= 1 (S2)

(x2+y2 = 1

4x2y2 = 1. (9.3) Le système (S1) possède huit solutions dansC, toutes à coordonnées réelles.

Quand on le déforme en (S2) en faisant varier le paramètre α, les deux solutions sur chaque branche de l’hyperbole se rapprochent jusqu’à être confondues. Le système (S2) n’a plus que quatre solutions, chacune en un certain sens « de multiplicité deux ». En diminuant encoreα, il n’y aurait plus de solution réelle, mais huit solutions complexes.

BR

OUILLON

Calcul modulo un idéal. Comme dans le cas des polynômes à une seule indéterminée,Sage permet de définir des idéaux4 JK[x], des anneaux quotients K[x]/J, et de calculer naturellement avec les éléments de ces anneaux quotients. L’idéalJ1 associé à (S1) se construit par :

sage: R.<x,y> = QQ[]

sage: J = R.ideal(x^2 + y^2 - 1, 16*x^2*y^2 - 1)

On peut ensuite effectuer le quotient deK[x] parJ1, y projeter des polynômes, calculer avec les classes d’équivalence moduloJ1, et les « remonter » en des représentants :

sage: ybar2 = R.quo(J)(y^2)

sage: [ybar2^i for i in range(3)]

[1, ybar^2, ybar^2 - 1/16]

sage: ((ybar2 + 1)^2).lift() 3*y^2 + 15/16

Il y a ici une difficulté théorique. Les éléments deK[x]/J sont représentés sous forme normale, ce qui est nécessaire pour pouvoir tester l’égalité de deux éléments. Or cette forme normale n’est pas évidente à définir, pour la raison déjà mentionnée en §9.1.5: la division d’un représentant d’une classe d’équivalencep+J par un générateur principal deJ utilisée pour calculer dansK[x]/J n’a pas d’analogue direct en plusieurs variables. Bornons-nous pour l’instant à admettre qu’il existe néanmoins une forme normale, qui dépend de l’ordre sur les éléments choisi à la construction de l’anneau et repose sur un système de générateurs deJ particulier appelé base de Gröbner.

La section 9.3 à la fin de ce chapitre est consacrée à définir les bases de Gröbner et montrer comment on peut les utiliser dans les calculs. Sage calcule automatiquement des bases de Gröbner lorsque c’est nécessaire ; mais ces calculs sont parfois très coûteux, en particulier quand le nombre de variables est grand, de sorte que calculer dans un anneau quotient peut être difficile.

Revenons à l’utilisation deSage. LorsquepJ, la commandep.lift(J) écritpcomme combinaison linéaire à coefficients polynomiaux des générateurs de J :

sage: u = (16*y^4 - 16*y^2 + 1).lift(J); u [16*y^2, -1]

sage: u[0]*J.0 + u[1]*J.1 16*y^4 - 16*y^2 + 1

Pour un polynôme quelconque, l’expressionp.mod(J)donne la forme normale de pmodulo J, vue comme élément deK[x] :

sage: (y^4).mod(J) y^2 - 1/16

4. Attention : les objetsInfinitePolynomialRingont aussi une méthodeideal, mais celle-ci n’a pas le même sens que pour les anneaux de polynômes usuels. (Un idéal quelconque de K[(xn)n∈N] n’a aucune raison d’être finiment engendré !) La suite du chapitre ne s’applique pas à ces objets.

Dans le document Calcul mathématique avec Sage (Page 195-200)