Contact
CoCalc Logo Icon
StoreFeaturesDocsShareSupport News AboutSign UpSign In
| Download

All published worksheets from http://sagenb.org

Views: 168738
Image: ubuntu2004

Les anneaux, les corps de fractions, etc

Première étape: fabriquer et utiliser le corps des fractions rationnelles

Choisissons le nom R pour le corps des fractions de l'anneau des polynômes sur Q\mathbb{Q} avec pour générateur t. Autrement dit c'est le corps des fractions rationelles sur Q\mathbb{Q}.

R.<t> = FractionField(PolynomialRing(QQ,'t'))

Toutes les expressions polynomiales avec des t correspondent à des fractions rationelles de R.

Q = (t^3 + 2*t + 5) / (2*t^6 - 3/5*t + 1)
print Q
(t^3 + 2*t + 5)/(2*t^6 - 3/5*t + 1)
print type(Q)
<type 'sage.rings.fraction_field_element.FractionFieldElement'>

On peut récupérer le numérateur:

N = Q.numerator() print N
t^3 + 2*t + 5

Qui lui est un polynôme:

print type(N)
<class 'sage.rings.polynomial.polynomial_element_generic.Polynomial_rational_dense'>

Pareil pour le dénominateur:

D = Q.denominator() print D
2*t^6 - 3/5*t + 1
print type(D)
<class 'sage.rings.polynomial.polynomial_element_generic.Polynomial_rational_dense'>

 

deuxième étape: les polynômes de fractions rationnelles

Choisissons S pour l'anneau des polynômes sur Q(t)\mathbb{Q}(t) avec pour indéterminée XX. De manière générale, dès qu'on a un anneau on peut prendre son anneau de polynôme associé avec la commande PolynomialRing.

S.<X> = PolynomialRing(R,'s')
help(PolynomialRing)
U = (5*t^2 + 1)*X^2 + (3*t-1)*X + 2
print U
(5*t^2 + 1)*X^2 + (3*t - 1)*X + 2
U in S
True

Malheureusement Sage ne sait pas résoudre les équations:

U.roots()
Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_16.py", line 4, in <module> exec compile(ur'U.roots()' + '\n', '', 'single') File "", line 1, in <module> File "polynomial_element.pyx", line 4358, in sage.rings.polynomial.polynomial_element.Polynomial.roots (sage/rings/polynomial/polynomial_element.c:30249) File "ring.pyx", line 640, in sage.rings.ring.Ring.is_finite (sage/rings/ring.c:4982) NotImplementedError

Alternative symbolique

Dans Sage il y a possibilité de faire référence à une indéterminée sans qu'elle fasse partie d'un anneaux de polynômes. Il faut pour cela comprendre un peu comment marche les équations symboliques.

Reprenons notre corps des fractions rationnelles en t.

R
Fraction Field of Univariate Polynomial Ring in t over Rational Field

Plutôt que de prendre une indéterminée dans un anneau de polynôme on prends une variable symbolique que l'on fabrique avec la commande var.

var('x')
x

Toutes les équations (polynomiales ou pas) qui font apparaître P sont symboliques.

P = (5*t^2 + 1)*x^2 + (3*t-1)*x + 2 print P
(5*t^2 + 1)*x^2 + (3*t - 1)*x + 2
type(P)
<type 'sage.symbolic.expression.Expression'>

Même des trucs tordus ! Une équation est une expression symbolique:

E = P == 0
print E
(5*t^2 + 1)*x^2 + (3*t - 1)*x + 2 == 0
print type(E)
<type 'sage.symbolic.expression.Expression'>

Et Sage sait résoudre les équations:

solve(E, x)
[x == -1/2*(3*t + sqrt(-31*t^2 - 6*t - 7) - 1)/(5*t^2 + 1), x == -1/2*(3*t - sqrt(-31*t^2 - 6*t - 7) - 1)/(5*t^2 + 1)]
help(solve)

Et avec des matrices ?

Reprenons encore notre corps des fractions rationnelles.

R
Fraction Field of Univariate Polynomial Ring in t over Rational Field

À partir d'un anneau on sait aussi fabriquer l'espace des matrices sur ce corps.

M = MatrixSpace(R,2,2)

Pour fabriquer des matrices sur M la syntaxe est intuitive et utilise les listes python.

m1 = M([[1+t^3, t+t^2], [t+t^2, 1+t^3]]) print m1
[t^3 + 1 t^2 + t] [t^2 + t t^3 + 1]
m2 = M([[1, t^2], [t^2, 1]]) print m2
[ 1 t^2] [t^2 1]

Comme tout à l'heure on va crér deux variables symboliques a et b et lui demander de résoudre l'équation qui t'intéresse.

var('a,b,x')
(a, b, x)
m = a*m1 + b*m2 print m
[ (t^3 + 1)*a + b (t + 1)*a*t + b*t^2] [(t + 1)*a*t + b*t^2 (t^3 + 1)*a + b]
P = m.charpoly(x) print P
-((t + 1)*a*t + b*t^2)^2 + ((t^3 + 1)*a + b - x)^2
P = P.expand() print P
a^2*t^6 - a^2*t^4 - 2*a*b*t^4 - b^2*t^4 - 2*a*t^3*x - a^2*t^2 + a^2 + 2*a*b - 2*a*x + b^2 - 2*b*x + x^2

Reste plus qu'à faire l'identification.

x0 = P.coeff(x,0) print x0
a^2*t^6 - a^2*t^4 - 2*a*b*t^4 - b^2*t^4 - a^2*t^2 + a^2 + 2*a*b + b^2
x1 = P.coeff(x,1) print x1
-2*a*t^3 - 2*a - 2*b

Et résoudre l'équation...

solve([x0 == 1, x1 == -2], a,b)
[[a == t/(t^4 - 1), b == -1/(t^3 - t^2 + t - 1)]]