Chow rings of matroids

AUTHORS:

  • Shriya M

class sage.matroids.chow_ring.ChowRing(R, M, augmented, presentation=None)[source]

Bases: QuotientRing_generic

The Chow ring of a matroid.

The Chow ring of the matroid \(M\) is defined as the quotient ring

\[A^*(M)_R := R[x_{F_1}, \ldots, x_{F_k}] / (I_M + J_M),\]

where \((I_M + J_M)\) is the Chow ring ideal of matroid \(M\).

The augmented Chow ring of matroid \(M\) has two different presentations as quotient rings:

The Feitchner-Yuzvinsky presentation is the quotient ring

\[A(M)_R := R[y_{e_1}, \ldots, y_{e_n}, x_{F_1}, \ldots, x_{F_k}] / I_{FY}(M),\]

where \(I_{FY}(M)\) is the Feitchner-Yuzvinsky augmented Chow ring ideal of matroid \(M\).

The atom-free presentation is the quotient ring

\[A(M)_R := R[x_{F_1}, \ldots, x_{F_k}] / I_{af}(M),\]

where \(I_{af}(M)\) is the atom-free augmented Chow ring ideal of matroid \(M\).

INPUT:

  • M – matroid

  • R – commutative ring

  • augmented – boolean; when True, this is the augmented Chow ring and if False, this is the non-augmented Chow ring

  • presentation – string (default: None); one of the following (ignored if augmented=False)

    • "fy" - the Feitchner-Yuzvinsky presentation

    • "atom-free" - the atom-free presentation

REFERENCES:

EXAMPLES:

sage: M1 = matroids.catalog.P8pp()
sage: ch = M1.chow_ring(QQ, False)
sage: ch
Chow ring of P8'': Matroid of rank 4 on 8 elements with 8 nonspanning circuits
over Rational Field
>>> from sage.all import *
>>> M1 = matroids.catalog.P8pp()
>>> ch = M1.chow_ring(QQ, False)
>>> ch
Chow ring of P8'': Matroid of rank 4 on 8 elements with 8 nonspanning circuits
over Rational Field
class Element(parent, rep, reduce=True)[source]

Bases: QuotientRingElement

degree()[source]

Return the degree of self.

EXAMPLES:

sage: ch = matroids.Uniform(3, 6).chow_ring(QQ, False)
sage: for b in ch.basis():
....:     print(b, b.degree())
1 0
A01 1
A02 1
A12 1
A03 1
A13 1
A23 1
A04 1
A14 1
A24 1
A34 1
A05 1
A15 1
A25 1
A35 1
A45 1
A012345 1
A012345^2 2
sage: v = sum(ch.basis())
sage: v.degree()
2
>>> from sage.all import *
>>> ch = matroids.Uniform(Integer(3), Integer(6)).chow_ring(QQ, False)
>>> for b in ch.basis():
...     print(b, b.degree())
1 0
A01 1
A02 1
A12 1
A03 1
A13 1
A23 1
A04 1
A14 1
A24 1
A34 1
A05 1
A15 1
A25 1
A35 1
A45 1
A012345 1
A012345^2 2
>>> v = sum(ch.basis())
>>> v.degree()
2
homogeneous_degree()[source]

Return the (homogeneous) degree of self if homogeneous otherwise raise an error.

EXAMPLES:

