Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 13 14 A B C Bib Ind
 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 

14 Subgeometries of projective spaces
 14.1 Particular Categories
 14.2 Subgeometries of projective spaces
 14.3 Basic operations
 14.4 Constructing elements of a subgeometry
 14.5 Groups and actions

14 Subgeometries of projective spaces

Let S=(P,L,I) be a point-line incidence geometry. In case S is a projective space over a finite field, it is clear that every line (and every subspace as well) can be identified with the set of points incident with it. Furthermore, the incidence relation I is then symmetrised containment. To define a subgeometry mathematically, we follow [Dem97]. Let P' ⊂ P and let L' be a set of subsets of P', such that every l' ∈ L' is a subset of exactly one line l ∈ L. If S'=(P',L',I) is a projective space again, then we call S' a subgeometry of S. Note that in general the subspaces of S' will be subsets of subspaces of S.

A typical example of a subgeometry is a Baer subplane of a projective plane. In this example, with S' the Baer subplane of the projective plane S, one could say that a point of S' is indeed a point of S, but a line of S', is not a line of S. If one considers a line of S' as a set of points of S', then a line of S' is a subset of the set of points on a line of S. Another example is the subgeometry of a projective space induced by a subspace π. In this example, clearly, the set of elements of the induced subgeometry can, mathematically, be considered as a subset of the set of elements of S.

The same considerations apply for classical polar spaces. These consideration have implications for the behaviour of certain operations in FinInG, e.g. when computing the span and meet of different elements.

Using geometry morphisms, and more particular a function like NaturalEmbeddingBySubField, one can deal in an indirect way with subgeometries. However, using NaturalEmbeddingBySubField is not flexible, and typical problems such as considering a subgeometry determined by a user chosen frame and a subfield, cannot be handled easily. Therefore FinInG provides some functions to naturally construct subgeometries of projective spaces.

A subgeometry in a projective space is completely determined by a frame of the projective space and a subfield of the base field of the projective space. The standard frame in an n-dimensional projective space PG(n,q) is the set of n+2 points represented by (1,0,...,0),(0,1,...,0),...,(0,0,...,1),(1,1,...,1). The subgeometry determined by the standard frame will be called canonical. Note that different frames may determine the same subgeometry (over a fixed subfield).

