|
#############################################################################
##
## varieties.gi FinInG package
## John Bamberg
## Anton Betten
## Jan De Beule
## Philippe Cara
## Michel Lavrauw
## Max Neunhoeffer
##
## Copyright 2018 Colorado State University
## Sabancı Üniversitesi
## Università degli Studi di Padova
## Universiteit Gent
## University of St. Andrews
## University of Western Australia
## Vrije Universiteit Brussel
##
##
## Implementation stuff for varieties
##
#############################################################################
#############################################################################
# Constructor methods:
#############################################################################
#############################################################################
#############################################################################
#############################################################################
### 0. Algebraic Varieties (generic methods) ###
#############################################################################
#############################################################################
#############################################################################
#############################################################################
#O AlgebraicVariety( <pg>, <pring>, <list> )
# constructs a projective variety in a projective space <pg>, with polynomials
# in <list>
##
InstallMethod( AlgebraicVariety,
"for a projective space, a polynomial ring and a list of polynomials",
[ IsProjectiveSpace, IsPolynomialRing, IsList ],
function( pg, pring, list )
return ProjectiveVariety(pg,pring,list);
end );
#############################################################################
#O AlgebraicVariety( <pg>, <list> )
# constructs a projective variety in a projective space <pg>, with polynomials
# in <list>
##
InstallMethod( AlgebraicVariety,
"for a projective space and a list of polynomials",
[ IsProjectiveSpace, IsList ],
function( pg, list )
local pring;
pring:=PolynomialRing(pg!.basefield,pg!.dimension + 1);
return ProjectiveVariety(pg,pring,list);
end );
#############################################################################
#O AlgebraicVariety( <ag>, <pring>, <list> )
# constructs an affine variety in an affine space <ag>, with polynomials
# in <list>
##
InstallMethod( AlgebraicVariety,
"for an affine space, a polynomial ring and a list of polynomials",
[ IsAffineSpace, IsPolynomialRing, IsList ],
function( pg, pring, list )
return AffineVariety(pg,pring,list);
end );
#############################################################################
#O AlgebraicVariety( <ag>, <list> )
# constructs an affine variety in an affine space <ag>, with polynomials
# in <list>
##
InstallMethod( AlgebraicVariety,
"for an affine space and a list of polynomials",
[ IsAffineSpace, IsList ],
function( ag, list )
local pring;
pring:=PolynomialRing(ag!.basefield, ag!.dimension);
return AffineVariety(ag, pring, list);
end );
#############################################################################
#############################################################################
#############################################################################
### 1. Projective Varieties ###
#############################################################################
#############################################################################
#############################################################################
#############################################################################
#O ProjectiveVariety( <pg>, <pring>, <list> )
# constructs a projective variety in a projective space <pg>, with polynomials
# in <list>, all polynomials are in <pring>
##
InstallMethod( ProjectiveVariety,
"for a projective space, a polynomial ring and a list of homogeneous polynomials",
[ IsProjectiveSpace, IsPolynomialRing, IsList ],
function( pg, pring, list )
local f, extrep, t, x, i, j, var, ty, degrees;
# The list of polynomials should be non-empty
if Length(list) < 1 then
Error("The list of polynomials should be non-empty");
fi;
# We check that the number of indeterminates of the polynomial ring is less
# than the 1 + the dimension of the projective space
if not Size(IndeterminatesOfPolynomialRing(pring)) = 1+pg!.dimension then
Error("The dimension of the projective space should be 1 less than the number of indeterminates of the polynomial ring");
fi;
# Next we check if the polynomial is homogenious
for f in list do
if not f in pring then
Error("The second argument should be a list of elements of the polynomial ring");
fi;
extrep:=ExtRepPolynomialRatFun(f);
t:=List(Filtered([1..Length(extrep)],i->IsOddInt(i)),j->extrep[j]);
degrees:=List(t,x->Sum(List(Filtered([1..Length(x)],i->IsEvenInt(i)),j->x[j])));
if not Size(AsSet(degrees)) = 1 then
Error("The second argument should be a list of homogeneous polynomials");
fi;
od;
var:=rec( geometry:=pg, polring:=pring, listofpols:=list);
ty:=NewType( NewFamily("ProjectiveVarietiesFamily"), IsProjectiveVariety and
IsProjectiveVarietyRep );
ObjectifyWithAttributes(var,ty,
#AmbientGeometry, pg,
#PolynomialRing, pring,
DefiningListOfPolynomials, list);
return var;
end );
#############################################################################
#O ProjectiveVariety( <pg>, <list> )
# constructs a projective variety in a projective space <pg>, with polynomials
# in <list>
##
InstallMethod( ProjectiveVariety,
"for a projective space and a list of polynomials",
[ IsProjectiveSpace, IsList ],
function( pg, list )
local pring;
pring:=PolynomialRing(pg!.basefield,pg!.dimension + 1);
return ProjectiveVariety(pg,pring,list);
end );
#############################################################################
# View, print methods for projective varieties.
##
InstallMethod( ViewObj,
"for a projective algebraic variety",
[ IsProjectiveVariety and IsProjectiveVarietyRep ],
function( var )
Print("Projective Variety in ");
ViewObj(var!.geometry);
end );
InstallMethod( PrintObj,
"for a projective algebraic variety",
[ IsProjectiveVariety and IsProjectiveVarietyRep ],
function( var )
Print("Projective Variety in ");
PrintObj(var!.geometry);
end );
InstallMethod( Display,
"for a projective algebraic variety",
[ IsProjectiveVariety and IsProjectiveVarietyRep ],
function( var )
Print("Projective Variety in ");
ViewObj(var!.geometry);
Print("\n Defining list of polynomials: ", DefiningListOfPolynomials(var),"\n");
end );
#############################################################################
#O HermitianVariety( <n>, <fld>);
# returns a nondegenerate hermitian variety in PG(n,fld)
InstallMethod( HermitianVariety,
"for a positive integer and a field",
[IsPosInt, IsField],
function(n,fld)
local pg, pring, list, hf, var, ty;
pg:=PG(n,fld);
pring:=PolynomialRing(fld,n+1);
list:=[EquationForPolarSpace(HermitianPolarSpace(n,fld))];
hf:=SesquilinearForm(HermitianPolarSpace(n,fld));
var:=rec( geometry:=pg, polring:=pring, listofpols:=list);
ty:=NewType( NewFamily("HermitianVarietiesFamily"), IsHermitianVariety and
IsHermitianVarietyRep );
ObjectifyWithAttributes(var,ty,
DefiningListOfPolynomials, list, SesquilinearForm, hf, IsStandardHermitianVariety, true);
return var;
end );
#############################################################################
#O HermitianVariety( <n>, <q>);
# returns a nondegenerate hermitian variety in PG(n,q)
InstallMethod( HermitianVariety,
"for a positive integer and a prime power",
[IsPosInt, IsPosInt],
function(n,q)
local fld;
fld:=GF(q);
return HermitianVariety(n,fld);
end );
#############################################################################
#O HermitianVariety( <pg>,<pring>,<pol>);
# returns a hermitian variety in pg
InstallMethod( HermitianVariety,
"for a projective space, a polynomial ring and a polynomial",
[IsProjectiveSpace,IsPolynomialRing, IsPolynomial],
function(pg,pring,pol)
local list,hf,var,ty;
hf:=HermitianFormByPolynomial(pol,pring);
list:=[pol];
var:=rec( geometry:=pg, polring:=pring, listofpols:=list);
ty:=NewType( NewFamily("HermitianVarietiesFamily"), IsHermitianVariety and
IsHermitianVarietyRep );
ObjectifyWithAttributes(var,ty,
DefiningListOfPolynomials, list, SesquilinearForm, hf, IsStandardHermitianVariety, false);
return var;
end );
#############################################################################
#O HermitianVariety( <pg>,<pol>);
# returns a hermitian variety in pg
InstallMethod( HermitianVariety,
"for a projective space and a polynomial",
[IsProjectiveSpace, IsPolynomial],
function(pg, pol)
local list,pring,hf,var,ty;
pring:=PolynomialRing(pg!.basefield, pg!.dimension +1);
hf:=HermitianFormByPolynomial(pol,pring);
list:=[pol];
var:=rec( geometry:=pg, polring:=pring, listofpols:=list);
ty:=NewType( NewFamily("HermitianVarietiesFamily"), IsHermitianVariety and
IsHermitianVarietyRep );
ObjectifyWithAttributes(var,ty,
DefiningListOfPolynomials, list, SesquilinearForm, hf, IsStandardHermitianVariety, false);
return var;
end );
#############################################################################
# View, print methods for hermitian varieties.
##
InstallMethod( ViewObj,
"for a hermitian variety",
[ IsHermitianVariety and IsHermitianVarietyRep ],
function( var )
Print("Hermitian Variety in ");
ViewObj(var!.geometry);
end );
InstallMethod( PrintObj,
"for a hermitian variety",
[ IsHermitianVariety and IsHermitianVarietyRep ],
function( var )
Print("Hermitian Variety in ");
PrintObj(var!.geometry);
end );
InstallMethod( Display,
"for a hermitian variety",
[ IsHermitianVariety and IsHermitianVarietyRep ],
function( var )
Print("Hermitian Variety in ");
ViewObj(var!.geometry);
Print("\n Polynomial: ", DefiningListOfPolynomials(var),"\n");
end );
#######################################################################
#O QuadraticVariety( <pg>,<pring>,<pol>);
# returns a quadratic variety in pg
InstallMethod( QuadraticVariety,
"for a projective space, a polynomial ring and a polynomial",
[IsProjectiveSpace,IsPolynomialRing, IsPolynomial],
function(pg,pring,pol)
local qf,list,var,ty;
qf:=QuadraticFormByPolynomial(pol,pring);
list:=[pol];
var:=rec( geometry:=pg, polring:=pring, listofpols:=list);
ty:=NewType( NewFamily("QuadraticVarietiesFamily"), IsQuadraticVariety and
IsQuadraticVarietyRep );
ObjectifyWithAttributes(var,ty,
DefiningListOfPolynomials, list, QuadraticForm, qf);
return var;
end );
#######################################################################
#O QuadraticVariety( <pg>,<pol>);
# returns a quadratic variety in pg
InstallMethod( QuadraticVariety,
"for a projective space, a polynomial ring and a polynomial",
[IsProjectiveSpace, IsPolynomial],
function(pg,pol)
local qf,pring,list,var,ty;
pring:=PolynomialRing(pg!.basefield, pg!.dimension +1);
qf:=QuadraticFormByPolynomial(pol,pring);
list:=[pol];
var:=rec( geometry:=pg, polring:=pring, listofpols:=list);
ty:=NewType( NewFamily("QuadraticVarietiesFamily"), IsQuadraticVariety and
IsQuadraticVarietyRep );
ObjectifyWithAttributes(var,ty,
DefiningListOfPolynomials, list, QuadraticForm, qf);
return var;
end );
#############################################################################
#O QuadraticVariety( <n>, <fld>, <type>);
# returns a nondegenerate quadratic variety in PG(n,fld), of a specified type
# when n is odd.
InstallMethod( QuadraticVariety,
"for a positive integer and a field and a string",
[IsPosInt, IsField, IsString],
function(n,fld,type)
local pg, pring, list, qf, var, ty, ps;
pg:=PG(n,fld);
pring:=PolynomialRing(fld,n+1);
if type = "o" or type = "parabolic" or type ="0" then
ps := ParabolicQuadric(n,fld);
if IsOddInt(n) then
Error("Dimension and type are incompatible.");
fi;
elif type = "+" or type = "hyperbolic" or type = "1" then
ps := HyperbolicQuadric(n,fld);
if IsEvenInt(n) then
Error("Dimension and type are incompatible.");
fi;
elif type = "-" or type = "elliptic" or type = "-1" then
ps := EllipticQuadric(n,fld);
if IsEvenInt(n) then
Error("Dimension and type are incompatible.");
fi;
fi;
list:=[EquationForPolarSpace(ps)];
qf:=SesquilinearForm(ps);
var:=rec( geometry:=pg, polring:=pring, listofpols:=list);
ty:=NewType( NewFamily("QuadraticVarietiesFamily"), IsQuadraticVariety and
IsQuadraticVarietyRep );
ObjectifyWithAttributes(var,ty,
DefiningListOfPolynomials, list, SesquilinearForm, qf, IsStandardQuadraticVariety, true);
return var;
end );
#############################################################################
#O QuadraticVariety( <n>, <fld>);
# returns a nondegenerate quadratic variety in PG(n,fld), where
# we assume here that n is even.
InstallMethod( QuadraticVariety,
"for an even positive integer and a field",
[IsPosInt, IsField],
function(n,fld)
local pg, pring, list, qf, var, ty, ps;
if not IsEvenInt(n) then
Error("The dimension must be even.");
fi;
pg:=PG(n,fld);
pring:=PolynomialRing(fld,n+1);
ps := ParabolicQuadric(n,fld);
list:=[EquationForPolarSpace(ps)];
qf:=SesquilinearForm(ps);
var:=rec( geometry:=pg, polring:=pring, listofpols:=list);
ty:=NewType( NewFamily("QuadraticVarietiesFamily"), IsQuadraticVariety and
IsQuadraticVarietyRep );
ObjectifyWithAttributes(var,ty,
DefiningListOfPolynomials, list, SesquilinearForm, qf, IsStandardQuadraticVariety, true);
return var;
end );
#
#############################################################################
#O QuadraticVariety( <n>, <q>);
#O QuadraticVariety( <n>, <q>, <type>);
# returns a nondegenerate quadratic variety in PG(n,q)
InstallMethod( QuadraticVariety,
"for a positive integer and a prime power",
[IsPosInt, IsPosInt],
function(n,q)
return QuadraticVariety(n,GF(q));
end );
InstallMethod( QuadraticVariety,
"for a positive integer and a prime power and a string",
[IsPosInt, IsPosInt, IsString],
function(n,q,type)
return QuadraticVariety(n,GF(q),type);
end );
#############################################################################
# View, print methods for quadratic varieties.
##
InstallMethod( ViewObj,
"for a quadratic variety",
[ IsQuadraticVariety and IsQuadraticVarietyRep ],
function( var )
Print("Quadratic Variety in ");
ViewObj(var!.geometry);
end );
InstallMethod( PrintObj,
"for a quadratic algebraic variety",
[ IsQuadraticVariety and IsQuadraticVarietyRep ],
function( var )
Print("Quadratic Variety in ");
PrintObj(var!.geometry);
end );
InstallMethod( Display,
"for a quadratic variety",
[ IsQuadraticVariety and IsQuadraticVarietyRep ],
function( var )
Print("Quadratic Variety in ");
ViewObj(var!.geometry);
Print("\n Polynomial: ", DefiningListOfPolynomials(var),"\n");
end );
#############################################################################
#O PolarSpace ( <var> )
# returns the polar space defined by the equation in the list of polynomials
# of <var>. It is of course checked that this list contains only one equation.
# it is then decided if we try to convert the polynomial to a quadric form or to
# a hermitian form.
##
InstallMethod( PolarSpace,
"for a projective algebraic variety",
[IsProjectiveVariety and IsProjectiveVarietyRep],
function(var)
local list,form,f,eq,r,degree,lm,l;
list := DefiningListOfPolynomials(var);
if Length(list) <> 1 then
Error("<var> does not define a polar space");
else
f := BaseField(AmbientSpace(var));
r := var!.polring;
eq := list[1];
lm := LeadingMonomial(eq);
l := Length(lm)/2;
degree := Sum(List([1..l],x->lm[2*x]));
if degree = 2 then
form := QuadraticFormByPolynomial(eq,r);
else
#if IsStandardHermitianVariety( var ) then
# return HermitianPolarSpace( ProjectiveDimension(AmbientSpace(var)), f); #IsStandardHermitianVariety retunrs a no method found error. Commenting out solves the problem. Refinement to be done later.
#fi;
form := HermitianFormByPolynomial(eq,r);
fi;
return PolarSpace(form);
fi;
end);
#############################################################################
#############################################################################
#############################################################################
### 2. Affine Varieties ###
#############################################################################
#############################################################################
#############################################################################
#############################################################################
#O AffineVariety( <ag>, <pring>, <list> )
# constructs a projective variety in an affine space <ag>, with polynomials
# in <list>, all polynomials are in <pring>
##
InstallMethod( AffineVariety,
"for a Affine space, a polynomial ring and a list of homogeneous polynomials",
[ IsAffineSpace, IsPolynomialRing, IsList ],
function( ag, pring, list )
local f, extrep, t, x, i, j, var, ty, degrees;
# The list of polynomials should be non-empty
if Length(list) < 1 then
Error("The list of polynomials should not be empty");
fi;
# We check that the number of indeterminates of the polynomial ring is less
# than the 1 + the dimension of the Affine space
if not Size(IndeterminatesOfPolynomialRing(pring)) = ag!.dimension then
Error("The dimension of the Affine space should be equal to the number of indeterminates of the polynomial ring");
fi;
var:=rec( geometry:=ag, polring:=pring, listofpols:=list);
ty:=NewType( NewFamily("AffineVarietiesFamily"), IsAffineVariety and
IsAffineVarietyRep );
ObjectifyWithAttributes(var,ty,
#AmbientGeometry, ag,
#PolynomialRing, pring,
DefiningListOfPolynomials, list);
return var;
end );
#############################################################################
#O AffineVariety( <ag>, <list> )
# constructs a projective variety in an affine space <ag>, with polynomials
# in <list>.
##
InstallMethod( AffineVariety,
"for a Affine space and a list of polynomials",
[ IsAffineSpace, IsList ],
function( ag, list )
local pring;
pring:=PolynomialRing(ag!.basefield,ag!.dimension);
return AffineVariety(ag,pring,list);
end );
#############################################################################
#O AffineVariety( <ag>, <list> )
# constructs a projective variety in an affine space <ag>, with polynomials
# in <list>.
##
InstallMethod( AlgebraicVariety,
"for a Affine space and a list of polynomials",
[ IsAffineSpace, IsList ],
function( ag, list )
local pring;
pring:=PolynomialRing(ag!.basefield,ag!.dimension);
return AffineVariety(ag,pring,list);
end );
#############################################################################
# View, print methods for affine varieties.
##
InstallMethod( ViewObj,
"for an affine variety",
[ IsAffineVariety and IsAffineVarietyRep ],
function( var )
Print("Affine Variety in ");
ViewObj(var!.geometry);
end );
InstallMethod( PrintObj,
"for an affine variety",
[ IsAffineVariety and IsAffineVarietyRep ],
function( var )
Print("Affine Variety in ");
PrintObj(var!.geometry);
end );
InstallMethod( Display,
"for an affine variety",
[ IsAffineVariety and IsAffineVarietyRep ],
function( var )
Print("Affine Variety in ");
ViewObj(var!.geometry);
Print("\n Defining list of polynomials: ", DefiningListOfPolynomials(var),"\n");
end );
#############################################################################
#############################################################################
#############################################################################
### 3. Algebraic Varieties ###
#############################################################################
#############################################################################
#############################################################################
#############################################################################
#O \in ( <point>, <var> )
# checks if <point> lies on <var>
##
InstallMethod( \in,
"for an element of an incidence structure and an algebraic variety",
[IsElementOfIncidenceStructure, IsAlgebraicVariety],
function(point,var)
local w, pollist, i, n, test, f, nrindets, pring;
# The point has to be a point of the ambient geometry of the variety
if not point in var!.geometry then
Error("The point should belong to the ambient geometry of the variety");
fi;
# The coordinate vector of the point should vanish at each polynomial in
# the list of defining polynomials of the variety
w:=point!.obj;
pollist:=var!.listofpols;
pring:=var!.polring;
nrindets:=Size(IndeterminatesOfPolynomialRing(pring));
n:=Length(pollist);
i:=0;
test:=true;
while i<n and test=true do
i:=i+1;
f:=pollist[i];
if not IsZero(Value(f,[1..nrindets],w)) then
test:=false;
fi;
od;
return test;
end );
#############################################################################
#O PointsOfAlgebraicVariety ( <var> )
# returns a object representing all points of an algebraic variety.
##
InstallMethod( PointsOfAlgebraicVariety,
"for an algebraic variety",
[IsAlgebraicVariety and IsAlgebraicVarietyRep],
function(var)
local pts;
pts:=rec(
geometry:=var!.geometry,
type:=1,
variety:=var
);
return Objectify(
NewType( ElementsCollFamily,IsPointsOfAlgebraicVariety and
IsPointsOfAlgebraicVarietyRep),
pts
);
end );
#############################################################################
#O ViewObj ( <var> )
##
InstallMethod( ViewObj,
"for a collections of points of an algebraic variety",
[ IsPointsOfAlgebraicVariety and IsPointsOfAlgebraicVarietyRep ],
function( pts )
Print("<points of ",pts!.variety,">");
end );
InstallMethod( PrintObj,
"for a collections of points of an algebraic variety",
[ IsPointsOfAlgebraicVariety and IsPointsOfAlgebraicVarietyRep ],
function( pts )
Print("Points( ",pts!.variety," )");
end );
#############################################################################
#O Points ( <var> )
# shortcut to PointsOfAlgebraicVariety
##
InstallMethod( Points,
"for an algebraic variety",
[IsAlgebraicVariety and IsAlgebraicVarietyRep],
function(var)
return PointsOfAlgebraicVariety(var);
end );
#############################################################################
#O \in ( <point>, <ptsonvariety> )
# checks if <point> lies on the variety corresponding to <ptsonvariety>
##
InstallMethod( \in,
"for an element of an incidence structure and the pointsofalgebraicvariety",
# 1*SUM_FLAGS+3 increases the ranking for this method
[IsElementOfIncidenceStructure, IsPointsOfAlgebraicVariety], 1*SUM_FLAGS+3,
function(point,pts)
return point in pts!.variety;
end );
#############################################################################
#O Iterator ( <var> )
# iterator for the points of an algebraic variety.
##
InstallMethod( Iterator,
"for points of an algebraic variety",
[IsPointsOfAlgebraicVariety],
function(pts)
local x;
return IteratorList(Filtered(Points(pts!.geometry), x->x in pts!.variety));
end );
#############################################################################
#O Enumerator( <D> )
# generic method that enumerates D, using an Iterator for D
# assuming D belongs to IsElementsOfIncidenceStructure
##
InstallMethod( Enumerator,
"generic method for IsPointsOfAlgebraicVariety",
[IsPointsOfAlgebraicVariety],
function ( pts )
local iter, elms;
iter := Iterator( pts );
elms := [ ];
while not IsDoneIterator( iter ) do
Add( elms, NextIterator( iter ) );
od;
return elms;
end);
#############################################################################
#O AmbientSpace( <av> )
# returns the AmbientSpace of <av>
##
InstallMethod( AmbientSpace,
"for an algebraic variety",
[IsAlgebraicVariety and IsAlgebraicVarietyRep],
function(av)
return ShallowCopy(av!.geometry);
end );
#############################################################################
#############################################################################
#############################################################################
### 4. Segre Varieties ###
#############################################################################
#############################################################################
#############################################################################
#############################################################################
#O SegreMap( <listofspaces> ), returns a function the is the Segre Map from
# a list of projective spaces over the same field in <listofspaces>
##
InstallMethod( SegreMap,
"for a list of projective spaces",
[ IsHomogeneousList ],
function( listofspaces )
local F, listofdims, l, dim, segremap,map, source, range, ty;
F := listofspaces[1]!.basefield;
listofdims := List(listofspaces, i -> ProjectiveDimension(i) + 1);
for l in listofspaces do
if l!.basefield <> F then
Error("The proj. spaces need to be defined over the same field");
fi;
od;
dim := Product( listofdims );
segremap:=function(listofpoints)
#Takes k points of k projective spaces defined over the same basefield
#to a point of a projective space of dimension (n_1+1)...(n_k+1),
#where n_i is the dimension of the i-th projective space
local listofdims,F,k,list,vector,l,llist,i,dim,cart;
if not Size(AsSet(List(listofpoints,p->Size(p!.geo!.basefield))))=1 then
Error("The points need to be defined over the same field \n");
else
listofdims:=List(listofpoints,p->Size(p!.obj));
F:=listofpoints[1]!.geo!.basefield;
k:=Size(listofpoints);
cart:=Cartesian(List(listofdims,d->[1..d]));
vector:=[];
for l in cart do
llist:=[];
for i in [1..k] do
Append(llist,[listofpoints[i]!.obj[l[i]]]);
od;
Append(vector,[Product(llist)]);
od;
dim:=Product(listofdims);
return VectorSpaceToElement(ProjectiveSpace(dim-1,F),vector);
fi;
end;
source:=List(listofspaces,x->Points(x));
range:=Points(SegreVariety(listofspaces));
map:=rec( source:=source, range:=range, map:=segremap );
ty:=NewType( NewFamily("SegreMapsFamily"), IsSegreMap and
IsSegreMapRep );
Objectify(ty, map);
return map;
end );
#############################################################################
#O SegreMap( <listofspaces> ), returns a function the is the Segre Map from
# a list of integers representing projective dimensions of projective spaces over
# the field <field>
##
InstallMethod( SegreMap,
"for a list of projective spaces and a field",
[IsHomogeneousList, IsField ],
function(dimlist,field)
return SegreMap(List(dimlist,n->PG(n,field)));
end );
#############################################################################
#O SegreMap( <pg1>, <pg2> ), returns the Segre map from
# two projective spaces over the same field.
##
InstallMethod( SegreMap,
"for two projective spaces",
[IsProjectiveSpace, IsProjectiveSpace ],
function(pg1,pg2)
return SegreMap([pg1,pg2]);
end );
#############################################################################
#O SegreMap( <d1>, <d2>, <field> ), returns the Segre map from
# two projective spaces of dimension d1 and d2 over the field <field>
##
InstallMethod( SegreMap,
"for two positive integers and a field",
# Note that the given integers are the projective dimensions!
[ IsPosInt, IsPosInt, IsField ],
function(d1,d2,field)
return SegreMap([PG(d1,field),PG(d2,field)]);
end );
#############################################################################
#O SegreMap( <d1>, <d2>, <field> ), returns the Segre map from
# two projective spaces of dimension d1 and d2 over the field GF(q)
##
InstallMethod( SegreMap,
"given two positive integers and a prime power",
# Note that the given integers are the projective dimensions!
[ IsPosInt, IsPosInt, IsPosInt ],
function(d1,d2,q)
return SegreMap([PG(d1,GF(q)),PG(d2,GF(q))]);
end );
############################################################################
#A Source(<sm>), returns the source of the Segre map
##
InstallMethod( Source,
"given a Segre map",
# Note that this can take very long, as it grows very fast. In order to avoid this,
# we should install a new Category consisting of tuples of projective points
[ IsSegreMap ],
function(sm)
return Cartesian(sm!.source);
end );
#############################################################################
# View, print methods for Segre maps.
##
InstallMethod( ViewObj,
"for a Segre map",
[ IsSegreMap and IsSegreMapRep ],
function( segremap )
Print("Segre Map of ");
ViewObj(segremap!.source);
end );
InstallMethod( PrintObj,
"for a Segre map",
[ IsSegreMap and IsSegreMapRep ],
function( segremap )
Print("Segre Map of ");
PrintObj(segremap!.source);
end );
#############################################################################
#O SegreVariety( <listofspaces> )
# returns the Segre variety from a list of projective spaces over the same field
##
InstallMethod( SegreVariety,
"for a list of projective spaces",
[IsHomogeneousList],
function(listofpgs)
local sv, var, ty, k, F, l, i, listofdims, cart, eta, dim, d, field, r, indets, cartcart, list1,
pollist, ij, ij2, s1, s2, s, polset, newpollist, f;
F := listofpgs[1]!.basefield;
listofdims := List(listofpgs, i -> ProjectiveDimension(i) + 1);
for l in listofpgs do
if l!.basefield <> F then
Error("The proj. spaces need to be defined over the same field");
fi;
od;
k:=Size(listofpgs);
listofdims:=List(listofpgs,x->ProjectiveDimension(x)+1);
cart:=Cartesian(List(listofdims,d->[1..d]));
eta:=t->Position(cart,t);
dim:=Product(listofdims);
field:=listofpgs[1]!.basefield;
r:=PolynomialRing(field,dim);
indets:=IndeterminatesOfPolynomialRing(r);
cartcart:=Cartesian([cart,cart]);
#list1:=List(cartcart,ij->indets[eta(ij[1])]*indets[eta(ij[2])]);
pollist:=[];
for ij in cartcart do
for s in [1..k] do
ij2:=StructuralCopy(ij);
s1:=ij2[1][s];
s2:=ij2[2][s];
ij2[1][s]:=s2;
ij2[2][s]:=s1;
Add(pollist,indets[eta(ij[1])]*indets[eta(ij[2])]-indets[eta(ij2[1])]*indets[eta(ij2[2])]);
od;
od;
polset:=AsSet(Filtered(pollist,x-> not x = Zero(r)));
newpollist:=[];
for f in polset do
if not -f in newpollist then
Add(newpollist,f);
fi;
od;
sv:=ProjectiveVariety(PG(dim-1,field),r,newpollist);
var:=rec( geometry:=PG(dim-1,field), polring:=r, listofpols:=newpollist,
inverseimage:=listofpgs );
ty:=NewType( NewFamily("SegreVarietiesFamily"), IsSegreVariety and
IsSegreVarietyRep );
ObjectifyWithAttributes(var,ty,
DefiningListOfPolynomials, newpollist);
return var;
end );
#############################################################################
#O SegreVariety( <dimlist> ), returns the Segre variety from
# a list of integers representing projective dimensions of projective spaces over
# the field <field>
##
InstallMethod( SegreVariety,
"given a list of projective dimensions and a field",
[IsHomogeneousList, IsField ],
function(dimlist,field)
return SegreVariety(List(dimlist,n->PG(n,field)));
end );
#############################################################################
#O SegreVariety( <pg1>, <pg2> ), returns the Segre variety from
# two projective spaces over the same field.
##
InstallMethod( SegreVariety,
"for two projective spaces",
[IsProjectiveSpace, IsProjectiveSpace ],
function(pg1,pg2)
return SegreVariety([pg1,pg2]);
end );
#############################################################################
#O SegreVariety( <d1>, <d2> ), returns the Segre variety from
# two projective spaces of dimension d1 and d2 over the field <field>
##
InstallMethod( SegreVariety,
"for two positive integers and a field",
# Note that the given integers are the projective dimensions!
[ IsPosInt, IsPosInt, IsField ],
function(d1,d2,field)
return SegreVariety([PG(d1,field),PG(d2,field)]);
end );
#############################################################################
#O SegreVariety( <d1>, <d2> ), returns the Segre variety from
# two projective spaces of dimension d1 and d2 over the field GF(<q>
##
InstallMethod( SegreVariety,
"for two positive integers and a prime power",
# Note that the given integers are the projective dimensions!
[ IsPosInt, IsPosInt, IsPosInt ],
function(d1,d2,q)
return SegreVariety([PG(d1,q),PG(d2,q)]);
end );
#############################################################################
# View, print methods for segre varieties.
##
InstallMethod( ViewObj,
"for a Segre variety",
[ IsSegreVariety and IsSegreVarietyRep ],
function( var )
Print("Segre Variety in ");
ViewObj(var!.geometry);
end );
InstallMethod( PrintObj,
"for a Segre variety",
[ IsSegreVariety and IsSegreVarietyRep ],
function( var )
Print("Segre Variety in ");
PrintObj(var!.geometry);
end );
#############################################################################
#O SegreMap( <sv> ), returns the Segre map corresponding with <sv>
##
InstallMethod( SegreMap,
"for a Segre variety",
[IsSegreVariety],
function(sv)
return SegreMap(sv!.inverseimage);
end );
#############################################################################
#O PointsOfSegreVariety ( <var> )
# returns a object representing all points of a segre variety.
##
InstallMethod( PointsOfSegreVariety,
"for a Segre variety",
[IsSegreVariety and IsSegreVarietyRep],
function(var)
local pts;
pts:=rec(
geometry:=var!.geometry,
type:=1,
variety:=var
);
return Objectify(
NewType( ElementsCollFamily,IsPointsOfSegreVariety and
IsPointsOfSegreVarietyRep),
pts
);
end );
#############################################################################
#O ViewObj ( <var> )
##
InstallMethod( ViewObj,
"for a collection representing the points of a Segre variety",
[ IsPointsOfSegreVariety and IsPointsOfSegreVarietyRep ],
function( pts )
Print("<points of ",pts!.variety,">");
end );
#############################################################################
#O Points ( <var> )
# shortcut to PointsOfSegreVariety
##
InstallMethod( Points,
"for a Segre variety",
[IsSegreVariety and IsSegreVarietyRep],
function(var)
return PointsOfSegreVariety(var);
end );
#############################################################################
#O Iterator ( <var> )
# iterator for the points of a segre variety.
##
InstallMethod( Iterator,
"for points of an Segre variety",
[IsPointsOfSegreVariety],
function(pts)
local x,sv,sm,cart,listofpgs,pg,ptlist;
sv:=pts!.variety;
sm:=SegreMap(sv!.inverseimage)!.map;
listofpgs:=sv!.inverseimage;
cart:=Cartesian(List(listofpgs,pg->Points(pg)));
ptlist:=List(cart,sm);
return IteratorList(ptlist);
end );
#############################################################################
#O Enumerator ( <var> )
# Enumerator for the points of a segre variety.
##
InstallMethod( Enumerator,
"generic method for IsPointsOfSegreVariety",
[IsPointsOfSegreVariety],
function ( pts )
local x,sv,sm,cart,listofpgs,pg,ptlist;
sv:=pts!.variety;
sm:=SegreMap(sv!.inverseimage)!.map;
listofpgs:=sv!.inverseimage;
cart:=Cartesian(List(listofpgs,pg->Points(pg)));
ptlist:=List(cart,sm);
return ptlist;
end);
#############################################################################
#O Size ( <var> )
# number of points on a Segre variety
##
InstallMethod( Size,
"for the set of points of a Segre variety",
[IsPointsOfSegreVariety],
function(pts)
local listofpgs,sv,x;
sv:=pts!.variety;
listofpgs:=sv!.inverseimage;
return Product(List(listofpgs,x->Size(Points(x))));
end );
####################
#O ImageElm( <sm>, <x> )
##
InstallOtherMethod( ImageElm,
"for a SegreMap and an element of its source",
[IsSegreMap, IsList],
function(sm, x)
return sm!.map(x);
end );
#
#############################################################################
#O \^( <x>, <sm> )
##
InstallOtherMethod( \^,
"for a SegreMap and an element of its source",
[IsList, IsSegreMap],
function(x, sm)
return ImageElm(sm,x);
end );
#
#############################################################################
#O ImagesSet( <sm>, <x> )
##
InstallOtherMethod( ImagesSet,
"for a SegreMap and subset of its source",
[IsSegreMap, IsList],
function(sm, x)
return List(x, t -> t^sm);
end );
#############################################################################
#############################################################################
#############################################################################
### 5. Veronese Varieties ###
#############################################################################
#############################################################################
#############################################################################
#O VeroneseMap( <pg> ), returns a function that is the Veronese Map from
#<pg>
##
InstallMethod( VeroneseMap,
"for a projective space",
[IsProjectiveSpace],
function(pg)
local F, dim, func,source,range,map,ty,veronesemap;
F:=pg!.basefield;
dim:=pg!.dimension;
func:=function(point)
# takes a point and maps it to its image under the veronese map
local i,j,list,n,F;
n:=Size(point!.obj);
F:=point!.geo!.basefield;
list:=[];
for i in [1..n] do
for j in [i..n] do
Append(list,[point!.obj[i]*point!.obj[j]]);
od;
od;
return VectorSpaceToElement(ProjectiveSpace((n-1)*(n+2)/2,F),list);
end;
source:=Points(pg);
range:=Points(VeroneseVariety(pg));
map:=rec( source:=source, range:=range, map:=func );
ty:=NewType( NewFamily("VeroneseMapsFamily"), IsVeroneseMap and
IsVeroneseMapRep );
Objectify(ty, map);
return map;
end );
#############################################################################
# View, print methods for Veronese maps.
##
InstallMethod( ViewObj,
"for a Veronese map",
[ IsVeroneseMap and IsVeroneseMapRep ],
function( veronesemap )
Print("Veronese Map of ");
ViewObj(veronesemap!.source);
end );
InstallMethod( PrintObj,
"for a Veronese map",
[ IsVeroneseMap and IsVeroneseMapRep ],
function( veronesemap )
Print("Veronese Map of ");
PrintObj(veronesemap!.source);
end );
#############################################################################
#O VeroneseVariety( <pg> ), returns the Veronese variety from <pg>
##
InstallMethod ( VeroneseVariety,
"for a projective space",
[IsProjectiveSpace],
function(pg)
local field,r,n2,indets,list,i,j,k,s,vv,var,ty,n;
field:=pg!.basefield;
n:=Dimension(pg)+1;
n2:=Int(n*(n+1)/2);
r:=PolynomialRing(field,n2);
indets:=IndeterminatesOfPolynomialRing(r);
list:=[];
for i in [1..n-1] do
for j in [i+1..n] do
Add(list,indets[(i-1)*n-Int((i^2-i)/2)+j]^2
-indets[(i-1)*n-Int((i^2-i)/2)+i]*indets[(j-1)*n-Int((j^2-j)/2)+j]);
od;
od;
for i in [1..n-2] do
for j in [i+1..n-1] do
for k in [j+1..n] do
Add(list,indets[(i-1)*n-Int((i^2-i)/2)+i]*indets[(j-1)*n-Int((j^2-j)/2)+k]
-indets[(i-1)*n-Int((i^2-i)/2)+j]*indets[(i-1)*n-Int((i^2-i)/2)+k]);
od;
od;
od;
vv:=ProjectiveVariety(PG(n2-1,field),r,list);
var:=rec( geometry:=PG(n2-1,field), polring:=r, listofpols:=list,
inverseimage:=pg );
ty:=NewType( NewFamily("VeroneseVarietiesFamily"), IsVeroneseVariety and
IsVeroneseVarietyRep );
ObjectifyWithAttributes(var,ty,
#AmbientGeometry, ag,
#PolynomialRing, pring,
DefiningListOfPolynomials, list);
return var;
end );
#############################################################################
#O VeroneseVariety( <n>, <field> ), returns the Veronese variety from
# PG(<n>,<field>).
##
InstallMethod( VeroneseVariety,
"for a positive integer and a field",
# Note that the given integer is the projective dimension
[ IsPosInt, IsField ],
function(d1,field)
return VeroneseVariety(PG(d1,field));
end );
#############################################################################
#O VeroneseVariety( <n>, <q> ), returns the Veronese variety from
# PG(<n>,<q>).
##
InstallMethod( VeroneseVariety,
"for a positive integer and a prime power",
# Note that the given integers are the projective dimensions!
[ IsPosInt, IsPosInt ],
function(d1,q)
return VeroneseVariety(PG(d1,q));
end);
#############################################################################
# view print operations for VeroneseVarieties.
##
InstallMethod( ViewObj,
"for a Veronese variety",
[ IsVeroneseVariety and IsVeroneseVarietyRep ],
function( var )
Print("Veronese Variety in ");
ViewObj(var!.geometry);
end );
InstallMethod( PrintObj,
"for a Veronese variety",
[ IsVeroneseVariety and IsVeroneseVarietyRep ],
function( var )
Print("Veronese Variety in ");
PrintObj(var!.geometry);
end );
#############################################################################
#O VeroneseMap( <vv> ), returns a function the is the Veronese Map from
# the Veronese variety <vv>
##
InstallMethod( VeroneseMap,
"for a Veronese variety",
[IsVeroneseVariety],
function(vv)
return VeroneseMap(vv!.inverseimage);
end );
#############################################################################
#O PointsOfVeroneseVariety ( <var> )
# returns a object representing all points of a Veronese variety.
##
InstallMethod( PointsOfVeroneseVariety,
"for a Veronese variety",
[IsVeroneseVariety and IsVeroneseVarietyRep],
function(var)
local pts;
pts:=rec(
geometry:=var!.geometry,
type:=1,
variety:=var
);
return Objectify(
NewType( ElementsCollFamily,IsPointsOfVeroneseVariety and
IsPointsOfVeroneseVarietyRep),
pts
);
end );
#############################################################################
#O ViewObj method for points of Veronese variety
##
InstallMethod( ViewObj,
"for points of Veronese variety",
[ IsPointsOfVeroneseVariety and IsPointsOfVeroneseVarietyRep ],
function( pts )
Print("<points of ",pts!.variety,">");
end );
#############################################################################
#O Points ( <var> )
# shortcut to PointsOfVeroneseVariety
##
InstallMethod( Points,
"for a Veronese variety",
[IsVeroneseVariety and IsVeroneseVarietyRep],
function(var)
return PointsOfVeroneseVariety(var);
end );
#############################################################################
#O Iterator ( <ptsr> )
# Iterator for points of a Veronese variety.
##
InstallMethod( Iterator,
"for points of a Veronese variety",
[IsPointsOfVeroneseVariety],
function(pts)
local vv,vm,pg,ptlist;
vv:=pts!.variety;
vm:=VeroneseMap(vv!.inverseimage)!.map;
pg:=vv!.inverseimage;
ptlist:=List(Points(pg),vm);
return IteratorList(ptlist);
end );
#############################################################################
#O Enumerator ( <ptsr> )
# Enumerator for points of a Veronese variety.
##
InstallMethod( Enumerator,
"for points of a Veronese variety",
[IsPointsOfVeroneseVariety],
function ( pts )
local vv,vm,pg,ptlist;
vv:=pts!.variety;
vm:=VeroneseMap(vv!.inverseimage)!.map;
pg:=vv!.inverseimage;
ptlist:=List(Points(pg),vm);
return ptlist;
end);
#############################################################################
#O Size ( <var> )
# number of points on a Veronese variety
##
InstallMethod( Size,
"for the set of points of a Segre variety",
[IsPointsOfVeroneseVariety],
function(pts)
local vv;
vv:=pts!.variety;
return Size(Points(vv!.inverseimage));
end );
#############################################################################
#############################################################################
#############################################################################
### 6. Methods for geometry maps (IsGeometryMap) ###
#############################################################################
#############################################################################
#############################################################################
#O ImageElm( <gm>, <x> )
##
InstallOtherMethod( ImageElm,
"for a GeometryMap and an element of its source",
[IsGeometryMap, IsElementOfIncidenceStructure],
function(gm, x)
return gm!.map(x);
end );
#
#############################################################################
#O \^( <x>, <gm> )
##
InstallOtherMethod( \^,
"for a GeometryMap and an element of its source",
[IsElementOfIncidenceStructure, IsGeometryMap],
function(x, gm)
return ImageElm(gm,x);
end );
#
#############################################################################
#O ImagesSet( <gm>, <x> )
##
InstallOtherMethod( ImagesSet,
"for a GeometryMap and subset of its source",
[IsGeometryMap, IsElementOfIncidenceStructureCollection],
function(gm, x)
return List(x, t -> t^gm);
end );
############################################################################
#A Source(<gm>), returns the source of the geometry map
##
InstallMethod( Source,
"given a geometry map",
[ IsGeometryMap ],
function(gm)
return gm!.source;
end );
############################################################################
#A Range(<gm>), returns the range of the geometry map
##
InstallMethod( Range,
"given a geometry map",
[ IsGeometryMap ],
function(gm)
return gm!.range;
end );
#############################################################################
#############################################################################
#############################################################################
### 7. Grassmann Varieties ###
#############################################################################
#############################################################################
#############################################################################
#############################################################################
#O GrassmannCoordinates ( <sub> )
# returns the Grassmann coordinates of the projective subspace <sub>
##
InstallMethod( GrassmannCoordinates,
"for a subspace of a projective space",
[ IsSubspaceOfProjectiveSpace ],
## Warning: this operation is not compatible with
## PluckerCoordinates. To get the same image, you
## need to multiply the fifth coordinate by -1.
function( sub )
local basis,k,n,list,vector;
k := ProjectiveDimension(sub);
n := ProjectiveDimension(sub!.geo);
if (k <= 0 or k >= n-1) then
Error("The dimension of the subspace has to be at least 1 and at most ", n-2);
fi;
basis := sub!.obj;
list := TransposedMat(basis);
vector := List(Combinations([1..n+1], k+1), i -> DeterminantMat( list{i} ));
return vector;
end );
#############################################################################
#O GrassmannMap ( <k>, <pgdomain> )
# returns the map that maps k-subspaces of <pgdomain> to a point with GrassmannCoordinates
##
InstallMethod( GrassmannMap,
"for an integer and a projective space",
[ IsPosInt, IsProjectiveSpace ],
## Warning: this operation is not compatible with
## PluckerCoordinates. To get the same image, you
## need to multiply the fifth coordinate by -1.
function( k, pgdomain )
local n,F,pgimage,varmap,func,dim,source,range,map,ty;
n := pgdomain!.dimension; ## projective dimension
F := pgdomain!.basefield;
if n<=2 then
Error("The dimension of the projective space must be at least 3");
fi;
if (k <= 0 or k >= n-1) then
Error("The dimension of the subspace has to be at least 1 and at most ", n-2);
fi;
## ambient projective space of image has dimension Binomial(n+1,k+1)-1
dim := Binomial( n+1, k+1 ) - 1;
pgimage := PG(dim,F);
func := function( var )
local basis,vector,list;
if ProjectiveDimension(var) <> k then
Error("Input must have projective dimension ", k, "\n");
fi;
basis := var!.obj;
list := TransposedMat(basis);
vector := List(Combinations([1..n+1], k+1), i -> DeterminantMat( list{i} ));
#ConvertToVectorRepNC( vector, F );
return VectorSpaceToElement(pgimage,vector);
end;
source:=ElementsOfIncidenceStructure(pgdomain,k+1);
range:=Points(GrassmannVariety(k,pgdomain));
map:=rec( source:=source, range:=range, map:=func );
ty:=NewType( NewFamily("GrassmannMapsFamily"), IsGrassmannMap and
IsGrassmannMapRep );
Objectify(ty, map);
return map;
end );
#############################################################################
#O GrassmannMap ( <k>, <n>, <q> )
# shortcut to GrassmannMap(<k>,PG(<n>,<q>))
##
InstallMethod( GrassmannMap,
"for three positive integers",
[ IsPosInt, IsPosInt, IsPosInt ],
function( k, n, q )
return GrassmannMap( k, ProjectiveSpace(n, q));
end );
#############################################################################
#O GrassmannMap ( <subs> )
# for subspaces of a projective space
##
InstallMethod( GrassmannMap, "given collection of varieties of a projectivespace",
[ IsSubspacesOfProjectiveSpace ],
function( subspaces )
return GrassmannMap( subspaces!.type-1, subspaces!.geometry);
end );
#############################################################################
# View, print methods for Grassmann maps.
##
InstallMethod( ViewObj,
"for a Grassmann map",
[ IsGrassmannMap and IsGrassmannMapRep ],
function( map )
Print("Grassmann Map of ");
ViewObj(map!.source);
end );
InstallMethod( PrintObj,
"for a Grassmann map",
[ IsGrassmannMap and IsGrassmannMapRep ],
function( map )
Print("Grassmann Map of ");
PrintObj(map!.source);
end );
#############################################################################
#O GrassmannVariety( <k>,<pg> )
# returns the Grassmann variety from an integer and a projective space
##
InstallMethod( GrassmannVariety,
"for an integer and a projective space",
[ IsPosInt, IsProjectiveSpace ],
function( k, pgdomain )
local n,F,dim,pgimage,r,x,comb,eta,t,pollist,i,j,list,s,icopy,jcopy,js,i1,
mi,mj,m,si,sj,polset,newpollist,f,gv,var,ty;
n := pgdomain!.dimension; ## projective dimension
F := pgdomain!.basefield;
if n<=2 then
Error("The dimension of the projective space must be at least 3");
fi;
if (k <= 0 or k >= n-1) then
Error("The dimension of the subspace has to be at least 1 and at most ", n-2);
fi;
## ambient projective space of image has dimension Binomial(n+1,k+1)-1
dim := Binomial( n+1, k+1 ) - 1;
pgimage := PG(dim,F);
r:=PolynomialRing(F,Dimension(pgimage)+1);
x:=IndeterminatesOfPolynomialRing(r);
comb:=Combinations([1..n+1],k+1);
eta:=t->Position(comb,t);
pollist:=[];
for i in comb do
for j in comb do
list:=[];
for s in [1..k+1] do
icopy:=StructuralCopy(i);
jcopy:=StructuralCopy(j);
js:=jcopy[s];
i1:=icopy[1];
icopy[1]:=js;
jcopy[s]:=i1;
if Size(AsSet(icopy))=k+1 and Size(AsSet(jcopy))=k+1 then
mi:=Filtered(comb,m->AsSet(m)=AsSet(icopy))[1];
mj:=Filtered(comb,m->AsSet(m)=AsSet(jcopy))[1];
si:=SignPerm(MappingPermListList(mi,icopy));
sj:=SignPerm(MappingPermListList(mj,jcopy));
Add(list,si*sj*x[eta(mi)]*x[eta(mj)]);
fi;
od;
Add(pollist,x[eta(i)]*x[eta(j)]-Sum(list));
od;
od;
polset:=AsSet(Filtered(pollist,x-> not x = Zero(r)));
newpollist:=[];
for f in polset do
if not -f in newpollist then
Add(newpollist,f);
fi;
od;
gv:=ProjectiveVariety(pgimage,r,newpollist);
var:=rec( geometry:=pgimage, polring:=r, listofpols:=newpollist,
inverseimage:=ElementsOfIncidenceStructure(PG(n,F),k+1) );
ty:=NewType( NewFamily("GrassmannVarietiesFamily"), IsGrassmannVariety and
IsGrassmannVarietyRep );
ObjectifyWithAttributes(var,ty,
DefiningListOfPolynomials, newpollist);
return var;
end );
#############################################################################
#############################################################################
#O GrassmannVariety( <subspaces> )
# returns the Grassmann variety from a collection of subspaces of a projective space
##
InstallMethod( GrassmannVariety,
"for a collection of subspaces of a projective space",
[ IsSubspacesOfProjectiveSpace ],
function( subspaces )
return GrassmannVariety( subspaces!.type-1, subspaces!.geometry);
end );
#############################################################################
#############################################################################
# View, print methods for Grassmann varieties.
##
InstallMethod( ViewObj,
"for a Grassmann variety",
[ IsGrassmannVariety and IsGrassmannVarietyRep ],
function( gv )
Print("Grassmann Variety in ");
ViewObj(gv!.geometry);
end );
InstallMethod( PrintObj,
"for a Grassmann variety",
[ IsGrassmannVariety and IsGrassmannVarietyRep ],
function( gv )
Print("Grassmann Variety in ");
PrintObj(gv!.geometry);
end );
#############################################################################
#O GrassmannMap( <vv> ), returns a function the is the Grassmann Map from
# the Grassmann variety <vv>
##
InstallMethod( GrassmannMap,
"for a Grassmann variety",
[IsGrassmannVariety],
function(gv)
return GrassmannMap(gv!.inverseimage);
end );
#############################################################################
#O PointsOfGrassmannVariety ( <var> )
# returns a object representing all points of a Grassmann variety.
##
InstallMethod( PointsOfGrassmannVariety,
"for a Grassmann variety",
[IsGrassmannVariety and IsGrassmannVarietyRep],
function(var)
local pts;
pts:=rec(
geometry:=var!.geometry,
type:=1,
variety:=var
);
return Objectify(
NewType( ElementsCollFamily,IsPointsOfGrassmannVariety and
IsPointsOfGrassmannVarietyRep),
pts
);
end );
#############################################################################
#O ViewObj method for points of Grassmann variety
##
InstallMethod( ViewObj,
"for points of Grassmann variety",
[ IsPointsOfGrassmannVariety and IsPointsOfGrassmannVarietyRep ],
function( pts )
Print("<points of ",pts!.variety,">");
end );
#############################################################################
#O Points ( <var> )
# shortcut to PointsOfGrassmannVariety
##
InstallMethod( Points,
"for a Grassmann variety",
[IsGrassmannVariety and IsGrassmannVarietyRep],
function(var)
return PointsOfGrassmannVariety(var);
end );
#############################################################################
#O Iterator ( <ptsr> )
# Iterator for points of a Grassmann variety.
##
InstallMethod( Iterator,
"for points of a Grassmann variety",
[IsPointsOfGrassmannVariety],
function(pts)
local gv,gm,subs,ptlist;
gv:=pts!.variety;
gm:=GrassmannMap(gv!.inverseimage)!.map;
subs:=gv!.inverseimage;
ptlist:=List(subs,gm);
return IteratorList(ptlist);
end );
#############################################################################
#O Enumerator ( <ptsr> )
# Enumerator for points of a Grassmann variety.
##
InstallMethod( Enumerator,
"for points of a Grassmann variety",
[IsPointsOfGrassmannVariety],
function ( pts )
local gv,gm,subs,ptlist;
gv:=pts!.variety;
gm:=GrassmannMap(gv!.inverseimage)!.map;
subs:=gv!.inverseimage;
ptlist:=List(subs,gm);
return ptlist;
end);
#############################################################################
#O Size ( <var> )
# number of points on a Grassmann variety
##
InstallMethod( Size,
"for the set of points of a Grassmann variety",
[IsPointsOfGrassmannVariety],
function(pts)
local gv;
gv:=pts!.variety;
return Size(gv!.inverseimage);
end );
[ Dauer der Verarbeitung: 0.46 Sekunden
(vorverarbeitet)
]
|