What's the easiest way to calculate a Hironaka standard basis using SageMath?

24 views
Skip to first unread message

Joshua Holden

unread,
Dec 12, 2020, 2:58:08 PM12/12/20
to sage-support

Hi, everyone!

I'm trying to do some computations with (truncated) multivariable power series, which I'd like to put into Hironaka standard basis form. This is almost the same as a Groebner basis, except that the "leading" terms have smallest degree instead of largest. This requires slight changes to the algorithms in order to make sure they terminate. Does anyone know if this has been implemented in Sage or have a good way to fake it? I don't use Sage a lot and I can't find anything obvious in the documentation so I thought I'd ask before trying to re-implement something.  I tried ask.sagemath.org and someone said this might be a better place.

Thanks very much!

----Josh

Simon King

unread,
Dec 13, 2020, 3:26:33 AM12/13/20
to sage-s...@googlegroups.com
Hi Joshua,

SageMath uses Singular to compute Gröbner and standard bases.

I think that Singular (and thus, SageMath) doesn't strictly distinguish
between a Gröbner basis and a standard basis, because in a global term
ordering (i.e. 1 is smallest), both notions coincide, and thus in local
term orderings (i.e. 1 is biggest), they don't distinguish either,
although Buchberger (coining the notion "Gröbner basis") only considered
global orderings, whereas Hironaka (coining the notion "standard basis")
was more into local orderings.

Example from the docs:
"""
Sage also supports local orderings:

sage: P.<x,y,z> = PolynomialRing(QQ,3,order='negdegrevlex')
sage: I = P * ( x*y*z + z^5, 2*x^2 + y^3 + z^7, 3*z^5 +y^5 )
sage: I.groebner_basis()
[x^2 + 1/2*y^3, x*y*z + z^5, y^5 + 3*z^5, y^4*z - 2*x*z^5, z^6]
"""

Note that Singular seems to give a different answer:

sage: singular(I).std()
2*x^2+y^3+z^7,
x*y*z+z^5,
y^5+3*z^5,
y^4*z-2*x*z^5,
3*z^6+2*x*y*z^5

But in fact it isn't, because by default, in local orderings, Singular
doesn't seem to do tail reductions and also wouldn't automatically
normalise the leading monomials, whereas SageMath does. I'm
demonstrating that Singular's and SageMath's answers coincide:

sage: singular.option('redTail')
sage: singular(I).std().interred().normalize()
x^2+1/2*y^3,
x*y*z+z^5,
y^5+3*z^5,
y^4*z-2*x*z^5,
z^6

Best regards,
Simon
Reply all
Reply to author
Forward
0 new messages