sage: ch = matroids.catalog.Fano().chow_ring(QQ, True, 'fy')
sage: for b in ch.basis():
....:     print(b, b.homogeneous_degree())
1 0
Ba 1
Ba*Babcdefg 2
Bb 1
Bb*Babcdefg 2
Bc 1
Bc*Babcdefg 2
Bd 1
Bd*Babcdefg 2
Bbcd 1
Bbcd^2 2
Be 1
Be*Babcdefg 2
Bace 1
Bace^2 2
Bf 1
Bf*Babcdefg 2
Babf 1
Babf^2 2
Bdef 1
Bdef^2 2
Bg 1
Bg*Babcdefg 2
Badg 1
Badg^2 2
Bbeg 1
Bbeg^2 2
Bcfg 1
Bcfg^2 2
Babcdefg 1
Babcdefg^2 2
Babcdefg^3 3
sage: v = sum(ch.basis()); v
Babcdefg^3 + Babf^2 + Bace^2 + Badg^2 + Bbcd^2 + Bbeg^2 +
Bcfg^2 + Bdef^2 + Ba*Babcdefg + Bb*Babcdefg + Bc*Babcdefg +
Bd*Babcdefg + Be*Babcdefg + Bf*Babcdefg + Bg*Babcdefg +
Babcdefg^2 + Ba + Bb + Bc + Bd + Be + Bf + Bg + Babf + Bace +
Badg + Bbcd + Bbeg + Bcfg + Bdef + Babcdefg + 1
sage: v.homogeneous_degree()
Traceback (most recent call last):
...
ValueError: element is not homogeneous
>>> from sage.all import *
>>> ch = matroids.catalog.Fano().chow_ring(QQ, True, 'fy')
>>> for b in ch.basis():
...     print(b, b.homogeneous_degree())
1 0
Ba 1
Ba*Babcdefg 2
Bb 1
Bb*Babcdefg 2
Bc 1
Bc*Babcdefg 2
Bd 1
Bd*Babcdefg 2
Bbcd 1
Bbcd^2 2
Be 1
Be*Babcdefg 2
Bace 1
Bace^2 2
Bf 1
Bf*Babcdefg 2
Babf 1
Babf^2 2
Bdef 1
Bdef^2 2
Bg 1
Bg*Babcdefg 2
Badg 1
Badg^2 2
Bbeg 1
Bbeg^2 2
Bcfg 1
Bcfg^2 2
Babcdefg 1
Babcdefg^2 2
Babcdefg^3 3
>>> v = sum(ch.basis()); v
Babcdefg^3 + Babf^2 + Bace^2 + Badg^2 + Bbcd^2 + Bbeg^2 +
Bcfg^2 + Bdef^2 + Ba*Babcdefg + Bb*Babcdefg + Bc*Babcdefg +
Bd*Babcdefg + Be*Babcdefg + Bf*Babcdefg + Bg*Babcdefg +
Babcdefg^2 + Ba + Bb + Bc + Bd + Be + Bf + Bg + Babf + Bace +
Badg + Bbcd + Bbeg + Bcfg + Bdef + Babcdefg + 1
>>> v.homogeneous_degree()
Traceback (most recent call last):
...
ValueError: element is not homogeneous
monomial_coefficients(copy=None)[source]

Return the monomial coefficients of self.

EXAMPLES:

sage: ch = matroids.catalog.NonFano().chow_ring(QQ, True, 'atom-free')
sage: v = ch.an_element(); v
Aa
sage: v.monomial_coefficients()
{0: 0, 1: 1, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0,
 10: 0, 11: 0, 12: 0, 13: 0, 14: 0, 15: 0, 16: 0, 17: 0,
 18: 0, 19: 0, 20: 0, 21: 0, 22: 0, 23: 0, 24: 0, 25: 0,
 26: 0, 27: 0, 28: 0, 29: 0, 30: 0, 31: 0, 32: 0, 33: 0,
 34: 0, 35: 0}
>>> from sage.all import *
>>> ch = matroids.catalog.NonFano().chow_ring(QQ, True, 'atom-free')
>>> v = ch.an_element(); v
Aa
>>> v.monomial_coefficients()
{0: 0, 1: 1, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0,
 10: 0, 11: 0, 12: 0, 13: 0, 14: 0, 15: 0, 16: 0, 17: 0,
 18: 0, 19: 0, 20: 0, 21: 0, 22: 0, 23: 0, 24: 0, 25: 0,
 26: 0, 27: 0, 28: 0, 29: 0, 30: 0, 31: 0, 32: 0, 33: 0,
 34: 0, 35: 0}
to_vector(order=None)[source]

Return self as a (dense) free module vector.

EXAMPLES:

sage: ch = matroids.Uniform(3, 6).chow_ring(QQ, False)
sage: v = ch.an_element(); v
-A01 - A02 - A03 - A04 - A05 - A012345
sage: v.to_vector()
(0, -1, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0)
>>> from sage.all import *
>>> ch = matroids.Uniform(Integer(3), Integer(6)).chow_ring(QQ, False)
>>> v = ch.an_element(); v
-A01 - A02 - A03 - A04 - A05 - A012345
>>> v.to_vector()
(0, -1, -1, 0, -1, 0, 0, -1, 0, 0, 0, -1, 0, 0, 0, 0, -1, 0)
basis()[source]