For a given subfield GF(q') ⊂ GF(q), the canonical subgeometry determined by the standard frame in PG(n,q) is mathematically spoken the image of the FinInG geometry morphism NaturalEmbeddingBySubField of the projective space PG(n,q'). The coordinates of the points of the subgeometry will be exclusively over the subfield GF(q'), as are the coordinates of the vectors after normalizing defining any subspace of the subgeometry. Clearly, the Frobenius automorphism which maps x to x^q' fixes all elements of the subgeometry.

For an arbitrary frame of PG(n,q) and a subfield GF(q'), there exists a natural collineation of PG(n,q) which fixes the subgeometry pointwise. This collineation is the conjugation of the Frobenius automorphism by the unique collineation mapping the defining frame of the subgeometry to the standard frame of PG(n,q), i.e. the frame defining the canonical subgeometry over GF(q'). Upon construction of a subgeometry, both collineations will be computed, and are of use when dealing with the full collineation group of a subgeometry. As for any incidence geometry in FinInG, operations to compute this collineation group as well as particular action functions for subgeometries are provided.

Subgeometries of projective spaces are constructed in a subcategory of IsProjectiveSpace, as such, all operations applicable to projective spaces, are naturally applicable to subgeometries. Subspaces of subgeometries are constructed in a subcategory of IsSubspaceOfProjectiveSpace. Hence, operations applicable to subspaces of projective spaces, are naturally applicable to subspaces of subgeometries.

14.1 Particular Categories

14.1-1 IsSubgeometryOfProjectiveSpace
‣ IsSubgeometryOfProjectiveSpace( category )

This category is a subcategory of IsProjectiveSpace, and contains all subgeometries of projective spaces. Note that mathematically, a subspace of a projective space is also a subgeometry. However, in FinInG, subspaces of a projective space are constructed in a category that is not a subcategory of IsProjectiveSpace. Since IsSubgeometryOfProjectiveSpace is a subcategory of IsProjectiveSpace, all operations applicable to projective spaces, are naturally applicable to subgeometries of projective spaces.

14.1-2 Categories for elements and collections of elements
‣ IsSubspaceOfSubgeometryOfProjectiveSpace( category )
‣ IsSubspacesOfSubgeometryOfProjectiveSpace( category )

A subspace of a subgeometry belongs to the category IsSubspaceOfSubgeometryOfProjectiveSpace.

14.2 Subgeometries of projective spaces

14.2-1 CanonicalSubgeometryOfProjectiveSpace
‣ CanonicalSubgeometryOfProjectiveSpace( pg, subfield )( operation )
‣ CanonicalSubgeometryOfProjectiveSpace( pg, q )( operation )

Returns: a subgeometry of pg

This operation returns the subgeometry of pg induced by the standard frame over the subfield subfield. Alternatively, a prime power q can be used as the order of the subfield. It is checked whether the user specified subfield is indeed a subfield of the base field of pg. If the subfield equals the base field of pg, the projective space pg is returned.

gap> pg := PG(2,25);
ProjectiveSpace(2, 25)
gap> sub := CanonicalSubgeometryOfProjectiveSpace(pg,GF(5));
Subgeometry PG(2, 5) of ProjectiveSpace(2, 25)
gap> CategoriesOfObject(sub);
[ "IsIncidenceStructure", "IsIncidenceGeometry", "IsLieGeometry", 
  "IsProjectiveSpace", "IsSubgeometryOfProjectiveSpace" ]
gap> pg := PG(3,3^6);
ProjectiveSpace(3, 729)
gap> sub := CanonicalSubgeometryOfProjectiveSpace(pg,3^2);
Subgeometry PG(3, 9) of ProjectiveSpace(3, 729)
gap> sub := CanonicalSubgeometryOfProjectiveSpace(pg,3^3);
Subgeometry PG(3, 27) of ProjectiveSpace(3, 729)
gap> sub := CanonicalSubgeometryOfProjectiveSpace(pg,3^6);
ProjectiveSpace(3, 729)
 

14.2-2 RandomFrameOfProjectiveSpace
‣ RandomFrameOfProjectiveSpace( pg )( operation )

Returns: a set of points of pg, being a frame. Note that the returned object is also a set in the GAP sense, i.e. an ordered list without duplicates.

gap> pg := PG(1,5^5);
ProjectiveSpace(1, 3125)
gap> frame := RandomFrameOfProjectiveSpace(pg);
[ <a point in ProjectiveSpace(1, 3125)>, <a point in ProjectiveSpace(1, 3125)>
    , <a point in ProjectiveSpace(1, 3125)> ]
gap> Length(frame);
3
gap> pg := PG(6,2^2);
ProjectiveSpace(6, 4)
gap> frame := RandomFrameOfProjectiveSpace(pg);
[ <a point in ProjectiveSpace(6, 4)>, <a point in ProjectiveSpace(6, 4)>, 
  <a point in ProjectiveSpace(6, 4)>, <a point in ProjectiveSpace(6, 4)>, 
  <a point in ProjectiveSpace(6, 4)>, <a point in ProjectiveSpace(6, 4)>, 
  <a point in ProjectiveSpace(6, 4)>, <a point in ProjectiveSpace(6, 4)> ]
gap> Length(frame);
8
 

14.2-3 IsFrameOfProjectiveSpace
‣ IsFrameOfProjectiveSpace( list )( operation )

Returns: true or false

When list is a list of points of a projective space, this operation returns true if and only if list constitutes a frame of the projective space. It is checked as well whether all points in list belong to the same projective space.

gap> pg := PG(1,7^3);
ProjectiveSpace(1, 343)
gap> p1 := VectorSpaceToElement(pg,[1,1]*Z(7)^0);
<a point in ProjectiveSpace(1, 343)>
gap> p2 := VectorSpaceToElement(pg,[1,2]*Z(7)^0);
<a point in ProjectiveSpace(1, 343)>
gap> p3 := VectorSpaceToElement(pg,[1,3]*Z(7)^0);
<a point in ProjectiveSpace(1, 343)>
gap> IsFrameOfProjectiveSpace([p1,p2,p3]);
true
 

14.2-4 SubgeometryOfProjectiveSpaceByFrame
‣ SubgeometryOfProjectiveSpaceByFrame( pg, list, field )( operation )
‣ SubgeometryOfProjectiveSpaceByFrame( pg, list, q )( operation )

Returns: a subgeometry of pg

The argument pg is a projective space which is not a subgeometry itself, the argument list is a list of points of pg defining a frame of pg, and finally the argument field is a subfield of the base field of pg. Alternatively, the argument q is the order of a subfield of the base field of pg. This method returns the subgeometry defined by the frame in list and the subfield field of the subfield GF(q). This method checks whether the subfield field or the field GF(q) is really a subfield of the base field of pg and whether the list of points in list is a frame of pg. Note also that it is currently not possible to construct subgeometries recursively, so pg may not be a subgeometry itself. If the specified subfield equals the base field of pg, then the projective space pg itself is returned.

gap> pg := PG(3,3^6);
ProjectiveSpace(3, 729)
gap> frame := RandomFrameOfProjectiveSpace(pg);
[ <a point in ProjectiveSpace(3, 729)>, <a point in ProjectiveSpace(3, 729)>, 
  <a point in ProjectiveSpace(3, 729)>, <a point in ProjectiveSpace(3, 729)>, 
  <a point in ProjectiveSpace(3, 729)> ]
gap> sub1 := SubgeometryOfProjectiveSpaceByFrame(pg,frame,GF(3));
Subgeometry PG(3, 3) of ProjectiveSpace(3, 729)
gap> sub2 := SubgeometryOfProjectiveSpaceByFrame(pg,frame,3^2);
Subgeometry PG(3, 9) of ProjectiveSpace(3, 729)
gap> sub3 := SubgeometryOfProjectiveSpaceByFrame(pg,frame,3^3);
Subgeometry PG(3, 27) of ProjectiveSpace(3, 729)
gap> sub4 := SubgeometryOfProjectiveSpaceByFrame(pg,frame,3^6);
ProjectiveSpace(3, 729)

14.3 Basic operations

14.3-1 Underlying vector space and ambient projective space
‣ UnderlyingVectorSpace( sub )( operation )
‣ AmbientSpace( sub )( operation )

Let P be a projective space over the field F. Let sub be a subgeometry of P over the subfield F'. The underlying vector space of sub is defined as the underlying vector space of P (which is a vector space over the field F). The ambient space of a subgeometry sub is the projective space P.

gap> pg := PG(2,5^6);
ProjectiveSpace(2, 15625)
gap> sub1 := CanonicalSubgeometryOfProjectiveSpace(pg,5);
Subgeometry PG(2, 5) of ProjectiveSpace(2, 15625)
gap> UnderlyingVectorSpace(pg);
( GF(5^6)^3 )
gap> UnderlyingVectorSpace(sub1);
( GF(5^6)^3 )
gap> AmbientSpace(sub1);
ProjectiveSpace(2, 15625)
gap> sub2 := CanonicalSubgeometryOfProjectiveSpace(pg,5^3);
Subgeometry PG(2, 125) of ProjectiveSpace(2, 15625)
gap> AmbientSpace(sub2);
ProjectiveSpace(2, 15625)
gap> UnderlyingVectorSpace(sub2);
( GF(5^6)^3 )
gap> frame := RandomFrameOfProjectiveSpace(pg);
[ <a point in ProjectiveSpace(2, 15625)>, 
  <a point in ProjectiveSpace(2, 15625)>, 
  <a point in ProjectiveSpace(2, 15625)>, 
  <a point in ProjectiveSpace(2, 15625)> ]
gap> sub3 := SubgeometryOfProjectiveSpaceByFrame(pg,frame,5^2);
Subgeometry PG(2, 25) of ProjectiveSpace(2, 15625)
gap> AmbientSpace(sub3);
ProjectiveSpace(2, 15625)
gap> UnderlyingVectorSpace(sub3);
( GF(5^6)^3 )

14.3-2 DefiningFrameOfSubgeometry
‣ DefiningFrameOfSubgeometry( sub )( attribute )

Returns: a set of projective points

This attribute returns a frame of the ambient space of sub defining it. Note that different frames might define the same subgeometry, but the frame used to constructed sub is stored at construction, and it is exactly this stored object that is returned by this attribute. The returned object is a set of points, and it is also a set in the GAP sense, i.e. an ordered list without duplicates.

gap> pg := PG(2,2^4);
ProjectiveSpace(2, 16)
gap> sub := CanonicalSubgeometryOfProjectiveSpace(pg,2);
Subgeometry PG(2, 2) of ProjectiveSpace(2, 16)
gap> frame := DefiningFrameOfSubgeometry(sub);
[ <a point in ProjectiveSpace(2, 16)>, <a point in ProjectiveSpace(2, 16)>, 
  <a point in ProjectiveSpace(2, 16)>, <a point in ProjectiveSpace(2, 16)> ]
gap> List(frame,x->Unpack(UnderlyingObject(x)));
[ [ Z(2)^0, 0*Z(2), 0*Z(2) ], [ 0*Z(2), Z(2)^0, 0*Z(2) ], 
  [ 0*Z(2), 0*Z(2), Z(2)^0 ], [ Z(2)^0, Z(2)^0, Z(2)^0 ] ]
gap> frame := RandomFrameOfProjectiveSpace(pg);
[ <a point in ProjectiveSpace(2, 16)>, <a point in ProjectiveSpace(2, 16)>, 
  <a point in ProjectiveSpace(2, 16)>, <a point in ProjectiveSpace(2, 16)> ]
gap> sub := SubgeometryOfProjectiveSpaceByFrame(pg,frame,2^2);
Subgeometry PG(2, 4) of ProjectiveSpace(2, 16)
gap> def := DefiningFrameOfSubgeometry(sub);
[ <a point in ProjectiveSpace(2, 16)>, <a point in ProjectiveSpace(2, 16)>, 
  <a point in ProjectiveSpace(2, 16)>, <a point in ProjectiveSpace(2, 16)> ]
gap> List(def,x->Unpack(UnderlyingObject(x)));
[ [ Z(2)^0, 0*Z(2), Z(2^4)^9 ], [ Z(2)^0, Z(2^4)^4, Z(2^4)^11 ], 
  [ Z(2)^0, Z(2^4)^2, Z(2^2)^2 ], [ Z(2)^0, Z(2^2)^2, Z(2^4)^14 ] ]
gap> StandardFrame(sub);
[ <a point in Subgeometry PG(2, 4) of ProjectiveSpace(2, 16)>, 
  <a point in Subgeometry PG(2, 4) of ProjectiveSpace(2, 16)>, 
  <a point in Subgeometry PG(2, 4) of ProjectiveSpace(2, 16)>, 
  <a point in Subgeometry PG(2, 4) of ProjectiveSpace(2, 16)> ]

14.3-3 Projective dimension and rank
‣ ProjectiveDimension( sub )( operation )
‣ Dimension( sub )( operation )
‣ Rank( sub )( operation )

Returns: an integer

If sub is a subgeometry of a projective space, then it is a projective space itself. Therefore, these three operations return the projective dimension of sub, see also 4.1-3.

gap> pg := PG(7,8^2);
ProjectiveSpace(7, 64)
gap> sub := CanonicalSubgeometryOfProjectiveSpace(pg,8);
Subgeometry PG(7, 8) of ProjectiveSpace(7, 64)
gap> ProjectiveDimension(sub);
7
gap> Dimension(sub);
7
gap> Rank(sub);
7

14.3-4 Underlying algebraic structures
‣ UnderlyingVectorSpace( sub )( operation )
‣ BaseField( sub )( operation )
‣ SubfieldOfSubgeometry( sub )( operation )

Returns: the first operation returns a vector space, the second and third operations return a finite field

The operations UnderlyingVectorSpace and BaseField are defined for projective spaces, see 4.1-5 and 4.1-4. For a subgeometry of a projective space sub with ambient space ps, these operations return UnderlyingVectorSpace(ps), BaseField(ps) respectively. The operation SubfieldOfSubgeometry returns the subfield over which sub is defined.

gap> pg := PG(3,3^6);
ProjectiveSpace(3, 729)
gap> sub1 := CanonicalSubgeometryOfProjectiveSpace(pg,3^3);
Subgeometry PG(3, 27) of ProjectiveSpace(3, 729)
gap> BaseField(sub1);
GF(3^6)
gap> UnderlyingVectorSpace(sub1);
( GF(3^6)^4 )
gap> SubfieldOfSubgeometry(sub1);
GF(3^3)
gap> sub2 := CanonicalSubgeometryOfProjectiveSpace(pg,3^2);
Subgeometry PG(3, 9) of ProjectiveSpace(3, 729)
gap> BaseField(sub2);
GF(3^6)
gap> UnderlyingVectorSpace(sub2);
( GF(3^6)^4 )
gap> SubfieldOfSubgeometry(sub2);
GF(3^2)

14.3-5 CollineationFixingSubgeometry
‣ CollineationFixingSubgeometry( sub )( attribute )

Returns: a collineation of the ambient space of sub

Let GF(q) be the field over which sub is defined, this is a subfield of GF(q^t) over which the ambient projective space P is defined. It is well known that there exists a collineation of P of order t, fixing all elements of sub, which is returned by this operation. This collineation is the collineation induced by the Frobenius map x↦ x^q, conjugated by the collineation of P mapping the subgeometry sub to the canonical subgeometry of P over GF(q). In case of a quadratic field extension (i.e. t=2), this collineation is known in the literature as the Baer involution of the subgeometry.

gap> pg := PG(2,7^3);
ProjectiveSpace(2, 343)
gap> sub := CanonicalSubgeometryOfProjectiveSpace(pg,GF(7));
Subgeometry PG(2, 7) of ProjectiveSpace(2, 343)
gap> coll := CollineationFixingSubgeometry(sub);
< a collineation: <cmat 3x3 over GF(7,3)>, F^7>
gap> Order(coll);
3

14.4 Constructing elements of a subgeometry

14.4-1 VectorSpaceToElement
‣ VectorSpaceToElement( sub, v )( operation )

Returns: a subspace of a subgeometry

sub is a subgeometry of a projective space, and v is either a row vector (for points) or a matrix (for higher dimensional subspaces). In the case that v is a matrix, the rows represent generators for the subspace. An exceptional case is when v is the zero-vector, in which case the trivial subspace is returned. This method checks whether v determines an element of sub.

gap> pg := PG(2,5^6);
ProjectiveSpace(2, 15625)
gap> vecs := [ [ Z(5)^0, Z(5^6)^13972, Z(5^6)^11653 ], 
> [ Z(5)^0, Z(5^6)^9384, Z(5^6)^1372 ],
> [ Z(5)^0, Z(5^6)^14447, Z(5^6)^15032 ], 
> [ Z(5)^0, Z(5^6)^8784, Z(5^6)^10360 ] ];;
gap> frame := List(vecs,x->VectorSpaceToElement(pg,x));
[ <a point in ProjectiveSpace(2, 15625)>, 
  <a point in ProjectiveSpace(2, 15625)>, 
  <a point in ProjectiveSpace(2, 15625)>, 
  <a point in ProjectiveSpace(2, 15625)> ]
gap> sub := SubgeometryOfProjectiveSpaceByFrame(pg,frame,5^3);
Subgeometry PG(2, 125) of ProjectiveSpace(2, 15625)
gap> VectorSpaceToElement(sub,[0,0,0]*Z(5)^0);
< empty subspace >
gap> vec := [ Z(5)^0, Z(5^6)^8584, Z(5^6)^13650 ];
[ Z(5)^0, Z(5^6)^8584, Z(5^6)^13650 ]
gap> VectorSpaceToElement(sub,vec);
<a point in Subgeometry PG(2, 125) of ProjectiveSpace(2, 15625)>
gap> vec := [ [ Z(5)^0, 0*Z(5), Z(5^6)^5740 ], [ 0*Z(5), Z(5)^0, Z(5^6)^15250 ] ];
[ [ Z(5)^0, 0*Z(5), Z(5^6)^5740 ], [ 0*Z(5), Z(5)^0, Z(5^6)^15250 ] ]
gap> VectorSpaceToElement(sub,vec);
Error, <obj> does not determine an element in <sub> called from
VectorSpaceToElementForSubgeometries( geom, v 
 ) at ./pkg/fining/lib/subgeometries.gi:400 called from
<function "unknown">( <arguments> )
 called from read-eval loop at line 19 of *stdin*
you can 'quit;' to quit to outer loop, or
you can 'return;' to continue
brk> quit;
gap> vec := [ [ Z(5)^0, 0*Z(5), Z(5^6)^8268 ], [ 0*Z(5), Z(5)^0, Z(5^6)^1472 ] ];
[ [ Z(5)^0, 0*Z(5), Z(5^6)^8268 ], [ 0*Z(5), Z(5)^0, Z(5^6)^1472 ] ]
gap> VectorSpaceToElement(sub,vec);
<a line in Subgeometry PG(2, 125) of ProjectiveSpace(2, 15625)>
gap> VectorSpaceToElement(sub,vecs);
Subgeometry PG(2, 125) of ProjectiveSpace(2, 15625)

14.4-2 ExtendElementOfSubgeometry
‣ ExtendElementOfSubgeometry( el )( operation )

Returns: a subspace of a projective space

The argument el is an element of a subgeometry P' with ambient projective space P. The projective space is defined over a field F, the subgeometry P' is defined over a subfield F' of F. The underlying vector space of el is a vector space over F' generated by a set S of vectors. This operation returns the element of P, corresponding to the vector space over F generated by the vectors in S. Note that the set S can be obtained using UnderlyingObject, see 3.2-2.

gap> pg := PG(3,5^5);
ProjectiveSpace(3, 3125)
gap> frame := RandomFrameOfProjectiveSpace(pg);
[ <a point in ProjectiveSpace(3, 3125)>, <a point in ProjectiveSpace(3, 3125)>
    , <a point in ProjectiveSpace(3, 3125)>, 
  <a point in ProjectiveSpace(3, 3125)>, 
  <a point in ProjectiveSpace(3, 3125)> ]
gap> sub := SubgeometryOfProjectiveSpaceByFrame(pg,frame,5);
Subgeometry PG(3, 5) of ProjectiveSpace(3, 3125)
gap> p := Random(Points(sub));
<a point in Subgeometry PG(3, 5) of ProjectiveSpace(3, 3125)>
gap> l := Random(Lines(p));
<a line in Subgeometry PG(3, 5) of ProjectiveSpace(3, 3125)>
gap> p * l;
true
gap> q := ExtendElementOfSubgeometry(p);
<a point in ProjectiveSpace(3, 3125)>
gap> q * l;
Error, <x> and <y> do not belong to the same geometry called from
x in y at ./pkg/fining/lib/projectivespace.gi:1658 called from
IsIncident( b, a ) at ./pkg/fining/lib/geometry.gi:439 called from
<function "unknown">( <arguments> )
 called from read-eval loop at line 15 of *stdin*
you can 'quit;' to quit to outer loop, or
you can 'return;' to continue
brk> quit;
gap> m := ExtendElementOfSubgeometry(l);
<a line in ProjectiveSpace(3, 3125)>
gap> q * m;
true
gap> UnderlyingObject(q) = UnderlyingObject(p);
true
gap> UnderlyingObject(l) = UnderlyingObject(m);
true

14.4-3 AmbientGeometry
‣ AmbientGeometry( el )( operation )

Returns: an incidence geometry

For el an element of a subgeometry P, which is also a projective space, this operation returns P.

14.4-4 Flags
‣ FlagOfIncidenceStructure( sub, els )( operation )
‣ IsEmptyFlag( flag )( operation )
‣ IsChamberOfIncidenceStructure( flag )( operation )

Returns: true or false

These operations are defined for projective spaces and so they are also applicable to subgeometries.

14.5 Groups and actions

Let P' be a subgeometry of P. Although one could argue that any semilinear map inducing a collineation preserving P' can be called a collineation of P', this would cause problems with the nice monomorphism functionality, since such a collineation does not necessarily have a faithful action on the subgeometry. For this reason, we decided to define the collineation group of the subgeometry P' as the collineation group of the projective space isomorphic to P' conjugated by the collineation of P mapping P' on the canonical subgeometry of P over the same field as P'. Similarly, the projectivity group, respectively the special projectivity group, of P' is defined as the conjugate of the projectivity group, respectively special projectivity group, of the projective space isomorphic to P'.

14.5-1 Groups of collineations
‣ CollineationGroup( sub )( operation )
‣ ProjectivityGroup( sub )( operation )
‣ SpecialProjectivityGroup( sub )( operation )

Returns: a group of collineations

 [Top of Book]  [Contents]   [Previous Chapter]   [Next Chapter] 
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 13 14 A B C Bib Ind

generated by GAPDoc2HTML