7 Finite Classical Polar Spaces

In this chapter we describe how to use **FinInG** to work with 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.

`‣ 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.

`‣ 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

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 summerise 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)\).

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 | X_{0}^{2} + X_{1} X_{2} + ... + X_{n-1}X_{n} |
\(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 primitve 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.

`‣ 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

`‣ 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

`‣ 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 .

`‣ 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 .

`‣ 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**.

`‣ 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

`‣ 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`.

`‣ 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`.

`‣ 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 )

`‣ 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 sequilinear 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)

`‣ 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 synomym `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

`‣ 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

`‣ 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)

`‣ 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

`‣ 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

`‣ 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

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`

.

`‣ 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 >

`‣ 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 >

`‣ 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

`‣ 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;

`‣ 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)

`‣ 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) ]

`‣ 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

`‣ 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

`‣ 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.

`‣ 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

`‣ 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;

`‣ 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"

`‣ 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

`‣ 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 ]

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.

`‣ 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>

`‣ 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)> ]

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, analoguously 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.

(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)\) |

`‣ 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)

`‣ 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)

`‣ 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)

`‣ 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 basefield of `ps` is GF(q^{2}), \(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)

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`.

`‣ 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

For all polar spaces an iterator is constructed using `IteratorList(enum)`

, where `enum` is an appropriate enumerator.

`‣ 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)>

`‣ 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>

generated by GAPDoc2HTML