GAP (FinInG) - Chapter 7: Finite Classical Polar Spaces

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]

[MathJax off]

7 Finite Classical Polar Spaces
7.1 Finite Classical Polar Spaces
7.1-1 IsClassicalPolarSpace
7.1-2 PolarSpace
7.2 Canonical and standard Polar Spaces
7.2-1 SymplecticSpace
7.2-2 HermitianPolarSpace
7.2-3 ParabolicQuadric
7.2-4 HyperbolicQuadric
7.2-5 EllipticQuadric
7.2-6 IsCanonicalPolarSpace
7.2-7 CanonicalPolarSpace
7.2-8 StandardPolarSpace
7.3 Basic operations for finite classical polar spaces
7.3-1 UnderlyingVectorSpace
7.3-2 AmbientSpace
7.3-3 ProjectiveDimension
7.3-4 Rank
7.3-5 BaseField
7.3-6 IsHyperbolicQuadric
7.3-7 IsEllipticQuadric
7.3-8 IsParabolicQuadric
7.4 Subspaces of finite classical polar spaces
7.4-1 VectorSpaceToElement
7.4-2 EmptySubspace
7.4-3 ProjectiveDimension
7.4-4 ElementsOfIncidenceStructure
7.4-5 AmbientSpace
7.4-6 Coordinates
7.5 Basic operations for polar spaces and subspaces of projective spaces
7.5-1 Incidence and containment
7.5-2 Span
7.5-3 Meet
7.5-4 IsCollinear
7.5-5 PolarityOfProjectiveSpace
7.5-6 TypeOfSubspace
7.5-7 TangentSpace
7.5-8 Pole
7.5-9 EvaluateForm
7.6 Shadow of elements
7.6-1 ShadowOfElement
7.6-2 ElementsIncidentWithElementOfIncidenceStructure
7.7 Projective Orthogonal/Unitary/Symplectic groups in FinInG
7.7-1 SpecialIsometryGroup
7.7-2 IsometryGroup
7.7-3 SimilarityGroup
7.7-4 CollineationGroup
7.8 Enumerating subspaces of polar spaces
7.8-1 Enumerators for polar spaces
7.8-2 Enumerator
7.8-3 Iterators for polar spaces
7.8-4 Iterator
7.8-5 AsList

### 7 Finite Classical Polar Spaces

In this chapter we describe how to use FinInG to work with finite classical polar spaces.

#### 7.1 Finite Classical Polar Spaces

A polar space is a point-line incidence geometry, satisfying the famous one-or-all axiom, i.e. for any point \(P\), not incident with a line \(l\), \(P\) is collinear with exactly one point of \(l\) or with all points of \(l\). The axiomatic treatment of polar spaces has its foundations in [Vel59], [Tit74], and [BS74], the latter in which the one-or-all axiom is described. Polar spaces are axiomatically, point-line geometries, but may contain higher dimensional projective subspaces too. All maximal subspaces have the same projective dimension, and this determines the rank of the polar space.

Well known examples of finite polar spaces are the geometries attached to sesquilinear and quadratic forms of vector spaces over a finite field, these geometries are called the finite classical polar spaces. For a given sesquilinear, respectively quadratic, form \(f\), the elements of the associated geometry are the totally isotropic, respectively totally singular, subspaces of the vectors space with relation to the form \(f\). The treatment of the forms is done through the package Forms.

From the axiomatic point of view, a polar space is a point-line geometry, and has rank at least 2. Considering a sesquilinear or quadratic form \(f\), of Witt index 1, the associated geometry consists only of projective points, and is then in the axiomatic treatment, not a polar space. However, as is the case for projective spaces, we will consider the rank one geometries associated to forms of Witt index 1 as examples of classical polar spaces. Even the elliptic quadric on the projective line, a geometry associated to an elliptic quadratic form on a two dimensional vector space over a finite field, is considered as a classical polar space, though it has no singular subspaces. The reason for this treatment is that most, if not all, methods for operations applicable on these geometries, rely on the same algebraic methodology. So, in FinInG, a classical polar space (sometimes abbreviated to polar space), is the geometry associated with a sesquilinear or quadratic form on a finite dimensional vector space over a finite field.

##### 7.1-1 IsClassicalPolarSpace

`‣ IsClassicalPolarSpace` | ( category )

This category is a subcategory of `IsLieGeometry`, and contains all the geometries associated to a non-degenerate sesquilinear or quadratic form.

The underlying vector space and matrix group are to our advantage in the treatment of classical polar spaces. We refer the reader to [HT91] and [Cam00b] for the necessary background theory (if it is not otherwise provided), and we follow the approach of [Cam00b] to introduce all different flavours.

Consider the projective space \(\mathrm{PG}(n,q)\) with underlying vector space \(V(n+1,q)\). Consider a non-degenerate sesquilinear form \(f\). Then \(f\) is Hermitian, alternating or symmetric. When the characteristic of the field is odd, respectively even, a symmetric bilinear form is called orthogonal, respectively, pseudo. We do not consider the pseudo case, so we suppose that \(f\) is Hermitian, symplectic or orthogonal. The classical polar space associated with \(f\) is the incidence geometry whose elements are of the subspaces of \(\mathrm{PG}(n,q)\) whose underlying vector subspace is totally isotropic with relation to \(f\). We call a polar space Hermitian, respectively, symplectic, orthogonal, if the underlying sesquilinear form is Hermitian, respectively, symplectic, orthogonal.

Symmetric bilinear forms have completely different geometric properties in even characteristic than in odd characteristic. On the other hand, polar spaces geometrically comparable to orthogonal polar spaces in odd characteristic, do exist in even characteristic. The algebraic background is now established by quadratic forms on a vector space instead of bilinear forms. Consider a non-singular quadratic form \(q\) on a vector space \(V(n+1,q)\). The classical polar space associated with \(f\) is the incidence geometry whose elements are the subspaces of \(\mathrm{PG}(n,q)\) whose underlying vector subspace is totally singular with relation to \(q\). The connection with orthogonal polar spaces in odd characteristic is clear, since in odd characteristic, quadratic forms and symmetric bilinear forms are equivalent. Therefore, we call polar spaces with an underlying quadratic form in even characteristic also orthogonal polar spaces.

##### 7.1-2 PolarSpace

`‣ PolarSpace`( form ) | ( operation )

`‣ PolarSpace`( pol ) | ( operation )

Returns: a classical polar space

form must be a sesquilinear or quadratic form created by use of the GAP package Forms. In the second variant, the argument pol must be a polarity of a projective space. An error message will be displayed if pol is a pseudo polarity. We refer to Chapter 6 for more information on polarities of projective spaces, and more particularly to Section 6.3 for the connection between polarities and forms.

    gap> mat := [[0,0,0,1],[0,0,-2,0],[0,2,0,0],[-1,0,0,0]]*Z(5)^0;
    [ [ 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0 ], [ 0*Z(5), 0*Z(5), Z(5)^3, 0*Z(5) ],
      [ 0*Z(5), Z(5), 0*Z(5), 0*Z(5) ], [ Z(5)^2, 0*Z(5), 0*Z(5), 0*Z(5) ] ]
    gap> form := BilinearFormByMatrix(mat,GF(25));
    < bilinear form >
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(
    3,GF(5^2)): x1*y4+Z(5)^3*x2*y3+Z(5)*x3*y2-x4*y1=0 >
    gap> r := PolynomialRing(GF(32),4);
    GF(2^5)[x_1,x_2,x_3,x_4]
    gap> poly := r.3*r.2+r.1*r.4;
    x_1*x_4+x_2*x_3
    gap> form := QuadraticFormByPolynomial(poly,r);
    < quadratic form >
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(3,GF(2^5)): x_1*x_4+x_2*x_3=0 >
    gap> mat := IdentityMat(5,GF(7));
    [ [ Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7) ],
      [ 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7) ],
      [ 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7) ],
      [ 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7) ],
      [ 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7)^0 ] ]
    gap> phi := PolarityOfProjectiveSpace(mat,GF(7));
    <polarity of PG(4, GF(7)) >
    gap> ps := PolarSpace(phi);
    <polar space in ProjectiveSpace(4,GF(7)): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2=0 >

