Singular

D.2.4.1 grobcov

Procedure from library `grobcov.lib` (see grobcov_lib).

Usage:
grobcov(ideal F[,options]);
F: ideal in a ring with parameters and variables (the names can be arbitrary)

Return:
list, say G, where all the data of the Groebner cover of F are stored. G is a list of lists G[1],G[2],...,G[s] (G[i] is called below: (lpp_i, basis_i, segment_i, [lpph_i]) - each list G[i], consists of 2 ideals: G[i][1] and G[i][2] in the variables and a list G[i][3] of 2 ideals G[i][3][1] and G[i][3][2] in the parameters [and a fourth list,G[i][4] of 2 ideals in the parameters if option ("rep",2) is set] Meaning of the ideals G[i][1] and G[i][2]:
- G[i][1] (= lpp_i) is the leading power product ideal of the input ideal F under the conditions in G[i][3]

- G[i][2] (= basis_i) is the Groebner basis of the input ideal F under the conditions in G[i][3] Meaning of the list G[i][3] (and similar for G[i][4]):

- G[i][3] (= segment_i) describes the locally closed set which has G[i][1] as (reduced) Groebner basis
G[i][3][1] is the ideal of the closed conditions
G[i][3][2] is the ideal of the open conditions
i.e. in the set V(G[i][3][1]) \ G[i][3][2] the input ideal has leading ideal G[i][1] and Groebner basis G[i][2]

Note:
grobcov is only tested for ideals in rings with global ordering over QQ

Options:
An option is a pair of arguments: string, integer.
To modify the default options, pairs of arguments
-option name, value- of valid options must be added to the call.

Explanation:
In the list G[1]=[[lpp_1,basis_1,segment_1], ..., G[s]=[lpp_s,basis_s,segment_s]] (optionally [[ lpp_1,basis_1,segment_1,lpph_1], ..., [lpp_s,basis_s,segment_s,lpph_s]]) The lpp (leading power products) are constant over a segment and are the set of lpp of the reduced Groebner basis for each point of the segment.

option ("showhom",1): the lpph will be shown: The lpph are the lpp of the homogenized ideal and are different for each segment. It is given as a string, and shown only for information. With the default option "can",1, the segments have different lpph.

basis: to each element of lpp corresponds an I-regular function given in full representation (by option ("ext",1)) or in generic representation (default option ("ext",0)). The I-regular function is the corresponding element of the reduced Groebner basis for each point of the segment with the given lpp. For each point in the segment, the polynomial or the set of polynomials representing it (if they do not specialize to 0) specializes to the corresponding element of the reduced Groebner basis after normalization.
In the full representation at least one of the polynomials representing the I-regular function specializes to non-zero.

option ("rep",0): With the default option ("rep",0) the representation of the segment is the P-representation. The P-representation of a segment is of the form [[p_1,[p_11,..,p_1k1]],..,[p_r,[p_r1,..,p_rkr]]] representing the segment Union_i ( V(p_i) \ ( Union_j V(p_ij) ) ), where the p's are prime ideals.

option ("rep",1): With option ("rep",1) the representation of the segment is the C-representation. The C-representation of a segment is of the form (E,N) representing V(E) \ V(N), and the ideals E and N are radical and N contains E.

option ("rep",2): With option ("rep",2) both representations of the segment are given.

With the default option the homogenized ideal is computed before obtaining the Groebner Cover, so that the result is the canonical Groebner Cover. Setting ("can",0) only homogenizes the basis so the result is not exactly canonical, but the computation is shorter.

"ext",0-1: The default is ("ext",0).
With the default ("ext",0), only the generic representation of the bases is computed (single polynomials, but not specializing to non-zero for every point of the segment. With option ("ext",1) the full representation of the bases is computed (possible sheaves) and sometimes a simpler result is obtained, but the computation is more time consuming.

"rep",0-1-2: The default is ("rep",0)
and then the segments are given in canonical P-representation; option ("rep",1) represents the segments in canonical C-representation, and option ("rep",2) gives both representations.

"comment",0-3: The default is ("comment",0).
Setting "comment" higher will provide information about the development of the computation.

"showhom",0-1: The default is ("showhom",0).
Setting "showhom",1 will output the set of lpp of the homogenized ideal of each segment as last element.

One can give none or whatever of these options.

Theory:
A. Montes , M. Wibmer, "Groebner Bases for Polynomial Systems with parameters". JSC 45 (2010) 1391-1425.)
or the not yet published book
A. Montes. " The Groebner Cover" (Discussing Parametric Polynomial Systems).

Example:
 ```LIB "grobcov.lib"; // Casas conjecture for degree 4: ring R1=(0,a0,a1,a2,a3,a4),(x1,x2,x3),dp; short=0; ideal F=x1^4+(4*a3)*x1^3+(6*a2)*x1^2+(4*a1)*x1+(a0), x1^3+(3*a3)*x1^2+(3*a2)*x1+(a1), x2^4+(4*a3)*x2^3+(6*a2)*x2^2+(4*a1)*x2+(a0), x2^2+(2*a3)*x2+(a2), x3^4+(4*a3)*x3^3+(6*a2)*x3^2+(4*a1)*x3+(a0), x3+(a3); grobcov(F); ==> [1]: ==> [1]: ==> _[1]=1 ==> [2]: ==> _[1]=1 ==> [3]: ==> [1]: ==> [1]: ==> _[1]=0 ==> [2]: ==> [1]: ==> _[1]=(a2-a3^2) ==> _[2]=(a1-a3^3) ==> _[3]=(a0-a3^4) ==> [2]: ==> [1]: ==> _[1]=x3 ==> _[2]=x2^2 ==> _[3]=x1^3 ==> [2]: ==> _[1]=x3+(a3) ==> _[2]=x2^2+(2*a3)*x2+(a3^2) ==> _[3]=x1^3+(3*a3)*x1^2+(3*a3^2)*x1+(a3^3) ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(a2-a3^2) ==> _[2]=(a1-a3^3) ==> _[3]=(a0-a3^4) ==> [2]: ==> [1]: ==> _[1]=1 // EXAMPLE: // M. Rychlik robot; // Complexity and Applications of Parametric Algorithms of // Computational Algebraic Geometry.; // In: Dynamics of Algorithms, R. de la Llave, L. Petzold and J. Lorenz eds.; // IMA Volumes in Mathematics and its Applications, // Springer-Verlag 118: 1-29 (2000).; // (18. Mathematical robotics: Problem 4, two-arm robot)." ring R2=(0,a,b,l2,l3),(c3,s3,c1,s1), dp; short=0; ideal S12=a-l3*c3-l2*c1,b-l3*s3-l2*s1,c1^2+s1^2-1,c3^2+s3^2-1; S12; ==> S12[1]=(-l3)*c3+(-l2)*c1+(a) ==> S12[2]=(-l3)*s3+(-l2)*s1+(b) ==> S12[3]=c1^2+s1^2-1 ==> S12[4]=c3^2+s3^2-1 grobcov(S12); ==> [1]: ==> [1]: ==> _[1]=c1 ==> _[2]=s3 ==> _[3]=c3 ==> _[4]=s1^2 ==> [2]: ==> _[1]=(2*a*l2)*c1+(2*b*l2)*s1+(-a^2-b^2-l2^2+l3^2) ==> _[2]=(l3)*s3+(l2)*s1+(-b) ==> _[3]=(2*a*l3)*c3+(-2*b*l2)*s1+(-a^2+b^2+l2^2-l3^2) ==> _[4]=(4*a^2*l2^2+4*b^2*l2^2)*s1^2+(-4*a^2*b*l2-4*b^3*l2-4*b*l2^3+4*\ b*l2*l3^2)*s1+(a^4+2*a^2*b^2-2*a^2*l2^2-2*a^2*l3^2+b^4+2*b^2*l2^2-2*b^2*l\ 3^2+l2^4-2*l2^2*l3^2+l3^4) ==> [3]: ==> [1]: ==> [1]: ==> _[1]=0 ==> [2]: ==> [1]: ==> _[1]=(a) ==> [2]: ==> _[1]=(l3) ==> [3]: ==> _[1]=(l2) ==> [4]: ==> _[1]=(a^2+b^2) ==> [2]: ==> [1]: ==> _[1]=s1 ==> _[2]=s3 ==> _[3]=c3 ==> _[4]=c1^2 ==> [2]: ==> _[1]=(2*b*l2)*s1+(-b^2-l2^2+l3^2) ==> _[2]=(2*b*l3)*s3+(-b^2+l2^2-l3^2) ==> _[3]=(l3)*c3+(l2)*c1 ==> _[4]=(4*b^2*l2^2)*c1^2+(b^4-2*b^2*l2^2-2*b^2*l3^2+l2^4-2*l2^2*l3^2+\ l3^4) ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(a) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(a) ==> [2]: ==> _[1]=(l2) ==> _[2]=(a) ==> [3]: ==> _[1]=(b) ==> _[2]=(a) ==> [3]: ==> [1]: ==> _[1]=1 ==> [2]: ==> _[1]=1 ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(b) ==> _[2]=(a) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(b) ==> _[3]=(a) ==> [2]: ==> _[1]=(l2+l3) ==> _[2]=(b) ==> _[3]=(a) ==> [3]: ==> _[1]=(l2-l3) ==> _[2]=(b) ==> _[3]=(a) ==> [2]: ==> [1]: ==> _[1]=(l2) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> [2]: ==> _[1]=(l2) ==> _[2]=(a^2+b^2-l3^2) ==> [4]: ==> [1]: ==> _[1]=s3 ==> _[2]=c3 ==> _[3]=c1^2 ==> [2]: ==> _[1]=(l2^2*l3+2*l2^2-l3^3)*s3+(2*l2*l3)*s1+(b*l3^2) ==> _[2]=(l2^2*l3+2*l2^2-l3^3)*c3+(2*l2*l3)*c1+(a*l3^2) ==> _[3]=c1^2+s1^2-1 ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(l2-l3) ==> _[2]=(b) ==> _[3]=(a) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> _[3]=(b) ==> _[4]=(a) ==> [2]: ==> [1]: ==> _[1]=(l2+l3) ==> _[2]=(b) ==> _[3]=(a) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> _[3]=(b) ==> _[4]=(a) ==> [3]: ==> [1]: ==> _[1]=(l2) ==> _[2]=(a^2+b^2-l3^2) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> _[3]=(a^2+b^2) ==> [5]: ==> [1]: ==> _[1]=c1^2 ==> _[2]=c3^2 ==> [2]: ==> _[1]=c1^2+s1^2-1 ==> _[2]=c3^2+s3^2-1 ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> _[3]=(b) ==> _[4]=(a) ==> [2]: ==> [1]: ==> _[1]=1 ==> [6]: ==> [1]: ==> _[1]=1 ==> [2]: ==> _[1]=1 ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(l3) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> [2]: ==> _[1]=(l3) ==> _[2]=(a^2+b^2-l2^2) ==> [7]: ==> [1]: ==> _[1]=1 ==> [2]: ==> _[1]=1 ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> _[3]=(a^2+b^2) ==> [8]: ==> [1]: ==> _[1]=s1 ==> _[2]=c1 ==> _[3]=c3^2 ==> [2]: ==> _[1]=(l2)*s1+(-b) ==> _[2]=(l2)*c1+(-a) ==> _[3]=c3^2+s3^2-1 ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(a^2+b^2-l2^2) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> _[3]=(a^2+b^2) ==> [9]: ==> [1]: ==> _[1]=1 ==> [2]: ==> _[1]=1 ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> _[3]=(a^2+b^2) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> _[3]=(b) ==> _[4]=(a) ==> [10]: ==> [1]: ==> _[1]=s1 ==> _[2]=c1 ==> _[3]=s3 ==> _[4]=c3 ==> [2]: ==> _[1]=(4*b*l2^3-4*b*l2*l3^2)*s1+(-4*b^2*l2^2-l2^4+2*l2^2*l3^2-l3^4) ==> _[2]=(4*b^2*l2^3-4*b^2*l2*l3^2)*c1+(-4*a*b^2*l2^2+a*l2^4-2*a*l2^2*l\ 3^2+a*l3^4) ==> _[3]=(4*b*l2^2*l3-4*b*l3^3)*s3+(4*b^2*l3^2+l2^4-2*l2^2*l3^2+l3^4) ==> _[4]=(4*b^2*l2^2*l3-4*b^2*l3^3)*c3+(4*a*b^2*l3^2-a*l2^4+2*a*l2^2*l3\ ^2-a*l3^4) ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(a^2+b^2) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(a^2+b^2) ==> [2]: ==> _[1]=(l2+l3) ==> _[2]=(a^2+b^2) ==> [3]: ==> _[1]=(l2) ==> _[2]=(a^2+b^2) ==> [4]: ==> _[1]=(l2-l3) ==> _[2]=(a^2+b^2) ==> [5]: ==> _[1]=(b) ==> _[2]=(a) ==> [11]: ==> [1]: ==> _[1]=1 ==> [2]: ==> _[1]=1 ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(l2-l3) ==> _[2]=(a^2+b^2) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> _[3]=(a^2+b^2) ==> [2]: ==> _[1]=(l2-l3) ==> _[2]=(b) ==> _[3]=(a) ==> [2]: ==> [1]: ==> _[1]=(l2+l3) ==> _[2]=(a^2+b^2) ==> [2]: ==> [1]: ==> _[1]=(l3) ==> _[2]=(l2) ==> _[3]=(a^2+b^2) ==> [2]: ==> _[1]=(l2+l3) ==> _[2]=(b) ==> _[3]=(a) // EXAMPLE: different segments may have different dimensions ring R3=(0,g,h),(y,z,v,w,t),dp; ideal I = -4*v2+zw+(h)*zt + (g)*vy, zv-4*v2+(h)*t2, -v2+vw+(-g)*vt+(-h)*t2; list G = grobcov(I); G; ==> [1]: ==> [1]: ==> _[1]=v2 ==> _[2]=zv ==> _[3]=yv ==> _[4]=zt2 ==> _[5]=zw2 ==> _[6]=z2w ==> _[7]=vw2t2 ==> _[8]=yw3t2 ==> [2]: ==> _[1]=v2-vw+(g)*vt+(h)*t2 ==> _[2]=zv-4*vw+(4g)*vt+(5h)*t2 ==> _[3]=(g)*yv+zw-4*vw+(h)*zt+(4g)*vt+(4h)*t2 ==> _[4]=zt2-5*vt2+wt2+(-g)*t3 ==> _[5]=zw2-4*vw2+(-g+h)*zwt+(4g-4h)*vwt+(gh)*yt2+(-gh-4h)*vt2+(gh+5h)\ *wt2+(-g2h+5h2)*t3 ==> _[6]=z2w-16*vw2+(h)*z2t+(16g-16h)*vwt+(-gh)*yt2+(16gh+4h)*vt2+(20h)\ *wt2+(20h2)*t3 ==> _[7]=vw2t2-w3t2+(-g+h)*vwt3+(2g-h)*w2t3+(gh)*yt4+(-gh-4h)*vt4+(-g2+\ 2gh+5h)*wt4+(-g2h+5h2)*t5 ==> _[8]=(g)*yw3t2+(-2g2+gh)*yw2t3+(4g+4h)*w3t3+(-g2h)*y2t4+(g3-2g2h-6g\ h)*ywt4+(-8g2-4gh+4h2+3h)*w2t4+(g3h-4g2h-10gh2)*yt5+(4g3-4g2h-8gh2-28gh-2\ 2h2)*wt5+(4g3h+4g2h2-28gh2-25h3-16h2)*t6 ==> [3]: ==> [1]: ==> [1]: ==> _[1]=0 ==> [2]: ==> [1]: ==> _[1]=(h) ==> [2]: ==> _[1]=(g) ==> [2]: ==> [1]: ==> _[1]=zw ==> _[2]=v2 ==> _[3]=zv ==> _[4]=zt2 ==> _[5]=vwt ==> _[6]=w2t2 ==> [2]: ==> _[1]=zw-4*vw+(h)*zt+(4h)*t2 ==> _[2]=v2-vw+(h)*t2 ==> _[3]=zv-4*vw+(5h)*t2 ==> _[4]=zt2-5*vt2+wt2 ==> _[5]=4*vwt+4*vt2-wt2+(-5h)*t3 ==> _[6]=4*w2t2+(-20h+4)*vt3+(4h-1)*wt3+(-21h)*t4 ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(g) ==> [2]: ==> [1]: ==> _[1]=(h) ==> _[2]=(g) ==> [3]: ==> [1]: ==> _[1]=zw ==> _[2]=v2 ==> _[3]=zv ==> [2]: ==> _[1]=zw-4*vw ==> _[2]=v2-vw ==> _[3]=zv-4*vw ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(h) ==> _[2]=(g) ==> [2]: ==> [1]: ==> _[1]=1 ==> [4]: ==> [1]: ==> _[1]=v2 ==> _[2]=zv ==> _[3]=yv ==> _[4]=zw2 ==> _[5]=z2w ==> [2]: ==> _[1]=v2-vw+(g)*vt ==> _[2]=zv-4*vw+(4g)*vt ==> _[3]=(g)*yv+zw-4*vw+(4g)*vt ==> _[4]=zw2-4*vw2+(-g)*zwt+(4g)*vwt ==> _[5]=z2w-16*vw2+(16g)*vwt ==> [3]: ==> [1]: ==> [1]: ==> _[1]=(h) ==> [2]: ==> [1]: ==> _[1]=(h) ==> _[2]=(g) //Compute the dimension and the degree at the segment G[1][3]: V(0) \ V(h,g) = {h!=0 and g!=0} degree(std(G[1][1])); ==> // dimension (proj.) = 1 ==> // degree (proj.) = 8 //Compute the dimension and the degree at the segment G[4][3]: V(h) \ V(h,g) = {h=0 and g!=0} degree(std(G[4][1])); ==> // dimension (proj.) = 2 ==> // degree (proj.) = 2 ```