Return the monomial basis of the given Chow ring.

EXAMPLES:

sage: ch = matroids.Uniform(3, 6).chow_ring(QQ, True, 'fy')
sage: ch.basis()
Family (1, B1, B1*B012345, B0, B0*B012345, B01, B01^2, B2,
B2*B012345, B02, B02^2, B12, B12^2, B3, B3*B012345, B03, B03^2,
B13, B13^2, B23, B23^2, B4, B4*B012345, B04, B04^2, B14, B14^2,
B24, B24^2, B34, B34^2, B5, B5*B012345, B05, B05^2, B15, B15^2,
B25, B25^2, B35, B35^2, B45, B45^2, B012345, B012345^2, B012345^3)
sage: set(ch.defining_ideal().normal_basis()) == set(ch.basis())
True
sage: ch = matroids.catalog.Fano().chow_ring(QQ, False)
sage: ch.basis()
Family (1, Abcd, Aace, Aabf, Adef, Aadg, Abeg, Acfg, Aabcdefg,
Aabcdefg^2)
sage: set(ch.defining_ideal().normal_basis()) == set(ch.basis())
True
sage: ch = matroids.Wheel(3).chow_ring(QQ, True, 'atom-free')
sage: ch.basis()
Family (1, A0, A0*A012345, A2, A2*A012345, A3, A3*A012345, A23,
A23^2, A1, A1*A012345, A013, A013^2, A4, A4*A012345, A04, A04^2,
A124, A124^2, A5, A5*A012345, A025, A025^2, A15, A15^2, A345,
A345^2, A012345, A012345^2, A012345^3)
sage: set(ch.defining_ideal().normal_basis()) == set(ch.basis())
True
>>> from sage.all import *
>>> ch = matroids.Uniform(Integer(3), Integer(6)).chow_ring(QQ, True, 'fy')
>>> ch.basis()
Family (1, B1, B1*B012345, B0, B0*B012345, B01, B01^2, B2,
B2*B012345, B02, B02^2, B12, B12^2, B3, B3*B012345, B03, B03^2,
B13, B13^2, B23, B23^2, B4, B4*B012345, B04, B04^2, B14, B14^2,
B24, B24^2, B34, B34^2, B5, B5*B012345, B05, B05^2, B15, B15^2,
B25, B25^2, B35, B35^2, B45, B45^2, B012345, B012345^2, B012345^3)
>>> set(ch.defining_ideal().normal_basis()) == set(ch.basis())
True
>>> ch = matroids.catalog.Fano().chow_ring(QQ, False)
>>> ch.basis()
Family (1, Abcd, Aace, Aabf, Adef, Aadg, Abeg, Acfg, Aabcdefg,
Aabcdefg^2)
>>> set(ch.defining_ideal().normal_basis()) == set(ch.basis())
True
>>> ch = matroids.Wheel(Integer(3)).chow_ring(QQ, True, 'atom-free')
>>> ch.basis()
Family (1, A0, A0*A012345, A2, A2*A012345, A3, A3*A012345, A23,
A23^2, A1, A1*A012345, A013, A013^2, A4, A4*A012345, A04, A04^2,
A124, A124^2, A5, A5*A012345, A025, A025^2, A15, A15^2, A345,
A345^2, A012345, A012345^2, A012345^3)
>>> set(ch.defining_ideal().normal_basis()) == set(ch.basis())
True
matroid()[source]

Return the matroid of self.

EXAMPLES:

sage: ch = matroids.Uniform(3,6).chow_ring(QQ, True, 'fy')
sage: ch.matroid()
U(3, 6): Matroid of rank 3 on 6 elements with circuit-closures
{3: {{0, 1, 2, 3, 4, 5}}}
>>> from sage.all import *
>>> ch = matroids.Uniform(Integer(3),Integer(6)).chow_ring(QQ, True, 'fy')
>>> ch.matroid()
U(3, 6): Matroid of rank 3 on 6 elements with circuit-closures
{3: {{0, 1, 2, 3, 4, 5}}}