A generalised ngon is a point/line geometry whose incidence graph is bipartite of diameter n and girth 2n. Although these rank 2 structures are very much a subdomain of GRAPE and Design, their significance in finite geometry warrants their inclusion in FinInG. By the famous theorem of Feit and Higman, a generalised ngon which has at least three points on every line, must have n in {2,3,4,6,8}. The case n=2 concerns the complete multipartite graphs, which we disregard. The more interesting cases are accordingly projective planes (n=3), generalised quadrangles (n=4), generalised hexagons (n=6), and generalised octagons (n=8).
FinInG provides some basic functionality to deal with generalised polygons as incidence geometries. A lot of nontrivial interaction with the package GRAPE has been very useful and even necessary. Currently, generic functions to create generalised polygons, to create elements of generalised polygons, and to explore the elements are implemented. This generic functionality allows the user to construct generalised polygons through many different objects available in GAP and FinInG. Apart from these generic functions, some particular generalised polygons are available: the classical generalised hexagons and elation generalised quadrangles from different perspectives can be constructed.
‣ IsGeneralisedPolygon  ( category ) 
‣ IsGeneralisedPolygonRep  ( representation ) 
This category is a subcategory of IsIncidenceGeometry
, and contains all generalised polygons. Generalised polygons constructed through functions described in this chapter, all belong to IsGeneralisedPolygonRep
.
IsGeneralisedPolygon
‣ IsProjectivePlaneCategory  ( category ) 
‣ IsGeneralisedQuadrangle  ( category ) 
‣ IsGeneralisedHexagon  ( category ) 
‣ IsGeneralisedOctagon  ( category ) 
All generalised polygons in FinInG belong to one of these four categories. It is not possible to construct generalised polygons of which the gonality is not known (or checked). Note that the classical generalised quadrangles (which are the classical polar spaces of rank 2) belong also to IsGeneralisedQuadrangle
and that the desarguesian projective planes (which are the projective spaces of dimension 2) also belong to IsProjectivePlaneCategory
, but both do not belong to IsGeneralisedPolygonRep
.
‣ IsWeakGeneralisedPolygon  ( category ) 
IsWeakGeneralisedPolygon
is the category for weak generalised polygons.
IsProjectivePlaneCategory
‣ IsDesarguesianPlane  ( category ) 
IsDesarguesianPlane
is declared as a subcategory of IsProjectivePlaneCategory
and IsProjecticeSpace
. Projective spaces of dimension 2 constructed using ProjectiveSpace
belong to IsDesarguesianPlane
.
IsGeneralisedQuadrangle
‣ IsClassicalGQ  ( category ) 
‣ IsElationGQ  ( category ) 
IsClassicalGQ
is declared as a subcategory of IsGeneralisedQuadrangle
and IsClassicalPolarSpace
. All classical polar spaces of rank 2 belong to IsClassicalGQ
. IsElationGQ
is declared as subcategory of IsGeneralisedQuadrangle
. Elation GQs will be discusedd in detail in Section 12.6
gap> gp := SymplecticSpace(3,2); W(3, 2) gap> IsGeneralisedPolygon(gp); true gap> IsGeneralisedQuadrangle(gp); true gap> IsClassicalGQ(gp); true gap> IsGeneralisedPolygonRep(gp); false
‣ IsClassicalGeneralisedHexagon  ( category ) 
IsClassicalGeneralisedHexagon
is declared as subcategory of IsGeneralisedHexagon
and IsLieGeometry
. The so called classical generalised hexagons are the hexagons that come from the triality of the hyperbolic quadric Q^{+}(7,q). The Split Cayley hexagon is embedded in the parabolic quadric Q(6,q), or W(5,q) in even characteristic. The twisted triality hexagon is embedded in the hyperbolic quadric Q^{+}(7,q). The construction of these hexagons in a subcategory of IsLieGeometry
means that the usual operations for Lie geometries become applicable. The classical generalised hexagons are in detail discussed in Section 12.5
gap> gp := SplitCayleyHexagon(3); H(3) gap> IsGeneralisedHexagon(gp); true gap> IsClassicalGeneralisedHexagon(gp); true gap> IsLieGeometry(gp); true gap> IsGeneralisedPolygonRep(gp); true
‣ GeneralisedPolygonByBlocks ( l )  ( operation ) 
Returns: a generalised polygon
The argument l is a finite homogeneous list consisting of ordered sets of a common size n+1. This operation will assume that each element of l represents a line of the generalised polygon. Its points are assumed to be the union of all elements of l. The incidence is assumed to be symmetrised containment. From this information, an incidence graph is computed using GRAPE. If this graph has diameter d and girth 2d, a generalised polygon is returned. The thickness condition is not checked. If d ∈ {3,4,6,8}, a projective plane, a generalised quadrangle, a generalised hexagon, a generalised octagon respectively, is returned. Note that for large input, this operation can be time consuming.
gap> blocks := [ > [ 1, 2, 3, 4, 5 ], [ 1, 6, 7, 8, 9 ], [ 1, 10, 11, 12, 13 ], > [ 1, 14, 15, 16, 17 ], [ 1, 18, 19, 20, 21 ], [ 2, 6, 10, 14, 18 ], > [ 2, 7, 11, 15, 19 ], [ 2, 8, 12, 16, 20 ], [ 2, 9, 13, 17, 21 ], > [ 3, 6, 11, 16, 21 ], [ 3, 7, 10, 17, 20 ], [ 3, 8, 13, 14, 19 ], > [ 3, 9, 12, 15, 18 ], [ 4, 6, 12, 17, 19 ], [ 4, 7, 13, 16, 18 ], > [ 4, 8, 10, 15, 21 ], [ 4, 9, 11, 14, 20 ], [ 5, 6, 13, 15, 20 ], > [ 5, 7, 12, 14, 21 ], [ 5, 8, 11, 17, 18 ], [ 5, 9, 10, 16, 19 ] ];; gap> gp := GeneralisedPolygonByBlocks( blocks ); <projective plane order 4>
‣ GeneralisedPolygonByIncidenceMatrix ( incmat )  ( operation ) 
Returns: a generalised polygon
The argument incmat is a matrix representing the incidence matrix of a point line geometry. The points are represented by the columns, the rows represent the lines. From incmat a homogeneous list of sets of column entries is derived, which is then passed to GeneralisedPolygonByBlocks
. When incmat indeed represents a generalised polygon, it is returned. The checks are performed by GeneralisedPolygonByBlocks
.
gap> incmat := [ > [ 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], > [ 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], > [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], > [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0 ], > [ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1 ], > [ 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0 ], > [ 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0 ], > [ 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0 ], > [ 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1 ], > [ 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ], > [ 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0 ], > [ 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0 ], > [ 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0 ], > [ 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0 ], > [ 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0 ], > [ 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1 ], > [ 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 ], > [ 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0 ], > [ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1 ], > [ 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0 ], > [ 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0 ] ];; gap> pp := GeneralisedPolygonByIncidenceMatrix( incmat ); <projective plane order 4>
‣ GeneralisedPolygonByElements ( pts, lns, inc )  ( operation ) 
‣ GeneralisedPolygonByElements ( pts, lns, inc, grp, act )  ( operation ) 
Returns: a generalised polygon
The argument pts, lns and inc are respectively a set of objects, a set of objects and a function. The function inc must represent an incidence relation between objects of pts and lns. The first version of GeneralisedPolygonByElements
will construct an incidence graph, and if this graph has diameter d and girth 2d, a generalised polygon is returned. The thickness condition is not checked. If d ∈ {3,4,6,8}, a projective plane, a generalised quadrangle, a generalised hexagon, a generalised octagon respectively, is returned. The argument grp is a group, and act a function, representing an action of the elements of grp on the objects in the lists pts and lns, preserving the incidence. The second version of GeneralisedPolygonByElements
acts as the first version, but uses grp and act to construct the incidence graph in a more efficient way, so if grp is a non trivial group, the construction of the graph will be faster. This operation can typically be used to construct generalised polygons from objects that are available in FinInG. This difference in time is shown in the first two examples. The third examples shows the construction of the generalised quadrangle T_{2}(O).
gap> pg := PG(2,25); ProjectiveSpace(2, 25) gap> pts := Set(Points(pg));; gap> lns := Set(Lines(pg));; gap> inc := \*; <Operation "*"> gap> gp := GeneralisedPolygonByElements(pts,lns,inc); <projective plane order 25> gap> time; 26427 gap> grp := CollineationGroup(pg); The FinInG collineation group PGammaL(3,25) gap> act := OnProjSubspaces; function( var, el ) ... end gap> gp := GeneralisedPolygonByElements(pts,lns,inc,grp,act); <projective plane order 25> gap> time; 127 gap> q := 4; 4 gap> conic := Set(Points(ParabolicQuadric(2,q))); [ <a point in Q(2, 4)>, <a point in Q(2, 4)>, <a point in Q(2, 4)>, <a point in Q(2, 4)>, <a point in Q(2, 4)> ] gap> pg := PG(3,q); ProjectiveSpace(3, 4) gap> hyp := HyperplaneByDualCoordinates(pg,[1,0,0,0]*Z(q)^0); <a plane in ProjectiveSpace(3, 4)> gap> em := NaturalEmbeddingBySubspace(PG(2,q),pg,hyp); <geometry morphism from <All elements of ProjectiveSpace(2, 4)> to <All elements of ProjectiveSpace(3, 4)>> gap> O := List(conic,x>x^em);; gap> group := CollineationGroup(pg); The FinInG collineation group PGammaL(4,4) gap> stab := FiningSetwiseStabiliser(group,O); #I Computing adjusted stabilizer chain... <projective collineation group with 6 generators> gap> points1 := Set(Filtered(Points(pg),x>not x in hyp));; gap> tangents := List(conic,x>TangentSpace(x)^em); [ <a line in ProjectiveSpace(3, 4)>, <a line in ProjectiveSpace(3, 4)>, <a line in ProjectiveSpace(3, 4)>, <a line in ProjectiveSpace(3, 4)>, <a line in ProjectiveSpace(3, 4)> ] gap> planes := List(tangents,x>Filtered(Planes(x),y>not y in hyp));; gap> points2 := Union(planes);; gap> points3 := [hyp]; [ <a plane in ProjectiveSpace(3, 4)> ] gap> linesa := Union(List(O,x>Filtered(Lines(x),y>not y in hyp)));; gap> linesb := Set(O);; gap> pts := Union(points1,points2,points3);; gap> lns := Union(linesa,linesb);; gap> inc := \*; <Operation "*"> gap> gp := GeneralisedPolygonByElements(pts,lns,inc,stab,\^); <generalised quadrangle of order [ 4, 4 ]> gap> time; 50
All operations described in this section are applicable on objects in the category IsGeneralisedPolygon
.
‣ Order ( gp )  ( attribute ) 
Returns: a pair of positive integers
This method returns the parameters (s,t) of the generalised polygon gp. That is, s+1 is the number of points on any line of gp, and t+1 is the number of lines incident with any point of gp.
gap> gp := TwistedTrialityHexagon(2^3); T(8, 2) gap> Order(gp); [ 8, 2 ] gap> gp := HermitianPolarSpace(4,25); H(4, 5^2) gap> Order(gp); [ 25, 125 ] gap> gp := EGQByqClan(LinearqClan(3)); #I Computed Kantor family. Now computing EGQ... <EGQ of order [ 9, 3 ] and basepoint 0> gap> Order(gp); [ 9, 3 ]
‣ IncidenceGraphAttr ( gp )  ( attribute ) 
This attribute is declared for objects in IsGeneralisedPolygon
. It is a mutable attribute and can be accessed by the operation IncidenceGraph
.
‣ IncidenceGraph ( gp )  ( operation ) 
Returns: a graph
The argument gp is a generalised polygon. This operation returns the incidence graph of gp. If gp is constructed using GeneralisedPolygonByBlocks
, GeneralisedPolygonByElements
or GeneralisedPolygonByIncidenceMatrix
, an incidence graph is computed to check the input, and is stored as an attribute. For the particular generalised polygons available in FinInG, there is no precomputed incidence graph. Note that computing an incidence graph may require some time, especially when the gp has no collineation group computed. Therefore, this operation will return an error when gp has no collineation group computed. As CollineationGroup
is an attribute for objects in IsGeneralisedPolygon
, the user should compute the collineation group and then reissue the command to compute the incidence graph.
We should also point out that this method returns a mutable attribute of gp, so that acquired information about the incidence graph can be added. For example, the automorphism group of the incidence graph may be computed and stored as a record component after the incidence graph is stored as an attribute of gp. Normally, attributes of GAP objects are immutable.
Note that the factor 2 as difference in the order of the collineation group of Q(4,4) and the order of the automorphism group of its incidence graph is easily explained by the fact that the Q(4,4) is self dual.
gap> blocks := [ > [ 1, 2, 3, 4, 5 ], [ 1, 6, 7, 8, 9 ], [ 1, 10, 11, 12, 13 ], > [ 1, 14, 15, 16, 17 ], [ 1, 18, 19, 20, 21 ], [ 2, 6, 10, 14, 18 ], > [ 2, 7, 11, 15, 19 ], [ 2, 8, 12, 16, 20 ], [ 2, 9, 13, 17, 21 ], > [ 3, 6, 11, 16, 21 ], [ 3, 7, 10, 17, 20 ], [ 3, 8, 13, 14, 19 ], > [ 3, 9, 12, 15, 18 ], [ 4, 6, 12, 17, 19 ], [ 4, 7, 13, 16, 18 ], > [ 4, 8, 10, 15, 21 ], [ 4, 9, 11, 14, 20 ], [ 5, 6, 13, 15, 20 ], > [ 5, 7, 12, 14, 21 ], [ 5, 8, 11, 17, 18 ], [ 5, 9, 10, 16, 19 ] ];; gap> gp := GeneralisedPolygonByBlocks( blocks ); <projective plane order 4> gap> incgraph := IncidenceGraph( gp );; gap> Diameter( incgraph ); 3 gap> Girth( incgraph ); 6 gap> VertexDegrees( incgraph ); [ 5 ] gap> aut := AutGroupGraph( incgraph ); <permutation group with 9 generators> gap> DisplayCompositionSeries(aut); G (9 gens, size 241920)  Z(2) S (5 gens, size 120960)  Z(2) S (5 gens, size 60480)  Z(3) S (4 gens, size 20160)  A(2,4) = L(3,4) 1 (0 gens, size 1) gap> gp := ParabolicQuadric(4,4); Q(4, 4) gap> incgraph := IncidenceGraph( gp );; Error, No collineation group computed. Please compute collineation group before compu ting incidence graph,n called from <function "unknown">( <arguments> ) called from readeval loop at line 24 of *stdin* you can 'quit;' to quit to outer loop, or you can 'return;' to continue brk> quit; gap> CollineationGroup(gp); PGammaO(5,4) gap> Order(last); 1958400 gap> incgraph := IncidenceGraph( gp );; #I Computing incidence graph of generalised polygon... gap> aut := AutGroupGraph( incgraph ); <permutation group with 10 generators> gap> Order(aut); 3916800
‣ IncidenceMatrixOfGeneralisedPolygon ( gp )  ( attribute ) 
Returns: a matrix
This method returns the incidence matrix of the generalised polygon via the operation CollapsedAdjacencyMat
in the GRAPE package. The rows of the matrix correspond to the points of gp, and the columns correspond to the lines. Note that since this operation relies on IncidenceGraph
, for some generalised polygons, it is necessary to compute a collineation group first.
gap> gp := SymplecticSpace(3,2); W(3, 2) gap> CollineationGroup(gp); PGammaSp(4,2) gap> mat := IncidenceMatrixOfGeneralisedPolygon(gp); #I Computing incidence graph of generalised polygon... [ [ 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 ], [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 ], [ 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0 ], [ 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 ], [ 0, 0, 0, 0, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1 ], [ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1 ], [ 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1 ] ]
‣ CollineationGroup ( gp )  ( attribute ) 
Returns: a group
This attribute returns the full collineation group of the generalised polygon gp. For some particular generalised polygons, a (subgroup) of the full collineation group can be computed efficiently without computing the incidence graph of gp: the full collineation group of classical generalised quadrangles and classical generalised hexagons; and an elation group with relation to a basepoint of an elation generalised quadrangle. For generalised polygons constructed by the operations GeneralisedPolygonByBlocks
, GeneralisedPolygonByElements
or GeneralisedPolygonByIncidenceMatrix
, the full collineation group is computed using the full automorphism group of the underlying incidence graph, the latter being computed by the package GRAPE.
The collineation groups computed for classical generalised quadrangles and classical generalised hexagons are collineation groups in the sense of FinInG, and come equipped with a NiceMonomorphism. The collineation groups computed in all other cases are permutations groups, acting on the vertices of the underlying incidence graph.
Note that the computation of the automorphism group of the underlying graph can be time consuming, also if the complete collineation group of the generalised polygon has been used as an argument in e.g. GeneralisedPolygonByElements
.
The first example illustrates that CollineationGroup
is naturally applicable to all classical generalised Polygons.
gap> gp := PG(2,2); ProjectiveSpace(2, 2) gap> CollineationGroup(gp); The FinInG collineation group PGL(3,2) gap> gp := EllipticQuadric(5,4); Q(5, 4) gap> CollineationGroup(gp); PGammaO(6,4) gap> gp := TwistedTrialityHexagon(3^3); T(27, 3) gap> CollineationGroup(gp); #I Computing nice monomorphism... #I Found permutation domain... 3D_4(27) gap> time; 40691
The second example illustrates the computation of collineation groups of generalised polygons constructed using different objects.
gap> mat := [ [ 1, 1, 0, 0, 0, 1, 0 ], [ 1, 0, 0, 1, 1, 0, 0 ], > [ 1, 0, 1, 0, 0, 0, 1 ], [ 0, 1, 1, 1, 0, 0, 0 ], > [ 0, 1, 0, 0, 1, 0, 1 ], [ 0, 0, 0, 1, 0, 1, 1 ], > [ 0, 0, 1, 0, 1, 1, 0 ] ]; [ [ 1, 1, 0, 0, 0, 1, 0 ], [ 1, 0, 0, 1, 1, 0, 0 ], [ 1, 0, 1, 0, 0, 0, 1 ], [ 0, 1, 1, 1, 0, 0, 0 ], [ 0, 1, 0, 0, 1, 0, 1 ], [ 0, 0, 0, 1, 0, 1, 1 ], [ 0, 0, 1, 0, 1, 1, 0 ] ] gap> gp := GeneralisedPolygonByIncidenceMatrix(mat); <projective plane order 2> gap> group := CollineationGroup(gp); Group([ (3,4)(5,7)(9,10)(13,14), (3,7)(4,5)(11,12)(13,14), (2,3)(6,7)(8,9) (12,13), (2,6)(4,5)(11,13)(12,14), (1,2)(4,7)(9,11)(10,12) ]) gap> gp := EGQByqClan(FisherqClan(3)); #I Computed Kantor family. Now computing EGQ... <EGQ of order [ 9, 3 ] and basepoint 0> gap> group := CollineationGroup(gp); #I Computing incidence graph of generalised polygon... #I Using elation of the collineation group... <permutation group of size 26127360 with 8 generators> gap> Order(group); 26127360 gap> Random(group); (1,75,27,191,96,50,9,110,88,53,63,154,115,213,229,19,236,226,49,143,16,266,58, 245,11,270,57,44)(2,181,116,225,262,223,17)(3,33,187,149,108,120,177,164,167, 261,198,26,196,276,52,73,94,222,101,176,32,39,43,89,31,280,65,71)(4,250,173, 112,246,38,142,138,54,208,69,243,197,42,269,242,125,8,134,265,67,206,20,13,29, 182,205,36)(5,109,129,82,210,277,185,56,104,114,90,68,61,228,132,235,78,257, 10,238,145,184,241,170,153,263,45,179)(6,159,230,106,147,91,22,137,256,113, 117,180,7,133,279,100,55,156,168,86,122,131,12,35,273,264,254,152)(14,62,66, 268,51,233,253,218,172,130,144,25,169,83,234,127,171,221,34,190,21,46,272,224, 239,267,60,98)(15,40,278,128,160,215,87,178,203,166,247,119,209,84,255,271, 232,81,193,252,92,95,111,201,107,140,135,258)( [...] ) gap> q := 4; 4 gap> conic := ParabolicQuadric(2,q); Q(2, 4) gap> nucleus := NucleusOfParabolicQuadric(conic); <a point in ProjectiveSpace(2, 4)> gap> conic := ParabolicQuadric(2,q); Q(2, 4) gap> nucleus := NucleusOfParabolicQuadric(conic); <a point in ProjectiveSpace(2, 4)> gap> hyperoval := Union(List(Points(conic)),[nucleus]); [ <a point in ProjectiveSpace(2, 4)>, <a point in Q(2, 4)>, <a point in Q(2, 4)>, <a point in Q(2, 4)>, <a point in Q(2, 4)>, <a point in Q(2, 4)> ] gap> pg := PG(3,q); ProjectiveSpace(3, 4) gap> hyp := HyperplaneByDualCoordinates(pg,[1,0,0,0]*Z(q)^0); <a plane in ProjectiveSpace(3, 4)> gap> em := NaturalEmbeddingBySubspace(PG(2,q),pg,hyp); <geometry morphism from <All elements of ProjectiveSpace(2, 4)> to <All elements of ProjectiveSpace(3, 4)>> gap> O := List(hyperoval,x>x^em); [ <a point in ProjectiveSpace(3, 4)>, <a point in ProjectiveSpace(3, 4)>, <a point in ProjectiveSpace(3, 4)>, <a point in ProjectiveSpace(3, 4)>, <a point in ProjectiveSpace(3, 4)>, <a point in ProjectiveSpace(3, 4)> ] gap> points := Set(Filtered(Points(pg),x>not x in hyp));; gap> lines := Union(List(O,x>Filtered(Lines(x),y>not y in hyp)));; gap> inc := \*; <Operation "*"> gap> gp := GeneralisedPolygonByElements(points,lines,inc); <generalised quadrangle of order [ 3, 5 ]> gap> coll := CollineationGroup(gp); <permutation group of size 138240 with 8 generators> gap> Order(coll); 138240 gap> Random(coll); (1,29,60,40)(2,42,4,10,3,61,59,19,57,51,58,8)(5,21,17,25,52,13,64,48,44,36,9, 56)(6,34,41,55,50,45,63,27,20,14,11,24)(7,53,18,46,12,35,62,16,43,23,49, 26)(15,32,47,31,28,39,54,37,22,38,33,30)(65,74,83,111,66,117,149,104,70,151, 142,78)(67,135,139,136,68,109,98,125,69,95,120,137)(71,92,73,128,77,106,141, 105,145,150,88,155)(72,121,158,160,76,143,119,103,138,152,134,84)(75,153,133, 107,115,122,118,85,154,116,147,91)(79,110,101,159,126,90,157,81,112,100,89, 108)(80,99,97,86,156,129,144,94,127,114,148,82)(87,132,102,131,123,130,124,96, 93,113,146,140)
In the third example, the use of an precomputed automorphism group is illustrated. It speeds up the construction of the underlying graph and the computation of the automorphism group of the underlying graph. However, as is also illustrated in the example, despite that the precomputed automorphism group of the generalised polygon is actually the full collineation group, still some time is needed to compute the automorphism group of the underlying graph. The timings after both CollineationGroup
commands are wrong. This is because GRAPE relies on an external binary to computed the automorphism group of a graph. The generalised quadrangle in this example is known as T_{2}^{*}(O).
gap> q := 8; 8 gap> conic := ParabolicQuadric(2,q); Q(2, 8) gap> nucleus := NucleusOfParabolicQuadric(conic); <a point in ProjectiveSpace(2, 8)> gap> hyperoval := Union(List(Points(conic)),[nucleus]); [ <a point in ProjectiveSpace(2, 8)>, <a point in Q(2, 8)>, <a point in Q(2, 8)>, <a point in Q(2, 8)>, <a point in Q(2, 8)>, <a point in Q(2, 8)>, <a point in Q(2, 8)>, <a point in Q(2, 8)>, <a point in Q(2, 8)>, <a point in Q(2, 8)> ] gap> pg := PG(3,q); ProjectiveSpace(3, 8) gap> hyp := HyperplaneByDualCoordinates(pg,[1,0,0,0]*Z(q)^0); <a plane in ProjectiveSpace(3, 8)> gap> em := NaturalEmbeddingBySubspace(PG(2,q),pg,hyp); <geometry morphism from <All elements of ProjectiveSpace(2, 8)> to <All elements of ProjectiveSpace(3, 8)>> gap> O := List(hyperoval,x>x^em); [ <a point in ProjectiveSpace(3, 8)>, <a point in ProjectiveSpace(3, 8)>, <a point in ProjectiveSpace(3, 8)>, <a point in ProjectiveSpace(3, 8)>, <a point in ProjectiveSpace(3, 8)>, <a point in ProjectiveSpace(3, 8)>, <a point in ProjectiveSpace(3, 8)>, <a point in ProjectiveSpace(3, 8)>, <a point in ProjectiveSpace(3, 8)>, <a point in ProjectiveSpace(3, 8)> ] gap> points := Set(Filtered(Points(pg),x>not x in hyp));; gap> lines := Union(List(O,x>Filtered(Lines(x),y>not y in hyp)));; gap> inc := \*; <Operation "*"> gap> gp := GeneralisedPolygonByElements(points,lines,inc); <generalised quadrangle of order [ 7, 9 ]> gap> time; 17466 gap> coll := CollineationGroup(gp); <permutation group of size 5419008 with 9 generators> gap> time; 69 gap> group := CollineationGroup(pg); The FinInG collineation group PGammaL(4,8) gap> stab := FiningSetwiseStabiliser(group,O); #I Computing adjusted stabilizer chain... <projective collineation group with 11 generators> gap> time; 2045 gap> gp := GeneralisedPolygonByElements(points,lines,inc,stab,\^); <generalised quadrangle of order [ 7, 9 ]> gap> time; 394 gap> coll := CollineationGroup(gp); <permutation group of size 5419008 with 9 generators> gap> time; 62 gap> Order(coll); 5419008 gap> Order(stab); 5419008
‣ CollineationAction ( group )  ( attribute ) 
Returns: a function
group is a collineation group of a generalised polygon, computed using CollineationGroup
. The collineation group of classical generalised polygons will be a collineation group in the sense of FinInG. The natural action is OnProjectiveSubspaces
. The collineation group of any other generalised polygons will be a permutation group. The result of CollineationAction
for such a group is a function with input a pair (x,g) where x is an element of the generalised polygon, and g is a collineation of the generalised polygon, so an element of group. The example illustrates the use in the generalised quadrangle.
gap> q := 4; 4 gap> conic := ParabolicQuadric(2,q); Q(2, 4) gap> nucleus := NucleusOfParabolicQuadric(conic); <a point in ProjectiveSpace(2, 4)> gap> hyperoval := Union(List(Points(conic)),[nucleus]); [ <a point in ProjectiveSpace(2, 4)>, <a point in Q(2, 4)>, <a point in Q(2, 4)>, <a point in Q(2, 4)>, <a point in Q(2, 4)>, <a point in Q(2, 4)> ] gap> pg := PG(3,q); ProjectiveSpace(3, 4) gap> hyp := HyperplaneByDualCoordinates(pg,[1,0,0,0]*Z(q)^0); <a plane in ProjectiveSpace(3, 4)> gap> em := NaturalEmbeddingBySubspace(PG(2,q),pg,hyp); <geometry morphism from <All elements of ProjectiveSpace(2, 4)> to <All elements of ProjectiveSpace(3, 4)>> gap> O := List(hyperoval,x>x^em); [ <a point in ProjectiveSpace(3, 4)>, <a point in ProjectiveSpace(3, 4)>, <a point in ProjectiveSpace(3, 4)>, <a point in ProjectiveSpace(3, 4)>, <a point in ProjectiveSpace(3, 4)>, <a point in ProjectiveSpace(3, 4)> ] gap> points := Set(Filtered(Points(pg),x>not x in hyp));; gap> lines := Union(List(O,x>Filtered(Lines(x),y>not y in hyp)));; gap> inc := \*; <Operation "*"> gap> gp := GeneralisedPolygonByElements(points,lines,inc); <generalised quadrangle of order [ 3, 5 ]> gap> coll := CollineationGroup(gp); <permutation group of size 138240 with 8 generators> gap> act := CollineationAction(coll); function( el, g ) ... end gap> g := Random(coll); (1,37,45,63,27,19)(2,53,13,64,11,51)(3,33,38,61,31,28)(4,49,6,62,15,60)(5,46, 47,59,20,17)(7,42,40,57,24,26)(8,58)(9,55)(10,39,41,56,25,23)(12,35,34,54,29, 32)(14,48,43,52,18,21)(16,44,36,50,22,30)(65,132,90,157,89,105)(66,68,131,143, 119,103)(67,135,76,123,130,106)(69,133,112,100,81,107)(70,134,150,88,155, 104)(71,99,79,144,93,149)(72,153,95,120,73,122)(74,125,115,128,140,87)(75,121, 136,117,113,91)(77,124,98,83,147,146)(78,145,84,118,85,142)(80,92,137,141,108, 97)(82,86,116,111,138,101)(94,127,126,102,109,96)(110,152,151,154,156, 129)(114,160,139,158,148,159) gap> l := Random(Lines(gp)); <a line in <generalised quadrangle of order [ 3, 5 ]>> gap> act(l,g); <a line in <generalised quadrangle of order [ 3, 5 ]>> gap> p := Random(Points(gp)); <a point in <generalised quadrangle of order [ 3, 5 ]>> gap> act(p,g); <a point in <generalised quadrangle of order [ 3, 5 ]>> gap> stab := Stabilizer(coll,p,act); <permutation group of size 2160 with 3 generators> gap> List(Orbits(stab,List(Points(gp)),act),x>Length(x)); [ 45, 18, 1 ] gap> List(Orbits(stab,List(Lines(gp)),act),x>Length(x)); [ 90, 6 ]
‣ BlockDesignOfGeneralisedPolygon ( gp )  ( attribute ) 
Returns: a block design
This method allows one to use the GAP package DESIGN to analyse a generalised polygon, so the user must first load this package. The argument gp is a generalised polygon, and if it has a collineation group, the block design is computed with this extra information and thus the resulting design is easier to work with. Likewise, if gp is an elation generalised quadrangle and it has an elation group, then we use the elation group's action to efficiently compute the block design. We should also point out that this method returns a mutable attribute of gp, so that accquired information about the block design can be added. For example, the automorphism group of the block design may be computed after the design is stored as an attribute of gp. Normally, attributes of GAP objects are immutable.
gap> LoadPackage("design"); #W BIND_GLOBAL: variable `BlockDesign' already has a value  Loading DESIGN 1.6 (The Design Package for GAP) by Leonard H. Soicher (http://www.maths.qmul.ac.uk/~leonard/). Homepage: http://www.designtheory.org/software/gap_design/  true gap> gh := SplitCayleyHexagon(2); H(2) gap> CollineationGroup(gh); #I for Split Cayley Hexagon #I Computing nice monomorphism... #I Found permutation domain... G_2(2) gap> des := BlockDesignOfGeneralisedPolygon(gh); rec( autSubgroup := <permutation group with 3 generators>, blocks := [ [ 1, 29, 52 ], [ 1, 34, 36 ], [ 1, 37, 48 ], [ 2, 13, 60 ], [ 2, 44, 53 ], [ 2, 45, 52 ], [ 3, 17, 35 ], [ 3, 22, 51 ], [ 3, 23, 48 ], [ 4, 16, 57 ], [ 4, 19, 36 ], [ 4, 54, 56 ], [ 5, 22, 63 ], [ 5, 31, 57 ], [ 5, 49, 52 ], [ 6, 7, 60 ], [ 6, 28, 57 ], [ 6, 35, 43 ], [ 7, 26, 27 ], [ 7, 33, 34 ], [ 8, 9, 53 ], [ 8, 22, 33 ], [ 8, 38, 56 ], [ 9, 25, 61 ], [ 9, 28, 37 ], [ 10, 18, 53 ], [ 10, 32, 35 ], [ 10, 36, 62 ], [ 11, 12, 63 ], [ 11, 26, 54 ], [ 11, 37, 42 ], [ 12, 41, 43 ], [ 12, 44, 50 ], [ 13, 15, 42 ], [ 13, 19, 51 ], [ 14, 15, 31 ], [ 14, 17, 61 ], [ 14, 34, 50 ], [ 15, 20, 38 ], [ 16, 23, 44 ], [ 16, 40, 59 ], [ 17, 45, 54 ], [ 18, 24, 26 ], [ 18, 30, 31 ], [ 19, 25, 41 ], [ 20, 21, 62 ], [ 20, 23, 27 ], [ 21, 28, 55 ], [ 21, 39, 45 ], [ 24, 29, 59 ], [ 24, 51, 55 ], [ 25, 27, 49 ], [ 29, 38, 43 ], [ 30, 39, 41 ], [ 30, 46, 48 ], [ 32, 40, 42 ], [ 32, 47, 49 ], [ 33, 39, 40 ], [ 46, 47, 56 ], [ 46, 58, 60 ], [ 47, 50, 55 ], [ 58, 59, 61 ], [ 58, 62, 63 ] ], isBlockDesign := true, v := 63 ) gap> f := GF(3); GF(3) gap> id := IdentityMat(2, f);; gap> clan := List( f, t > t*id );; gap> clan := qClan(clan,f); <qclan over GF(3)> gap> egq := EGQByqClan( clan ); #I Computed Kantor family. Now computing EGQ... <EGQ of order [ 9, 3 ] and basepoint 0> gap> HasElationGroup( egq ); true gap> design := BlockDesignOfGeneralisedPolygon( egq );; #I Computing orbits on lines of gen. polygon... #I Computing block design of generalised polygon... gap> aut := AutGroupBlockDesign( design ); <permutation group with 6 generators> gap> NrBlockDesignPoints( design ); 280 gap> NrBlockDesignBlocks( design ); 112 gap> DisplayCompositionSeries(aut); G (6 gens, size 26127360)  Z(2) S (5 gens, size 13063680)  Z(2) S (5 gens, size 6531840)  Z(2) S (4 gens, size 3265920)  2A(3,3) = U(4,3) ~ 2D(3,3) = O(6,3) 1 (0 gens, size 1)
‣ ElementsOfIncidencStructure ( gp, i )  ( attribute ) 
‣ Points ( gp )  ( attribute ) 
‣ Lines ( gp )  ( attribute ) 
Returns: a collection of elements of a generalised polygon
gp is any generalised polygon, i is a natural number, necessarily 1 or 2. ElementsOfIncidenceStructure
returns the elements of type i of gp, Points
and Lines
are the usual shortcuts.
‣ Size ( els )  ( operation ) 
Returns: a number
els is a collection of elements of a generalised polygon. This operation returns the number of element in els.
‣ ObjectToElement ( gp, obj )  ( operation ) 
‣ ObjectToElement ( gp, type, obj )  ( operation ) 
‣ UnderlyingObject ( el )  ( operation ) 
Returns: a collection of elements of a generalised polygon
To create elements in gp (of type type), one of the versions of ObjectToElement
can be used. It is checked whether obj represents an element (of type type). To retrieve an underlying object of an element el, UnderlyingObject
can be used.
gap> mat := [ [ 1, 1, 0, 0, 0, 1, 0 ], [ 1, 0, 0, 1, 1, 0, 0 ], > [ 1, 0, 1, 0, 0, 0, 1 ], [ 0, 1, 1, 1, 0, 0, 0 ], > [ 0, 1, 0, 0, 1, 0, 1 ], [ 0, 0, 0, 1, 0, 1, 1 ], > [ 0, 0, 1, 0, 1, 1, 0 ] ]; [ [ 1, 1, 0, 0, 0, 1, 0 ], [ 1, 0, 0, 1, 1, 0, 0 ], [ 1, 0, 1, 0, 0, 0, 1 ], [ 0, 1, 1, 1, 0, 0, 0 ], [ 0, 1, 0, 0, 1, 0, 1 ], [ 0, 0, 0, 1, 0, 1, 1 ], [ 0, 0, 1, 0, 1, 1, 0 ] ] gap> gp := GeneralisedPolygonByIncidenceMatrix(mat); <projective plane order 2> gap> p := Random(Points(gp)); <a point in <projective plane order 2>> gap> UnderlyingObject(p); 7 gap> l := Random(Lines(gp)); <a line in <projective plane order 2>> gap> UnderlyingObject(l); [ 4, 6, 7 ] gap> ObjectToElement(gp,1,4); <a point in <projective plane order 2>> gap> ObjectToElement(gp,2,5); Error, <obj> does not represent a line of <gp> called from <function "unknown">( <arguments> ) called from readeval loop at line 18 of *stdin* you can 'quit;' to quit to outer loop, or you can 'return;' to continue brk> quit; gap> ObjectToElement(gp,2,[1,2,3]); Error, <obj> does not represent a line of <gp> called from <function "unknown">( <arguments> ) called from readeval loop at line 18 of *stdin* you can 'quit;' to quit to outer loop, or you can 'return;' to continue brk> quit; gap> ObjectToElement(gp,[1,2,6]); <a line in <projective plane order 2>>
‣ IsIncident ( v, w )  ( operation ) 
‣ \* ( v, w )  ( operation ) 
Returns: true or false
Let v and w be two elements of a generalised polygon. It is checked if the ambient geometry of the two elements are identical, and true is returned if and only if the two elements are incident in their ambient geometry.
‣ Span ( v, w )  ( operation ) 
Returns: a line of a generalised polygon or fail
Let v and w be two elements of a generalised polygon. It is checked if the ambient geometries of the two elements are identical, and if the two elements are points. If v and w are incidence with a common line, this line is returned. Otherwise fail
is returned. For generalised polygons constructed with GeneralisedPolygonByBlocks
, GeneralisedPolygonByElements
an GeneralisedPolygonByInidenceMatrix
, the underlying graph is used. Note that the behaviour of Span
is different for elements of generalised polygons that belong to IsLieGeometry
, see 4.216.
gap> mat := [ [ 1, 1, 0, 0, 0, 1, 0 ], [ 1, 0, 0, 1, 1, 0, 0 ], > [ 1, 0, 1, 0, 0, 0, 1 ], [ 0, 1, 1, 1, 0, 0, 0 ], > [ 0, 1, 0, 0, 1, 0, 1 ], [ 0, 0, 0, 1, 0, 1, 1 ], > [ 0, 0, 1, 0, 1, 1, 0 ] ]; [ [ 1, 1, 0, 0, 0, 1, 0 ], [ 1, 0, 0, 1, 1, 0, 0 ], [ 1, 0, 1, 0, 0, 0, 1 ], [ 0, 1, 1, 1, 0, 0, 0 ], [ 0, 1, 0, 0, 1, 0, 1 ], [ 0, 0, 0, 1, 0, 1, 1 ], [ 0, 0, 1, 0, 1, 1, 0 ] ] gap> gp := GeneralisedPolygonByIncidenceMatrix(mat); <projective plane order 2> gap> p := Random(Points(gp)); <a point in <projective plane order 2>> gap> q := Random(Points(gp)); <a point in <projective plane order 2>> gap> Span(p,q); <a line in <projective plane order 2>> gap> ps := ParabolicQuadric(4,3); Q(4, 3) gap> gp := GeneralisedPolygonByElements(Set(Points(ps)),Set(Lines(ps)),\*); <generalised quadrangle of order [ 3, 3 ]> gap> p := Random(Points(gp)); <a point in <generalised quadrangle of order [ 3, 3 ]>> gap> q := Random(Points(gp)); <a point in <generalised quadrangle of order [ 3, 3 ]>> gap> Span(p,q); #I <x> and <y> do not span a line of gp fail
‣ Meet ( v, w )  ( operation ) 
Returns: a point of a generalised polygon or fail
Let v and w be two elements of a generalised polygon. It is checked if the ambient geometries of the two elements are identical, and if the two elements are lines. If v and w are incidence with a common point, this point is returned. Otherwise fail
is returned. For generalised polygons constructed with GeneralisedPolygonByBlocks
, GeneralisedPolygonByElements
an GeneralisedPolygonByInidenceMatrix
, the underlying graph is used. Note that the behavior of Meet
is different for elements of generalised polygongs that belong to IsLieGeometry
, see 4.217
gap> mat := [ [ 1, 1, 0, 0, 0, 1, 0 ], [ 1, 0, 0, 1, 1, 0, 0 ], > [ 1, 0, 1, 0, 0, 0, 1 ], [ 0, 1, 1, 1, 0, 0, 0 ], > [ 0, 1, 0, 0, 1, 0, 1 ], [ 0, 0, 0, 1, 0, 1, 1 ], > [ 0, 0, 1, 0, 1, 1, 0 ] ]; [ [ 1, 1, 0, 0, 0, 1, 0 ], [ 1, 0, 0, 1, 1, 0, 0 ], [ 1, 0, 1, 0, 0, 0, 1 ], [ 0, 1, 1, 1, 0, 0, 0 ], [ 0, 1, 0, 0, 1, 0, 1 ], [ 0, 0, 0, 1, 0, 1, 1 ], [ 0, 0, 1, 0, 1, 1, 0 ] ] gap> gp := GeneralisedPolygonByIncidenceMatrix(mat); <projective plane order 2> gap> l := Random(Lines(gp)); <a line in <projective plane order 2>> gap> m := Random(Lines(gp)); <a line in <projective plane order 2>> gap> Meet(l,m); <a point in <projective plane order 2>> gap> ps := ParabolicQuadric(4,3); Q(4, 3) gap> gp := GeneralisedPolygonByElements(Set(Points(ps)),Set(Lines(ps)),\*); <generalised quadrangle of order [ 3, 3 ]> gap> l := Random(Lines(gp)); <a line in <generalised quadrangle of order [ 3, 3 ]>> gap> m := Random(Lines(gp)); <a line in <generalised quadrangle of order [ 3, 3 ]>> gap> Meet(l,m); #I <x> and <y> do meet in a common point of gp fail
‣ ShadowOfElement ( geo, v, j )  ( operation ) 
‣ Points ( el )  ( operation ) 
‣ Lines ( el )  ( operation ) 
‣ ElementsIncidentWithElementOfIncidenceStructure ( el, i )  ( operation ) 
Returns: A collection of elements
geo is a generalised polygon, v must be an element of geo, j is an integer equal to 1 or 2, since geo is a rank two geometry. The operation ShadowOfElement
returns the collection of elements of geo of type j, incident with the element v. The operations Points
and Lines
with argument are the usual shortcuts to ShadowOfElement
with j respectively equal to 1, 2. The operation ElementsIncidentWithElementOfIncidenceStructure
is the usual shortcut to ShadowOfElement
.
gap> blocks := [ > [ 1, 2, 3, 4, 5 ], [ 1, 6, 7, 8, 9 ], [ 1, 10, 11, 12, 13 ], > [ 1, 14, 15, 16, 17 ], [ 1, 18, 19, 20, 21 ], [ 2, 6, 10, 14, 18 ], > [ 2, 7, 11, 15, 19 ], [ 2, 8, 12, 16, 20 ], [ 2, 9, 13, 17, 21 ], > [ 3, 6, 11, 16, 21 ], [ 3, 7, 10, 17, 20 ], [ 3, 8, 13, 14, 19 ], > [ 3, 9, 12, 15, 18 ], [ 4, 6, 12, 17, 19 ], [ 4, 7, 13, 16, 18 ], > [ 4, 8, 10, 15, 21 ], [ 4, 9, 11, 14, 20 ], [ 5, 6, 13, 15, 20 ], > [ 5, 7, 12, 14, 21 ], [ 5, 8, 11, 17, 18 ], [ 5, 9, 10, 16, 19 ] ];; gap> gp := GeneralisedPolygonByBlocks( blocks ); <projective plane order 4> gap> l := Random(Lines(gp)); <a line in <projective plane order 4>> gap> pts := ShadowOfElement(gp,l,1); <shadow points in <projective plane order 4>> gap> List(pts); [ <a point in <projective plane order 4>>, <a point in <projective plane order 4>>, <a point in <projective plane order 4>>, <a point in <projective plane order 4>>, <a point in <projective plane order 4>> ] gap> p := Random(Points(gp)); <a point in <projective plane order 4>> gap> lines := Lines(p); <shadow lines in <projective plane order 4>> gap> List(lines); [ <a line in <projective plane order 4>>, <a line in <projective plane order 4>>, <a line in <projective plane order 4>>, <a line in <projective plane order 4>>, <a line in <projective plane order 4>> ]
‣ DistanceBetweenElements ( v, w )  ( operation ) 
Returns: a number
Let v and w be two elements of a generalised polygon. It is checked if the ambient geometry of the two elements are identical, and the distance between the two elements in the incidence graph of their ambient geometry is returned.
gap> g := ElementaryAbelianGroup(27); <pc group of size 27 with 3 generators> gap> flist1 := [ Group(g.1), Group(g.2), Group(g.3), Group(g.1*g.2*g.3) ];; gap> flist2 := [ Group([g.1, g.2^2*g.3]), Group([g.2, g.1^2*g.3 ]), > Group([g.3, g.1^2*g.2]), Group([g.1^2*g.2, g.1^2*g.3 ]) ];; gap> egq := EGQByKantorFamily(g, flist1, flist2); <EGQ of order [ 3, 3 ] and basepoint 0> gap> p := Random(Points(egq)); <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> gap> q := Random(Points(egq)); <a point of class 3 of <EGQ of order [ 3, 3 ] and basepoint 0>> gap> DistanceBetweenElements(p,q); 2 gap> gh := SplitCayleyHexagon(3); H(3) gap> l := Random(Lines(gh)); #I for Split Cayley Hexagon #I Computing nice monomorphism... #I Found permutation domain... <a line in H(3)> gap> m := First(Lines(gh),x>DistanceBetweenElements(l,x)=6); <a line in H(3)>
Consider the hyperbolic quadric Q^{+}(7,q). This is a polar space of rank 4. It is well known that its generators fall into two systems. Each system contains exactly (q^{3}+q^{2}+q+1)(q^{2}+q+1) generators, which is equal to the number of points of Q^{+}(7,q). Generators from the same system meet each other in an empty subspace or in a line, Generators from a different system meet each other in a point or a plane. One defines the rank 4 geometry Ω(7,q) as follows. The 0points are the points of Q^{+}(7,q), the 1points are the generators of the first system, the 2points are the generators of the second system, and the lines are the lines of Q^{+}(7,q). The incidence is the natural incidence of the underlying projective space. Denote the set of ipoints as P^{(i)}, i=0,1,2.
A triality of Ω(7,q) is a map τ:P^{(i)}→P^{(i+1)} (where i+1 is computed modulo 3) preserving the incidence and for which τ^{3}=1. Note that the image of a line under τ is determined by the image of the points incident with the line.
An ipoint is absolute with respect to a fixed triality if it is incident with its image under the triality. Consequently, a line is absolute with if it is fixed by the triality.
A generalised hexagon can be constructed as geometry of absolute points of one kind and absolute lines with relation to a fixed triality. Note that not all trialities yield (thick) generalised quadrangles. There are different types of trialities, for some of them the absolute geometry is degenerate.
The triality used in FinInG to construct the classical generalised hexagons is fixed. It is described explicitely in [VM98]. To describe the triality, a trilinear form expressing the incidence between ipoints of Ω(7,q) is used. Given the fact that, because of the existence of a triality, the role of the 0, 1 and 2 points are the same, each of the 1 and 2 points can be labelled the same way as the 0points, which are effectively labelled by 8tuples (x_0,...,x_7) ∈ V(8,q)=V where each 8tuples represents a projective point of Q^{+}(7,q).
Consider the hyperbolic quadric determined by the quadratic form X_{0}X_{4}+X_{1}X_{5}+X_{2}X_{6}+X_{3}X_{7}. Consider the trilinear map T,
d 
T(x,y,z) := 
d 