FinInG relies on the package Forms for its facility with sesquilinear and quadratic forms. One can specify a polar space with a user-defined form, and we refer to the documentation for Forms for information on how one can create and use forms. Here we just display a worked example.

    gap> id := IdentityMat(7, GF(3));;
    gap> form := QuadraticFormByMatrix(id, GF(3));
    < quadratic form >
    gap> ps := PolarSpace( form );
    <polar space in ProjectiveSpace(
    6,GF(3)): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2+x_7^2=0 >
    gap> psl32 := PSL(3,2);
    Group([ (4,6)(5,7), (1,2,4)(3,6,5) ])
    gap> reps:=[[1,1,1,0,0,0,0], [-1,1,1,0,0,0,0], [1,-1,1,0,0,0,0], [1,1,-1,0,0,0,0]]*Z(3)^0;;
    gap> ovoid := Union( List(reps, x-> Orbit(psl32, x, Permuted)) );;
    gap> ovoid := List(ovoid, x -> VectorSpaceToElement(ps, x));;
    gap> planes := AsList( Planes( ps ) );;
    #I  Computing collineation group of canonical polar space...
    gap> ForAll(planes, p -> Number(ovoid, x -> x in p) = 1);
    true

#### 7.2 Canonical and standard Polar Spaces

To introduce the classification of polar spaces, we use the classification of the underlying forms in similarity classes. We follow mostly the approach and terminology of [KL90], as we did in the manual of the package Forms.

