Hi Reimundo,
On 2020-06-17, 'Reimundo Heluani' via sage-support <
sage-s...@googlegroups.com> wrote:
> Is there an implementation of such a thing as in the title?
TL;DR: Yes. Singular does have these capabilities. I recall that these
were comfortably wrapped in SageMath, but as it turns out: They aren't.
Note to developers: I think we should have at least two trac tickets
related with Reimundo's question, and we should have these tickets opened
10 years ago already!!!
1. If A is a super-commutative algebra (which exists in Sage), then
singular(A) should create a copy of A in the Singular pexpect
interface, but this is broken.
2. Apparently, for ideals over A, Sage is using a generic implementation
that doesn't know about Gröbner bases. It should of course use an
implementation based on libsingular.
Longer answer:
I suppose "supercommutative" means that you have something
that resembles a polynomial ring, with the difference that some of the
generators anti-commute among each other, whereas some generators
commute with all generators.
> I am facing the following design problem, and I'd love to get some pointers.
Can one not find it by searching in the SageMath documentation? Anyway,
I suppose it is explained in the docs how to create a SCA
(SuperCommutativeAlgebra) with grading, create ideals
over such algebras, and compute Gröbner bases.
This is how one could search during a SageMath session:
sage: search_src('supercommutative')
However, the answers to that search have not really been helpful. So,
perhaps the search in the documentation wasn't successful either. It
points to a lot of places in "sage.categories", but not where I recall
the actual implementation.
Fortunately I recall that supercommutative algebra is abbreviated as
sca. Hence, the following search succeeded:
sage: search_def('sca', whole_word=True)
It tells you that you find it (of course with documentation and
examples) in sage.rings.polynomial.plural
> Now the issue is to compute the graded dimension of the quotient as a formal
> power series.
You talk about Hilbert-Poincaré series? That's already implemented in
SageMath
Actually I need Hilbert-Poincaré series for my computation of modular
cohomology rings of finite groups; these rings are graded-commutative
(for odd prime characteristic at least) and can thus be implemented as
supercommutative algebras.
Here is a non-trivial example from my cohomology computations
(translated to boilerplate singular):
sage: names = '(x1a,x1b,x3a,x3b,y2a,y2b,y2c,y2d,y6)'
sage: Igens = ['x1a*x1b',
'y2b*x1a-y2a*x1b',
'y2c*x1a-y2b*x1b-y2a*x1b',
'y2c*x1b-y2b*x1b-y2a*x1b',
'y2d*x1a-y2b*x1b+y2a*x1b',
'-y2b^2+y2a*y2c-y2a*y2b',
'y2b*y2c-y2b^2-y2a*y2b',
'y2c^2+y2b^2+y2a*y2b',
'y2b^2-y2a*y2d-y2a*y2b+x1a*x3a',
'-y2b*y2d-y2b^2+y2a*y2b+x1b*x3a',
'-y2b*y2d-y2a*y2d+x1a*x3b',
'-y2c*y2d+x1b*x3b',
'y2d*x3a-y2d^2*x1b-y2c*x3a-y2b*x3a+y2a*y2b*x1b-y2a^2*x1b',
'-y2b*x3a+y2a*x3b-y2a*x3a-y2a*y2b*x1b',
'-y2c*x3a+y2b*x3b-y2a^2*x1b',
'y2c*x3b+y2c*x3a-y2a*y2b*x1b-y2a^2*x1b',
'x3a*x3b-y2d*x1b*x3b+y2a*x1b*x3b-y2a*x1a*x3b+y2a*x1a*x3a']
Create the super commutative algebra:
sage: R = singular.ring(3,names,'wp(1,1,3,3,2,2,2,2,6)')
sage: A = singular.superCommutative(4,9)
sage: A.set_ring()
Create an ideal and compute its Hilbert series (note that the quotient
of A by this ideal is isomorphic to the cohomology ring of the Sylow
3-subgroup of U_3(8) with coefficients in GF(3)):
sage: I = singular.ideal(Igens)
sage: from sage.rings.polynomial.hilbert import hilbert_poincare_series
sage: HP = hilbert_poincare_series(I.twostd().lead(), (1,1,3,3,2,2,2,2,6))
Now we can read off the number of standard monomials in each (weighted)
degree. Unfortunately, Singular doesn't have a function to return
standard monomials in WEIGHTED degree. Hence, just as a proof of
concept, I collect the standard monomials in unweighted degree up to 8,
then filter and count by weighted degree.
sage: SM = []
sage: for d in range(1,9):
....: SM.extend(list(I.twostd().kbase(d)))
....:
sage: for d in range(1,9):
....: print(d,len([m for m in SM if m.deg()==d]))
....:
1 2
2 6
3 8
4 7
5 8
6 6
7 6
8 11
And this coincides with what the Hilbert series predicts:
sage: HP
(t^14 + t^13 + 3*t^12 - 3*t^10 - 7*t^9 - 3*t^8 + t^7 + 2*t^6 - 2*t^5 - 5*t^4 - 7*t^3 - 6*t^2 - 2*t - 1)/(t^3 - 1)
sage: PowerSeriesRing(ZZ,'t')(HP)
1 + 2*t + 6*t^2 + 8*t^3 + 7*t^4 + 8*t^5 + 6*t^6 + 6*t^7 + 11*t^8 + 13*t^9 + 9*t^10 + 11*t^11 + 10*t^12 + 8*t^13 + 10*t^14 + 10*t^15 + 8*t^16 + 10*t^17 + 10*t^18 + 8*t^19 + O(t^20)
Note that in princible Singular can compute Hilbert series, too, but
it has an awkward syntax, refuses to work in non-commutative settings,
and occasionally suffers from integer overflows.
Best regards,
Simon