On peut construire en Sage l'ordre de l'exercice (pour des variables $x_1,x_2,y_1,y_2,y_3$) avec le constructeur TermOrder
o = TermOrder('lex', 2) + TermOrder('degrevlex', 3)
o
Block term order with blocks: (Lexicographic term order of length 2, Degree reverse lexicographic term order of length 3)
A.<x1,x2,y1,y2,y3> = PolynomialRing(QQ, order=o)
A
Multivariate Polynomial Ring in x1, x2, y1, y2, y3 over Rational Field
x1*y1*y2 < x1*y1^2
True
A.<x,y,z> = PolynomialRing(QQ, order='lex')
I = A.ideal([x^2-2*x*z+5, x*y^2+y*z^3, 3*y^2-8*z^3])
I.groebner_basis()
[x^2 - 2*x*z + 5, x*z^3 + 9/640*z^8 - 3/20*z^7 + 3/16*z^5, y^2 - 8/3*z^3, y*z^3 - 3/80*z^8 + 2/5*z^7 - 1/2*z^5, z^9 - 32/3*z^8 + 80/3*z^6 + 1600/9*z^3]
J = I.change_ring(A.change_ring(order='degrevlex'))
J.groebner_basis()
[y^4 + 16/3*y^3*z + 320/9*y^2, x*y^2 + 3/8*y^3, z^3 - 3/8*y^2, x^2 - 2*x*z + 5]
A.<x,y> = PolynomialRing(QQ, order='lex')
I = A.ideal(x^2*y^2 - x, x*y^3 + y)
G = I.groebner_basis()
G
[x, y]
x in I, y in I
(True, True)
I.reduce(x)
0
a, b = x.lift(I)
a, b
(-1/2*x*y^2 - 1, 1/2*x^2*y)
a*I.0 + b*I.1
x
P = x^3*y^2 + 2*x*y^4
P.mod(I)
0
A.<x,y,z> = QQ[]
I = A.ideal(x*y*z + z^3, y^2)
I.groebner_basis()
[z^5, y*z^3, x*y*z + z^3, y^2]
I = A.ideal(x + y + z, x*y + y*z + z*x, x*y*z + 1)
I.reduce(x^3 + 1)
0
En regardant la base de Gröbner, et par symétrie de l'ensemble générateur, on aurait pu conclure directement que $x^3+1∈I$
I.groebner_basis()
[z^3 + 1, y^2 + y*z + z^2, x + y + z]
A.<x,y,z,t> = PolynomialRing(QQ, order='lex')
I = A.ideal(z^5-y^3*t^2, x^2*t - y*z^2, x^2*z^3 - y^4*t, x^4*z - y^5)
G = I.groebner_basis()
G
[x^4*z - y^5, x^2*z^3 - y^4*t, x^2*t - y*z^2, y^3*t^2 - z^5]
On vérifie que la base de Gröbner calculée par Sage coïncide (à des constantes près) avec les générateurs
sorted(I.gens()), sorted(G)
([-y^3*t^2 + z^5, x^2*t - y*z^2, x^2*z^3 - y^4*t, x^4*z - y^5], [y^3*t^2 - z^5, x^2*t - y*z^2, x^2*z^3 - y^4*t, x^4*z - y^5])
...o, plus simplement:
I.basis_is_groebner()
True
Une petite fonction pour changer l'ordre de $I$ et renvoyer les termes de tête de sa base de Gröbner
# `ord` et `names` prennent des valeurs par défaut,
# s'ils ne sont pas donnés explicitement
def LT(I, ord='lex', names='x,y,z,t'):
A = I.ring()
J = I.change_ring(A.change_ring(names=names, order=ord))
G = J.groebner_basis()
return [g.lt() for g in G]
sans parametres ord
et names
, les valeurs par défaut sont prises
LT(I)
[x^4*z, x^2*z^3, x^2*t, y^3*t^2]
LT(I, 'degrevlex')
[y^5, x^2*z^3, z^5, y*z^2]
syntaxe équivalente à la précédente
LT(I, ord='degrevlex')
[y^5, x^2*z^3, z^5, y*z^2]
LT(I, 'invlex')
[y^3*t^2, y^4*t, x^2*t, x^4*z]
LT(I, 'deglex')
[x^4*z, x^2*z^3, y^3*t^2, x^2*t]
En utilisant TermOrder
, on peut construire d'autres ordres, par exemple l'ordre degrevlex gradué:
sage.rings.polynomial.term_order?
LT(I, TermOrder('wdegrevlex', (2,2,1,1)))
[y^5, y^4*t, y^3*t^2, x^2*t]
Et, finalement, la solution, avec un autre ordre lexicographique
LT(I, names='y,z,t,x')
[y^5, y^4*t, y^3*t^2, y^2*t^3*x^2, y*z^2, y*t^4*x^4, z^11]
Le même ordre, exprimé de façon matricielle
p = SymmetricGroup(4)([2,3,4,1])
p
(1,2,3,4)
p.matrix()
[0 1 0 0] [0 0 1 0] [0 0 0 1] [1 0 0 0]
lt = LT(I, ord=TermOrder(p.matrix()))
lt
[y^5, y^4*t, y^3*t^2, x^2*y^2*t^3, y*z^2, x^4*y*t^4, z^11]
On peut s'arrêter là, mais si vraiement on a envie de tester tous les ordres lexicographiques possibles, on peut s'appuyer sur les capacités
S = Permutations(['x','y','z','t'])
S
Permutations of the set ['x', 'y', 'z', 't']
for s in S:
print(s, LT(I, names=','.join(s)))
(['x', 'y', 'z', 't'], [x^4*z, x^2*z^3, x^2*t, y^3*t^2]) (['x', 'y', 't', 'z'], [x^4*z, x^2*t, x^2*z^3, y^3*t^2]) (['x', 'z', 'y', 't'], [x^4*z, x^2*z^3, x^2*t, z^5]) (['x', 'z', 't', 'y'], [x^4*z, x^2*z^3, x^2*t, z^5]) (['x', 't', 'y', 'z'], [x^4*z, x^2*t, x^2*z^3, t^2*y^3]) (['x', 't', 'z', 'y'], [x^4*z, x^2*t, x^2*z^3, t^2*y^3]) (['y', 'x', 'z', 't'], [y^5, y^4*t, y^3*t^2, y^2*x^2*t^3, y*x^4*t^4, y*z^2, x^6*t^5]) (['y', 'x', 't', 'z'], [y^5, y^4*t, y^3*t^2, y^2*x^2*t^3, y*x^4*t^4, y*z^2, x^6*t^5]) (['y', 'z', 'x', 't'], [y^5, y^4*t, y^3*t^2, y^2*x^2*t^3, y*z^2, y*x^4*t^4, z^11]) (['y', 'z', 't', 'x'], [y^5, y^4*t, y^3*t^2, y^2*t^3*x^2, y*z^2, y*t^4*x^4, z^11]) (['y', 't', 'x', 'z'], [y^5, y^4*t, y^3*t^2, y^2*t^3*x^2, y*t^4*x^4, y*z^2, t^5*x^6]) (['y', 't', 'z', 'x'], [y^5, y^4*t, y^3*t^2, y^2*t^3*x^2, y*t^4*x^4, y*z^2, t^5*x^6]) (['z', 'x', 'y', 't'], [z^5, z^3*x^2, z^2*y, z*x^4, z*y^6, x^10*t]) (['z', 'x', 't', 'y'], [z^5, z^3*x^2, z^2*y, z*x^4, z*y^6, x^10*t]) (['z', 'y', 'x', 't'], [z^5, z^3*x^2, z^2*y, z*y^6, z*x^4, y^11]) (['z', 'y', 't', 'x'], [z^5, z^3*x^2, z^2*y, z*y^6, z*x^4, y^11]) (['z', 't', 'x', 'y'], [z^5, z^3*x^2, z^2*y, z*x^4, z*y^6, t*x^10]) (['z', 't', 'y', 'x'], [z^5, z^3*x^2, z^2*y, z*y^6, z*x^4, t*x^10]) (['t', 'x', 'y', 'z'], [t^2*y^3, t*x^2, t*y^4, x^4*z]) (['t', 'x', 'z', 'y'], [t^2*y^3, t*x^2, t*y^4, x^4*z]) (['t', 'y', 'x', 'z'], [t^2*y^3, t*y^4, t*x^2, y^5]) (['t', 'y', 'z', 'x'], [t^2*y^3, t*y^4, t*x^2, y^5]) (['t', 'z', 'x', 'y'], [t^2*y^3, t*x^2, t*y^4, z*x^4]) (['t', 'z', 'y', 'x'], [t^2*y^3, t*y^4, t*x^2, z*x^4])
A.<x,y> = QQ[]
I = A.ideal(x - y^2, x*y - x)
I.groebner_basis()
[x^2 - x, x*y - x, y^2 - x]
I.change_ring(A.change_ring(order='lex')).groebner_basis()
[x - y^2, y^3 - y^2]
I.change_ring(A.change_ring(order='invlex')).groebner_basis()
[y^2 - x, x*y - x, x^2 - x]
L'ensemble $G = \{x^2 - x,\; xy - x,\; y^2 - x,\; y^3 - y^2\}$ forme une base de Gröbner de l'idéal pour tous les ordres ci-dessus.
Selon l'ordre monomial choisi l'escalier de cette base (ensemble des monômes pas contenus dans $〈\mathrm{LT}(G)〉$) contient les monômes
$$\begin{cases} \{1, x, y\} &\text{si $x < y^2$,}\\ \{1, y, y^2\} &\text{sinon.} \end{cases}$$Dans tous les cas, ceci coincide avec la dimension de l'algèbre quotient $ℚ[x,y]/I$, qui est $3$ (l'idéal est de dimension $0$).
I.dimension(), I.vector_space_dimension()
(0, 3)
Puisque $G⊂I$, ceux-ci sont aussi les deux seuls escaliers possibles pour $\mathrm{LT}(I)$. Par conséquent, les monomes de tête de $G$ engendrent $\mathrm{LT}(I)$ pour n'importe quel ordre monomial.