• Aucun résultat trouvé

Construction d’anneaux de polynômes

Dans le document Calcul mathématique avec Sage (Page 135-139)

Corps finis et théorie élémentaire des 6

7.1 Anneaux de polynômes

7.1.2 Construction d’anneaux de polynômes

EnSage, les polynômes, comme beaucoup d’autres objets algébriques, sont en général à coefficients dans un anneau commutatif. C’est le point de vue que nous adoptons, mais la plupart de nos exemples concernent des polynômes sur un corps. Dans tout le chapitre, les lettresA etK désignent respectivement un anneau commutatif et un corps quelconques.

La première étape pour mener un calcul dans une structure algébriqueR est souvent de construireR elle-même. On construit Q[x] par

sage: R = PolynomialRing(QQ, 'x')

2. Une petite différence : alors que var('x') a le même effet quex = var('x') en utilisation interactive,polygen(QQ, 'x')sans affectation ne change pas la valeur de la variable Pythonx.

BR

OUILLON

sage: x = R.gen()

Le 'x' qui apparaît sur la première ligne est une chaîne de caractères, le nom de l’indéterminée, ougénérateur de l’anneau. Le xde la deuxième ligne est une variable Python dans laquelle on récupère le générateur ; employer le même nom facilite la lecture du code. L’objet ainsi stocké dans la variable x représente le polynômex∈Q[x]. Il a pour parent (leparent d’un objetSage est la structure algébrique « d’où il est issu », voir §3.5.1) l’anneauQQ['x'] :

sage: x.parent()

Univariate Polynomial Ring in x over Rational Field

Le polynômex∈Q[x] est considéré comme différent à la fois des polynômes identitéxA[x] d’anneau de baseA6=Qet de ceux, commet∈Q[t], dont l’indéterminée porte un autre nom.

L’expression PolynomialRing(QQ, 't')s’écrit aussi QQ['t']. On com-bine souvent cette abréviation avec la construction «S.<g> = ...», qui affecte simultanément une structure à la variable S et son générateur à la variable g. La construction de l’anneau Q[x] et de son indéterminée se réduit alors à R.<x> = QQ['x'], ou même simplement R.<x> = QQ[] en sous-entendant la variablex. La formex = polygen(QQ, 'x')vue en intro-duction équivaut àx = PolynomialRing(QQ, 'x').gen().

Signalons en passant que l’on peut choisir entre plusieurs représentations en mémoire lorsque l’on construit un anneau de polynômes. Les différences entre représentations seront discutées en §7.7.

Exercice 22 (Variables et indéterminées).

1. Comment définir xetypour observer les résultats suivants ? sage: x^2 + 1

y^2 + 1

sage: (y^2 + 1).parent()

Univariate Polynomial Ring in x over Rational Field

2. Après les instructions

sage: Q.<x> = QQ[]; p = x + 1; x = 2; p = p + x

quelle est la valeur dep? 7.1.3 Polynômes

Après l’instruction R.<x> = QQ[], les expressions construites à partir dexet des constantes rationnelles par les opérations+et*sont des éléments deQ[x]. Par exemple, dansp = x + 2,Sagedétermine automatiquement que la valeur de la variablexet l’entier 2 peuvent tous deux s’interpréter comme des éléments deQ[x]. La routine d’addition des polynômes deQ[x]

est donc appelée ; elle fabrique et renvoie le polynômex+ 2∈Q[x].

BR

OUILLON

Accès aux données, opérations syntaxiques

indéterminéex p.variables(), p.variable_name() coefficient dexk p[k]

coefficient dominant p.leading_coefficient() degré degp p.degree()

liste des coefficients p.coeffs() liste des coefficientsnon nuls p.coefficients() dictionnaire degré7→coefficient p.dict()

tests (unitaire, constant, ...) p.is_monic(), p.is_constant(), ...

Arithmétique de base

opérationsp+q,pq,p×q,pk p + q, p - q, p * q, p^k substitutionx:=a p(a) ou p.subs(a)

dérivée p.derivative() ou diff(p)

Transformations

changement d’anneau de baseA[x]B[x] p.change_ring(B) ou B['x'](p) polynôme réciproque p.reverse()

Tableau 7.2– Opérations de base sur les polynômesp, qA[x].

Une autre façon de créer un polynôme consiste à énumérer ses coefficients.

