############################################################################# ## ## correlations.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 correlation groups ## #############################################################################
################################################################### # Code for the "standard duality" of a projective space. We want it to # be an involutory mapping. To be used later on in the objects # representing a correlation. # Difficulty: make it a mapping and overload the \* operator # (because we know that delta^-1 = delta. ###################################################################
# CHECKED 14/09/11 jdb ############################################################################# #O IdentityMappingOfElementsOfProjectiveSpace( <ps> ) # returns the identity mapping on the collection of subspaces of a projective space <ps> ##
InstallMethod( IdentityMappingOfElementsOfProjectiveSpace, "for a projective space",
[IsProjectiveSpace], function(ps)
local map;
map := IdentityMapping(ElementsOfIncidenceStructure(ps));
SetFilterObj(map,IsIdentityMappingOfElementsOfProjectiveSpace);
return map; end );
# CHECKED 14/09/11 jdb ############################################################################# #O StandardDualityOfProjectiveSpace( <ps> ) # returns the Standard duality of a projective space ##
InstallMethod( StandardDualityOfProjectiveSpace, "for a projective space",
[IsProjectiveSpace], function( ps ) ## In this method, we implement the standard duality acting ## on projective spaces.
local map, f, S, ty, obj, one;
f := function(v)
local ty, b, newb, rk;
ty := v!.type;
b := v!.obj; if ty = 1then
b := [b]; fi;
newb := NullspaceMat(TransposedMat(b));
rk := Rank(newb); if rk = 1then
newb := newb[1]; fi;
return VectorSpaceToElement(ps, newb); ## check that this normalises the element end;
S := ElementsOfIncidenceStructure(ps); ## map := MappingByFunction(ElementsOfIncidenceStructure(ps), ElementsOfIncidenceStructure(ps), f, f);
ty := TypeOfDefaultGeneralMapping( S, S,
IsStandardDualityOfProjectiveSpace
and IsSPMappingByFunctionWithInverseRep
and IsBijective and HasOrder and HasIsOne); # We looked at the code to create a MappingByFunction. Restricted the filter # was sufficient to be able to overload \* for my new category of mappings.
obj := rec( fun := f, invFun := f, preFun := f, ps := ps );
one := IdentityMappingOfElementsOfProjectiveSpace(ps);
ObjectifyWithAttributes(obj, ty, Order, 2, IsOne, false, One, one); #this command I learned in st andrews!
Setter(InverseImmutable)(obj,obj); #cannot set this attribute in previous line, because map does not exist then
return obj; end );
# Added ml 5/02/2013 ############################################################################# #O IsCollineation( <g> ) ##
InstallMethod( IsCollineation, [ IsProjGrpElWithFrobWithPSIsom], function( g ) if IsIdentityMappingOfElementsOfProjectiveSpace(g!.psisom) then
return true; else return false; fi; end );
# Added ml 8/11/2012 ############################################################################# #O IsCorrelation( <g> ) # method to check if a given correlation-collineation of a projective space is # a correlation, i.e. if the underlying psisom is not the IdentityMappingOfElementsOfProjectiveSpace ##
InstallMethod( IsCorrelation, [ IsProjGrpElWithFrobWithPSIsom ], function( g )
local delta;
delta:=g!.psisom; if IsIdentityMappingOfElementsOfProjectiveSpace(delta) then return false; else return true; fi; end );
# Added ml 5/02/2013 User friendly method ############################################################################# #O IsCorrelation( <g> ) # ##
InstallMethod( IsCorrelation, [ IsProjGrpElWithFrob ], function( g )
return false; end );
# Added ml 5/02/2013 User friendly method ############################################################################# #O IsCorrelation( <g> ) # ##
InstallMethod( IsCorrelation, [ IsProjGrpEl ], function( g )
return false; end );
# Added ml 7/11/2012 ############################################################################# #O IsProjectivity( <g> ) # method to check if a given ProjGrpElWithFrobWithPSIsom is a projectivity, # i.e. if the corresponding frobenius automorphism and the psisom is the identity ##
InstallMethod( IsProjectivity, "for objects in IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep",
[ IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep],
g -> IsOne(g!.frob) and IsOne(g!.psisom) );
# function( g ) # local F,sigma,delta; # F:=g!.fld; # sigma:=g!.frob; # delta:=g!.psisom; # if sigma = FrobeniusAutomorphism(F)^0 and IsIdentityMappingOfElementsOfProjectiveSpace(delta) # then return true; # else return false; # fi; # end );
# Added ml 8/11/2012 # changed ml 28/11/2012 ############################################################################# #O IsStrictlySemilinear( <g> ) # method to check if a given ProjGrpElWithFrobWithPSIsom is a projective semilinear map, # i.e. if the corresponding frobenius automorphism is NOT the identity ##
InstallMethod( IsStrictlySemilinear, "for objects in IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep",
[ IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep],
g -> not IsOne(g!.frob) );
#function( g ) # local F,sigma,delta; # F:=g!.fld; # sigma:=g!.frob; # delta:=g!.psisom; # if sigma <> FrobeniusAutomorphism(F)^0 # then return true; # else return false; # fi; # end );
################################################################### # Tests whether CorrelationCollineationGroup is a ProjectivityGroup and so on ... ###################################################################
# Added ml 8/11/2012 ############################################################################# #O IsProjectivityGroup( <G> ) # method to check if a given CorrelationCollineationGroup G is a projectivity group, # i.e. if the corresponding frobenius automorphisms of the generators are the identity # and the corresponding projective isomorphisms of the generators are the identity ##
InstallMethod( IsProjectivityGroup, [ IsProjGroupWithFrobWithPSIsom ], function( G )
local gens, F, d, set, g, set2;
gens:=GeneratorsOfMagmaWithInverses(G);
F:=gens[1]!.fld;
d:=NrRows(gens[1]!.mat)-1;
set:=AsSet(List(gens,g->g!.frob));
set2:=AsSet(List(gens,g->g!.psisom)); if set = AsSet([FrobeniusAutomorphism(F)^0]) and
set2 = AsSet([IdentityMappingOfElementsOfProjectiveSpace(PG(d,F))]) then return true; else return false; fi; end );
# Added ml 8/11/2012 ############################################################################# #O IsCollineationGroup( <G> ) ##
InstallMethod( IsCollineationGroup, [ IsProjGroupWithFrobWithPSIsom ], function( G )
local gens, F, d, set, g, set2;
gens:=GeneratorsOfMagmaWithInverses(G);
F:=gens[1]!.fld;
d:=NrRows(gens[1]!.mat)-1;
set2:=AsSet(List(gens,g->g!.psisom)); if set2 = AsSet([IdentityMappingOfElementsOfProjectiveSpace(PG(d,F))]) then return true; else return false; fi; end );
InstallMethod( ViewObj, "for such a nice looking standard duality of a projective space",
[IsStandardDualityOfProjectiveSpace and IsSPMappingByFunctionWithInverseRep], function(delta)
Print("StandardDuality( ",Source(delta)," )"); end);
InstallMethod( Display, "for such a nice looking standard duality of a projective space",
[IsStandardDualityOfProjectiveSpace and IsSPMappingByFunctionWithInverseRep], function(delta)
Print("StandardDuality( ",Source(delta)," )"); end);
InstallMethod( PrintObj, "for such a nice looking standard duality of a projective space",
[IsStandardDualityOfProjectiveSpace and IsSPMappingByFunctionWithInverseRep], function(delta)
Print("StandardDuality( ",Source(delta)," )"); end);
################################################################### # multiplying projective space isomorphisms. Actually, these methods # are not intended for the user, since there is no check to see # if the arguments are projective space isomorphisms of the same # projective space. On the other hand, the user should only use these # objects as an argument for constructor functions of corrlelations. # The methods here are in the first place helper methods for the methods # multiplying correlations. So we allow ourselves here some sloppyness. ###################################################################
# CHECKED 14/09/11 jdb ############################################################################# #O \*( <delta1>, <delta2> ) # returns the product of two standard dualities of a projective space. ##
InstallMethod( \*, "for multiplying a standard-duality of a projective space",
[IsStandardDualityOfProjectiveSpace, IsStandardDualityOfProjectiveSpace], function(delta1,delta2)
return One(delta1); end);
# CHECKED 14/09/11 jdb ############################################################################# #O \*( <delta1>, <delta2> ) # returns the product of the identitymap and the standard duality of a projective space. ##
InstallMethod( \*, "for multiplying a standard-duality of a projective space",
[IsIdentityMappingOfElementsOfProjectiveSpace, IsStandardDualityOfProjectiveSpace], function(delta1,delta2)
return delta2; end);
# CHECKED 14/09/11 jdb ############################################################################# #O \*( <delta1>, <delta2> ) # returns the product of the standard duality and the identitymap of a projective space. ##
InstallMethod( \*, "for multiplying a standard-duality of a projective space",
[IsStandardDualityOfProjectiveSpace, IsIdentityMappingOfElementsOfProjectiveSpace], function(delta1,delta2)
return delta1; end);
# CHECKED 14/09/11 jdb ############################################################################# #O \*( <delta1>, <delta2> ) # returns the product of two identitymaps of a projective space. ##
InstallMethod( \*, "for multiplying a standard-duality of a projective space",
[IsIdentityMappingOfElementsOfProjectiveSpace, IsIdentityMappingOfElementsOfProjectiveSpace], function(delta1,delta2)
return delta1; end);
# CHECKED 14/09/11 jdb ############################################################################# #O \=( <delta1>, <delta2> ) # returns true iff <delta1>=<delta2>, two standard dualities. ##
InstallMethod( \=, "for two standard-dualities of a projective space",
[IsStandardDualityOfProjectiveSpace, IsStandardDualityOfProjectiveSpace], function(delta,eta)
return Source(delta) = Source(eta); end);
# CHECKED 14/09/11 jdb ############################################################################# #O \=( <delta1>, <delta2> ) # returns false, since a duality is not the identitymap.
InstallMethod( \=, "for a standard-duality of a projective space and the identitymap",
[IsStandardDualityOfProjectiveSpace, IsIdentityMappingOfElementsOfProjectiveSpace], function(delta,eta)
return false; end);
# CHECKED 14/09/11 jdb ############################################################################# #O \=( <delta1>, <delta2> ) # returns false, since a duality is not the identitymap.
InstallMethod( \=, "for the identity map and a standard-duality of a projective space",
[IsIdentityMappingOfElementsOfProjectiveSpace, IsStandardDualityOfProjectiveSpace], function(delta,eta)
return false; end);
# CHECKED 14/09/11 jdb ############################################################################# #O \=( <delta1>, <delta2> ) # returns true iff <delta1>=<delta2>, two identitymaps of a projective space. ##
InstallMethod( \=, "for two identity maps of a projective space",
[IsIdentityMappingOfElementsOfProjectiveSpace, IsIdentityMappingOfElementsOfProjectiveSpace], function(delta,eta)
return Source(delta) = Source(eta); end);
################################################################### # Constructor methods for "projective elements with frobenius with # vector space isomorphism", # Such an object represents a collineation (delta = identity) OR # a correlation (delta = standard duality). ###################################################################
# CHECKED 14/09/11 jdb # cmat changed 19/3/14 ############################################################################# #O ProjElWithFrobWithPSIsom( <mat>, <frob>, <f>, <delta> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, # i.e. correlations. This method is not intended for the users, it has no # checks built in. the fourth argument must be the standard duality of a projective # space. ##
InstallMethod( ProjElWithFrobWithPSIsom, "for a cmat/ffe matrix, a Frobenius automorphism, a field and the st. duality",
[IsCMatRep and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse,
IsField, IsStandardDualityOfProjectiveSpace], function( m, frob, f, delta )
local el;
el := rec( mat := m, fld := f, frob := frob, psisom := delta );
Objectify( ProjElsWithFrobWithPSIsomType, el );
return el; end );
#added 19/3/14 ############################################################################# #O ProjElWithFrobWithPSIsom( <mat>, <frob>, <f>, <delta> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, # i.e. correlations. This method is not intended for the users, it has no # checks built in. the fourth argument must be the standard duality of a projective # space. ##
InstallMethod( ProjElWithFrobWithPSIsom, "for a ffe matrix, a Frobenius automorphism, a field and the st. duality",
[IsMatrix and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse,
IsField, IsStandardDualityOfProjectiveSpace], function( m, frob, f, delta )
local el,cmat;
cmat := NewMatrix(IsCMatRep,f,NrCols(m),m);
el := rec( mat := cmat, fld := f, frob := frob, psisom := delta );
Objectify( ProjElsWithFrobWithPSIsomType, el );
return el; end );
# CHECKED 14/09/11 jdb # cmat changed 19/3/14 ############################################################################# #O ProjElWithFrobWithPSIsom( <mat>, <frob>, <f> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, # i.e. correlations. This method is not intended for the users, it has no # checks built in. There is no fourth argument, the projective space isomorphism # will be the identity mapping of the projective space. ##
InstallMethod( ProjElWithFrobWithPSIsom, "for a cmat/ffe matrix, a Frobenius automorphism and a field",
[IsCMatRep and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse,
IsField], function( m, frob, f )
local el,isom,n;
n := NrRows(m);
isom := IdentityMappingOfElementsOfProjectiveSpace(ProjectiveSpace(n-1,f)); ## I hope this works! was wrong, for godsake, don't tell Celle about this type of mistakes :-(
el := rec( mat := m, fld := f, frob := frob, psisom := isom);
Objectify( ProjElsWithFrobWithPSIsomType, el );
return el; end );
# added 19/3/14 ############################################################################# #O ProjElWithFrobWithPSIsom( <mat>, <frob>, <f> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, # i.e. correlations. This method is not intended for the users, it has no # checks built in. There is no fourth argument, the projective space isomorphism # will be the identity mapping of the projective space. ##
InstallMethod( ProjElWithFrobWithPSIsom, "for a ffe matrix, a Frobenius automorphism and a field",
[IsMatrix and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse,
IsField], function( m, frob, f )
local el,isom,n,cmat;
n := NrRows(m);
cmat := NewMatrix(IsCMatRep,f,NrCols(m),m);
isom := IdentityMappingOfElementsOfProjectiveSpace(ProjectiveSpace(n-1,f)); ## I hope this works! was wrong, for godsake, don't tell Celle about this type of mistakes :-(
el := rec( mat := cmat, fld := f, frob := frob, psisom := isom);
Objectify( ProjElsWithFrobWithPSIsomType, el );
return el; end );
# CHECKED 14/09/11 jdb # cmat changed 19/3/14 ############################################################################# #O ProjElWithFrobWithPSIsom( <mat>, <frob>, <f>, <delta> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, # i.e. correlations. This method is not intended for the users, it has no # checks built in. The fourth argument must be the identity mapping of a projective space. ##
InstallMethod( ProjElWithFrobWithPSIsom, "for a cmat/ffe matrix and a Frobenius automorphism, a field and the identity mapping",
[IsCMatRep and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse,
IsField, IsGeneralMapping and IsSPGeneralMapping and IsOne], function( m, frob, f, delta )
local el;
el := rec( mat := m, fld := f, frob := frob, psisom := delta );
Objectify( ProjElsWithFrobWithPSIsomType, el );
return el; end );
# added 19/3/14 ############################################################################# #O ProjElWithFrobWithPSIsom( <mat>, <frob>, <f>, <delta> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, # i.e. correlations. This method is not intended for the users, it has no # checks built in. The fourth argument must be the identity mapping of a projective space. ##
InstallMethod( ProjElWithFrobWithPSIsom, "for a ffe matrix and a Frobenius automorphism, a field and the identity mapping",
[IsMatrix and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse,
IsField, IsGeneralMapping and IsSPGeneralMapping and IsOne], function( m, frob, f, delta )
local el,cmat;
cmat := NewMatrix(IsCMatRep,f,NrCols(m),m);
el := rec( mat := cmat, fld := f, frob := frob, psisom := delta );
Objectify( ProjElsWithFrobWithPSIsomType, el );
return el; end );
InstallMethod( ViewObj, "for a projective group element with Frobenius with duality",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function(el)
Print("<projective element with Frobenius with projectivespace isomorphism: ");
ViewObj(el!.mat); if IsOne(el!.frob) then
Print(", F^0, "); else
Print(", F^",el!.frob!.power,", "); fi;
ViewObj(el!.psisom);
Print(" >"); end);
InstallMethod( Display, "for a projective group element with Frobenius with projective space isomorphism",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function(el)
Print("<projective element with Frobenius, underlying matrix, \n");
Print(el!.mat); if IsOne(el!.frob) then
Print(", F^0"); else
Print(", F^",el!.frob!.power); fi;
Print(", underlying projective space isomorphism:\n",el!.psisom,">\n"); end );
InstallMethod( PrintObj, "for a projective group element with Frobenius with projective space isomorphism",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function(el)
Print("ProjElWithFrobWithPSIsom(");
PrintObj(el!.mat);
Print(",");
PrintObj(el!.frob);
Print(",");
PrintObj(el!.psisom);
Print(")"); end );
################################################################### # Some operations for correlations and correlation-collineation groups. ###################################################################
# CHECKED 14/09/11 jdb ############################################################################# #O Representative( <el> ) # returns the underlying matrix, field automorphism and projective space isomorphism # of the correlation <el> ##
InstallOtherMethod( Representative, "for a projective group element with Frobenius with projective space isomorphism",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function( el )
return [el!.mat,el!.frob,el!.psisom]; end );
# CHECKED 14/09/11 jdb ############################################################################# #O BaseField( <el> ) # returns the underlying field of the correlation <el> ##
InstallMethod( BaseField, "for a projective group element with Frobenius with proj space isomorphism",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function( el )
return el!.fld; end );
# CHECKED 14/09/11 jdb ############################################################################# #O BaseField( <g> ) # returns the base field of the correlation-collineation group group <g> ##
InstallMethod( BaseField, "for a projective group with Frobenius with proj space isomorphism",
[IsProjGroupWithFrobWithPSIsom], function( g )
local f,gens; if IsBound(g!.basefield) then
return g!.basefield; fi; if HasParent(g) then
f := BaseField(Parent(g));
g!.basefield := f;
return f; fi; # Now start to investigate:
gens := GeneratorsOfGroup(g); if Length(gens) > 0then
g!.basefield := gens[1]!.fld;
return g!.basefield; fi; # Now we have to give up:
Error("base field could not be determined"); end );
################################################################### # code for multiplying, comparing... correlations with themselves and # other elements, and more operations. ###################################################################
# CHECKED 15/09/11 jdb # small change 19/3/14 ############################################################################# #O \=( <a>, <b> ) # returns true iff the correlations <a> and <b> are the same. ##
InstallMethod( \=, "for two projective group els with Frobenius with projective space isomorphism",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep,
IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function( a, b )
local aa,bb,p,s,i; if a!.fld <> b!.fld then Error("different base fields"); fi; if a!.frob <> b!.frob then return false; fi;
aa := a!.mat;
bb := b!.mat;
p := PositionNonZero(aa[1]);
s := bb[1][p] / aa[1][p]; if s*aa <> bb then return false; fi; #small change #for i in [1..Length(aa)] do # if s*aa[i] <> bb[i] then return false; fi; #od; if a!.psisom <> b!.psisom then return false; fi;
return true; end );
# CHECKED 15/09/11 jdb ############################################################################# #O IsOne( <a> ) # returns true if the correlation <a> is the identity. ##
InstallMethod( IsOne, "for a projective group elm with Frobenius with projective space isomorphism",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function( el )
local s; if not(IsOne(el!.frob)) then return false; fi; if not(IsOne(el!.psisom)) then return false; fi;
s := el!.mat[1][1]; if IsZero(s) then return false; fi;
s := s^-1;
return IsOne( s*el!.mat ); end );
# CHECKED 15/09/11 jdb ############################################################################# #O OneImmutable( <el> ) # returns immutable one of the group the correlation <el> ##
InstallOtherMethod( OneImmutable, "for a projective group elm with Frobenius with projective space isomorphism",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function( el )
local o;
o := rec( mat := OneImmutable( el!.mat ), fld := el!.fld,
frob := el!.frob^0, psisom := el!.psisom^0);
Objectify( ProjElsWithFrobWithPSIsomType, o);
return o; end );
# CHECKED 15/09/11 jdb ############################################################################# #O OneImmutable( <g> ) # returns immutable one of the group the correlation group <g> ##
InstallOtherMethod( OneImmutable, "for a projective group with Frobenius with projective space isomorphism",
[IsGroup and IsProjGrpElWithFrobWithPSIsom], function( g )
local gens, o;
gens := GeneratorsOfGroup(g); if Length(gens) = 0then if HasParent(g) then
gens := GeneratorsOfGroup(Parent(g)); else
Error("sorry, no generators, no one"); fi; fi;
o := rec( mat := OneImmutable( gens[1]!.mat ), fld := BaseField(g),
frob := gens[1]!.frob^0, psisom := gens[1]!.psisom^0 );
Objectify( ProjElsWithFrobWithPSIsomType, o);
return o; end );
# CHECKED 15/09/11 jdb ############################################################################# #O OneSameMutability( <el> ) # returns one of the group of <el> with same mutability of <el>. ##
InstallMethod( OneSameMutability, "for a projective group element with Frobenius with projective space isomorphism",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function( el )
local o;
o := rec( mat := OneImmutable( el!.mat ), fld := el!.fld,
frob := el!.frob^0, psisom := el!.psisom^0 );
Objectify( ProjElsWithFrobWithPSIsomType, o);
return o; end );
################################################################### # The things that make it a group :-) ################################################################### # we first need: ################################### # Methods for \^ (standard duality) ################################### #7 CHECKED 15/09/11 jdb
# added the cvec one 20/3/14.
InstallOtherMethod( \^, "for a cvec/FFE vector and a id. mapping of el. of ps.",
[ IsCVecRep and IsFFECollection, IsIdentityMappingOfElementsOfProjectiveSpace ], function( v, f )
return v; end );
InstallOtherMethod( \^, "for a FFE vector and a id. mapping of el. of ps.",
[ IsVector and IsFFECollection, IsIdentityMappingOfElementsOfProjectiveSpace ], function( v, f )
return v; end );
InstallOtherMethod( \^, "for a compressed GF2 vector and a id. mapping of el. of ps.",
[ IsVector and IsFFECollection and IsGF2VectorRep, IsIdentityMappingOfElementsOfProjectiveSpace ], function( v, f )
return v; end );
InstallOtherMethod( \^, "for a compressed 8bit vector and a id. mapping of el. of ps.",
[ IsVector and IsFFECollection and Is8BitVectorRep, IsIdentityMappingOfElementsOfProjectiveSpace ], function( v, f )
return v; end );
#added the cmat one 20/3/14.
InstallOtherMethod( \^, "for a FFE matrix and a st. duality",
[ IsCMatRep and IsFFECollColl, IsStandardDualityOfProjectiveSpace ], function( m, f )
return TransposedMat(Inverse(m)); end );
InstallOtherMethod( \^, "for a FFE matrix and a st. duality",
[ IsMatrix and IsFFECollColl, IsStandardDualityOfProjectiveSpace ], function( m, f )
return TransposedMat(Inverse(m)); end );
#added the cmat one 20/3/14.
InstallOtherMethod( \^, "for a FFE matrix and a id. mapping of el. of ps.",
[ IsCMatRep and IsFFECollColl, IsIdentityMappingOfElementsOfProjectiveSpace ], function( m, f )
return m; end );
InstallOtherMethod( \^, "for a FFE matrix and a id. mapping of el. of ps.",
[ IsMatrix and IsFFECollColl, IsIdentityMappingOfElementsOfProjectiveSpace ], function( m, f )
return m; end );
InstallOtherMethod( \^, "for an element of a projective space and a id. mapping of el. of ps.",
[ IsSubspaceOfProjectiveSpace, IsIdentityMappingOfElementsOfProjectiveSpace ], function( p, f)
return p; end );
InstallOtherMethod( \^, "for an elements of a projective space and a st. duality",
[ IsSubspaceOfProjectiveSpace, IsStandardDualityOfProjectiveSpace ], function( p, f)
return f!.fun(p); end );
# CHECKED 15/09/11 jdb ############################################################################# #O \*( <a>, <b> ) # returns a*b, for two correlations <a> and <b> ##
InstallMethod( \*, "for two projective group elements with frobenius with projective space isomorphism",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep,
IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function( a, b )
local el;
el := rec( mat := a!.mat * ((b!.mat^(a!.frob^-1)))^a!.psisom, fld := a!.fld, #O Celle, dear friend, you missed this correction :-) #O True Jan, but I can't see everything, hey :-)
frob := a!.frob * b!.frob, psisom := a!.psisom * b!.psisom );
Objectify( ProjElsWithFrobWithPSIsomType, el);
return el; end );
# CHECKED 14/09/11 jdb ############################################################################# #O \<( <a>, <b> ) # method for LT, for two correlations. ##
InstallMethod(\<, "for two correlations",
[IsProjGrpElWithFrobWithPSIsom, IsProjGrpElWithFrobWithPSIsom], function(a,b)
local aa,bb,pa,pb,sa,sb,i,va,vb; if a!.fld <> b!.fld then Error("different base fields"); fi; if a!.psisom < b!.psisom then
return true; elif b!.psisom < a!.psisom then
return false; fi; if a!.frob < b!.frob then
return true; elif b!.frob < a!.frob then
return false; fi;
aa := a!.mat;
bb := b!.mat;
pa := PositionNonZero(aa[1]);
pb := PositionNonZero(bb[1]); if pa > pb then
return true; elif pa < pb then
return false; fi;
sa := aa[1][pa]^-1;
sb := bb[1][pb]^-1; for i in [1..Length(aa)] do
va := sa*aa[i];
vb := sb*bb[i]; if va < vb then return true; fi; if vb < va then return false; fi;
od;
return false; end);
## Let M be a matrix, f be a Frobenius aut, and t be a psisom. ## Then the inverse of Mft is ## t^-1 f^-1 M^-1 = (M^-1)^(ft) f^-1 t^-1
# CHECKED 19/09/11 jdb ############################################################################# #O InverseSameMutability( <el> ) # returns el^-1, for IsProjGrpElWithFrobWithPSIsom, keeps mutability (of matrix). ##
InstallMethod( InverseSameMutability, "for a projective group element with Frobenius with projective space isomorphism",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function( el )
local m, f, t;
f := el!.frob^-1;
t := el!.psisom;
m := rec( mat := ((InverseSameMutability(el!.mat))^f)^t, fld := el!.fld,
frob := f, psisom := t);
Objectify( ProjElsWithFrobWithPSIsomType, m );
return m; end );
# CHECKED 19/09/11 jdb ############################################################################# #O InverseMutable( <el> ) # returns el^-1 (mutable) for IsProjGrpElWithFrobWithPSIsom ##
InstallMethod( InverseMutable, "for a projective group element with Frobenius with projective space isomorphism",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function( el )
local m, f, t;
f := el!.frob;
t := el!.psisom;
m := rec( mat := ((InverseMutable(el!.mat))^f)^t, fld := el!.fld,
frob := f^-1, psisom := t );
Objectify( ProjElsWithFrobWithPSIsomType, m );
return m; end );
############################################################################################# # Methods for \* to multiply IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrob #############################################################################################
#the following method is wrong, and is btw never used. #InstallMethod( \*, # "for two projective group elements with frobenius with projective space isomorphism", # [IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep, # IsProjGrpElWithFrob and IsProjGrpElWithFrobRep], # function( a, b ) # local el; # el := rec( mat := (a!.mat * (b!.mat^(a!.frob^-1)))^a!.psisom, fld := a!.fld, # frob := a!.frob * b!.frob, psisom := a!.psisom * b!.psisom ); # Objectify( ProjElsWithFrobWithPSIsomType, el); # return el; # end );
InstallMethod( \*, "for a projective group element with frobenius and a correlation",
[IsProjGrpElWithFrob and IsProjGrpElWithFrobRep,
IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep], function( a, b )
local el;
el := rec( mat := (a!.mat * (b!.mat^(a!.frob^-1))), fld := a!.fld,
frob := a!.frob * b!.frob, psisom := b!.psisom );
Objectify( ProjElsWithFrobWithPSIsomType, el);
return el; end );
InstallMethod( \*, "for a correlation and a projective group element with frobenius",
[IsProjGrpElWithFrobWithPSIsom and IsProjGrpElWithFrobWithPSIsomRep,
IsProjGrpElWithFrob and IsProjGrpElWithFrobRep], function( a, b )
local el;
el := rec( mat := (a!.mat * (b!.mat^(a!.frob^-1)))^a!.psisom, fld := a!.fld,
frob := a!.frob * b!.frob, psisom := a!.psisom );
Objectify( ProjElsWithFrobWithPSIsomType, el);
return el; end );
##################################################################### # Methods to construct a collection of ProjElsWithFrobWithPSIsom #####################################################################
# CHECKED 19/09/11 jdb ############################################################################# #O ProjElsWithFrobWithPSIsom( <l>, <f> ) # method to construct a list of objects in the category IsProjGrpElWithFrobWithPSIsom, # using a list of triples of matrix/frobenius automorphism/projective space isomorphism, and a field. # This method relies of ProjElWithFrobWithPSIsom, and is not inteded for the user. # no checks are built in. This could result in e.g. the use of a field that is # not compatible with (some of) the matrices, and result in a non user friendly # error ##
InstallMethod( ProjElsWithFrobWithPSIsom, "for a list of triples of ffe matrice + frob aut + st duality, and a field",
[IsList, IsField], function( l, f )
local objectlist, m;
objectlist := []; for m in l do
Add(objectlist, ProjElWithFrobWithPSIsom(m[1],m[2],f,m[3]));
od;
return objectlist; end );
# CHECKED 19/09/2011 jdb # changed 02/11/2012 ml ############################################################################# #A CorrelationCollineationGroup( <ps> ) # returns the group of collineations and correlations of the projective space <ps> ##
InstallMethod( CorrelationCollineationGroup, "for a full projective space",
[ IsProjectiveSpace and IsProjectiveSpaceRep ], function( ps )
local corr,d,f,frob,g,newgens,q,tau,pow,string;
f := ps!.basefield;
q := Size(f);
d := ProjectiveDimension(ps);
g := GL(d+1,f);
frob := FrobeniusAutomorphism(f);
tau := StandardDualityOfProjectiveSpace(ps);
newgens := List(GeneratorsOfGroup(g),x->[x,frob^0,tau^0]);
Add(newgens,[One(g),frob,tau^0]);
Add(newgens,[One(g),frob^0,tau]);
newgens := ProjElsWithFrobWithPSIsom(newgens, f);
corr := GroupWithGenerators(newgens);
SetSize(corr, Size(g) / (q - 1) * Order(frob) * 2); #* 2 for the standard duality.
pow := DegreeOverPrimeField(f); if pow > 1then
string := Concatenation("The FinInG correlation-collineation group PGammaL(",String(d+1),",",String(q),")"); else
string := Concatenation("The FinInG correlation-collineation group PGL(",String(d+1),",",String(q),")"); fi;
string := Concatenation(string," : 2");
SetName(corr,string);
return corr; end );
##################################################################### # User friendly Methods to construct a correlation of a projective space. #####################################################################
# CHECKED 19/09/11 jdb ############################################################################# #O CorrelationOfProjectiveSpace( <mat>, <gf> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, i.e. a # correlation of a projective space. This method is intended for the user, and contains # a check whether the matrix is non-singular. The method relies on ProjElWithFrobWithPSIsom, # the field automorphism and the projective space automorphism will be trivial ##
InstallMethod( CorrelationOfProjectiveSpace, "for a matrix and a finite field",
[ IsMatrix and IsFFECollColl, IsField], function( mat, gf ) if Rank(mat) <> NrRows(mat) then
Error("<mat> must not be singular"); fi;
return ProjElWithFrobWithPSIsom( mat, IdentityMapping(gf), gf); end );
# CHECKED 19/09/11 jdb ############################################################################# #O CorrelationOfProjectiveSpace( <mat>, <frob>, <gf> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, i.e. a # correlation of a projective space. This method is intended for the user, and contains # a check whether the matrix is non-singular. The method relies on ProjElWithFrobWithPSIsom, # the projective space automorphism will be trivial ##
InstallMethod( CorrelationOfProjectiveSpace, "for a matrix, a frobenius automorphism, and a finite field",
[ IsMatrix and IsFFECollColl, IsRingHomomorphism and
IsMultiplicativeElementWithInverse, IsField], function( mat, frob, gf ) if Rank(mat) <> NrRows(mat) then
Error("<mat> must not be singular"); fi;
return ProjElWithFrobWithPSIsom( mat, frob, gf); end );
# CHECKED 19/09/11 jdb ############################################################################# #O CorrelationOfProjectiveSpace( <mat>, <gf>, <delta> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, i.e. a # correlation of a projective space. This method is intended for the user, and contains # a check whether the matrix is non-singular. The method relies on ProjElWithFrobWithPSIsom, # ##
InstallMethod( CorrelationOfProjectiveSpace, "for a matrix, a finite field, and a projective space isomorphism",
[ IsMatrix and IsFFECollColl, IsField, IsStandardDualityOfProjectiveSpace], function( mat, gf, delta ) if Rank(mat) <> NrRows(mat) then
Error("<mat> must not be singular"); fi; if delta!.ps!.basefield <> gf then
Error("<delta> is not a duality of the correct projective space"); fi;
return ProjElWithFrobWithPSIsom( mat, IdentityMapping(gf), gf, delta); end );
# Added ml 8/11/12 ############################################################################# #O CorrelationOfProjectiveSpace( <mat>, <gf>, <delta> ) # # same method as above but now for delta equal to IsIdentityMappingOfElementsOfProjectiveSpace ##
InstallMethod( CorrelationOfProjectiveSpace, "for a matrix, a finite field, and a projective space isomorphism",
[ IsMatrix and IsFFECollColl, IsField, IsIdentityMappingOfElementsOfProjectiveSpace], function( mat, gf, delta ) if Rank(mat) <> NrRows(mat) then
Error("<mat> must not be singular"); fi; if Source(delta)!.geometry <> PG(NrRows(mat)-1,gf) then
Error("<delta> is not the identity mapping of the correct projective space"); fi;
return ProjElWithFrobWithPSIsom( mat, IdentityMapping(gf), gf, delta); end );
# CHECKED 19/09/11 jdb ############################################################################# #O CorrelationOfProjectiveSpace( <mat>, <frob>, <gf>, <delta> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, i.e. a # correlation of a projective space. This method is intended for the user, and contains # a check whether the matrix is non-singular. The method relies on ProjElWithFrobWithPSIsom. ##
InstallMethod( CorrelationOfProjectiveSpace, "for a matrix, a frobenius automorphism, a finite field, and a projective space isomorphism",
[ IsMatrix and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse, IsField,
IsStandardDualityOfProjectiveSpace], function( mat, frob, gf, delta ) if Rank(mat) <> NrRows(mat) then
Error("<mat> must not be singular"); fi; if delta!.ps!.basefield <> gf then
Error("<delta> is not a duality of the correct projective space"); fi;
return ProjElWithFrobWithPSIsom( mat, frob, gf, delta); end );
# Added ml 8/11/12 ############################################################################# #O CorrelationOfProjectiveSpace( <mat>, <frob>, <gf>, <delta> ) # # same method as above but now for delta equal to IsIdentityMappingOfElementsOfProjectiveSpace ##
InstallMethod( CorrelationOfProjectiveSpace, "for a matrix, a frobenius automorphism, a finite field, and a projective space isomorphism",
[ IsMatrix and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse, IsField,
IsIdentityMappingOfElementsOfProjectiveSpace], function( mat, frob, gf, delta ) if Rank(mat) <> NrRows(mat) then
Error("<mat> must not be singular"); fi; if Source(delta)!.geometry <> PG(NrRows(mat)-1,gf) then
Error("<delta> is not the identity mapping of the correct projective space"); fi;
return ProjElWithFrobWithPSIsom( mat, frob, gf, delta); end );
# Added ml 8/11/12 ############################################################################# #O CorrelationOfProjectiveSpace( <pg>, <mat>, <frob>, <delta> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, i.e. a # correlation of a projective space. This method uses CorrelationOfProjectiveSpace ##
InstallMethod( CorrelationOfProjectiveSpace, "for a projective space, a matrix, a field automorphism, and a projective space isomorphism",
[ IsProjectiveSpace, IsMatrix and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse,
IsStandardDualityOfProjectiveSpace], function( pg, mat, frob, delta ) if Dimension(pg)+1 <> NrRows(mat) then
Error("The arguments <pg> and <mat> are not compatible"); fi;
return CorrelationOfProjectiveSpace( mat, frob, BaseField(pg), delta); end );
# Added ml 8/11/12 ############################################################################# #O CorrelationOfProjectiveSpace( <pg>, <mat>, <frob>, <delta> ) # # same method as above but now for delta equal to IsIdentityMappingOfElementsOfProjectiveSpace ##
InstallMethod( CorrelationOfProjectiveSpace, "for a projective space, a matrix, a field automorphism, and a projective space isomorphism",
[ IsProjectiveSpace, IsMatrix and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse,
IsIdentityMappingOfElementsOfProjectiveSpace], function( pg, mat, frob, delta ) if Dimension(pg)+1 <> NrRows(mat) then
Error("The arguments <pg> and <mat> are not compatible"); fi; if Source(delta)!.geometry <> pg then
Error("<delta> is not the identity mapping of the correct projective space"); fi;
return CorrelationOfProjectiveSpace( mat, frob, BaseField(pg), delta); end );
# Added ml 8/11/12 ############################################################################# #O Correlation( <pg>, <mat>, <frob>, <delta> ) # method to construct an object in the category IsProjGrpElWithFrobWithPSIsom, i.e. a # correlation of a projective space. The method uses CorrelationOfProjectiveSpace ##
InstallMethod( Correlation, "for a projective space, a matrix, a field automorphism, and a projective space isomorphism",
[ IsProjectiveSpace, IsMatrix and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse,
IsStandardDualityOfProjectiveSpace], function( pg, mat, frob, delta ) if Dimension(pg)+1 <> NrRows(mat) then
Error("The arguments <pg> and <mat> are not compatible"); fi;
return CorrelationOfProjectiveSpace( mat, frob, BaseField(pg), delta); end );
# Added ml 8/11/12 ############################################################################# #O Correlation( <pg>, <mat>, <frob>, <delta> ) # # same method as above but now for delta equal to IsIdentityMappingOfElementsOfProjectiveSpace ##
InstallMethod( Correlation, "for a projective space, a matrix, a field automorphism, and a projective space isomorphism",
[ IsProjectiveSpace, IsMatrix and IsFFECollColl, IsRingHomomorphism and IsMultiplicativeElementWithInverse,
IsIdentityMappingOfElementsOfProjectiveSpace], function( pg, mat, frob, delta ) if Dimension(pg)+1 <> NrRows(mat) then
Error("The arguments <pg> and <mat> are not compatible"); fi; if Source(delta)!.geometry <> pg then
Error("<delta> is not the identity mapping of the correct projective space"); fi;
return CorrelationOfProjectiveSpace( mat, frob, BaseField(pg), delta); end );
################################################################### # Some operations for correlations ###################################################################
# CHECKED 19/09/11 jdb ############################################################################# #O MatrixOfCorrelation( <c> ) # returns the underlying matrix of <c> ##
InstallMethod( MatrixOfCorrelation, [ IsProjGrpElWithFrobWithPSIsom and
IsProjGrpElWithFrobWithPSIsomRep],
c -> c!.mat );
# CHECKED 19/09/11 jdb ############################################################################# #O FieldAutomorphism( <c> ) # returns the underlying field automorphism of <c> ##
InstallMethod( FieldAutomorphism, [ IsProjGrpElWithFrobWithPSIsom and
IsProjGrpElWithFrobWithPSIsomRep],
c -> c!.frob );
# CHECKED 19/09/11 jdb ############################################################################# #O ProjectiveSpaceIsomorphism( <c> ) # returns the underlying projective space isomorphism of <c> ##
InstallMethod( ProjectiveSpaceIsomorphism, [ IsProjGrpElWithFrobWithPSIsom and
IsProjGrpElWithFrobWithPSIsomRep],
c -> c!.psisom );
##################################################################### # Embedding from a collineation group into a correlation group. #####################################################################
# CHECKED 19/09/11 jdb ############################################################################# #O Embedding( <group>, <corr> ) # returns an embedding from a collineation group into a correlation group, # i.e. a group homomorphism (which is in fact trivial), from PG(amma)L(n+1,q) -> # PG(amma)L(n+1,q) : 2 ##
InstallOtherMethod( Embedding, "for a collineation group",
[IsProjectiveGroupWithFrob, IsProjGroupWithFrobWithPSIsom], function(group,corr)
local hom; if not ((BaseField(group)=BaseField(corr)) and (Dimension(group)=Dimension(corr))) then
Error("Embedding not allowed, dimension and/or base field do not match"); fi;
hom := GroupHomomorphismByFunction(group,corr,
y->ProjElWithFrobWithPSIsom(y!.mat,y!.frob,y!.fld),false, function(x) if IsOne(x!.psisom) then
return ProjElWithFrob(x!.mat,x!.frob,x!.fld);
Print("method prefun"); else
Error("<x> has no preimage"); fi; end);
SetIsInjective(hom,true);
return hom; end );
##################################################################### # Actions # We follow almost the same approach as in goup.gi. We define the # action of a correlation on vectorspaces, but we our user function # for actions does not rely on it, since it would cause more function # calls. # Also recall that in group.gi we have implemented the methods that do algebraic # stuff. The user methods, related to the projective geometry stuff, are # in projectivespace.gi. Here we have both parts, since this file # is anyway related to projectivespace.gi # #####################################################################
# CHECKED 19/09/11 jdb ############################################################################# #F OnProjPointsWithFrobWithPSIsom( <line>, <el> ) # computes <line>^<el> where this action is the "natural" one, and <line> represents # a projective point. This function relies on the GAP function OnPoints, which represents # the natural action of matrices on row *vectors* (So the result is *not* normalized, neither # it is assumed that the input is normalized. # Important: despite its natural name, this function is *not* intended for the user. # <line>: just a row vector, representing a projective point. # <el>: a correlation. # Important: since this function is just "doing the algebra", it returns a vector that # must be interpreted as the coordinates of a hyperplane now. ##
InstallGlobalFunction( OnProjPointsWithFrobWithPSIsom, function( line, el )
local vec,c;
vec := OnPoints(line,el!.mat)^el!.frob;
c := PositionNonZero(vec); if c <= Length( vec ) then if not(IsMutable(vec)) then
vec := ShallowCopy(vec); fi;
MultVector(vec,Inverse( vec[c] )); fi;
return vec; end );
# CHECKED 19/09/11 jdb ############################################################################# #F OnProjSubspacesWithFrobWithPSIsom( <subspace>, <el> ) # computes <subspace>^<el> where this action is the "natural" one, and <subspace> represents # a projective subspace. This function relies on the GAP action function # OnRight, which computes the action of a matrix on a sub vector space. # Important: despite its natural name, this function is *not* intended for the user. # <el>: a projective group element (so a projectivity, *not* a projective semilinear element. ##
InstallGlobalFunction( OnProjSubspacesWithFrobWithPSIsom, function( line, el )
local vec,c;
vec := OnRight(line,el!.mat)^el!.frob; if not(IsMutable(vec)) then
vec := MutableCopyMat(vec); fi;
TriangulizeMat(vec);
return vec; #return EchelonMat(vec).vectors; end );
# CHECKED 20/09/11 jdb # changed name 05/02/13 ml jdbOnProjSubspacesExtended ############################################################################# #F OnProjSubspacesExtended( <sub>, <el> ) # computes <sub>^<el>, where <sub> is an element of a projective space, and # <el> a correlation. This function is stand alone now, and hence we still have # to do the canonization. Therefore we use VectorSpaceToElement. ##
InstallGlobalFunction( OnProjSubspacesExtended, function( sub, el )
local vec,newsub,ps,ty,newvec,rk;
vec := Unwrap(sub);
ps := AmbientSpace(sub!.geo);
ty := sub!.type;
newvec := (vec*el!.mat)^el!.frob; if ty = 1then
newvec := [newvec]; fi; if not IsOne(el!.psisom) then
newvec := NullspaceMat(TransposedMat(newvec)); fi;
rk := Rank(newvec); if rk = 1then
newvec := newvec[1]; fi;
return VectorSpaceToElement(ps,newvec); end );
# CHECKED 19/09/11 jdb ############################################################################# #O Dimension( <g> ) # returns the dimension of the correlation group <g>. The dimension of this # group is defined as the vector space dimension of the projective space # of which <g> was defined as a projective group, or, in other words, as the # size of the matrices. ##
InstallMethod( Dimension, "for a projective group with Frobenius with vspace isomorphism",
[IsProjGroupWithFrobWithPSIsom], function( g )
local gens; if HasParent(g) then
return Dimension(Parent(g)); fi; # Now start to investigate:
gens := GeneratorsOfGroup(g); if Length(gens) > 0then
return NrRows(gens[1]!.mat); fi;
Error("dimension could not be determined"); end );
# CHECKED 20/09/11 jdb ############################################################################# #P ActionOnAllPointsHyperplanes( <g> ) # returns the action of the correlation group <g> on the projective points # an hyperplanes of the underlying projective space. ##
InstallMethod( ActionOnAllPointsHyperplanes, "for a correlation group",
[ IsProjGroupWithFrobWithPSIsom ], function( pg )
local a,d,f,o,orb,orb2, m, j, flip, vs, ps;
f := BaseField(pg);
d := Dimension(pg);
ps := ProjectiveSpace(d-1,f);
vs := f^d;
o := One(f);
orb := []; for m in vs do
j := PositionNonZero(m); if j <= d and m[j] = o then
Add(orb, m); fi;
od;
flip := function(j)
local vec;
vec := TriangulizedNullspaceMat(TransposedMat([j]));
return vec; end;
orb2 := []; for m in orb do
Add(orb2, flip(m));
od;
orb := List(Concatenation(orb,orb2),x->VectorSpaceToElement(ps,x)); #corrected 12/4/11
a := ActionHomomorphism(pg, orb,
OnProjSubspacesExtended, "surjective");
SetIsInjective(a,true);
return a; end );
# CHECKED 20/09/11 jdb ############################################################################# #P CanComputeActionOnPoints( <g> ) # is set true if we consider the computation of the action feasible. # for correlation groups. ##
InstallMethod( CanComputeActionOnPoints, "for a projective group with frob with pspace isomorphism",
[IsProjGroupWithFrobWithPSIsom], function( g )
local d,q;
d := Dimension( g );
q := Size( BaseField( g ) ); if (q^d - 1)/(q-1) > FINING.LimitForCanComputeActionOnPoints then
return false; else
return true; fi; end );
# CHECKED 20/09/11 jdb ############################################################################# #O NiceMonomorphism( <pg> ) # <pg> is a correlation group. This operation returns a nice monomorphism. ##
InstallMethod( NiceMonomorphism, "for a projective group with Frobenius with pspace isomorphism (feasible case)",
[IsProjGroupWithFrobWithPSIsom and CanComputeActionOnPoints and
IsHandledByNiceMonomorphism], 50, function( pg )
return ActionOnAllPointsHyperplanes( pg ); end );
# CHECKED 20/09/11 jdb ############################################################################# #O NiceMonomorphism( <pg> ) # <pg> is a correlation group. This operation returns a nice monomorphism. ##
InstallMethod( NiceMonomorphism, "for a projective group with Frobenius with pspace isomorphism (nasty case)",
[IsProjGroupWithFrobWithPSIsom and IsHandledByNiceMonomorphism], 50, function( pg )
local can;
can := CanComputeActionOnPoints(pg); if not(can) then
Error("action on projective points not feasible to calculate"); else
return ActionOnAllPointsHyperplanes( pg ); fi; end );
# CHECKED 19/09/11 jdb ################################################################### # View methods of groups of projective elements with frobenius with # projective space isomorphism ###################################################################
InstallMethod( ViewObj, "for a projective group with frobenius with pspace isomorphism",
[IsProjGroupWithFrobWithPSIsom], function( g )
Print("<projective group with Frobenius with proj. space isomorphism>"); end );
InstallMethod( ViewObj, "for a trivial projective group with frobenius with pspace isomorphism ",
[IsProjGroupWithFrobWithPSIsom and IsTrivial], function( g )
Print("<trivial projective group with Frobenius with proj. space isomorphism>"); end );
InstallMethod( ViewObj, "for a projective group with Frobenius with proj. space isomorphism with gens",
[IsProjGroupWithFrobWithPSIsom and HasGeneratorsOfGroup], function( g )
local gens;
gens := GeneratorsOfGroup(g); if Length(gens) = 0then
Print("<trivial projective group with Frobenius with proj. space isomorphism>"); else
Print("<projective group with Frobenius with proj. space isomorphism with ",Length(gens), " generators>"); fi; end );
InstallMethod( ViewObj, "for a projective group with frobenius with pspace isomorphism with size",
[IsProjGroupWithFrobWithPSIsom and HasSize], function( g ) if Size(g) = 1then
Print("<trivial projective group with Frobenius with proj. space isomorphism>"); else
Print("<projective group with Frobenius with proj. space isomorphism of size ",Size(g),">"); fi; end );
InstallMethod( ViewObj, "for a projective group with frobenius with pspace isomorphism with gens and size",
[IsProjGroupWithFrobWithPSIsom and HasGeneratorsOfGroup and HasSize], function( g )
local gens;
gens := GeneratorsOfGroup(g); if Length(gens) = 0then
Print("<trivial projective group with Frobenius with proj. space isomorphism>"); else
Print("<projective group with Frobenius with proj. space isomorphism of size ",Size(g)," with ",
Length(gens)," generators>"); fi; end );
############################################################################# # The polarity section of this file. #############################################################################
############################################################################# # operations to create polarities of projective spaces #############################################################################
# operation to construct polarity of projective space using a sesquilinear form. # to be considered as the standard.
InstallMethod(PolarityOfProjectiveSpaceOp, "for a sesquilinear form of the underlying vectorspace",
[IsSesquilinearForm and IsFormRep], function(form)
local mat,field,n,aut,v,ps,q,delta,polarity; if IsDegenerateForm(form) then
Error("<form> must not be degenerate"); fi;
mat := GramMatrix(form);
field := BaseField(form);
n := NrRows(mat);
aut := CompanionAutomorphism(form);
v := field^n;
ps := ProjectiveSpace(n-1,field);
delta := StandardDualityOfProjectiveSpace(ps);
polarity := ProjElWithFrobWithPSIsom(mat,aut,field,delta);
polarity!.form := form;
SetFilterObj( polarity, IsPolarityOfProjectiveSpace );
SetFilterObj( polarity, IsPolarityOfProjectiveSpaceRep );
return polarity; end );
############################################################################# # standard View, Display and Print operations #############################################################################
InstallMethod( ViewObj, "for a polarity",
[IsPolarityOfProjectiveSpace and IsPolarityOfProjectiveSpaceRep], function(el)
local dim, field;
field := el!.fld;
dim := NrRows(el!.mat);
Print("<polarity of PG(", dim-1, ", ", field, ")"); #ViewObj(el!.mat); #if IsOne(el!.frob) then # Print(", F^0"); #else # Print(", F^",el!.frob!.power); #fi;
Print(" >"); end);
InstallMethod( PrintObj, "for a polarity",
[IsPolarityOfProjectiveSpace and IsPolarityOfProjectiveSpaceRep], function( f )
local dim, field;
field := f!.fld;
dim := NrRows(f!.mat);
Print("<polarity of PG(", dim-1, ", ", field, ")>, underlying matrix\n");
PrintObj(f!.mat);
Print(",");
PrintObj(f!.frob);
Print(") \n"); end );
InstallMethod( Display, "for a projective group element with Frobenius with projective space isomorphism",
[IsPolarityOfProjectiveSpace and IsPolarityOfProjectiveSpaceRep], function(f)
local dim, field;
dim := NrRows(f!.mat);
field := f!.fld;
Print("<polarity of PG(", dim-1, ", ", field, ")>, underlying matrix\n");
Display(f!.mat); if IsOne(f!.frob) then
Print(", F^0"); else
Print(", F^",f!.frob!.power); fi;
Print(">\n"); end );
#First user function to create polarity of projective space. #using a form. Just calls ...Op version of this operation.
InstallMethod(PolarityOfProjectiveSpace, "for a sesquilinear form of the underlying vectorspace",
[IsSesquilinearForm and IsFormRep], function(form)
return PolarityOfProjectiveSpaceOp(form); end );
InstallMethod(PolarityOfProjectiveSpace, "for a matrix and a finite field",
[IsMatrix,IsField and IsFinite], function(matrix,field)
local form; if Rank(matrix) <> NrRows(matrix) then
Error("<matrix> must not be singular"); fi;
form := BilinearFormByMatrix(matrix,field);
return PolarityOfProjectiveSpaceOp(form); end );
InstallMethod(PolarityOfProjectiveSpace, "for a matrix, a finite field, and a frobenius automorphism",
[IsMatrix, IsFrobeniusAutomorphism, IsField and IsFinite], function(matrix,frob,field)
local form; if Rank(matrix) <> NrRows(matrix) then
Error("<matrix> must not be singular"); fi; if Order(frob)<>2then
Error("<frob> must be involutory or identity"); else
form := HermitianFormByMatrix(matrix,field);
return PolarityOfProjectiveSpaceOp(form); fi; end );
InstallMethod(HermitianPolarityOfProjectiveSpace, "for a sesquilinear form of a projective space",
[IsMatrix,IsField and IsFinite], function(matrix,field)
local form; if Rank(matrix) <> NrRows(matrix) then
Error("<matrix> must not be singular"); fi; if IsOddInt(DegreeOverPrimeField(field)) then
Error("Size of <field> must be a square" ); fi;
form := HermitianFormByMatrix(matrix,field);
return PolarityOfProjectiveSpaceOp(form); end );
############################################################################# # operations, attributes and properties #############################################################################
InstallMethod( GramMatrix, "for a polarity of a projective space",
[IsPolarityOfProjectiveSpace and IsPolarityOfProjectiveSpaceRep],
x -> x!.mat );
InstallOtherMethod( BaseField, "for a polarity of a projective space",
[IsPolarityOfProjectiveSpace and IsPolarityOfProjectiveSpaceRep],
x -> x!.fld );
InstallMethod( CompanionAutomorphism, "for a polarity of a projective space",
[IsPolarityOfProjectiveSpace and IsPolarityOfProjectiveSpaceRep],
x -> x!.frob );
InstallMethod( SesquilinearForm, "for a polarity of a projective space",
[IsPolarityOfProjectiveSpace and IsPolarityOfProjectiveSpaceRep],
el -> el!.form );
InstallMethod( IsHermitianPolarityOfProjectiveSpace, "for a polarity of a projective space",
[IsPolarityOfProjectiveSpace and IsPolarityOfProjectiveSpaceRep],
x -> IsHermitianForm(x!.form) );
InstallMethod( IsOrthogonalPolarityOfProjectiveSpace, "for a polarity of a projective space",
[IsPolarityOfProjectiveSpace and IsPolarityOfProjectiveSpaceRep],
x -> IsOrthogonalForm(x!.form) );
InstallMethod( IsSymplecticPolarityOfProjectiveSpace, "for a polarity of a projective space",
[IsPolarityOfProjectiveSpace and IsPolarityOfProjectiveSpaceRep],
x -> IsSymplecticForm(x!.form) );
InstallMethod( IsPseudoPolarityOfProjectiveSpace, "for a polarity of a projective space",
[IsPolarityOfProjectiveSpace and IsPolarityOfProjectiveSpaceRep],
x -> IsPseudoForm(x!.form) );
#installs the method for sub^phi with sub a subspace of a projectivespace and # phi a polarity of a projective space. To be discussed whether this should be done # in general or only for polarities. # uses OnProjSubspacesExtended, defined in group2.g*
InstallOtherMethod( \^, "for an element of a projective space and a polarity of a projective space",
[ IsSubspaceOfProjectiveSpace, IsPolarityOfProjectiveSpace], function(sub,phi)
return OnProjSubspacesExtended(sub,phi); end );
#the following is obsolete now. #InstallMethod( IsDegeneratePolarity, "for a polarity of a projective space", # [ IsPolarityOfProjectiveSpace ], # function( polarity ) # local form; # form := Form( polarity ); # return IsDegenerateForm( form ); # end );
#InstallGlobalFunction( OnProjSubspacesExtended, # function( line, el ) # local vec,c; # vec := (OnRight(line,el!.mat)^el!.frob)^el!.duality; # if not(IsMutable(vec)) then # vec := MutableCopyMat(vec); # fi; # TriangulizeMat(vec); # return vec; # end );
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.41 Sekunden
(vorverarbeitet am 2026-10-12)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.