
D.2.4.15 envelop
Procedure from library grobcov.lib (see grobcov_lib).
 Usage:
 envelop(poly F,ideal C[,options]);
poly F must represent the family of hypersurfaces for which on want to compute its envelop.
ideal C must be the ideal of restrictions on the variables defining the family, and should contain less polynomials
than the number of variables.
(x_1,..,x_n) are the variables of the hypersurfaces of F, that are considered as parameters of the parametric ring.
(u_1,..,u_m) are the parameteres of the hypersurfaces, that are considered as variables of the parametric ring.
Calling sequence:
ring R=(0,x_1,..,x_n),(u_1,..,u_m),lp;
poly F=F(x_1,..,x_n,u_1,..,u_m);
ideal C=g_1(u_1,..u_m),..,g_s(u_1,..u_m);
envelop(F,C[,options]); where s<m.
 Return:
 The output is a list of the components [C_1, .. , C_n] of the locus. Each component is given by
Ci=[pi,[pi1,..pi_s_i],type_i,level_i]
where the first element is the canonical Prepresentation of the subset. The type is one of
"Normal", "Special", "Accumulation" or "Degenerate", and level is the depth of the segment in the
constructible set of the locus. Generally it is 1, because the locus components are locally closed.
The locus is divided into two class of subsets: the normal and the nonnormal locus.
The Normal locus has two kind of components: "Normal" and "Special".
The Nonnormal locus has two kind of components: "Accumulation" and "Degenerate".
Normal component is n1dimensional component, where each point in the component has 0dimensional
antiimage, and the antiimage depends on the point in the component.
Special component is n1dimensional component, where each point in the component has 0dimensional
antiimage, and the antiimage does not depend on the point in it. The Special components return more
information, namely the antiimage of the component, that is 0dimensional, and is independent of the point
in the locus component.
Accumulation component is of dimension less that n1 (less than an hypersurface) whose antiimage is
nonzero dimensional.
Degenerate components is n1dimensional component, and each point in the component has nonzero
dimensional antiimage.
The level is the depth of the segment of the constructible locus subset (normal and nonnormal subsets).
If all levels of a locus are 1, then all subsets are locally closed.
 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.
The algorithm allows the following options as pair of arguments:
"vmov", ideal(mover variables) : by default vmov are u_1,..,u_m. But it can be restricted by the user to the
more convenient ones.
"version", v : There are two versions of the algorithm. ("version",1) is a full algorithm that always
distinguishes correctly between "Normal" and "Special" components, whereas ("version",0) can declare
a component as "Normal" being really "Special", but is more effective. By default ("version",1) is used
when the number of variables is less than 4 and 0 if not. The user can force to use one or other version, but
it is not recommended.
"comments", c: by default it is 0, but it can be set to 1.
 Note:
 grobcov and locus are called internally.
The basering R, must be of the form Q[a][x] (a=parameters, x=variables).
This routine uses the generalized definition of envelop introduced in the book
A. Montes. "Discussing Parametric Polynomial Systems: The Groebner Cover" not yet published.
Example:
 LIB "grobcov.lib";
// Steiner Deltoid
// 1. Consider the circle x1^2+y1^21=0, and a mover point M(x1,y1) on it.
// 2. Consider the triangle A(0,1), B(1,0), C(1,0).
// 3. Consider lines passing through M perpendicular to two sides of ABC triangle.
// 4. Obtain the envelop of the lines above.
if(defined(R)){kill R;}
ring R=(0,x,y),(x1,y1,x2,y2),lp;
short=0;
ideal C=(x1)^2+(y1)^21,
x2+y21,
x2y2x1+y1;
matrix M[3][3]=x,y,1,x2,y2,1,x1,0,1;
poly F=det(M);
// Curves Family F
F;
==> x1*y2+(y)*x1+(y)*x2+(x)*y2
// Conditions C=
C;
==> C[1]=x1^2+y1^21
==> C[2]=x2+y21
==> C[3]=x1+y1+x2y2
envelop(F,C);
==> [1]:
==> [1]:
==> _[1]=(x^4+2*x^2*y^2+10*x^2*yx^2+y^46*y^3+12*y^28*y)
==> [2]:
==> [1]:
==> _[1]=1
==> [3]:
==> Normal
==> [4]:
==> 1
==> [2]:
==> [1]:
==> _[1]=(x+y1)
==> [2]:
==> [1]:
==> _[1]=1
==> [3]:
==> [1]:
==> Special
==> [2]:
==> y2,x21,y1,x11
==> [4]:
==> 1