Consider a vector space \(V=V(n+1,q)\) and a sesquilinear form \(f\) on \(V\). The pair \((V,f)\) is called a formed space. Consider now two formed spaces \((V,f)\) and \((V,f')\), where \(f\) and \(f'\) are two sesquilinear forms on \(V\). A non-singular linear map \(\phi\) from \(V\) to itself induces a similarity of the formed space \((V,f)\) to the formed space \((V,f')\) if and only if

\[f(v,w) = \lambda f'(\phi(v),\phi(w)),\]

for all vectors \(v,w\) and some non-zero \(\lambda \in GF(q)\) . Up to similarity, there is only one class of non-degenerate Hermitian forms, and one class of non-degenerate symplectic forms on a given vector space \(V\). For symmetric bilinear forms in odd characteristic, the number of similarity classes depends on the dimension of \(V\). In odd dimension, there is only one similarity class, and non-degenerate forms in this class are called parabolic (bilinear) forms. In even dimension, there are two similarity classes, and non-degenerate forms are either elliptic (bilinear) forms or hyperbolic (bilinear) forms.

Consider now a vector space \(V\) and a quadratic form \(q\) on \(V\). The pair \((V,q)\) is called a formed space. Consider now two formed spaces \((V,q)\) and \((V,q')\), where \(q\) and \(q'\) are two quadratic forms on \(V\). A non-degenerate linear map \(\phi\) from \(V\) to itself induces a similarity of the formed space \((V,q)\) to the formed space \((V,q')\) if and only if

\[q(v) = \lambda q'(\phi(v))),\]

for all vectors \(v\) and some non-zero \(\lambda \in GF(q)\) . For quadratic forms in even characteristic, the number of similarity classes depends on the dimension of \(V\). In odd dimension, there is only one similarity class, and non-degenerate forms in this class are called parabolic (bilinear) forms. In even dimension, there are two similarity classes, and non-degenerate forms are either elliptic (bilinear) forms or hyperbolic (bilinear) forms.

If \(\phi\) induces a similarity of a formed vector space such that \(\lambda = 1\), then the similarity is called an isometry of the formed vector space. In almost all cases, each similarity class contains exactly one isometry class. Only the orthogonal sesquilinear forms (in odd characteristic) have two isometry classes. Consequently, if an isometry exists between formed vector spaces, they are called isometric. Projectively, a formed vector space becomes a classical polar space embedded in a projective space. Obviously, forms in the same similarity class determine exactly the same classical polar space. Conversely, it is well known that a classical polar space determines a form up to a constant factor, i.e. it determines a similarity class of forms. In FinInG, the word canonical is used in the mathematical sense, i.e. a classical polar space is canonical if its determining form belongs to a fixed similarity class. A classical polar space is called standard if its determining form is the fixed representative of the canonical similarity class. Hence a standard classical polar space is always a canonical classical polar space, a canonical polar space is determined by a standard form up to a constant factor. In the following table, we summaries the above information on polar spaces, together with the standard forms that are chosen in FinInG. Note that Tr refers to the absolute trace map from \(\mathrm{GF}(q)\) to \(\mathrm{GF}(p)\).

Table: finite classical polar spaces
polar space | standard form | characteristic \(p\) | projective dimension
hermitian polar space | \(X_0^{q+1} + X_1^{q+1} + \ldots + X_{n}^{q+1}\) | odd or even | odd or even
symplectic space | \( X_0 Y_1 - Y_0X_1+ \ldots + X_{n-1}Y_n - Y_{n-1}X_n\) | odd or even | odd
hyperbolic quadric | \( X_0 X_1 + \ldots + X_{n-1}X_n\) | \(p \equiv 3 \pmod{4}\) or \(p=2\) | odd
hyperbolic quadric | \(2(X_0 X_1 + \ldots + X_{n-1}X_n)\) | \(p \equiv 1 \pmod{4}\) | odd
parabolic quadric | X02 + X1 X2 + ... + Xn-1Xn | \(p \equiv 1,3 \pmod{8}\) or \(p=2\) | even
parabolic quadric | \(t(X_0^2 + X_1X_2 + \ldots + X_{n-1}X_n)\), \(t\) a primitive element of \(\mathrm{GF}(p)\) | \(p \equiv 5,7 \pmod{8}\) | even
elliptic quadric | \(X_0^2 + X_1^2 + X_2X_3 + \ldots + X_{n-1}X_n\) | \(p \equiv 3 \pmod{4}\) | odd
elliptic quadric | \(X_0^2 + tX_1^2 + X_2X_3 + \ldots + X_{n-1}X_n\), \(t\) a primitive element of \(\mathrm{GF}(p)\) | \(p \equiv 1 \pmod{4}\) | odd
elliptic quadric | \(X_0^2 + X_0X_1 + dX_1^2 + X_2X_3 + \ldots + X_{n-1}X_n\), \(\mathrm{Tr}(d)=1\) | even | odd

We refer to Appendix B for information on the operations that construct gram matrices that are used to obtain the above standard forms.

The FinInG provides a wealth of flexibility in constructing polar spaces. The user may choose a particular quadratic or sesquilinear form, but may also chose to construct polars spaces that have one of the above mentioned forms as underlying form. Furthermore, FinInG will detect when necessary if the user-constructed polar space is canonical. This mechanism gives the user complete flexibility while avoiding unnecessary computations when, for example, constructing the collineation group of a user-defined polar space.

The following five operations always return polar spaces induced by one of the above standard forms.

##### 7.2-1 SymplecticSpace

`‣ SymplecticSpace`( d, F ) | ( operation )

`‣ SymplecticSpace`( d, q ) | ( operation )

Returns: a symplectic polar space

This function returns the symplectic polar space of dimension d over F for a field F or over GF(q) for a prime power q.

    gap> ps := SymplecticSpace(3,4);
    W(3, 4)
    gap> Display(ps);
    W(3, 4)
    Symplectic form
    Gram Matrix:
     . 1 . .
     1 . . .
     . . . 1
     . . 1 .
    Witt Index: 2

##### 7.2-2 HermitianPolarSpace

`‣ HermitianPolarSpace`( d, F ) | ( operation )

`‣ HermitianPolarSpace`( d, q ) | ( operation )

Returns: a Hermitian polar space

This function returns the Hermitian polar space of dimension d over F for a field F or over GF(q) for a prime power q.

    gap> ps := HermitianPolarSpace(2,25);
    H(2, 5^2)
    gap> Display(ps);
    H(2, 25)
    Hermitian form
    Gram Matrix:
     1 . .
     . 1 .
     . . 1
    Polynomial: [ [  x_1^6+x_2^6+x_3^6 ] ]
    Witt Index: 1

##### 7.2-3 ParabolicQuadric

`‣ ParabolicQuadric`( d, F ) | ( operation )

`‣ ParabolicQuadric`( d, q ) | ( operation )

Returns: a parabolic quadric

d must be an even positive integer. This function returns the parabolic quadric of dimension d over F for a field F or over GF(q) for a prime power q.

    gap> ps := ParabolicQuadric(2,9);
    Q(2, 9)
    gap> Display(ps);
    Q(2, 9)
    Parabolic bilinear form
    Gram Matrix:
     1 . .
     . . 2
     . 2 .
    Polynomial: [ [  x_1^2+x_2*x_3 ] ]
    Witt Index: 1
    gap> ps := ParabolicQuadric(4,16);
    Q(4, 16)
    gap> Display(ps);
    Q(4, 16)
    Parabolic quadratic form
    Gram Matrix:
     1 . . . .
     . . 1 . .
     . . . . .
     . . . . 1
     . . . . .
    Polynomial: [ [  x_1^2+x_2*x_3+x_4*x_5 ] ]
    Witt Index: 2
    Bilinear form
    Gram Matrix:
     . . . . .
     . . 1 . .
     . 1 . . .
     . . . . 1
     . . . 1 .

##### 7.2-4 HyperbolicQuadric

`‣ HyperbolicQuadric`( d, F ) | ( operation )

`‣ HyperbolicQuadric`( d, q ) | ( operation )

Returns: a hyperbolic quadric

d must be an odd positive integer. This function returns the hyperbolic quadric of dimension d over F for a field F or over GF(q) for a prime power q.

    gap> ps := HyperbolicQuadric(5,3);
    Q+(5, 3)
    gap> Display(ps);
    Q+(5, 3)
    Hyperbolic bilinear form
    Gram Matrix:
     . 2 . . . .
     2 . . . . .
     . . . 2 . .
     . . 2 . . .
     . . . . . 2
     . . . . 2 .
    Polynomial: [ [  x_1*x_2+x_3*x_4+x_5*x_6 ] ]
    Witt Index: 3
    gap> ps := HyperbolicQuadric(3,4);
    Q+(3, 4)
    gap> Display(ps);
    Q+(3, 4)
    Hyperbolic quadratic form
    Gram Matrix:
     . 1 . .
     . . . .
     . . . 1
     . . . .
    Polynomial: [ [  x_1*x_2+x_3*x_4 ] ]
    Witt Index: 2
    Bilinear form
    Gram Matrix:
     . 1 . .
     1 . . .
     . . . 1
     . . 1 .

##### 7.2-5 EllipticQuadric

`‣ EllipticQuadric`( d, F ) | ( operation )

`‣ EllipticQuadric`( d, q ) | ( operation )

Returns: an elliptic quadric

d must be an odd positive integer. This function returns the elliptic quadric of dimension d over F for a field F or over GF(q) for a prime power q.

    gap> ps := EllipticQuadric(3,27);
    Q-(3, 27)
    gap> Display(ps);
    Q-(3, 27)
    Elliptic bilinear form
    Gram Matrix:
     1 . . .
     . 1 . .
     . . . 2
     . . 2 .
    Polynomial: [ [  x_1^2+x_2^2+x_3*x_4 ] ]
    Witt Index: 1
    gap> ps := EllipticQuadric(5,8);
    Q-(5, 8)
    gap> Display(ps);
    Q-(5, 8)
    Elliptic quadratic form
    Gram Matrix:
     1 1 . . . .
     . 1 . . . .
     . . . 1 . .
     . . . . . .
     . . . . . 1
     . . . . . .
    Polynomial: [ [  x_1^2+x_1*x_2+x_2^2+x_3*x_4+x_5*x_6 ] ]
    Witt Index: 2
    Bilinear form
    Gram Matrix:
     . 1 . . . .
     1 . . . . .
     . . . 1 . .
     . . 1 . . .
     . . . . . 1
     . . . . 1 .

The following operations are applicable on any classical polar space in FinInG.

##### 7.2-6 IsCanonicalPolarSpace

`‣ IsCanonicalPolarSpace`( ps ) | ( attribute )

Returns: true or false

This attribute returns true when a polar space with a particular underlying form is canonical. The execution of this attribute on a general user constructed polar space needs to check the type of ps. The obtained extra information is stored automatically as attribute for ps, as can be noted by the different printing of ps before and after execution.

    gap> mat := [[0,1,0,0],[0,0,0,0],[0,0,0,1],[0,0,0,0]]*Z(5)^0;
    [ [ 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5) ], [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ],
      [ 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0 ], [ 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ] ]
    gap> form := QuadraticFormByMatrix(mat,GF(5));
    < quadratic form >
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(3,GF(5)): x_1*x_2+x_3*x_4=0 >
    gap> IsCanonicalPolarSpace(ps);
    true
    gap> ps;
    Q+(3, 5): x_1*x_2+x_3*x_4=0
    gap> mat := [[1,0,0],[0,0,1],[0,1,0]]*Z(3)^0;
    [ [ Z(3)^0, 0*Z(3), 0*Z(3) ], [ 0*Z(3), 0*Z(3), Z(3)^0 ],
      [ 0*Z(3), Z(3)^0, 0*Z(3) ] ]
    gap> form := QuadraticFormByMatrix(mat,GF(3));
    < quadratic form >
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(2,GF(3)): x_1^2-x_2*x_3=0 >
    gap> IsCanonicalPolarSpace(ps);
    false
    gap> ps;
    Q(2, 3): x_1^2-x_2*x_3=0

##### 7.2-7 CanonicalPolarSpace

`‣ CanonicalPolarSpace`( form ) | ( operation )

`‣ CanonicalPolarSpace`( P ) | ( operation )

Returns: a classical polar space

the canonical polar space isometric to the given polar space P or the classical polar space with underlying form form.

##### 7.2-8 StandardPolarSpace

`‣ StandardPolarSpace`( form ) | ( operation )

`‣ StandardPolarSpace`( P ) | ( operation )

Returns: a classical polar space

the polar space induced by a standard form and similar to the given polar space P or the classical polar space with underlying form form.

#### 7.3 Basic operations for finite classical polar spaces

##### 7.3-1 UnderlyingVectorSpace

`‣ UnderlyingVectorSpace`( ps ) | ( operation )

Returns: a vector space

The polar space ps is the geometry associated with a sesquilinear or quadratic form \(f\). The vector space on which \(f\) is acting is returned.

    gap> ps := EllipticQuadric(5,4);
    Q-(5, 4)
    gap> vs := UnderlyingVectorSpace(ps);
    ( GF(2^2)^6 )
    gap> ps := SymplecticSpace(3,81);
    W(3, 81)
    gap> vs := UnderlyingVectorSpace(ps);
    ( GF(3^4)^4 )

##### 7.3-2 AmbientSpace

`‣ AmbientSpace`( ps ) | ( operation )

Returns: the ambient projective space

When ps is a polar space, this operation returns the ambient projective space, i.e. the underlying projective space of the sesquilinear or quadratic form that defines ps.

    gap> ps := EllipticQuadric(5,4);
    Q-(5, 4)
    gap> AmbientSpace(ps);
    ProjectiveSpace(5, 4)
    gap> ps := SymplecticSpace(3,81);
    W(3, 81)
    gap> AmbientSpace(ps);
    ProjectiveSpace(3, 81)

##### 7.3-3 ProjectiveDimension

`‣ ProjectiveDimension`( ps ) | ( operation )

`‣ Dimension`( ps ) | ( operation )

Returns: the dimension of the ambient projective space of ps

When ps is a polar space, an ambient projective space \(P\) is uniquely defined and can be asked using `AmbientSpace`. This operation and its synonym `Dimension` returns the dimension of \(P\).

    gap> ps := EllipticQuadric(5,4);
    Q-(5, 4)
    gap> ProjectiveDimension(ps);
    5
    gap> ps := SymplecticSpace(3,81);
    W(3, 81)
    gap> ProjectiveDimension(ps);
    3

##### 7.3-4 Rank

`‣ Rank`( ps ) | ( operation )

Returns: the rank of ps

When ps is a polar space, its rank, i.e. the number of different types, equals the Witt index of the defining sesquilinear or quadratic form.

    gap> ps := EllipticQuadric(5,4);
    Q-(5, 4)
    gap> Rank(ps);
    2
    gap> ps := HyperbolicQuadric(5,4);
    Q+(5, 4)
    gap> Rank(ps);
    3
    gap> ps := SymplecticSpace(7,81);
    W(7, 81)
    gap> Rank(ps);
    4

##### 7.3-5 BaseField

`‣ BaseField`( ps ) | ( operation )

Returns: the base field of the polar space ps

    gap> ps := HyperbolicQuadric(5,7);
    Q+(5, 7)
    gap> BaseField(ps);
    GF(7)
    gap> ps := HermitianPolarSpace(2,256);
    H(2, 16^2)
    gap> BaseField(ps);
    GF(2^8)

##### 7.3-6 IsHyperbolicQuadric

`‣ IsHyperbolicQuadric`( ps ) | ( property )

Returns: true or false

returns true if and only if ps is a hyperbolic quadric.

    gap> mat := IdentityMat(6,GF(5));
    < mutable compressed matrix 6x6 over GF(5) >
    gap> form := BilinearFormByMatrix(mat,GF(5));
    < bilinear form >
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(
    5,GF(5)): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2=0 >
    gap> IsHyperbolicQuadric(ps);
    true
    gap> mat := IdentityMat(6,GF(7));
    < mutable compressed matrix 6x6 over GF(7) >
    gap> form := BilinearFormByMatrix(mat,GF(7));
    < bilinear form >
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(
    5,GF(7)): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2=0 >
    gap> IsHyperbolicQuadric(ps);
    false

##### 7.3-7 IsEllipticQuadric

`‣ IsEllipticQuadric`( ps ) | ( property )

Returns: true or false

returns true if and only if ps is an elliptic quadric.

    gap> mat := IdentityMat(6,GF(5));
    < mutable compressed matrix 6x6 over GF(5) >
    gap> form := BilinearFormByMatrix(mat,GF(5));
    < bilinear form >
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(
    5,GF(5)): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2=0 >
    gap> IsEllipticQuadric(ps);
    false
    gap> mat := IdentityMat(6,GF(7));
    < mutable compressed matrix 6x6 over GF(7) >
    gap> form := BilinearFormByMatrix(mat,GF(7));
    < bilinear form >
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(
    5,GF(7)): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2=0 >
    gap> IsEllipticQuadric(ps);
    true

##### 7.3-8 IsParabolicQuadric

`‣ IsParabolicQuadric`( ps ) | ( property )

Returns: true or false

returns true if and only if ps is a parabolic quadric.

    gap> mat := IdentityMat(5,GF(9));
    [ [ Z(3)^0, 0*Z(3), 0*Z(3), 0*Z(3), 0*Z(3) ],
      [ 0*Z(3), Z(3)^0, 0*Z(3), 0*Z(3), 0*Z(3) ],
      [ 0*Z(3), 0*Z(3), Z(3)^0, 0*Z(3), 0*Z(3) ],
      [ 0*Z(3), 0*Z(3), 0*Z(3), Z(3)^0, 0*Z(3) ],
      [ 0*Z(3), 0*Z(3), 0*Z(3), 0*Z(3), Z(3)^0 ] ]
    gap> form := BilinearFormByMatrix(mat,GF(9));
    < bilinear form >
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(4,GF(3^2)): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2=0 >
    gap> IsParabolicQuadric(ps);
    true
    gap> mat := [[1,0,0,0,0],[0,0,1,0,0],[0,0,0,0,0],[0,0,0,0,1],[0,0,0,0,0]]*Z(2)^0;
    [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ],
      [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2) ],
      [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ],
      [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0 ],
      [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ] ]
    gap> form := QuadraticFormByMatrix(mat,GF(8));
    < quadratic form >
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(4,GF(2^3)): x_1^2+x_2*x_3+x_4*x_5=0 >
    gap> IsParabolicQuadric(ps);
    true

#### 7.4 Subspaces of finite classical polar spaces

The elements of a finite classical polar space \(P\) are the subspaces of the ambient projective space that are totally isotropic with relation to the sesquilinear or quadratic form that defines \(P\). Constructing subspaces of finite classical polar spaces is done as in the projective space case, except that additional checks are implemented in the methods to check that the subspace of the vector space is totally isotropic. The empty subspace, also called the trivial subspace, which has dimension -1, corresponds with the zero dimensional vector space of the underlying vector space of the ambient projective space of \(P\), and is of course totally isotropic. As such, is is considered as a subspace of a finite classical polar space in the mathematical sense, but not as an element of the incidence geometry, and hence do in FinInG not belong to the category `IsSubspaceOfClassicalPolarSpace`.

##### 7.4-1 VectorSpaceToElement

`‣ VectorSpaceToElement`( ps, v ) | ( operation )

Returns: an element of the polar space geo

Let ps be a polar space, and v is either a row vector (for points) or an \(m\)x\(n\) matrix (for an \((m-1)\)-subspace of a polar space with an \((n-1)\)-dimensional ambient projective space. In the case that v is a matrix, the rows represent basis vectors for the subspace. An exceptional case is when v is a zero-vector, whereby the trivial subspace is returned. It is checked that the subspace defined by \(v\) is totally isotropic with relation to the form defining ps.

    gap> ps := SymplecticSpace(3,4);
    W(3, 4)
    gap> v := [1,0,1,0]*Z(4)^0;
    [ Z(2)^0, 0*Z(2), Z(2)^0, 0*Z(2) ]
    gap> p := VectorSpaceToElement(ps,v);
    <a point in W(3, 4)>
    gap> mat := [[1,1,0,1],[0,0,1,0]]*Z(4)^0;
    [ [ Z(2)^0, Z(2)^0, 0*Z(2), Z(2)^0 ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ] ]
    gap> line := VectorSpaceToElement(ps,mat);
    Error, <x> does not generate an element of <geom> called from
    <function "unknown">( <arguments> )
     called from read-eval loop at line 12 of *stdin*
    you can 'quit;' to quit to outer loop, or
    you can 'return;' to continue
    brk> quit;
    gap> mat := [[1,1,0,0],[0,0,1,0]]*Z(4)^0;
    [ [ Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2) ], [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2) ] ]
    gap> line := VectorSpaceToElement(ps,mat);
    <a line in W(3, 4)>
    gap> p := VectorSpaceToElement(ps,[0,0,0,0]*Z(4)^0);
    < empty subspace >

##### 7.4-2 EmptySubspace

`‣ EmptySubspace`( ps ) | ( operation )

Returns: the trivial subspace in the projective ps

The object returned by this operation is contained in every projective subspace of the projective space ps, but is not an element of ps. Hence, testing incidence results in an error message.

    gap> ps := HermitianPolarSpace(10,49);
    H(10, 7^2)
    gap> e := EmptySubspace(ps);
    < empty subspace >

##### 7.4-3 ProjectiveDimension

`‣ ProjectiveDimension`( sub ) | ( operation )

`‣ Dimension`( sub ) | ( operation )

Returns: the projective dimension of a subspace of a polar space. The operation `ProjectiveDimension` is also applicable on the EmptySubspace

    gap> ps := EllipticQuadric(7,8);
    Q-(7, 8)
    gap> mat := [[0,0,1,0,0,0,0,0],[0,0,0,0,1,0,0,0]]*Z(8)^0;
    [ [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2) ],
      [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2) ] ]
    gap> line := VectorSpaceToElement(ps,mat);
    <a line in Q-(7, 8)>
    gap> ProjectiveDimension(line);
    1
    gap> Dimension(line);
    1
    gap> e := EmptySubspace(ps);
    < empty subspace >
    gap> ProjectiveDimension(e);
    -1

##### 7.4-4 ElementsOfIncidenceStructure

`‣ ElementsOfIncidenceStructure`( ps, j ) | ( operation )

Returns: the collection of elements of the projective space ps of type j

For the projective space ps of dimension \(d\) and the type j, \(1 \leq j \leq d\) this operation returns the collection of \(j-1\) dimensional subspaces.

    gap> ps := HermitianPolarSpace(8,13^2);
    H(8, 13^2)
    gap> planes := ElementsOfIncidenceStructure(ps,3);
    <planes of H(8, 13^2)>
    gap> solids := ElementsOfIncidenceStructure(ps,4);
    <solids of H(8, 13^2)>
    gap> ElementsOfIncidenceStructure(ps,5);
    Error, <geo> has no elements of type <j> called from
    <function "unknown">( <arguments> )
     called from read-eval loop at line 11 of *stdin*
    you can 'quit;' to quit to outer loop, or
    you can 'return;' to continue
    brk> quit;

##### 7.4-5 AmbientSpace

`‣ AmbientSpace`( el ) | ( operation )

Returns: returns the ambient space of an element el of a polar space

This operation is also applicable on the trivial subspace. For a Lie geometry, the ambient space of an element is defined as the ambient space of the Lie geometry, i.e. a projective space.

    gap> ps := HermitianPolarSpace(3,7^2);
    H(3, 7^2)
    gap> line := VectorSpaceToElement(ps,[[Z(7)^0,0*Z(7),Z(7^2)^34,Z(7^2)^44],
    > [0*Z(7),Z(7)^0,Z(7^2)^2,Z(7^2)^4]]);
    <a line in H(3, 7^2)>
    gap> AmbientSpace(line);
    ProjectiveSpace(3, 49)

##### 7.4-6 Coordinates

`‣ Coordinates`( p ) | ( operation )

Returns: the homogeneous coordinates of the point p

    gap> ps := ParabolicQuadric(6,5);
    Q(6, 5)
    gap> p := VectorSpaceToElement(ps,[0,1,0,0,0,0,0]*Z(5)^0);
    <a point in Q(6, 5)>
    gap> Coordinates(p);
    [ 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5), 0*Z(5) ]

#### 7.5 Basic operations for polar spaces and subspaces of projective spaces

##### 7.5-1 Incidence and containment

`‣ IsIncident`( el1, el2 ) | ( operation )

`‣ \*`( el1, el2 ) | ( operation )

`‣ \in`( el1, el2 ) | ( operation )

Returns: true or false

Recall that for projective spaces, incidence is symmetrized containment, where the empty subspace and the whole projective space are excluded as arguments for this operation, since they are not considered as elements of the geometry, but both the empty subspace and the whole projective space are allowed as arguments for `\in`.

    gap> ps := HyperbolicQuadric(7,7);
    Q+(7, 7)
    gap> p := VectorSpaceToElement(ps,[1,0,1,0,0,0,0,0]*Z(7)^0);
    <a point in Q+(7, 7)>
    gap> l := VectorSpaceToElement(ps,[[1,0,1,0,0,0,0,0],[0,-1,0,1,0,0,0,0]]*Z(7)^0);
    <a line in Q+(7, 7)>
    gap> p * l;
    true
    gap> l * p;
    true
    gap> IsIncident(p,l);
    true
    gap> p in l;
    true
    gap> l in p;
    false
    gap> e := EmptySubspace(ps);
    < empty subspace >
    gap> e * l;
    Error, no method found! For debugging hints type ?Recovery from NoMethodFound
    Error, no 1st choice method found for `*' on 2 arguments called from
    <function "HANDLE_METHOD_NOT_FOUND">( <arguments> )
     called from read-eval loop at line 17 of *stdin*
    you can 'quit;' to quit to outer loop, or
    you can 'return;' to continue
    brk> quit;
    gap> e in l;
    true
    gap> l in ps;
    true

##### 7.5-2 Span

`‣ Span`( u, v ) | ( operation )

Returns: an element

u and v are elements of a projective or polar space. This function returns the join of the two elements, that is, the span of the two subspaces.

    gap> ps := HyperbolicQuadric(5,2);
    Q+(5, 2)
    gap> p := Random(Planes(ps));
    <a plane in Q+(5, 2)>
    gap> q := Random(Planes(ps));
    <a plane in Q+(5, 2)>
    gap> s := Span(p,q);
    <a proj. 4-space in ProjectiveSpace(5, 2)>
    gap> s = Span([p,q]);
    true
    gap> t := Span(EmptySubspace(ps),p);
    <a plane in Q+(5, 2)>
    gap> t = p;
    true

##### 7.5-3 Meet

`‣ Meet`( u, v ) | ( operation )

Returns: an element

u and v are elements of a projective or polar space. This function returns the meet of the two elements. If two elements do not meet, then Meet returns `EmptySubspace`, which in FinInG, is an element with projective dimension -1. (Note that the poset of subspaces of a polar space is a meet-semilattice, but not closed under taking spans).

    gap> ps := HyperbolicQuadric(5,3);
    Q+(5, 3)
    gap> pi := Random( Planes(ps) );
    <a plane in Q+(5, 3)>
    gap> tau := Random( Planes(ps) );
    <a plane in Q+(5, 3)>
    gap> Meet(pi,tau);
    <a point in Q+(5, 3)>

Note: the above example will return different answers depending on the two planes chosen at random.

##### 7.5-4 IsCollinear

`‣ IsCollinear`( ps, u, v ) | ( operation )

Returns: Boolean

u and v are points of the ambient space of the polar space ps. This function returns True if u and v are collinear in ps. Note that belonging to ps is a necessary condition for u and v to be collinear.

    gap> ps := ParabolicQuadric(4,9);
    Q(4, 9)
    gap> p := VectorSpaceToElement(PG(4,9),[0,1,0,0,0]*Z(9)^0);
    <a point in ProjectiveSpace(4, 9)>
    gap> q := VectorSpaceToElement(PG(4,9),[0,0,1,0,0]*Z(9)^0);
    <a point in ProjectiveSpace(4, 9)>
    gap> r := VectorSpaceToElement(PG(4,9),[0,0,0,1,0]*Z(9)^0);
    <a point in ProjectiveSpace(4, 9)>
    gap> p in ps;
    true
    gap> q in ps;
    true
    gap> r in ps;
    true
    gap> IsCollinear(ps,p,q);
    false
    gap> IsCollinear(ps,p,r);
    true
    gap> IsCollinear(ps,q,r);
    true
    gap> ps := ParabolicQuadric(4,4);
    Q(4, 4)
    gap> p := VectorSpaceToElement(PG(4,4),[1,0,0,0,0]*Z(2)^0);
    <a point in ProjectiveSpace(4, 4)>
    gap> q := VectorSpaceToElement(PG(4,4),[0,1,0,0,0]*Z(2)^0);
    <a point in ProjectiveSpace(4, 4)>
    gap> r := VectorSpaceToElement(PG(4,4),[0,0,0,1,0]*Z(2)^0);
    <a point in ProjectiveSpace(4, 4)>
    gap> p in ps;
    false
    gap> q in ps;
    true
    gap> r in ps;
    true
    gap> IsCollinear(ps,p,q);
    false
    gap> IsCollinear(ps,q,r);
    true

##### 7.5-5 PolarityOfProjectiveSpace

`‣ PolarityOfProjectiveSpace`( ps ) | ( operation )

Returns: a polarity of a projective space

ps must be a polar space. This operation returns, when possible a polarity of the ambient projective space of ps. It is well known that except for orthogonal polar spaces in even characteristic, a classical polar space is in fact the geometry of absolute points of a polarity of a projective space, and that no polarity can be associated to parabolic quadrics in even characteristic. Polarities of projective spaces are discussed in more detail in Chapter 6.

    gap> ps := SymplecticSpace(5,9);
    W(5, 9)
    gap> phi := PolarityOfProjectiveSpace(ps);
    <polarity of PG(5, GF(3^2)) >
    gap> ps := EllipticQuadric(3,4);
    Q-(3, 4)
    gap> phi := PolarityOfProjectiveSpace(ps);
    <polarity of PG(3, GF(2^2)) >
    gap> ps := ParabolicQuadric(4,4);
    Q(4, 4)
    gap> phi := PolarityOfProjectiveSpace(ps);
    Error, no polarity of the ambient projective space can be associated to <ps> called from
    <function "unknown">( <arguments> )
     called from read-eval loop at line 13 of *stdin*
    you can 'quit;' to quit to outer loop, or
    you can 'return;' to continue
    brk> quit;

##### 7.5-6 TypeOfSubspace

`‣ TypeOfSubspace`( ps, v ) | ( operation )

Returns: a string

This operation is a convenient way to find out the intersection type of a projective subspace with a polar space. The argument ps is a nondegenerate polar space, and the argument v is a subspace of the ambient projective space. The operation returns a string in accordance with the type of subspace: "degenerate", "symplectic", "hermitian", "elliptic", "hyperbolic" or "parabolic".

    gap> h1 := HermitianPolarSpace(2, 3^2);
    H(2, 3^2)
    gap> h2 := HermitianPolarSpace(3, 3^2);
    H(3, 3^2)
    gap> pg := AmbientSpace( h2 );
    ProjectiveSpace(3, 9)
    gap> pi := VectorSpaceToElement( pg, [[1,0,0,0],[0,1,0,0],[0,0,1,0]] * Z(9)^0 );
    <a plane in ProjectiveSpace(3, 9)>
    gap> TypeOfSubspace(h2, pi);
    "hermitian"
    gap> pi := VectorSpaceToElement( pg, [[1,0,0,0],[0,1,0,0],[0,0,1,Z(9)]] * Z(9)^0 );
    <a plane in ProjectiveSpace(3, 9)>
    gap> TypeOfSubspace(h2, pi);
    "degenerate"

##### 7.5-7 TangentSpace

`‣ TangentSpace`( el ) | ( operation )

`‣ TangentSpace`( ps, el ) | ( operation )

Returns: A subspace of a projective space

Let el be an element of a classical polar space. The first version returns the tangent space at el to this polar space. Let el be a subspace of the ambient space of the polar space ps. The second version checks whether el belongs to ps and returns the tangent space at el to ps. Some obvious properties are demonstrated in the example.

    gap> ps := HermitianPolarSpace(3,4^2);
    H(3, 4^2)
    gap> p := Random(Points(ps));
    <a point in H(3, 4^2)>
    gap> plane := TangentSpace(p);
    <a plane in ProjectiveSpace(3, 16)>
    gap> TypeOfSubspace(ps,plane);
    "degenerate"
    gap> ps := ParabolicQuadric(6,4);
    Q(6, 4)
    gap> p := VectorSpaceToElement(PG(6,4),[0,1,0,0,0,0,0]*Z(4)^0);
    <a point in ProjectiveSpace(6, 4)>
    gap> hyp := TangentSpace(ps,p);
    <a proj. 5-space in ProjectiveSpace(6, 4)>
    gap> NucleusOfParabolicQuadric(ps) in hyp;
    true
    gap> ps := EllipticQuadric(5,2);
    Q-(5, 2)
    gap> line := Random(Lines(ps));
    <a line in Q-(5, 2)>
    gap> TangentSpace(line);
    <a solid in ProjectiveSpace(5, 2)>
    gap> ps := HermitianPolarSpace(5,4);
    H(5, 2^2)
    gap> plane := Random(Planes(ps));
    <a plane in H(5, 2^2)>
    gap> tan := TangentSpace(plane);
    <a plane in ProjectiveSpace(5, 4)>
    gap> tan in ps;
    true
    gap> tan = plane;
    true

##### 7.5-8 Pole

`‣ Pole`( ps, el ) | ( operation )

Returns: A subspace of a projective space

Let el be a subspace of the ambient space of the polar space ps. This operation returns the pole of el with relation to the polar space ps.

    gap> conic := ParabolicQuadric(2,13);
    Q(2, 13)
    gap> p := VectorSpaceToElement(PG(2,13),[1,0,0]*Z(13)^0);
    <a point in ProjectiveSpace(2, 13)>
    gap> pole := Pole(conic,p);
    <a line in ProjectiveSpace(2, 13)>
    gap> TypeOfSubspace(conic,pole);
    "hyperbolic"
    gap> tangent_points := Filtered(Points(pole),x->x in conic);
    [ <a point in ProjectiveSpace(2, 13)>, <a point in ProjectiveSpace(2, 13)> ]
    gap> tangent_lines_on_p := List(tangent_points,x->Span(x,p));
    [ <a line in ProjectiveSpace(2, 13)>, <a line in ProjectiveSpace(2, 13)> ]
    gap> List(tangent_lines_on_p,x->Number(Points(x),y->y in conic));
    [ 1, 1 ]

##### 7.5-9 EvaluateForm

`‣ EvaluateForm`( form, el1 ) | ( operation )

`‣ EvaluateForm`( form, el1, el2 ) | ( operation )

`‣ \^`( form, el1 ) | ( operation )

`‣ \^`( form, el1, el2 ) | ( operation )

Returns: a finite field element or a list (of lists) of finite field elements

This method passes form and the underlying vector or matrix of el1, when form is a quadratic form, and el1 and el2 when form is a sesquilinear form to the operation `Evaluate` of the package Forms. The same applies to the respective methods for `\^`. The example below illustrates how the points of a projective space that evaluate to zero under a given form, are precisely the points of the quadric associated with the given form.

    gap> f := GF(5);
    GF(5)
    gap> mat := IdentityMat(4,f);
    [ [ Z(5)^0, 0*Z(5), 0*Z(5), 0*Z(5) ], [ 0*Z(5), Z(5)^0, 0*Z(5), 0*Z(5) ],
      [ 0*Z(5), 0*Z(5), Z(5)^0, 0*Z(5) ], [ 0*Z(5), 0*Z(5), 0*Z(5), Z(5)^0 ] ]
    gap> form := BilinearFormByMatrix(mat,f);
    < bilinear form >
    gap> pg := PG(3,5);
    ProjectiveSpace(3, 5)
    gap> pts := Filtered(Points(pg),x->[x,x]^form = Zero(f));;
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(3,GF(5)): x_1^2+x_2^2+x_3^2+x_4^2=0 >
    gap> Collected(List(pts,x->x in ps));
    [ [ true, 36 ] ]
    gap> Size(Points(ps));
    36
    gap> qform := QuadraticForm(ps);
    < quadratic form >
    gap> pts2 := Filtered(Points(pg),x->x^qform = Zero(f));;
    gap> Collected(List(pts2,x->x in ps));
    [ [ true, 36 ] ]

#### 7.6 Shadow of elements

The functionality in this section is comparable to the shadow functionality for elements of projective spaces, which are described in Section 4.3. The generic description of shadows of elements of incidence structures can be found in Section 3.4.

##### 7.6-1 ShadowOfElement

`‣ ShadowOfElement`( ps, el, i ) | ( operation )

`‣ ShadowOfElement`( ps, el, str ) | ( operation )

Returns: the elements of type i incident with el. The second variant determines the type i from the position of str in the list returned by `TypesOfElementsOfIncidenceStructurePlural`

    gap> id := IdentityMat(8,GF(7));
    < mutable compressed matrix 8x8 over GF(7) >
    gap> form := BilinearFormByMatrix(id,GF(7));
    < bilinear form >
    gap> ps := PolarSpace(form);
    <polar space in ProjectiveSpace(
    7,GF(7)): 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> Rank(ps);
    4
    gap> ps;
    Q+(7, 7): 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> mat := [[1,0,0,0,3,2,0,0],[0,1,0,0,0,0,3,2],[0,0,1,0,5,3,0,0]]*Z(7)^0;
    [ [ Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), Z(7), Z(7)^2, 0*Z(7), 0*Z(7) ],
      [ 0*Z(7), Z(7)^0, 0*Z(7), 0*Z(7), 0*Z(7), 0*Z(7), Z(7), Z(7)^2 ],
      [ 0*Z(7), 0*Z(7), Z(7)^0, 0*Z(7), Z(7)^5, Z(7), 0*Z(7), 0*Z(7) ] ]
    gap> plane := VectorSpaceToElement(ps,mat);
    <a plane in Q+(7, 7): 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> time;
    1
    gap> shadow := ShadowOfElement(ps,plane,4);
    <shadow solids in Q+(7, 7): 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> List(shadow);
    [ <a solid in Q+(7, 7): 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>,
      <a solid in Q+(7, 7): 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> shadow := ShadowOfElement(ps,plane,2);
    <shadow lines in Q+(7, 7): 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>

##### 7.6-2 ElementsIncidentWithElementOfIncidenceStructure

`‣ ElementsIncidentWithElementOfIncidenceStructure`( el, i ) | ( operation )

Returns: the elements of type i incident with el, in other words, the type i shadow of the element el

Internally, the function `FlagOfIncidenceStructure` is used to create a flag from list. This function also performs the checking.

    gap> ps := HyperbolicQuadric(11,2);
    Q+(11, 2)
    gap> vec := [[Z(2)^0,0*Z(2),0*Z(2),0*Z(2),0*Z(2),Z(2)^0,0*Z(2),Z(2)^0,Z(2)^0,
    > 0*Z(2),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,
    > 0*Z(2),Z(2)^0,Z(2)^0],
    > [0*Z(2),0*Z(2),Z(2)^0,0*Z(2),0*Z(2),Z(2)^0,0*Z(2),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,0*Z(2),Z(2)^0,0*Z(2),Z(2)^0,0*Z(2),
    > 0*Z(2),Z(2)^0,0*Z(2)],
    > [0*Z(2),0*Z(2),0*Z(2),0*Z(2),Z(2)^0,Z(2)^0,0*Z(2),0*Z(2),0*Z(2),
    > Z(2)^0,Z(2)^0,Z(2)^0]];
    [ [ Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), Z(2)^0, Z(2)^0,
          0*Z(2), 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,
          0*Z(2), Z(2)^0, Z(2)^0 ],
      [ 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 0*Z(2), Z(2)^0, 0*Z(2), 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, 0*Z(2), Z(2)^0, 0*Z(2), Z(2)^0, 0*Z(2),
          0*Z(2), Z(2)^0, 0*Z(2) ],
      [ 0*Z(2), 0*Z(2), 0*Z(2), 0*Z(2), Z(2)^0, Z(2)^0, 0*Z(2), 0*Z(2), 0*Z(2),
          Z(2)^0, Z(2)^0, Z(2)^0 ] ]
    gap> subspace := VectorSpaceToElement(ps,vec);
    <a proj. 4-space in Q+(11, 2)>
    gap> els := ElementsIncidentWithElementOfIncidenceStructure(subspace,6);
    <shadow proj. subspaces of dim. 5 in Q+(11, 2)>
    gap> List(els);
    [ <a proj. 5-space in Q+(11, 2)>, <a proj. 5-space in Q+(11, 2)> ]

#### 7.7 Projective Orthogonal/Unitary/Symplectic groups in FinInG

The classical groups (apart from the general lines group), are the matrix groups that respect, in a certain way, a sesquilinear or quadratic form. We formally recall the definitions used in FinInG. These definitions are exactly the same as in Forms.

Let \((V,f)\) and \((W,g)\) be two formed vector spaces over the same field \(F\), where both \(f\) and \(g\) are sesquilinear forms. Suppose that \(\phi\) is a linear map from \(V\) to \(W\). The map \(\phi\) is an isometry from the formed space \((V,f)\) to the formed space \((W,g)\) if for all \(v,w\) in \(V\) we have

\[f(v,w) = f'(\phi(v), \phi(w)).\]

The map \(\phi\) is a similarity from the formed space \((V,f)\) to the formed space \((W,g)\) if for all \(v,w\) in \(V\) we have

\[f(v,w) = \lambda f'(\phi(v), \phi(w))\]

for some non-zero \(\lambda \in F\). Finally, the map \(\phi\) is a semi-similarity from the formed space \((V,f)\) to the formed space \((W,g)\) if for all \(v,w\) in \(V\) we have

\[f(v,w) = \lambda f'(\phi(v), \phi(w))^\alpha\]

for some non-zero λ in \(F\) \(\lambda \in F\) and a field automorphism \(\alpha\) of \(F\).

Let \((V,f)\) and \((W,g)\) be two formed vector spaces over the same field \(F\), where both \(f\) and \(g\) are quadratic forms. Suppose that \(\phi\) is a linear map from \(V\) to \(W\). The map \(\phi\) is an isometry from the formed space \((V,f)\) to the formed space \((W,g)\) if for all \(v,w\) in \(V\) we have

\[f(v) = f'(\phi(v)).\]

The map \(\phi\) is a similarity from the formed space \((V,f)\) to a formed space \((W,g)\) if for all \(v,w\) in \(V\) we have

\[f(v) = \lambda f'(\phi(v))\]

\[f(v) = \lambda f'(\phi(v))\]

for some non-zero \(\lambda \in F\). Finally, the map \(\phi\) is a semi-similarity from the formed space \((V,f)\) to the formed space \((W,g)\) if for all \(v,w\) in \(V\) we have

\[f(v)=\lambda f'(\phi(v))^\alpha\]

for some non-zero \(\lambda \in F\) and a field automorphism \(\alpha\) of \(F\).

Collineations of classical polar spaces are induced by semi-similarities of the underlying formed vector space, and vice versa, analogously by factoring out scalar matrices. The only exceptions are the two-dimensional unitary groups where the the full semi-similarity group can contain elements of its centre that are not scalars. In FinInG, the subgroups corresponding with similarities and isometries are also implemented, including a special variant, corresponding with the matrices having determinant one. We use a consistent terminology, where isometries, similarities, respectively, of the polar space, correspond with isometries, similarities, respectively, of the underlying formed vector space. Special isometries of a polar space are induced by isometries of the formed vector space that have a matrix with determinant one. If \(P\) is a polar space with special isometry group, isometry group, similarity group, collineation group, respectively, \(S\), \(I\), \(G\), \(\Gamma\)Γ, respectively, then clearly \(S \leqslant I \leqslant G \leqslant \Gamma\) . Equalities can occur in certain cases, and will, as we will see in the following overview.

Table: projective finite classical groups
(sub)group | symplectic | hyperbolic | elliptic | parabolic | hermitian
special isometry | \(\mathrm{PSp}(d,q)\) | \(\mathrm{PSO}(1,d,q)\) | \(\mathrm{PSO}(-1,d,q)\) | \(\mathrm{PSO}(0,d,q)\) | \(\mathrm{PSU}(d,q^2)\)
isometry | \(\mathrm{PSp}(d,q)\) | \(\mathrm{PGO}(1,d,q)\) | \(\mathrm{PGO}(-1,d,q)\) | \(\mathrm{PGO}(0,d,q)\) | \(\mathrm{PGU}(d,q^2)\)
similarity | \(\mathrm{PGSp}(d,q)\) | \(\mathrm{P}\Delta\mathrm{O}^+(d,q)\) | \(\mathrm{P}\Delta\mathrm{O}^-(d,q)\) | \(\mathrm{PGO}(0,d,q)\) | \(\mathrm{PGU}(d,q^2)\)
collineation | \(\mathrm{P}\Gamma\mathrm{Sp}(d,q)\) | \(\mathrm{P}\Gamma\mathrm{O}^+(d,q)\) | \(\mathrm{P}\Gamma\mathrm{O}^-(d,q)\) | \(\mathrm{P}\Gamma\mathrm{O}(d,q)\) | \(\mathrm{P}\Gamma\mathrm{U}(d,q^2)\)

##### 7.7-1 SpecialIsometryGroup

`‣ SpecialIsometryGroup`( ps ) | ( operation )

Returns: the special isometry group of the polar space ps

    gap> ps := SymplecticSpace(3,4);
    W(3, 4)
    gap> SpecialIsometryGroup(ps);
    PSp(4,4)
    gap> ps := HyperbolicQuadric(5,8);
    Q+(5, 8)
    gap> SpecialIsometryGroup(ps);
    PSO(1,6,8)
    gap> ps := EllipticQuadric(3,27);
    Q-(3, 27)
    gap> SpecialIsometryGroup(ps);
    PSO(-1,4,27)
    gap> ps := ParabolicQuadric(4,8);
    Q(4, 8)
    gap> SpecialIsometryGroup(ps);
    PSO(0,5,8)
    gap> ps := HermitianPolarSpace(4,9);
    H(4, 3^2)
    gap> SpecialIsometryGroup(ps);
    PSU(5,3^2)

##### 7.7-2 IsometryGroup

`‣ IsometryGroup`( ps ) | ( operation )

Returns: the isometry group of the polar space ps

    gap> ps := SymplecticSpace(3,4);
    W(3, 4)
    gap> IsometryGroup(ps);
    PSp(4,4)
    gap> ps := HyperbolicQuadric(5,8);
    Q+(5, 8)
    gap> IsometryGroup(ps);
    PGO(1,6,8)
    gap> ps := EllipticQuadric(3,27);
    Q-(3, 27)
    gap> IsometryGroup(ps);
    PGO(-1,4,27)
    gap> ps := ParabolicQuadric(4,8);
    Q(4, 8)
    gap> IsometryGroup(ps);
    PGO(0,5,8)
    gap> ps := HermitianPolarSpace(4,9);
    H(4, 3^2)
    gap> IsometryGroup(ps);
    PGU(5,3^2)

##### 7.7-3 SimilarityGroup

`‣ SimilarityGroup`( ps ) | ( operation )

Returns: the similarity group of the polar space ps

    gap> ps := SymplecticSpace(3,4);
    W(3, 4)
    gap> SimilarityGroup(ps);
    PGSp(4,4)
    gap> ps := HyperbolicQuadric(5,8);
    Q+(5, 8)
    gap> SimilarityGroup(ps);
    PDeltaO+(6,8)
    gap> ps := EllipticQuadric(3,27);
    Q-(3, 27)
    gap> SimilarityGroup(ps);
    PDeltaO-(4,27)
    gap> ps := ParabolicQuadric(4,8);
    Q(4, 8)
    gap> SimilarityGroup(ps);
    PGO(0,5,8)
    gap> ps := HermitianPolarSpace(4,9);
    H(4, 3^2)
    gap> SimilarityGroup(ps);
    PGU(5,3^2)

##### 7.7-4 CollineationGroup

`‣ CollineationGroup`( ps ) | ( operation )

Returns: the collineation group of the polar space ps

In most cases, the full projective semisimilarity group is returned. For two-dimensional unitary groups, the centre may contain elements that are not scalars. In this case, we return a central extension of the projective semisimilarity group. If the base field of ps is GF(q2), \(q\) prime, the similarity group is returned.

    gap> ps := SymplecticSpace(3,4);
    W(3, 4)
    gap> CollineationGroup(ps);
    PGammaSp(4,4)
    gap> ps := HyperbolicQuadric(5,8);
    Q+(5, 8)
    gap> CollineationGroup(ps);
    PGammaO+(6,8)
    gap> ps := EllipticQuadric(3,27);
    Q-(3, 27)
    gap> CollineationGroup(ps);
    PGammaO-(4,27)
    gap> ps := ParabolicQuadric(4,8);
    Q(4, 8)
    gap> CollineationGroup(ps);
    PGammaO(5,8)
    gap> ps := HermitianPolarSpace(4,9);
    H(4, 3^2)
    gap> CollineationGroup(ps);
    PGammaU(5,3^2)

#### 7.8 Enumerating subspaces of polar spaces

##### 7.8-1 Enumerators for polar spaces

An enumerator for a collection of subspaces of a given type of a polar space is provided in FinInG. If C is such a collection, then `List(C)` will use the enumerator to compute a list with all the elements of C.

##### 7.8-2 Enumerator

`‣ Enumerator`( C ) | ( operation )

`‣ List`( C ) | ( operation )

Returns: an enumerator for the collection C and a list with all elements of C

The argument C is a collection of subspaces of a polar space.

    gap> Enumerator(Points(ParabolicQuadric(6,3)));
    EnumeratorOfSubspacesOfClassicalPolarSpace( <points of Q(6, 3)> )
    gap> Enumerator(Lines(HermitianPolarSpace(4,4)));
    EnumeratorOfSubspacesOfClassicalPolarSpace( <lines of H(4, 2^2)> )
    gap> planes := List(Planes(HermitianPolarSpace(5,4)));;
    gap> time;
    11515
    gap> Length(planes);
    891

##### 7.8-3 Iterators for polar spaces

For all polar spaces an iterator is constructed using `IteratorList(enum)`, where enum is an appropriate enumerator.

##### 7.8-4 Iterator

`‣ Iterator`( elements ) | ( operation )

Returns: an iterator

C is a collection of subspaces of a polar space.

    gap> iter := Iterator(Lines(ParabolicQuadric(4,2)));
    <iterator>
    gap> NextIterator(iter);
    <a line in Q(4, 2)>
    gap> NextIterator(iter);
    <a line in Q(4, 2)>
    gap> NextIterator(iter);
    <a line in Q(4, 2)>
    gap> NextIterator(iter);
    <a line in Q(4, 2)>
    gap> NextIterator(iter);
    <a line in Q(4, 2)>

##### 7.8-5 AsList

`‣ AsList`( subspaces ) | ( operation )

Returns: an Orb object or list

    gap> ps := HyperbolicQuadric(5,3);
    Q+(5, 3)
    gap> lines := AsList(Lines(ps));
    <closed orbit, 520 points>

[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