Toric ideals

A toric ideal (associated to an integer matrix \(A\)) is an ideal of the form

\[I_A = \left< x^u - x^v : u,v \in \ZZ_\geq^n , u-v \in \ker(A) \right>\]

In other words, it is an ideal generated by irreducible “binomials”, that is, differences of monomials without a common factor. Since the Buchberger algorithm preserves this property, any Groebner basis is then also generated by binomials.

EXAMPLES:

sage: A = matrix([[1,1,1],[0,1,2]])
sage: IA = ToricIdeal(A)
sage: IA.ker()
Free module of degree 3 and rank 1 over Integer Ring
User basis matrix:
[-1  2 -1]
sage: IA
Ideal (-z1^2 + z0*z2) of Multivariate Polynomial
Ring in z0, z1, z2 over Rational Field

Here, the “naive” ideal generated by \(z_0 z_2 - z_1^2\) does already equal the toric ideal. But that is not true in general! For example, this toric ideal ([ProcSympPureMath62], Example 1.2) is the twisted cubic and cannot be generated by \(2=\dim \ker(A)\) polynomials:

sage: A = matrix([[3,2,1,0],[0,1,2,3]])
sage: IA = ToricIdeal(A)
sage: IA.ker()
Free module of degree 4 and rank 2 over Integer Ring
User basis matrix:
[-1  1  1 -1]
[-1  2 -1  0]
sage: IA
Ideal (-z1*z2 + z0*z3, -z1^2 + z0*z2, z2^2 - z1*z3) of
Multivariate Polynomial Ring in z0, z1, z2, z3 over Rational Field

The following family of toric ideals is from Example 4.4 of [ProcSympPureMath62]. One can show that \(I_d\) is generated by one quadric and \(d\) binomials of degree \(d\):

sage: I = lambda d: ToricIdeal(matrix([[1,1,1,1,1],[0,1,1,0,0],[0,0,1,1,d]]))
sage: I(2)
Ideal (-z3^2 + z0*z4,
       z0*z2 - z1*z3,
       z2*z3 - z1*z4) of
Multivariate Polynomial Ring in z0, z1, z2, z3, z4 over Rational Field
sage: I(3)
Ideal (-z3^3 + z0^2*z4,
       z0*z2 - z1*z3,
       z2*z3^2 - z0*z1*z4,
       z2^2*z3 - z1^2*z4) of
Multivariate Polynomial Ring in z0, z1, z2, z3, z4 over Rational Field
sage: I(4)
Ideal (-z3^4 + z0^3*z4,
       z0*z2 - z1*z3,
       z2*z3^3 - z0^2*z1*z4,
       z2^2*z3^2 - z0*z1^2*z4,
       z2^3*z3 - z1^3*z4) of
Multivariate Polynomial Ring in z0, z1, z2, z3, z4 over Rational Field

Finally, the example in [GRIN]

sage: A = matrix(ZZ, [ [15,  4, 14, 19,  2,  1, 10, 17],
....:                  [18, 11, 13,  5, 16, 16,  8, 19],
....:                  [11,  7,  8, 19, 15, 18, 14,  6],
....:                  [17, 10, 13, 17, 16, 14, 15, 18] ])
sage: IA = ToricIdeal(A)     # long time
sage: IA.ngens()             # long time
213

REFERENCES:

[GRIN](1, 2) Bernd Sturmfels, Serkan Hosten: GRIN: An implementation of Grobner bases for integer programming, in “Integer Programming and Combinatorial Optimization”, [E. Balas and J. Clausen, eds.], Proceedings of the IV. IPCO Conference (Copenhagen, May 1995), Springer Lecture Notes in Computer Science 920 (1995) 267-276.
[ProcSympPureMath62](1, 2) Bernd Sturmfels: Equations defining toric varieties, Algebraic Geometry - Santa Cruz 1995, Proc. Sympos. Pure Math., 62, Part 2, Amer. Math. Soc., Providence, RI, 1997, pp. 437-449.
[GBCP]Bernd Sturmfels: Grobner Bases and Convex Polytopes AMS University Lecture Series Vol. 8 (01 December 1995)

AUTHORS:

  • Volker Braun (2011-01-03): Initial version
class sage.schemes.toric.ideal.ToricIdeal(A, names='z', base_ring=Rational Field, polynomial_ring=None, algorithm='HostenSturmfels')

Bases: sage.rings.polynomial.multi_polynomial_ideal.MPolynomialIdeal

This class represents a toric ideal defined by an integral matrix.

INPUT:

  • A – integer matrix. The defining matrix of the toric ideal.

  • names – string (optional). Names for the variables. By default, this is 'z' and the variables will be named z0, z1, …

  • base_ring – a ring (optional). Default: \(\QQ\). The base ring of the ideal. A toric ideal uses only coefficients \(\pm 1\).

  • polynomial_ring – a polynomial ring (optional). The polynomial ring to construct the ideal in.

    You may specify the ambient polynomial ring via the polynomial_ring parameter or via the names and base_ring parameter. A ValueError is raised if you specify both.

  • algorithm – string (optional). The algorithm to use. For now, must be 'HostenSturmfels' which is the algorithm proposed by Hosten and Sturmfels in [GRIN].

EXAMPLES:

sage: A = matrix([[1,1,1],[0,1,2]])
sage: ToricIdeal(A)
Ideal (-z1^2 + z0*z2) of Multivariate Polynomial Ring
in z0, z1, z2 over Rational Field

First way of specifying the polynomial ring:

sage: ToricIdeal(A, names='x,y,z', base_ring=ZZ)
Ideal (-y^2 + x*z) of Multivariate Polynomial Ring
in x, y, z over Integer Ring

Second way of specifying the polynomial ring:

sage: R.<x,y,z> = ZZ[]
sage: ToricIdeal(A, polynomial_ring=R)
Ideal (-y^2 + x*z) of Multivariate Polynomial Ring
in x, y, z over Integer Ring

It is an error to specify both:

sage: ToricIdeal(A, names='x,y,z', polynomial_ring=R)
Traceback (most recent call last):
...
ValueError: You must not specify both variable names and a polynomial ring.
A()

Return the defining matrix.

OUTPUT:

An integer matrix.

EXAMPLES:

sage: A = matrix([[1,1,1],[0,1,2]])
sage: IA = ToricIdeal(A)
sage: IA.A()
[1 1 1]
[0 1 2]
ker()

Return the kernel of the defining matrix.

OUTPUT:

The kernel of self.A().

EXAMPLES:

sage: A = matrix([[1,1,1],[0,1,2]])
sage: IA = ToricIdeal(A)
sage: IA.ker()
Free module of degree 3 and rank 1 over Integer Ring
User basis matrix:
[-1  2 -1]
nvariables()

Return the number of variables of the ambient polynomial ring.

OUTPUT:

Integer. The number of columns of the defining matrix A().

EXAMPLES:

sage: A = matrix([[1,1,1],[0,1,2]])
sage: IA = ToricIdeal(A)
sage: IA.nvariables()
3