Here we describe what is meant by a geometry morphism in FinInG and the various operations and tools available to the user.
A geometry morphism from P to P' is defined to be a map from the elements of P to the elements of P' which preserves incidence and induces a function from the type set of P to the type set of P'. For instance, a correlation and a collineation are examples of geometry morphisms, but they have been dealt with in more specific ways in FinInG. We will mainly be concerned with geometry morphisms where the source and range are different. Hence, the natural embedding of a projective space in a larger projective space, the mapping induced by field reduction, and the Klein correspondence are examples of such geometry morphisms.
> IsGeometryMorphism | ( family ) |
The category IsGeometryMorphism
represents a special object in FinInG which carries attributes and the given element map. The element map is given as a IsGeneralMapping
, and so has a source and range.
gap> ShowImpliedFilters(IsGeometryMorphism); Implies: IsGeneralMapping IsTotal Tester(IsTotal) IsSingleValued Tester(IsSingleValued) |
The usual operations of ImagesElm
, ImagesSet
, PreImagesElm
, PreImagesSet
work for geometry morphisms, as well as the overload operator \^
. Since Image
is a GAP function, we advise the user to not use this for geometry morphisms.
For some geometry morphisms, there is also an accompanying intertwiner for the automorphism groups of the source range. Given a geometry morphism f from P to P', an intertwiner phi is a map from the automorphism group of P to the automorphism group of P', such that for every element p of P and every automorphism g of P, we have
f(p^g) = f(p)^{\phi(g)} .
> Intertwiner ( f ) | ( attribute ) |
Returns: a group homomorphism
The arguments f is a geometry morphism. If f comes equipped with a natural intertwiner from the the automorphism group of the source of f to the automorphism group to the image of f, then the user may be able to obtain the intertwiner by calling this operation (see the individual geometry morphism constructions). Here is a simple example of the intertwiner for the isomorphism of two polar spaces (see IsomorphismPolarSpaces
(10.1-3)).
gap> form := BilinearFormByMatrix( IdentityMat(3,GF(3)), GF(3) ); < bilinear form > gap> ps := PolarSpace(form); <polar space of rank 2 over GF(3)> gap> pq := ParabolicQuadric(2,3); Q(2, 3) gap> iso := IsomorphismPolarSpaces(ps, pq); <geometry morphism from <Elements of <polar space of rank 2 over GF( 3)>> to <Elements of Q(2, 3)>> gap> KnownAttributesOfObject(iso); [ "Range", "Source", "Intertwiner" ] gap> hom := Intertwiner(iso);; |
> IsomorphismPolarSpaces ( ps1, ps2 ) | ( operation ) |
> IsomorphismPolarSpaces ( ps1, ps2, boolean ) | ( operation ) |
Returns: a geometry morphism
The arguments ps1 and ps2 are equivalent polar spaces, and this function returns a geometry isomorphism between them. The optional third argument boolean can take either true
or false
as input, and then our operation will or will not compute the intertwiner accordingly. The user may wish that the intertwiner is not computed when working with large polar spaces. The default (when calling the operation with two arguments) is set to true
, and in this case, if at least one of ps1 or ps2 has a collineation group installed as an attribute, then an intertwining homomorphism is installed as an attribute. That is, we also obtain a natural group isomorphism from the collineation group of ps1 onto the collineation group of ps2 (see also Intertwiner
(10.1-2)).
gap> id := IdentityMat(6, GF(5));; gap> form := BilinearFormByMatrix( id, GF(5) ); < bilinear form > gap> ps := PolarSpace( form ); <polar space of rank 5 over GF(5)> gap> PolarSpaceType( ps ); "hyperbolic" gap> quadric := HyperbolicQuadric( 5, 5 ); Q+(5, 5) gap> iso := IsomorphismPolarSpaces( ps, quadric ); <geometry morphism from <Elements of <polar space of rank 5 over GF( 5)>> to <Elements of Q+(5, 5)>> gap> HasCollineationGroup( ps ); true gap> hom := Intertwiner( iso );; gap> ImagesSet(hom, SpecialIsometryGroup( ps )); <projective group with Frobenius of size 14508000000 with 3 generators> |
Both functions also have a "no check" version.
> IsomorphismPolarSpacesNC ( ps1, ps2 ) | ( operation ) |
> IsomorphismPolarSpacesNC ( ps1, ps2, boolean ) | ( operation ) |
Returns: a geometry morphism
When using groups in GAP, we often use homomorphisms to pass from one situation to another, even though mathematically it may appear to be unneccessary, there can be ambiguities if the functionality is too flexible. This also applies to finite geometry. Take for example the usual exercise of thinking of a hyperplane in a projective space as another projective space. To conform with similar things in GAP, the right thing to do is to embed one projective space into another, rather than having one projective space automatically a substructure of another. The reason for this is that there are many ways one can do this embedding, even though we may dispense with this choice when we are working mathematically. So to avoid ambiguity, we stipulate that one should construct the embedding explicitly. How this is done will be the subject of the following section.
The most natural of geometry morphisms include, for example, the embedding of a projective space into another via a subspace, or the projection of a polar space to a smaller polar space of the same type via a totally isotropic subspace.
> NaturalEmbeddingBySubspace ( geom1, geom2, v ) | ( operation ) |
> NaturalEmbeddingBySubspaceNC ( geom1, geom2, v ) | ( operation ) |
Returns: a geometry morphism
The arguments geom1 and geom2 are both projective spaces, or both polar spaces, and v is an element of a projective or polar space. This function returns a geometry morphism representing the natural embedding of geom1 into geom2 as the subspace v. Hence geom1 and v must be equivalent as geometries. The operation NaturalEmbeddingBySubspaceNC
is the ``no check'' version of NaturalEmbeddingBySubspace
.
gap> geom1 := ProjectiveSpace(2, 3); PG(2, 3) gap> geom2 := ProjectiveSpace(3, 3); PG(3, 3) gap> planes := Planes(geom2); <planes of PG(3, 3)> gap> hyp := Random(planes); <a plane in PG(3, 3)> gap> em := NaturalEmbeddingBySubspace(geom1, geom2, hyp); <geometry morphism from <Elements of PG(2, 3)> to <Elements of PG(3, 3)>> gap> points := Points(geom1); <points of PG(2, 3)> gap> x := Random(points); <a point in PG(2, 3)> gap> x^em; <a point in PG(3, 3)> |
Another example, this time with polar spaces:
gap> h1 := HermitianVariety(2, 3^2); H(2, 3^2) gap> h2 := HermitianVariety(3, 3^2); H(3, 3^2) gap> pg := AmbientSpace( h2 ); PG(3, 9) gap> pi := VectorSpaceToElement( pg, [[1,0,0,0],[0,1,0,0],[0,0,1,0]] * Z(9)^0 ); <a plane in PG(3, 9)> gap> em := NaturalEmbeddingBySubspace( h1, h2, pi ); <geometry morphism from <Elements of H(2, 3^2)> to <Elements of H(3, 3^2)>> |
> NaturalEmbeddingByFieldReduction ( geom1, geom2 ) | ( operation ) |
> NaturalEmbeddingByFieldReduction ( geom1, geom2, B ) | ( operation ) |
> NaturalEmbeddingByFieldReduction ( geom1, geom2, boolean ) | ( operation ) |
Returns: a geometry morphism
The arguments geom1 and geom2 are projective or polar spaces. This function returns a geometry morphism representing the natural embedding of geom1 into geom2 via field reduction. By natural for projective spaces, we mean that the embedding is induced by considering the field F_1 of geom1 as a vector space over the field F_2 of geom2, perhaps with a choice of basis B in the case we have projective spaces. If geom1 and geom2 are polar spaces, then the only such possible embeddings are listed in the table below (see [Gil08]):
Polar Space 1 | Polar Space 2 | Conditions |
W(2n-1,q^a) | W(2na-1,q) | -- |
Q^+(2n-1,q^a) | Q^+(2na-1,q) | -- |
Q^-(2n-1,q^a) | Q^-(2na-1,q) | -- |
Q(2n,q^2a) | Q^+(2(2n+1)a-1,q) | q=1 mod 4 |
Q(2n,q^2a) | Q^-(2(2n+1)a-1,q) | q=3 mod 4 |
Q(2n,q^2a+1) | Q((2a+1)(2n+1)-1,q) | q odd |
H(n,q^2a+1) | H((2a+1)(n+1)-1,q) | q square |
H(2n,q^2a) | Q^+(2a(2n+1)-1,q) | q odd square |
H(2n-1,q^2a) | Q^-(4an-1,q) | q odd square |
H(n,q^2a) | W(2n-1,q) | -- |
The geometry morphism also comes equipped with an intertwiner (see Intertwiner
(10.1-2)). In the case polar spaces, this intertwiner has as its domain the isometry group of geom1. The optional third argument boolean can take either true
or false
as input, and then our operation will or will not compute the intertwiner accordingly. The user may wish that the intertwiner is not computed when embedding into large polar spaces. The default (when calling the operation with two arguments) is set to true
. Here is a simple example where the geometry morphism takes the points of PG(2,9) and maps them to the lines of PG(5,3).
gap> pg1 := ProjectiveSpace(2,9); PG(2, 9) gap> pg2 := ProjectiveSpace(5,3); PG(5, 3) gap> em := NaturalEmbeddingByFieldReduction(pg1, pg2); <geometry morphism from <Elements of PG(2, 9)> to <Elements of PG(5, 3)>> gap> line := Random( Lines(pg1) ); <a line in PG(2, 9)> gap> solid := line ^ em; <a solid in PG(5, 3)> gap> l := em!.prefun(solid); <a line in PG(2, 9)> |
Suppose we have field reduction from a polar space P_1 to a polar space P_2, and suppose that they are both defined by sesquilinear forms. Let M be the Gram matrix for the sesquilinear form defining P_1 and let {b_1,..,b_m} be a basis for the larger defining field of F P_1 over the smaller defining field K of P_2. Now the BlownUpMat
command takes as input a matrix mat over F and returns the matrix of the linear transformation on the row space K^mn with respect to the K-basis whose vectors are {b_1 v_1, ... b_m v_1, ..., b_mv_n}, where {v_1,...,v_n} is a basis for F^n. Hence if we have a singular vector x=(x_1,...,x_n) of P_1, then the blow-up of x will be singular if and only if for all i,j in {1,...,m}, we have
\sum_{k=1}^n Coeff(x_kb_i)\cdot Coeff(M_k\cdot x b_j)=0
where Coeff is the map which takes the coefficients of an element of F with respect to {b_1,..,b_m}, and M_k is the k-th row of M.
In this example, we consider the image of the Hermitian variety H(2,25) in Q^-(5,5).
gap> h := HermitianVariety(2, 5^2); H(2, 5^2) gap> quadric := EllipticQuadric(5, 5); Q-(5, 5) gap> em := NaturalEmbeddingByFieldReduction(h, quadric); #I Testing degeneracy of the *associated bilinear form* <geometry morphism from <Elements of H(2, 5^2)> to <Elements of Q-(5, 5)>> gap> points := AsList(Points(h));; gap> image := ImagesSet(em, points);; gap> image[1]; <a line in Q-(5, 5)> gap> hom := Intertwiner( em );; gap> g := Range( hom ); <projective group with Frobenius of size 378000 with 2 generators> gap> OrbitLengths(g, image); [ 126 ] |
> BlownUpProjectiveSpace ( basis, pg1 ) | ( operation ) |
Returns: a projective space
Blows up the projective space pg1 with respect to the basis using field reduction. If the argument pg1 is has projective dimension r-1 over the finite field GF(q^t), and basis is a basis of GF(q^t) over GF(q), then this functions returns a projective space of dimension rt-1 over GF(q).
> BlownUpProjectiveSpaceBySubfield ( subfield, pg ) | ( operation ) |
Returns: a projective space
Blows up a projective space pg with respect to the standard basis of the basefield of pg over the subfield.
> BlownUpSubspaceOfProjectiveSpace ( basis, subspace ) | ( operation ) |
Returns: a subspace of a projective space
Blows up a subspace of a projective space with respect to the basis using field reduction and returns it a subspace of the projective space obtained from blowing up the ambient projective space of subspace with respect to basis using field reduction.
> BlownUpSubspaceOfProjectiveSpaceBySubfield ( subfield, subspace ) | ( operation ) |
Returns: a subspace of a projective space
Blows up a subspace of a projective space with respect to the standard basis of the basefield of subspace over the subfield, using field reduction and returns it a subspace of the projective space obtained from blowing up the ambient projective space of subspace over the subfield.
> IsDesarguesianSpreadElement ( basis, subspace ) | ( operation ) |
Returns: true or false
Checks wether the subspace is a subspace which is obtained from a blowing up a projective point using field reduction with respect to basis.
> NaturalEmbeddingBySubField ( geom1, geom2 ) | ( operation ) |
> NaturalEmbeddingBySubField ( geom1, geom2, boolean ) | ( operation ) |
Returns: a geometry morphism
The arguments geom1 and geom2 are projective or polar spaces of the same dimension. This function returns a geometry morphism representing the natural embedding of geom1 into geom2 as a subfield geometry. If geom1 and geom2 are polar spaces, then the only such possible embeddings are listed in the table below (see [KL90]):
Polar Space 1 | Polar Space 2 | Conditions |
W(2n-1,q) | W(2n-1,q^a) | -- |
W(2n-1,q) | H(2n-1,q^2) | -- |
H(d,q^2) | H(d,q^2r) | r odd |
O^epsilon(d,q) | H(d,q^2) | q odd |
O^epsilon(d,q) | O^epsilon'(d,q^r) | epsilon=(epsilon')^r |
The geometry morphism also comes equipped with an intertwiner (see Intertwiner
(10.1-2)). The optional third argument boolean can take either true
or false
as input, and then our operation will or will not compute the intertwiner accordingly. The user may wish that the intertwiner is not computed when embedding into large polar spaces. The default (when calling the operation with two arguments) is set to true
. Here is a simple example where the geometry morphism takes the points of PG(2,3) and embeds them into PG(2,9).
gap> pg1 := ProjectiveSpace(2, 3); PG(2, 3) gap> pg2 := ProjectiveSpace(2, 9); PG(2, 9) gap> em := NaturalEmbeddingBySubfield(pg1,pg2); <geometry morphism from <Elements of PG(2, 3)> to <Elements of PG(2, 9)>> gap> points := AsList(Points( pg1 )); [ <a point in PG(2, 3)>, <a point in PG(2, 3)>, <a point in PG(2, 3)>, <a point in PG(2, 3)>, <a point in PG(2, 3)>, <a point in PG(2, 3)>, <a point in PG(2, 3)>, <a point in PG(2, 3)>, <a point in PG(2, 3)>, <a point in PG(2, 3)>, <a point in PG(2, 3)>, <a point in PG(2, 3)>, <a point in PG(2, 3)> ] gap> image := ImagesSet(em, points); [ <a point in PG(2, 9)>, <a point in PG(2, 9)>, <a point in PG(2, 9)>, <a point in PG(2, 9)>, <a point in PG(2, 9)>, <a point in PG(2, 9)>, <a point in PG(2, 9)>, <a point in PG(2, 9)>, <a point in PG(2, 9)>, <a point in PG(2, 9)>, <a point in PG(2, 9)>, <a point in PG(2, 9)>, <a point in PG(2, 9)> ] |
In this example, we embed W(5,3) in H(5,3^2).
gap> w := SymplecticSpace(5, 3); W(5, 3) gap> h := HermitianVariety(5, 3^2); H(5, 3^2) gap> em := NaturalEmbeddingBySubfield(w, h); <geometry morphism from <Elements of W(5, 3)> to <Elements of H(5, 3^2)>> gap> points := AsList(Points(w));; gap> image := ImagesSet(em, points);; gap> ForAll(image, x -> x in h); true |
> NaturalProjectionBySubspace ( ps, v ) | ( operation ) |
> NaturalProjectionBySubspaceNC ( ps, v ) | ( operation ) |
Returns: a geometry morphism
The argument ps is a projective or polar space, and v is a subspace of ps. In the case that ps is a projective space, this operation returns a geometry morphism from the subspaces containing v to the subspaces of a smaller projective space over the same field. Similarly, if ps is a polar space, this operation returns a geometry morphism from the totally singular subspaces containing v to a polar space of smaller dimension, but of the same polar space type. The operation NaturalProjectionBySubspaceNC
performs in exactly the same way as NaturalProjectionBySubspace
except that there are fewer checks such as whether v is a subspace of ps, and whether the input of the function and preimage of the returned geometry morphism is valid or not. We should also mention here a shorthand for this operation which is basically and overload of the quotient operation. So, for example, SymplecticSpace(3, 3) / v
achieves the same thing as NaturalProjectionBySubspace(SymplecticSpace(3,3), v)
.
gap> ps := HyperbolicQuadric(5,3); Q+(5, 3) gap> x := Random( Points(ps) );; gap> planes_on_x := AsList( Planes(x) ); [ <a plane in Q+(5, 3)>, <a plane in Q+(5, 3)>, <a plane in Q+(5, 3)>, <a plane in Q+(5, 3)>, <a plane in Q+(5, 3)>, <a plane in Q+(5, 3)>, <a plane in Q+(5, 3)>, <a plane in Q+(5, 3)> ] gap> proj := NaturalProjectionBySubspace(ps, x); <geometry morphism from <Elements of Q+(5, 3)> to <Elements of <polar space of rank 3 over GF(3)>>> gap> image := ImagesSet(proj, planes_on_x); [ <a line in Q+(3, 3)>, <a line in Q+(3, 3)>, <a line in Q+(3, 3)>, <a line in Q+(3, 3)>, <a line in Q+(3, 3)>, <a line in Q+(3, 3)>, <a line in Q+(3, 3)>, <a line in Q+(3, 3)> ] |
In this section we provide some more specialised geometry morphisms, that are commonly used in finite geometry.
> KleinCorrespondence ( quadric ) | ( operation ) |
Returns: a geometry morphism
The argument quadric is a 5-dimensional hyperbolic quadric Q+^(5,q), and this function returns the Klein correspondence from the lines of PG(3,q) to the points of quadric.
gap> quadric := HyperbolicQuadric(5,3); Q+(5, 3) gap> k := KleinCorrespondence( quadric ); #I Finding base change... #I Computing nice monomorphism... <geometry morphism from <lines of PG(3, 3)> to <points of Q+(5, 3)>> gap> pg := ProjectiveSpace(3, 3); PG(3, 3) gap> l := Random( Lines(pg) ); <a line in PG(3, 3)> gap> l^k; <a point in Q+(5, 3)> |
> NaturalDuality ( gq ) | ( operation ) |
Returns: a geometry morphism
The argument gq is either the symplectic generalised quadrangle W(3,q)
or the hermitian generalised quadrangle H(3,q^2)
. By the Klein correspondence, the lines of W(3,q) are mapped to the points of Q(4,q), which results in a point-line duality from W(3,q) onto Q(4,q). Likewise, the Klein correspondence induces a duality between H(3,q^2) and Q^-(5,q). At the moment, the geometry morphism returned is a map from lines to points. This operation does not require that the input is the canonical version of the generalised quadrangle; it suffices that the input has the correct polarity type.
gap> w := SymplecticSpace(3,5); W(3, 5) gap> lines:=AsList(Lines(w));; #I Computing nice monomorphism... gap> duality := NaturalDuality(w); #I Finding base change... #I No intertwiner computed. One of the polar spaces must have a collineation group computed <geometry morphism from <lines of W(3, 5)> to <points of Q(4, 5)>> gap> l:=lines[1]; <a line in W(3, 5)> gap> l^duality; <a point in Q(4, 5)> gap> PreImageElm(duality,last); <a line in PG(3, 5)> |
> ProjectiveCompletion ( as ) | ( operation ) |
Returns: a geometry morphism
The argument as is an affine space. This operation returns an embedding of as into the projective space ps of the same dimension, and over the same field. For example, the point (x, y, z) goes to the projective point with homogeneous coordinates (1, x, y, z). An intertwiner is unnecessary, CollineationGroup(as)
is a subgroup of CollineationGroup(ps)
.
gap> as := AffineSpace(3,5); AG(3, 5) gap> map := ProjectiveCompletion(as); <geometry morphism from <Elements of AG(3, 5)> to <Elements of PG(3, 5)>> gap> p := Random( Points(as) ); <a point in AG(3, 5)> gap> p^map; <a point in PG(3, 5)> |
generated by GAPDoc2HTML