up previous next
toric

saturate toric ideals

Syntax
toric(I: IDEAL): IDEAL
toric(I: IDEAL, L: LIST of INDETS): IDEAL
toric(M: MAT|LIST of LIST): IDEAL

Description
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 i-th component of k(+) is the i-th 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, Preprint (1998). 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.

Example
/**/  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*z-y^2, x*w-y*z));
ideal(-y^2 +x*z, -y*z +x*w, z^2 -y*w)

/**/  toric(ideal(x*z-y^2, x*w-y*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)

See Also