up previous next
saturate toric ideals
toric(I: IDEAL): IDEAL
toric(I: IDEAL, L: LIST of INDETS): IDEAL
toric(M: MATLIST of LIST): IDEAL 
These functions return the saturation of an ideal, I, generated by
binomials. In the first two cases, I is the ideal generated by the
binomials in L. To describe the ideal in the last case, let K be the
integral elements in the kernel of M. For each k in K, we can write k
= k(+)  k() where the ith component of k(+) is the ith component
of k, if positive, otherwise zero. Then I is the ideal generated by
the binomials
x^k(+)  x^k()
as k ranges over K.
NOTE: successive calls to this last form of the function may produce
different generators for the saturation.
The first and third functions return the saturation of I. For the
second function, if the saturation of I with respect to the variables
in X happens to equal the saturation of I, then the saturation of I is
returned. Otherwise, an ideal
containing the saturation with
respect to the given variables is returned. The point is that if one
knows, a priori, that the saturation of I can be obtained by
saturating with respect to a subset of the variables, the second
function may be used to save time.
For more details, see the article:
A.M. Bigatti, R. La Scala, L. Robbiano,
Computing Toric Ideals,
Journal of Symbolic Computation, 27, 351365 (1999).
The article describes three different algorithms; the one implemented
in CoCoA is
EATI. The first two examples below are motivated
by B. Sturmfels,
Groebner Bases and Convex Polytopes, Chapter
6, p. 51. They count the number of homogeneous primitive partition
identities of degrees 8 and 9.
/**/ use QQ[x[1..8],y[1..8]];
/**/ HPPI8 := [x[1]^I*x[I+2]*y[2]^(I+1) y[1]^I*y[I+2]*x[2]^(I+1)  I in 1..6];
/**/ BL := toric(ideal(HPPI8), [x[1],y[2]]);
/**/ len(gens(BL));
340
/**/ use QQ[x[1..9],y[1..9]];
/**/ HPPI9 := [x[1]^I*x[I+2]*y[2]^(I+1) y[1]^I*y[I+2]*x[2]^(I+1)  I in 1..7];
/**/ BL := toric(ideal(HPPI9), [x[1],y[2]]);
/**/ len(gens(BL));
798
/**/ use R ::= QQ[x,y,z,w];
/**/ toric(ideal(x*zy^2, x*wy*z));
ideal(y^2 +x*z, y*z +x*w, z^2 y*w)
/**/ toric(ideal(x*zy^2, x*wy*z), [y]);
ideal(y^2 +x*z, y*z +x*w, z^2 y*w)
/**/ use R ::= QQ[x,y,z];
/**/ toric([[1,3,2],[3,4,8]]);
ideal(x^16 +y^2*z^5)
/**/ toric(mat([[1,3,2],[3,4,8]]));
ideal(x^16 +y^2*z^5)