d 
+ 
d 

d 
+ x_{3}(z_{0}y_{4}+z_{1}y_{5}+z_{2}y_{6}) + x_{7}(y_{0}z_{4}+y_{1}z_{5}+y_{2}z_{6}) + 
d 
+ y_{3}(x_{0}z_{4}+x_{1}z_{5}+x_{2}z_{6}) + y_{7}(z_{0}x_{4}+z_{1}x_{5}+z_{2}x_{6}) + z_{3}(y_{0}x_{4}+y_{1}x_{5}+y_{2}x_{6}) + z_{7}(x_{0}y_{4}+x_{1}y_{5}+x_{2}y_{6})  x_{3}y_{3}z_{3}  x_{7}y_{7}z_{7}
Now a pair (x,y) ∈ V × V represents an incident 01 pair of points if and only if T(x,y,z) vanishes in the variable z, and similarly for any cyclic permutation of the letters x,y,z. So given a 1point y, T(x,y,z) = 0, where z is a variable, and x is an unknown, gives a set of equations representing a generator of Q^{+}(7,q) this is the generator of Q^{+}(7,q) represented by y as label of a 1point.
Let σ be an automorphism of GF(q) of order 3, or the identity. Consider the map
τ_{σ}: P^{(i)}→P^{(i+1)}
(x_{j}) → (x_{j}^{σ}), j=0...7.
This map clearly preserves T(x,y,z), so preserves the incidence, and has order three, so it is a triality of Ω(7,q). We call an element p absolute with respect to a triality τ if and only if p I p^{τ}. Consequently, a line is absolute if and only if it is fixed by the triality. Denote the set of ipoints that are absolute with respect to the triality as P^{(i)}_{abs}, and the set of absolute lines with respect to the triality as L_{abs}. Then a famous theorem of Tits ([Tit59]) says that for the triality τ_{σ} , the pointline geometry Γ^{(i)} = (P^{(i)}_{abs}, L_{abs}, I) is a generalised hexagon of order (K,L), K the field GF(q) and L the subfield of invariant elements of K under the field automorphism σ. Note that a finite field has a field automorphism of order three if and only if its order equals q^{3}. So, for K equal to GF(q) and σ=1, Γ^{(i)} is a generalised hexagon of order q, which is called the split Cayley hexagon of order q, denoted H(q). For K equal to GF(q^{3}), and σ a nontrival field automorphism of order 3, Γ^{(i)} is a generalised hexagon of order (q^{3},q), which is called the twisted triality hexagon of order (q^{3},q), denoted T(q^{3},q). Note that for a given triality, the hexagons Γ^{(i)} , i=0,1,2 are isomorphic. Consequently, Γ^{(0)} is a pointline geometry of which the point set, line set respectively, is a subset of the points, lines respectively of Q^{+}(7,q). Finally, we mention the following important theorem, which was shown by Tits ([Tit59]): the split Cayley hexagon, obtained by the triliaty with σ=1, is contained in the hyperplane with equation X_{3} + X_{7}, which intersects the hyperbolic quadric in the parabolic quadric Q(6,q). The points of the split Cayley hexagon are the points of Q(6,q).
This above description of the triality and the associated generalised hexagons, contains sufficient analytical information to implement the split Cayley hexagon and the twisted triality hexagon in an efficient way. The user is allowed to choose a representation for the ambient polar space. For q=2^{h} the polar spaces Q(6,q) and W(5,q) are isomorphic. Consequently, the user may choose W(5,q) as ambient polar space for the split Cayley hexagon of even order. This embedding in W(5,q) is called the perfect symplectic embedding of the split Cayley hexagon. Finally, [VM98] contains an explicit description of the generators of the collineation groups of both generalised hexagons.
‣ IsLieGeometry  ( category ) 
Recall that the classical generalised hexagons are constructed as an object in IsLieGeometry
. This makes most operations described in the appropriate chapters on Lie geometries, projective spaces and polar spaces applicable.
‣ SplitCayleyHexagon ( q )  ( operation ) 
‣ SplitCayleyHexagon ( f )  ( operation ) 
‣ SplitCayleyHexagon ( ps )  ( operation ) 
Returns: a generalised hexagon
gap> hexagon := SplitCayleyHexagon( 3 ); H(3) gap> AmbientPolarSpace(hexagon); Q(6, 3): x_1*x_5x_2*x_6x_3*x_7+x_4^2=0 gap> ps := ParabolicQuadric(6,3); Q(6, 3) gap> hexagon := SplitCayleyHexagon( ps ); H(3) in Q(6, 3) gap> AmbientPolarSpace(hexagon); Q(6, 3) gap> hexagon := SplitCayleyHexagon( 4 ); H(4) gap> AmbientPolarSpace(hexagon); W(5, 4): x1*y4+x2*y5+x3*y6+x4*y1+x5*y2+x6*y3=0 gap> ps := ParabolicQuadric(6,4); Q(6, 4) gap> hexagon := SplitCayleyHexagon( ps ); H(4) in Q(6, 4) gap> AmbientPolarSpace(hexagon); Q(6, 4)
‣ TwistedTrialityHexagon ( q )  ( operation ) 
‣ TwistedTrialityHexagon ( f )  ( operation ) 
‣ TwistedTrialityHexagon ( ps )  ( operation ) 
Returns: a generalised hexagon
gap> hexagon := TwistedTrialityHexagon(2^3); T(8, 2) gap> AmbientPolarSpace(hexagon); <polar space in ProjectiveSpace( 7,GF(2^3)): x_1*x_5+x_2*x_6+x_3*x_7+x_4*x_8=0 > gap> ps := HyperbolicQuadric(7,2^3); Q+(7, 8) gap> hexagon := TwistedTrialityHexagon(ps); T(8, 2) in Q+(7, 8) gap> AmbientPolarSpace(hexagon); Q+(7, 8)
‣ VectorSpaceToElement ( gh, vec )  ( operation ) 
Returns: an element of a classical generlised hexagon
The argument vec is one vector or a list of vectors from the underlying vectorspace of gh. This operation checks whether vec represents a point or a line of gh. Note that vectors and matrices in different representations are allowed as argument.
gap> ps := ParabolicQuadric(6,9); Q(6, 9) gap> gh := SplitCayleyHexagon(ps); H(9) in Q(6, 9) gap> vec := [ Z(3)^0, Z(3^2), 0*Z(3), Z(3^2), Z(3^2)^3, Z(3^2)^5, 0*Z(3) ]; [ Z(3)^0, Z(3^2), 0*Z(3), Z(3^2), Z(3^2)^3, Z(3^2)^5, 0*Z(3) ] gap> p := VectorSpaceToElement(gh,vec); <a point in H(9) in Q(6, 9)> gap> vec := [ [ Z(3)^0, 0*Z(3), Z(3^2)^7, 0*Z(3), Z(3)^0, Z(3^2)^2, Z(3^2)^2 ], > [ 0*Z(3), Z(3)^0, 0*Z(3), Z(3)^0, 0*Z(3), Z(3^2)^3, 0*Z(3) ] ]; [ [ Z(3)^0, 0*Z(3), Z(3^2)^7, 0*Z(3), Z(3)^0, Z(3^2)^2, Z(3^2)^2 ], [ 0*Z(3), Z(3)^0, 0*Z(3), Z(3)^0, 0*Z(3), Z(3^2)^3, 0*Z(3) ] ] gap> line := VectorSpaceToElement(gh,vec); Error, <x> does not generate an element of <geom> called from <function "unknown">( <arguments> ) called from readeval loop at line 14 of *stdin* you can 'quit;' to quit to outer loop, or you can 'return;' to continue brk> quit;
‣ ObjectToElement ( gh, obj )  ( operation ) 
Returns: an element of a classical generlised hexagon
The argument obj is one vector or a list of vectors from the underlying vectorspace of gh. This operation checks whether obj represents a point or a line of gh. Note that vectors and matrices in different representations are allowed as argument.
gap> mat := IdentityMat(8,GF(5^3)); < mutable compressed matrix 8x8 over GF(125) > gap> form := BilinearFormByMatrix(mat,GF(5^3)); < bilinear form > gap> ps := PolarSpace(form); <polar space in ProjectiveSpace( 7,GF(5^3)): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2+x_7^2+x_8^2=0 > gap> gh := TwistedTrialityHexagon(ps); T(125, 5) in Q+(7, 125): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2+x_7^2+x_8^2 gap> vec := [ Z(5)^0, Z(5^3)^55, Z(5^3)^99, Z(5^3)^107, Z(5^3)^8, Z(5^3)^35, Z(5^3)^73, > Z(5^3)^115 ]; [ Z(5)^0, Z(5^3)^55, Z(5^3)^99, Z(5^3)^107, Z(5^3)^8, Z(5^3)^35, Z(5^3)^73, Z(5^3)^115 ] gap> p := ObjectToElement(gh,vec); <a point in T(125, 5) in Q+(7, 125): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2+x_7^2 +x_8^2> gap> vec := [ [ Z(5)^0, 0*Z(5), Z(5^3)^76, Z(5^3)^117, Z(5^3)^80, Z(5^3)^19, Z(5^3)^48, > Z(5^3)^100 ], > [ 0*Z(5), Z(5)^0, Z(5^3)^115, Z(5^3)^14, Z(5^3)^40, Z(5^3)^67, Z(5^3)^123, > Z(5^3)^3 ] ]; [ [ Z(5)^0, 0*Z(5), Z(5^3)^76, Z(5^3)^117, Z(5^3)^80, Z(5^3)^19, Z(5^3)^48, Z(5^3)^100 ], [ 0*Z(5), Z(5)^0, Z(5^3)^115, Z(5^3)^14, Z(5^3)^40, Z(5^3)^67, Z(5^3)^123, Z(5^3)^3 ] ] gap> line := ObjectToElement(gh,vec); <a line in T(125, 5) in Q+(7, 125): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2+x_7^2+ x_8^2>
‣ UnderlyingObject ( gh, obj )  ( operation ) 
Returns: a vector or a matrix
12.58 \in
‣ \in ( x, gh )  ( operation ) 
Returns: true or false
gap> ps := HyperbolicQuadric(7,5^3); Q+(7, 125) gap> gh := TwistedTrialityHexagon(ps); T(125, 5) in Q+(7, 125) gap> repeat > p := Random(Points(ps)); > until p in gh; gap> time; 18399 gap> p in gh; true gap> q := ElementToElement(gh,p); <a point in T(125, 5) in Q+(7, 125)> gap> l := Random(Lines(p)); <a line in Q+(7, 125)> gap> l in gh; false gap> List(Lines(q),x>x in gh); [ true, true, true, true, true, true ]
‣ Span ( x, y )  ( operation ) 
‣ Meet ( x, y )  ( operation ) 
Returns: a subspace of a projective space
x and y are two elements of a classical generalised hexagon. The operation Span
returns the projective line spanned by x and y. The operation Meet
returns the intersection of the elements x and y. Note that the classical generalised hexagons are Lie geometries, so their elements belong to a subcategory of IsSubspaceOfProjectiveSpace
. Therefore, the operations Span
and Meet
behave as described in 7.52 and 7.53.
gap> ps := SymplecticSpace(5,8); W(5, 8) gap> gh := SplitCayleyHexagon(ps); H(8) in W(5, 8) gap> vec := [ Z(2)^0, Z(2^3)^6, Z(2^3)^5, Z(2^3)^6, Z(2)^0, Z(2^3) ]; [ Z(2)^0, Z(2^3)^6, Z(2^3)^5, Z(2^3)^6, Z(2)^0, Z(2^3) ] gap> p := VectorSpaceToElement(gh,vec); <a point in H(8) in W(5, 8)> gap> vec := [ Z(2)^0, Z(2^3)^2, Z(2^3), Z(2^3)^3, Z(2^3)^5, Z(2^3)^5 ]; [ Z(2)^0, Z(2^3)^2, Z(2^3), Z(2^3)^3, Z(2^3)^5, Z(2^3)^5 ] gap> q := VectorSpaceToElement(gh,vec); <a point in H(8) in W(5, 8)> gap> span := Span(p,q); <a line in ProjectiveSpace(5, 8)> gap> ElementToElement(gh,span); <a line in H(8) in W(5, 8)> gap> vec := [ [ Z(2)^0, 0*Z(2), Z(2^3)^6, Z(2)^0, 0*Z(2), Z(2^3) ], > [ 0*Z(2), Z(2)^0, Z(2^3)^6, Z(2^3)^4, Z(2^3)^4, 0*Z(2) ] ]; [ [ Z(2)^0, 0*Z(2), Z(2^3)^6, Z(2)^0, 0*Z(2), Z(2^3) ], [ 0*Z(2), Z(2)^0, Z(2^3)^6, Z(2^3)^4, Z(2^3)^4, 0*Z(2) ] ] gap> l := VectorSpaceToElement(gh,vec); <a line in H(8) in W(5, 8)> gap> vec := [ [ Z(2)^0, 0*Z(2), Z(2)^0, Z(2^3), 0*Z(2), Z(2^3) ], > [ 0*Z(2), Z(2)^0, Z(2)^0, Z(2^3)^2, Z(2^3)^4, Z(2^3)^4 ] ]; [ [ Z(2)^0, 0*Z(2), Z(2)^0, Z(2^3), 0*Z(2), Z(2^3) ], [ 0*Z(2), Z(2)^0, Z(2)^0, Z(2^3)^2, Z(2^3)^4, Z(2^3)^4 ] ] gap> m := VectorSpaceToElement(gh,vec); <a line in H(8) in W(5, 8)> gap> Meet(l,m); < empty subspace > gap> DistanceBetweenElements(l,m); 6
‣ CollineationGroup ( gh )  ( attribute ) 
Returns: a group of collineations
gh is a classical generalised hexagon. This attribute returns the full collineation group, equipped with a nice monomorphism.
gap> mat := IdentityMat(7,GF(9)); < mutable compressed matrix 7x7 over GF(9) > gap> form := BilinearFormByMatrix(mat,GF(9)); < bilinear form > gap> ps := PolarSpace(form); <polar space in ProjectiveSpace( 6,GF(3^2)): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2+x_7^2=0 > gap> gh := SplitCayleyHexagon(ps); H(9) in Q(6, 9): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2+x_7^2 gap> group := CollineationGroup(gh); #I for Split Cayley Hexagon #I Computing nice monomorphism... #I Found permutation domain... <projective collineation group with 18 generators> gap> time; 19602 gap> HasNiceMonomorphism(group); true gap> gh := TwistedTrialityHexagon(2^3); T(8, 2) gap> group := CollineationGroup(gh); #I Computing nice monomorphism... #I Found permutation domain... 3D_4(8)
Suppose S=(P,B,I) is a generalised quadrangle of order (s,t) for which there exists a point p and a group of collineations G fixing p and each line through p, with the extra property that G acts regularly on the points not collinear with p. Then S is called an elation generalised quadrangle with basepoint p and elation group G, and G has order s^{2}t. Let y be a fixed point of S, not collinear with p. Denote the t+1 lines incident with p as L_{i}, i=0 ... t. Define for each line L_{i} the unique pointline pair (z_{i},M_{i}) such that L_{i} I z_{i} I M_{i} I y. Define the groups S_{i} as the subgroups of G fixing the lines M_{i}, and define the groups S_{i}^{*} as the subgroups of G fixing the point z_{i}. Define the set J = {S_{i}: i=0 ... t}, and the set J^{*} = {S_{i}^{*}: i=0 ... t}. Since S is an elation generalised quadrangle, J is a collection of t+1 subgroups of G of order s, and each S_{i}^{*} contains has order st and contains S_{i} as a subgroup. Furthermore, the following two conditions are satisfied.
(K1) S_{i} S_{j} ∩S_{k} = {1}, for distinct i,j,k.
(K2) S_{i}^{*} ∩S_{j} = {1}, for distinct i,j.
The pair (J,J^{*}) is called a 4gonal family or Kantor family in G.
Remarkably, each Kantor family in a group of order s^{2}t gives rise to an elation generalised quadrangle. Kantor families and elation generalised quadrangles are equivalent objects, and one of the motivations to study Kantor families in groups was to find examples of nonclassical elation generalised quadrangles.
Given a group G, together with a Kantor family (J,J^{*}), a generalised quadrangle is defined as follows.
The points are of three types:
(i) points of type 1 are the elements of G;
(ii) points of of type 2 are the right cosets S^{*}g, S^{*}∈ J^{*}
(iii) the unique point of type (iii) is the symbol (∞).
The lines are of two types:
(a) lines of type (a) are the right cosets Sg, S ∈ J;
(b) Lines of type (b) are the symbols [S], S ∈ J.
Incidence is defined as follows. A point g of type (i) is incident with each line Sg, S ∈ J of type (a). A point of type (ii) S^{*}g is incident the line [S] of type (b) and the t lines of type (a) for which Sh ⊂ S^{*}g. Finally, the unique point of type (iii) is incident with the lines of type (b), and there are no further incidences.
It is shown, see e.g. the standard work in this field of Payne and Thas [PT84], that this pointline geoemtry is a generalised quadrangle of order (s,t).
FinInG provides functions to construct elation generalised quadrangles directly from a Kantor family. The constructed generalised quadrangles are generalised polygons in the sense of FinInG, i.e. all generic operations described in Sections 12.3 and 12.4.
‣ IsEGQByKantorFamily  ( category ) 
‣ IsElementOfKantorFamily  ( category ) 
IsEGQByKantorFamily
is a subcategory of IsElationGQ
. It contains all elations generalised quadrangles that are constructed from a Kantor family. IsElementOfKantorFamily
is a subcategory of IsElementOfGeneralisedPolygon
. It contains the elements from generalised quadrangles in the category IsEGQByKantorFamily
.
‣ IsKantorFamily ( g, f, fstar )  ( operation ) 
Returns: true or false
There is no specific way to construct a Kantor family in FinInG. However, given a group G and two collections of subgroups, IsKantorFamily
will check whether the input satisfies the conditions of a Kantor family. If so, the input can be used directly for the operation EGQByKantorFamily
.
‣ EGQByKantorFamily ( g, f, fstar )  ( operation ) 
Returns: a generalised quadrangle
Let g be a group and f and fstar two collections of subgroups, satisfying the conditions of a Kantor family. This operation returns the corresponding elation generalised quadrangle. Note that this operation does not check if the input satisfies the conditions to be a Kantor family, it only checks whether the group f[i] is a subgroup of the group fstar[i]. In the example below, the use of IsKantorFamily
is also demonstrated, and some categories are displayed.
gap> g := ElementaryAbelianGroup(27); <pc group of size 27 with 3 generators> gap> flist1 := [ Group(g.1), Group(g.2), Group(g.3), Group(g.1*g.2*g.3) ];; gap> flist2 := [ Group([g.1, g.2^2*g.3]), Group([g.2, g.1^2*g.3 ]), > Group([g.3, g.1^2*g.2]), Group([g.1^2*g.2, g.1^2*g.3 ]) ];; gap> IsKantorFamily( g, flist1, flist2 ); #I Checking tangency condition... #I Checking triple condition... true gap> egq := EGQByKantorFamily(g, flist1, flist2); <EGQ of order [ 3, 3 ] and basepoint 0> gap> CategoriesOfObject(egq); [ "IsIncidenceStructure", "IsIncidenceGeometry", "IsGeneralisedPolygon", "IsGeneralisedQuadrangle", "IsElationGQ", "IsElationGQByKantorFamily" ] gap> p := Random(Points(egq)); <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> gap> CategoriesOfObject(p); [ "IsElementOfIncidenceStructure", "IsElementOfIncidenceGeometry", "IsElementOfGeneralisedPolygon", "IsElementOfKantorFamily" ]
‣ ObjectToElement ( egq, t, obj )  ( operation ) 
‣ ObjectToElement ( egq, obj )  ( operation ) 
‣ BasePointOfEGQ ( egq )  ( operation ) 
‣ UnderlyingObject ( el )  ( operation ) 
For technical reasons, the underlying objects of the elements of an elation generalised quadrangle constructed from a Kantor family, are not exactly the mathematical objects from the definition. However, these technicalities are almost completely hidden for the user, except for the representation of lines of type (b), which are represented in FinInG by the elements of the collection J^{*} (instead of the elements of the collection J). This change from the original definition has no mathematical implications, since there is a bijective correspondence between the elements of J^{*} and J. Notice also that it is only possible to obtain the basepoint of an elation generalised quadrangle constructed from a Kantor family through calling the attribute BasePointOfEGQ
.
gap> g := ElementaryAbelianGroup(27); <pc group of size 27 with 3 generators> gap> flist1 := [ Group(g.1), Group(g.2), Group(g.3), Group(g.1*g.2*g.3) ];; gap> flist2 := [ Group([g.1, g.2^2*g.3]), Group([g.2, g.1^2*g.3 ]), > Group([g.3, g.1^2*g.2]), Group([g.1^2*g.2, g.1^2*g.3 ]) ];; gap> egq := EGQByKantorFamily(g, flist1, flist2); <EGQ of order [ 3, 3 ] and basepoint 0> gap> h := Random(g); f1*f2^2 gap> p := ObjectToElement(egq,h); <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>> gap> coset := RightCoset(flist1[1],h); RightCoset(Group( [ f1 ] ),f1*f2^2) gap> l := ObjectToElement(egq,coset); <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>> gap> p * l; true gap> S := flist2[2]; <pc group of size 9 with 2 generators> gap> m := ObjectToElement(egq,S); <a line of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> gap> q := BasePointOfEGQ(egq); <a point of class 3 of <EGQ of order [ 3, 3 ] and basepoint 0>> gap> m * q; true gap> lines := List(Lines(p)); [ <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>> ] gap> pts1 := List(Points(m)); [ <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 3 of <EGQ of order [ 3, 3 ] and basepoint 0>> ] gap> pts2 := List(Points(l)); [ <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> ] gap> List(pts2,x>UnderlyingObject(x)); [ f2^2, f1*f2^2, f1^2*f2^2, RightCoset(Group( [ f1, f2^2*f3 ] ),f3^2) ] gap> UnderlyingObject(q); 0
‣ ElationGroup ( egq )  ( attribute ) 
‣ OnKantorFamily ( g, el )  ( function ) 
‣ CollineationAction ( g )  ( attribute ) 
The attribute ElationGroup
is naturally set upon creation of an elation generalised quadrangle from a Kantor family. The elements of the elation group act "naturally" on the elements of the elation generalised quadrangle. This natural action is implemented in the action function OnKantorFamily
. When g is the elation group of an elation generalised quadrangle constructed from a Kantor family, the attribute CollineationAction
will return the action function OnKantorFamily
. The action function makes use of generic GAP operations possible, as is demonstrated in the example.
gap> g := ElementaryAbelianGroup(27); <pc group of size 27 with 3 generators> gap> flist1 := [ Group(g.1), Group(g.2), Group(g.3), Group(g.1*g.2*g.3) ];; gap> flist2 := [ Group([g.1, g.2^2*g.3]), Group([g.2, g.1^2*g.3 ]), > Group([g.3, g.1^2*g.2]), Group([g.1^2*g.2, g.1^2*g.3 ]) ];; gap> egq := EGQByKantorFamily(g, flist1, flist2); <EGQ of order [ 3, 3 ] and basepoint 0> gap> group := ElationGroup(egq); <pc group of size 27 with 3 generators> gap> CollineationAction(group) = OnKantorFamily; true gap> l := ObjectToElement(egq,RightCoset(flist1[1],One(g))); <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>> gap> stab := Stabilizer(group,l,OnKantorFamily); Group([ f1 ]) gap> pts := List(Points(egq)); [ <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 3 of <EGQ of order [ 3, 3 ] and basepoint 0>> ] gap> Orbits(group,pts,OnKantorFamily); [ [ <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a point of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a point of class 3 of <EGQ of order [ 3, 3 ] and basepoint 0>> ] ] gap> lines := List(Lines(egq)); [ <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> ] gap> Orbits(group,lines,OnKantorFamily); [ [ <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>>, <a line of class 1 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a line of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a line of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a line of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> ], [ <a line of class 2 of <EGQ of order [ 3, 3 ] and basepoint 0>> ] ]
Let C = {A_{i}: i=1 ... q} be a set of q distinct upper triangle 2 × 2 matrices over the finite field GF(q). Then C is called a qclan if A_{r}  A_{t} is anistropic for r ≠ t.
Define G = {(α,c,β): α,β ∈ GF(q)^{2}, c ∈ GF(q) }, and define the binary operator × as (α,c,β) × (α',c',β') = (α+α',c+c'+βα'^{T},β+β'). Then G,× is a group with center Z(G)={(0,c,0): c ∈ GF(q)}. Consider a qclan C = {A_{i}: i=1 ... q}, define K_{i} = A_{i} + A_{i}^{T}. Now define the following subgroups of G
A(i)= {(α,αA_{i},αK_{i}): α ∈ GF(q)^{2}, i=1..q } and A(∞)= {(0,0,γ) γ ∈ GF(q)^{2} }, and
A^{*}(i)= {(α,b,αK_{i}): α ∈ GF(q)^{2}, b ∈ GF(q), i=1..q } and A^{*}(∞) = {(0,b,γ): γ ∈ GF(q)^{2}, b ∈ GF(q)}
Define J = {A(i): i= 1 ... q} ∪ {A(∞)} and J^{*} = {A^{*}(i): i= 1 ... q} ∪ {A^{*}(∞)}
A combination of results of Payne and Kantor yield the famous theorem that (J,J^{*}) is a Kantor family in G if and only if C is a qclan. FinInG provides functionality to construct qclans and to construct the corresponding Kantor family. As such, elation generalised quadrangles can directly constructed from qclans.
‣ qClan ( list, f )  ( operation ) 
Returns: a qclan.
Given a list list of 2 × matrices over the field f, it is checked if the matrices in the list satisfy the condition to constitute a qclan over f. If so, the qclan is returned.
‣ LinearqClan ( q )  ( operation ) 
‣ FisherThasWalkerKantorBettenqClan ( q )  ( operation ) 
‣ KantorMonomialqClan ( q )  ( operation ) 
‣ KantorKnuthqClan ( q )  ( operation ) 
‣ FisherqClan ( q )  ( operation ) 
Returns: a qclan
Some famous qclans are built in. We refer to ... for more information on these.
‣ KantorFamilyByqClan ( clan )  ( operation ) 
Returns: A Kantor family.
The Kantor family constructed from a qclan will be a matrix group together with the corresponding collections J and J^{*}.
‣ EGQByqClan ( clan )  ( operation ) 
Returns: An elation generalised quadrangle constructed from a qclan.
Given a qclan clan, the operation KantorFamilyByqClan
will be used to construct the Kantor family from clan, followed by the construction of the elation generalised quadrangle using the operation EGQByKantorFamily
. The first example shows also the use of qClan
, and shows that a linear qclan yields a classical generalised quadrangle.
gap> f := GF(3); GF(3) gap> id := IdentityMat(2, f);; gap> list := List( f, t > t * id );; gap> clan := qClan(list,f); <qclan over GF(3)> gap> egq := EGQByqClan(clan); #I Computed Kantor family. Now computing EGQ... <EGQ of order [ 9, 3 ] and basepoint 0> gap> incgraph := IncidenceGraph(egq);; #I Computing incidence graph of generalised polygon... #I Using elation of the collineation group... gap> group := AutomorphismGroup(incgraph); <permutation group with 6 generators> gap> Order(group); 26127360 gap> Order(CollineationGroup(HermitianPolarSpace(3,9))); 26127360 gap> clan := KantorKnuthqClan(9); <qclan over GF(3^2)> gap> egq := EGQByqClan(clan); #I Computed Kantor family. Now computing EGQ... <EGQ of order [ 81, 9 ] and basepoint 0> gap> clan := FisherThasWalkerKantorBettenqClan(11); <qclan over GF(11)>
A flock is a partition of the points of a quadratic cone in PG(3,q) minus its vertex into conics. Each conic is determined by a plane, and each plane is determined uniquely by a triple of elements of the field GF(q). So a flock is determined by q such triples. Remarkably, as was shown by J.A. Thas, the conditions for these triples to constitute a flock, are exactly the same conditions for these triples to constitute q upper triangle matrices making a qclan over GF(q). Hence, qclans and flocks, and thus flocks and elation generalised quadrangles, are equivalent objects.
The quadratic cone can be embedded as a hyperplane section into the parabolic quadric Q(4,q). L. Bader, G. Lunardon and J.A. Thas observed that a set of q points of Q(4,q) can be constructed from the q planes determining the flock, and this set of points satisfies certain geometric conditions. Such a set is called a BLTset. Dually, a BLTset corresponds to a set of lines of W(3,q). Furthermore, from this BLTset of lines, it is possible to construct directly an elation generalised quadrangle from carefully selecting points and lines from the symplectic space W(5,q). This construction is called the Knarr construction.
Consider the symplectic polar space W(5,q) and choose a point P ∈ W(5,q). Its tangent space is a 4dimensional space F. Embed W(3,q) in a solid of F not on the point p, and let L be the set of BLT lines. Each line spans with p a plane of W(5,q), call these q planes the BLTplanes. Now we can define the points an lines of the elation generalised quadrangle as follows.
Points of type (i) are the points of W(5,q) ∖ F, points of type (ii) are the lines of each BLTplane not on p and the unique point of type (iii) is the point p. Lines of type (a) are the planes of W(5,q) meeting a BLTplane in a line. Note that no plane of W(5,q) meeting two BLT planes in a line can exist. Lines of type (b) are the BLTplanes. Incidence is the natural incidence (so the incidence inherited) from the polar space W(5,q), and this geometry is a elation generalised quadrangle with basepoint p and of order (q^{2},q) .
FinInG provides functions to construct elation generalised quadrangles using this model from BLTsets, and provides a function to compute a BLT set from a qclan directly. The advantage of constructing a elation generalised from elements of Lie geometries is the availability of the underlying projective groups and their action on elements of Lie geometries.
‣ IsEGQByBLTSet  ( category ) 
IsEGQByBLTSet
is a subcategory of IsElationGQ
. It contains all elations generalised quadrangles that are constructed from a BLT set.
‣ BLTSetByqClan ( clan )  ( operation ) 
Returns: A BLTset.
The BLTset is a set of points of the parabolic quadric in PG(4,q) with particular equation X_{1}X_{5}+ X_{2}X_{4}+w^{(q+1)/2}X_{3}^{2}=0, where w is a primitive element of the underlying field of clan.
gap> clan := KantorKnuthqClan(9); <qclan over GF(3^2)> gap> blt := BLTSetByqClan(clan); [ <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0> ] gap> clan := FisherThasWalkerKantorBettenqClan(11); <qclan over GF(11)> gap> blt := BLTSetByqClan(clan); [ <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0> ]
‣ EGQByBLTSet ( blt )  ( operation ) 
Returns: An elation generalised quadrangle.
blt is a BLTset, this operation returns an elation generalised quadrangle constructed as described above consisting of elements of W(5,q). Notice in the example that computing the full collineation group of the GQ constructed directly from the qclan (hence a group coset geometry) is substantially slower than computing the full collineation group of the GQ constructed from the BLTset.
gap> clan := LinearqClan(3); <qclan over GF(3)> gap> bltset := BLTSetByqClan( clan); [ <a point in Q(4, 3): x_1*x_5x_2*x_4+x_3^2=0>, <a point in Q(4, 3): x_1*x_5x_2*x_4+x_3^2=0>, <a point in Q(4, 3): x_1*x_5x_2*x_4+x_3^2=0>, <a point in Q(4, 3): x_1*x_5x_2*x_4+x_3^2=0> ] gap> egq := EGQByBLTSet( bltset ); #I Now embedding dual BLTset into W(5,q)... #I Computing elation group... <EGQ of order [ 9, 3 ] and basepoint in W(5, 3 ) > gap> p := BasePointOfEGQ(egq); <a point in <EGQ of order [ 9, 3 ] and basepoint in W(5, 3 ) >> gap> UnderlyingObject(p); <a point in W(5, 3)> gap> l := Random(Lines(egq)); <a line in <EGQ of order [ 9, 3 ] and basepoint in W(5, 3 ) >> gap> UnderlyingObject(l); <a plane in W(5, 3)> gap> group := ElationGroup(egq); <projective collineation group with 5 generators> gap> Order(group); 243 gap> CollineationGroup(egq); #I Using elation group to enumerate elements #I Using elation group to enumerate elements #I Computing incidence graph of generalised polygon... #I Using elation of the collineation group... #I Using elation group to enumerate elements <permutation group of size 26127360 with 7 generators> gap> time; 147 gap> egq := EGQByqClan(clan); #I Computed Kantor family. Now computing EGQ... <EGQ of order [ 9, 3 ] and basepoint 0> gap> CollineationGroup(egq); #I Computing incidence graph of generalised polygon... #I Using elation of the collineation group... <permutation group of size 26127360 with 6 generators> gap> time; 1139
‣ DefiningPlanesOfEGQByBLTSet ( egq )  ( attribute ) 
For an elation generalised quadrangle in the category IsEGQByBLTSet
(constructed from a BLTset), the planes of the polar space W(5,q), as described in the introduction, determine the generalised quadrangle completely. This attribute returns these q planes of W(5,q).
gap> clan := KantorKnuthqClan(9); <qclan over GF(3^2)> gap> blt := BLTSetByqClan(clan); [ <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0>, <a point in Q(4, 9): x_1*x_5x_2*x_4+Z(3^2)^5*x_3^2=0> ] gap> egq := EGQByBLTSet(blt); #I Now embedding dual BLTset into W(5,q)... #I Computing elation group... <EGQ of order [ 81, 9 ] and basepoint in W(5, 9 ) > gap> DefiningPlanesOfEGQByBLTSet(egq); [ <a plane in W(5, 9)>, <a plane in W(5, 9)>, <a plane in W(5, 9)>, <a plane in W(5, 9)>, <a plane in W(5, 9)>, <a plane in W(5, 9)>, <a plane in W(5, 9)>, <a plane in W(5, 9)>, <a plane in W(5, 9)>, <a plane in W(5, 9)> ]
‣ ObjectToElement ( egq, t, obj )  ( operation ) 
‣ ObjectToElement ( egq, obj )  ( operation ) 
‣ UnderlyingObject ( el )  ( operation ) 
The underlying objects of the elements of an elation generalised quadrangle in the category IsEGQByBLTSet
are elements of the polar space W(5,q) in its standard representation. These elements can be used as underlying object to construct elements of egq. The example also demonstrates the use of DistanceBetweenElements
.
gap> clan := FisherThasWalkerKantorBettenqClan(11); <qclan over GF(11)> gap> blt := BLTSetByqClan(clan); [ <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0>, <a point in Q(4, 11): Z(11)*x_1*x_5+Z(11)*x_2*x_4+Z(11)^6*x_3^2=0> ] gap> egq := EGQByBLTSet(blt); #I Now embedding dual BLTset into W(5,q)... #I Computing elation group... <EGQ of order [ 121, 11 ] and basepoint in W(5, 11 ) > gap> planes := DefiningPlanesOfEGQByBLTSet(egq); [ <a plane in W(5, 11)>, <a plane in W(5, 11)>, <a plane in W(5, 11)>, <a plane in W(5, 11)>, <a plane in W(5, 11)>, <a plane in W(5, 11)>, <a plane in W(5, 11)>, <a plane in W(5, 11)>, <a plane in W(5, 11)>, <a plane in W(5, 11)>, <a plane in W(5, 11)>, <a plane in W(5, 11)> ] gap> p := BasePointOfEGQ(egq); <a point in <EGQ of order [ 121, 11 ] and basepoint in W(5, 11 ) >> gap> up := UnderlyingObject(p); <a point in W(5, 11)> gap> ps := SymplecticSpace(5,11); W(5, 11) gap> uq := VectorSpaceToElement(ps,[1,1,0,0,0,0]*Z(11)^0); <a point in W(5, 11)> gap> q := ObjectToElement(egq,1,uq); <a point in <EGQ of order [ 121, 11 ] and basepoint in W(5, 11 ) >> gap> DistanceBetweenElements(p,q); 4 gap> l := ObjectToElement(egq,2,planes[1]); <a line in <EGQ of order [ 121, 11 ] and basepoint in W(5, 11 ) >> gap> DistanceBetweenElements(p,l); 1 gap> DistanceBetweenElements(q,l); 3 gap> um := VectorSpaceToElement(ps,[[1,0,0,0,1,1],[0,1,0,9,1,0],[0,0,1,9,9,9]]*Z(11)^0); <a plane in W(5, 11)> gap> m := ObjectToElement(egq,2,um); <a line in <EGQ of order [ 121, 11 ] and basepoint in W(5, 11 ) >> gap> DistanceBetweenElements(p,m); 3 gap> DistanceBetweenElements(q,m); 3 gap> DistanceBetweenElements(l,m); 2
‣ CollineationSubgroup ( egq )  ( attribute ) 
For an elation generalised quadrangle in the category IsEGQByBLTSet
(constructed from a BLT set), the planes of the polar space W(5,q), as described in the introduction, determine the generalised quadrangle completely. The setwise stabiliser of these planes in the collineation group of W(5,q) is a subgroup of the completely collineation group of the elation generalised quadrangle, and can be computed much faster than the complete collineation group. This attribute returns this setwise stabiliser. The returned group is equipped with the CollineationACtion
attribute. If CollineationSubgroup
is computed, this group will be used instead of the elation group to compute the incidence graph.
gap> clan := FisherThasWalkerKantorBettenqClan(5); <qclan over GF(5)> gap> blt := BLTSetByqClan(clan); [ <a point in Q(4, 5): Z(5)*x_1*x_5+Z(5)*x_2*x_4+Z(5)^3*x_3^2=0>, <a point in Q(4, 5): Z(5)*x_1*x_5+Z(5)*x_2*x_4+Z(5)^3*x_3^2=0>, <a point in Q(4, 5): Z(5)*x_1*x_5+Z(5)*x_2*x_4+Z(5)^3*x_3^2=0>, <a point in Q(4, 5): Z(5)*x_1*x_5+Z(5)*x_2*x_4+Z(5)^3*x_3^2=0>, <a point in Q(4, 5): Z(5)*x_1*x_5+Z(5)*x_2*x_4+Z(5)^3*x_3^2=0>, <a point in Q(4, 5): Z(5)*x_1*x_5+Z(5)*x_2*x_4+Z(5)^3*x_3^2=0> ] gap> egq := EGQByBLTSet(blt); #I Now embedding dual BLTset into W(5,q)... #I Computing elation group... <EGQ of order [ 25, 5 ] and basepoint in W(5, 5 ) > gap> coll := CollineationSubgroup(egq); #I Computing adjusted stabilizer chain... <projective collineation group with 13 generators> gap> Order(coll); 9000000 gap> act := CollineationAction(coll); function( el, x ) ... end gap> orbs := Orbits(coll,Points(egq),act);; #I Using elation group to enumerate elements gap> List(orbs,x>Length(x)); [ 1, 3125, 150 ] gap> el := ElationGroup(egq); <projective collineation group with 5 generators> gap> orbs := Orbits(el,Points(egq),act);; #I Using elation group to enumerate elements gap> List(orbs,x>Length(x)); [ 1, 3125, 25, 25, 25, 25, 25, 25 ]
generated by GAPDoc2HTML