Par exemple, la fonction ci-dessous fabrique des polynômes où le coefficient de xk s’interprète comme le nombre de façons de placer k tours sur un échiquiern×nsans qu’elles se menacent (d’où son nom).

sage: def rook_polynomial(n, var='x'):

... return ZZ[var]([binomial(n, k)^2 * factorial(k)

... for k in (0..n) ])

...

Ici, les parenthèses aprèsZZ[var]servent à convertir de force un objet donné en un élément de cet anneau. La conversion d’une liste [a0, a1, . . .] en élément de ZZ['x']renvoie le polynôme a0+a1x+· · · ∈Z[x].

Les éléments d’un anneau de polynômes sont représentés par des objets Python de la classe Polynomial ou de classes dérivées. Les principales opérations3 disponibles sur ces objets sont résumées dans les tableaux7.2 à 7.4. Ainsi, on récupère le degré d’un polynôme en appelant sa méthode degree. De même, p.subs(a) ou simplementp(a) donne la valeur de pau point a, mais sert aussi à calculer la composée palorsqueaest lui-même un polynôme, et plus généralement à évaluer un polynôme deA[x] en un élément d’uneA-algèbre :

3. Il y en a beaucoup d’autres. Ces tableaux omettent les fonctionnalités trop pointues, les variantes plus spécialisées de méthodes mentionnées, et de nombreuses méthodes communes à tous les « éléments d’anneaux », voire à tous les objetsSage, qui ne présentent pas d’intérêt particulier sur les polynômes. Notons cependant que les méthodes spécialisées (par exemple p.rescale(a), équivalent à p(a*x)) sont souvent plus efficaces que les

méthodes plus générales qui peuvent les remplacer.

BR

OUILLON

sage: p = R.random_element(degree=4) # un polynome au hasard sage: p

-4*x^4 - 52*x^3 - 1/6*x^2 - 4/23*x + 1 sage: p.subs(x^2)

-4*x^8 - 52*x^6 - 1/6*x^4 - 4/23*x^2 + 1 sage: p.subs(matrix([[1,2],[3,4]])) [-375407/138 -273931/69]

[ -273931/46 -598600/69]

Nous reviendrons sur le contenu des deux derniers tableaux dans les sec-tions7.2et7.3.

La liste exacte des opérations disponibles, leur effet et leur efficacité dépendent fortement de l’anneau de base. Par exemple, les polynômes de ZZ['x']possèdent une méthode contentqui renvoie leur contenu, c’est-à-dire le pgcd de leurs coefficients ; ceux de QQ['x'] non, l’opération étant triviale. La méthode factor existe quant à elle pour tous les polynômes mais déclenche une exceptionNotImplementedError pour un polynôme à coefficients dansSR ou dansZ/4Z. Cette exception signifie que l’opération n’est pas disponible dansSagepour ce type d’objet bien qu’elle ait un sens mathématiquement.

Il est donc très utile de pouvoir jongler avec les différents anneaux de coefficients sur lesquels on peut considérer un « même » polynôme. Appliquée à un polynôme deA[x], la méthodechange_ringrenvoie son image dansB[x], quand il y a une façon naturelle de convertir les coefficients. La conversion est souvent donnée par un morphisme canonique deA dans B : notamment, change_ring sert à étendre l’anneau de base pour disposer de propriétés algébriques supplémentaires. Ici par exemple, le polynôme pest irréductible sur les entiers, mais se factorise surR:

sage: x = polygen(QQ) sage: p = x^2 - 16*x + 3 sage: p.factor()

x^2 - 16*x + 3

sage: p.change_ring(RDF).factor()

(x - 15.8102496759) * (x - 0.189750324093)

Le domaine RDF est en fait celui des « flottants machine », présenté au chapitre11. La factorisation obtenue n’est qu’approchée ; elle ne suffit pas à retrouver exactement à coup sûr le polynôme de départ. Pour représenter les racines réelles de polynômes à coefficients entiers d’une manière qui permet les calculs exacts, on utilise le domaine AA des nombres algébriques réels.

Nous verrons quelques exemples dans les sections suivantes.

La même méthodechange_ringpermet de réduire un polynôme deZ[x]

modulo un nombre premier : sage: p.change_ring(GF(3)) x^2 + 2*x

Inversement, siBA et si les coefficients de p sont en fait dans B, c’est

BR

OUILLON

aussichange_ringque l’on utilise afin de ramener pdans B[x].

Dans le document Calcul mathématique avec Sage (Page 135-139)