GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it
% This file was created automatically from iso.msk.1% DO NOT EDIT!2\Chapter{Block Designs and Projective Planes}34This section contains functions to help studying projective planes.5There is also a function converting relative difference sets to block6designs. Those desings can be studied with the \package{DESIGN} \cite{DESIGN}7package by L. Soicher.89Projective planes are always assumed to consist of positive integers10(as points) and sets of integers (as blocks). The incidence relation11is assumed to be the element relation. The blocks of a projective12plane must be *sets*.1314\>ProjectivePlane( <blocks> ) O1516Given a list of lists <blocks> which represents the blocks of a17projective plane, a block design is generated. If the <blocks> is not18a set of sets of the integers `[1..v]' for some $v$, the points are19sorted and enumerated and the blocks are changed accordingly.20But the original names are known to the returned BlockDesign.2122The block design generated this way will contain two extra entries,23<jblock> and <isProjectivePlane>. The matrix <.jblock> contains the24number of the block containing the points $i$ and $j$ at the $(i,j)$th25position. And <isProjectivePlane> will be `true'.26If <blocks> do not form the lines of a projective plane, an error is27issued.282930\>PointJoiningLinesProjectivePlane( <plane> ) O3132Returns a matrix which has as $ij$th entry the point wich is contained33in the blocks with numbers $i$ and $j$. This matrix is also stored in34<plane>. Some operations are faster if <plane> contains this matrix.35If <plane> is not a projective plane, an error is issued.36373839\beginexample40gap> b:=[ [ 1, 3 ], [ 1, 6 ], [ 2, 4 ], [ 2, 7 ],41> [ 3, 5 ], [ 4, 6 ], [ 5, 7 ] ];;42gap> plane:=ProjectivePlane(b);43rec( isBlockDesign := true, v := 7,44blocks := [ [ 1, 3 ], [ 1, 6 ], [ 2, 4 ], [ 2, 7 ],45[ 3, 5 ], [ 4, 6 ], [ 5, 7 ] ],46jblock := [ [ 0, 0, 1, 0, 0, 2, 0 ], [ 0, 0, 0, 3, 0, 0, 4 ],47[ 1, 0, 0, 0, 5, 0, 0 ], [ 0, 3, 0, 0, 0, 6, 0 ],48[ 0, 0, 5, 0, 0, 0, 7 ], [ 2, 0, 0, 6, 0, 0, 0 ],49[ 0, 4, 0, 0, 7, 0, 0 ] ],50isProjectivePlane := true )51gap> PointJoiningLinesProjectivePlane(plane);52[ [ 0, 1, 0, 0, 3, 0, 0 ], [ 1, 0, 0, 0, 0, 6, 0 ], [ 0, 0, 0, 2, 0, 4, 0 ],53[ 0, 0, 2, 0, 0, 0, 7 ], [ 3, 0, 0, 0, 0, 0, 5 ], [ 0, 6, 4, 0, 0, 0, 0 ],54[ 0, 0, 0, 7, 5, 0, 0 ] ]55gap> RecNames(plane);56[ "isBlockDesign", "v", "blocks", "jblock", "isProjectivePlane", "jpoint" ]57\endexample5859\>DevelopmentOfRDS( <diffset>, <Gdata> ) O6061This calculates the development of a (partial relative) difference set62<diffset> in the group given by <Gdata>.63That is, the associated block design.6465<diffset> can be given as a list of group66elements or a list of integers (positions in the set of group elements).67<Gdata> can either be the record returned by68"PermutationRepForDiffsetCalculations" or a group or a set of group elements.6970In either case, the returned object is a `BlockDesign' in the sense of71L. Soichers DESIGN package.72737475\beginexample76gap> G:=CyclicGroup(21);; Gdata:=PermutationRepForDiffsetCalculations(G);;77gap> AllDiffsets([2],[1..21],4,[],Gdata,1);78[ [ 2, 5, 16, 17 ], [ 2, 6, 10, 18 ] ]79gap> d1:=DevelopmentOfRDS(Set(G){[2,5,16,17]},Set(G));80rec( isBlockDesign := true, v := 21,81blocks := [ [ 1, 2, 5, 16, 17 ], [ 1, 3, 14, 15, 21 ], [ 1, 4, 8, 10, 13 ],82[ 1, 6, 7, 9, 20 ], [ 1, 11, 12, 18, 19 ], [ 2, 3, 9, 10, 12 ],83[ 2, 4, 7, 15, 19 ], [ 2, 6, 8, 11, 21 ], [ 2, 13, 14, 18, 20 ],84[ 3, 4, 6, 17, 18 ], [ 3, 5, 8, 19, 20 ], [ 3, 7, 11, 13, 16 ],85[ 4, 5, 9, 11, 14 ], [ 4, 12, 16, 20, 21 ], [ 5, 6, 12, 13, 15 ],86[ 5, 7, 10, 18, 21 ], [ 6, 10, 14, 16, 19 ], [ 7, 8, 12, 14, 17 ],87[ 8, 9, 15, 16, 18 ], [ 9, 13, 17, 19, 21 ], [ 10, 11, 15, 17, 20 ] ],88autSubgroup := <permutation group with 21 generators>,89pointNames := [ <identity> of ..., f1, f2, f1^2, f1*f2, f2^2, f1^2*f2,90f1*f2^2, f2^3, f1^2*f2^2, f1*f2^3, f2^4, f1^2*f2^3, f1*f2^4, f2^5,91f1^2*f2^4, f1*f2^5, f2^6, f1^2*f2^5, f1*f2^6, f1^2*f2^6 ],92blockSizes := [ 5 ], blockNumbers := [ 21 ], isSimple := true,93isBinary := true )94gap> d2:=DevelopmentOfRDS([2,5,16,17],Gdata);;95gap> d1=d296true97gap> d1=DevelopmentOfRDS(Set(G){[2,5,16,17]},G);98true99gap> d1=DevelopmentOfRDS([2,5,16,17],G);100true101\endexample102103Note that equality for block designs means equality of records. So104`DevelopmentOfRDS' generates exactly the same record in each of the105above examples. The output is in fact independent of the chosen data type of the input (as long as it is valid). In particular, the design always knows its `pointNames'.106107\>ProjectiveClosureOfPointSet( <points>[, <maxsize>], <plane> ) O108109Let <plane> be a projective plane. Let <points> be a set of non-collinear110points (integers) of this plane. Then111`ProjectiveClosureOfPointSet' returns a record with the entries <.closure>112and <.embedding>.113114Here <.closure> is the projective closure of <points> (the smallest115projectively closed subset of <plane> containing the points <points>).116It is not checked, whether this is a projective plane. As the BlockDesign117<.closure> has points `[1..w]' and <plane> has poins `[1..v]' with118$w\leq v$, we need an embedding of <.closure> into <plane>. This embedding119is the permutation <.embedding>. It is a permutation on `[1..v]' which120takes the points of <.closure> to a set of points in <plane> containing121<points> and preserving incidence. Note that nothing is known about the122behaviour of <.embedding> on any point outside `[1..w]' and123`[1..w]^<.embedding>'.124125If $<maxsize>$ is given and $<maxsize> \neq 0$, calculations are stopped126if the closure is known to127have at least <maxsize> points and the plane <plane> is returned as128<.closure> with the trivial permutation as embedding.129130131132133Let's find a Baer subplane in the desarguesian plane of order $4$:134\beginexample135gap> G:=CyclicGroup(21);; Gdata:=PermutationRepForDiffsetCalculations(G);;136gap> AllDiffsets([2],[1..21],4,[],Gdata,1);137[ [ 2, 5, 16, 17 ], [ 2, 6, 10, 18 ] ]138gap> plane:=DevelopmentOfRDS([2,5,16,17],Gdata);;139gap> ProjectiveClosureOfPointSet([1,3,4],plane);140rec( closure := rec( isBlockDesign := true, v := 3,141blocks := [ [ 1, 2 ], [ 1, 3 ], [ 2, 3 ] ]142pointNames := [ <identity> of ..., f2, f1^2 ]),143embedding := (2,3,4) )144gap> IsProjectivePlane(last.closure);145false146gap> baer:=ProjectiveClosureOfPointSet([1,3,4,5],plane);;147gap> baer.closure.blocks;148[ [ 1, 2, 6 ], [ 1, 3, 5 ], [ 1, 4, 7 ], [ 2, 3, 7 ],149[ 2, 4, 5 ], [ 3, 4, 6 ], [ 5, 6, 7 ] ]150gap> IsProjectivePlane(baer.closure);151true152gap> Set(baer.closure.blocks,b->OnSets(b,baer.embedding));153[ [ 1, 3, 14 ], [ 1, 4, 8 ], [ 1, 5, 17 ], [ 3, 4, 17 ],154[ 3, 5, 8 ], [ 4, 5, 14 ], [ 8, 14, 17 ] ]155\endexample156157%%%%%%%%%%%%%%%%%%%%158\Section{Isomorphisms and Collineations}159160Isomorphisms of projective planes are mappings which take points to161points and blocks to blocks and respect incidence. A *collineation* of162a projective plane $P$ is an isomorphism from $P$ to $P$.163164As projective planes are assumed to live on the integers, isomorphisms165of projective planes are represented by permutations. To test if a166permutation on points is actually an isomorphism of projective planes,167the following methods can be used.168169\>IsIsomorphismOfProjectivePlanes( <perm>, <plane1>, <plane2> ) O170171Let <plane1>, <plane2> be two projective planes.172`IsIsomorphismOfProjectivePlanes' test if the permutation173<perm> on points defines an isomorphism of the projective planes174<plane1> and <plane2>.175176177\>IsCollineationOfProjectivePlane( <perm>, <plane> ) O178179Let <plane> be a projective plane and <perm> a permutation180on the points of this plane. `IsCollineationOfProjectivePlane(<perm>,<plane>)' returns181`true', if <perm> induces a collineation of <plane>.182183This is just another form to call `IsIsomorphismOfProjectivePlanes(<perm>,<plane>,<plane>)'184185186\>IsomorphismProjPlanesByGenerators( <gens1>, <plane1>, <gens2>, <plane2> ) O187\>IsomorphismProjPlanesByGeneratorsNC( <gens1>, <plane1>, <gens2>, <plane2> ) O188189Let <gens1> be a list of points generating the projective plane190<plane1> and <gens2> a list of generating points for <plane2>. Then a191permutation is returned representing a mapping from the points of <plane1>192to those of <plane2> and taking the list <gens1> to the list <gens2>.193If there is no such mapping which defines an isomorphism of projective194planes, `fail' is returned.195196`IsomorphismProjPlanesByGeneratorsNC' does *not* check whether <gens1>197and <gens2> really generate the planes <plane1> and <plane2>.198199200201Look at the above example again:202\beginexample203gap> P:=ProjectivePlane( [ [ 1, 2, 6 ], [ 1, 3, 5 ], [ 1, 4, 7 ],204> [ 2, 3, 7 ], [ 2, 4, 5 ], [ 3, 4, 6 ], [ 5, 6, 7 ] ]);;205gap> pi:=IsomorphismProjPlanesByGenerators([1,2,3,4],P,[2,4,6,7],P);206(1,2,4,7,3,6,5)207gap> IsIsomorphismOfProjectivePlanes(pi,P,P);208true209gap> IsCollineationOfProjectivePlane(pi,P);210true211gap> IsomorphismProjPlanesByGenerators([1,2,3,4],P,[1,2,3,5],P);212fail213gap> ProjectiveClosureOfPointSet([1,2,3,5],P).closure.v;2144215\endexample216217218%%%%%%%%%%%%%%%%%%%%%%%%%%%219\Section{Central Collineations}220221Let $\phi$ be a collineation of a projective plane which fixes one222point block-wise (the so-called *centre*) and one block point-wise223(the so-called *axis*). If the centre is contained in the axis, $\phi$224is called *elation*. Otherwise, $\phi$ is called *homology*. The group225of elations with given axis is called *translation group* of the plane226(relative to the chosen axis). A projective plane with transitive227translation group is called *translation plane*. Here transitivity is228on the points outside the axis.229230\>ElationByPair( <centre>, <axis>, <pair>, <plane> ) O231232Let <centre> be a point and <axis> a block of a projective plane233<plane> .234<pair> must be a pair of points outside <axis> and lie on a block235containing <center>. Then there is a unique collineation fixing <axis>236pointwise and <centre> blockwise (an elation) and taking <point[1]>237to <point[2]>.238239If one of the conditions is not met, an error is issued.240This method is faster, if <plane.jpoint> is known (see241"RDS:PointJoiningLinesProjectivePlane")242243244\>AllElationsCentAx( <centre>, <axis>, <plane>[, "generators"] ) O245246Let <centre> be a point and <axis> a block of the projective plane247<plane>.248`AllElationsCentAx' returns the group of all elations with centre249<centre> and axis <axis> as a group of permutations on the points of250<plane>.251252If ``generators'' is set, only a list of generators of the translation253group is returned.254This method is faster, if <plane.jpoint> is known (see255"RDS:PointJoiningLinesProjectivePlane")256257258\>AllElationsAx( <axis>, <plane>[, "generators"] ) O259260Let <axis> be a block of a projective plane <plane>.261`AllElationsAx' returns the group of all elations with axis262<axis>.263264If ``generators'' is set, only a set of generators for the group of elations265is returned.266This method is faster, if <plane.jpoint> is known (see267"RDS:PointJoiningLinesProjectivePlane")268269270\beginexample271gap> P:=ProjectivePlane( [ [ 1, 2, 6 ], [ 1, 3, 5 ], [ 1, 4, 7 ],272> [ 2, 3, 7 ], [ 2, 4, 5 ], [ 3, 4, 6 ], [ 5, 6, 7 ] ]);;273gap> pi:=ElationByPair(1,[1,2,6],[3,5],P);274(3,5)(4,7)275gap> AllElationsCentAx(1,[1,2,6],P);276Group([ (3,5)(4,7) ])277gap> AllElationsAx([1,2,6],P);278Group([ (3,5)(4,7), (3,7)(4,5) ])279gap> AllElationsAx([1,2,6],P);280Group([ (3,5)(4,7), (3,7)(4,5) ])281gap> Size(last);2824283\endexample284285\>IsTranslationPlane( [<infline>, ]<plane> ) O286287Returns `true' if the plane <plane> has a block $b$ such that the288group of elations with axis $b$ is transitive outside $b$.289290If <infline> is given, only the group of elations with axis291<infline> is considered.292This is faster than293calculating the full translation group if the projective plane <plane>294is not a translation plane. If <plane> is a translation plane, the full295translation group is calculated.296297This method is faster, if <plane.jpoint> is known (see298"RDS:PointJoiningLinesProjectivePlane")299300301302\beginexample303gap> AllElationsAx(P.blocks[1],P);304Group([ (3,5)(4,7), (3,7)(4,5) ])305gap> Size(last);3064307gap> IsTranslationPlane(P);308true309\endexample310311\>HomologyByPair( <centre>, <axis>, <pair>, <plane> ) O312313`HomologyByPair' returns the homology defined by the pair314<pair> fixing <centre> blockwise and <axis> pointwise.315The returned permutation fixes <axis> pointwise and <centre> linewise and316takes <pair[1]> to <pair[2]>.317318319\>GroupOfHomologies( <centre>, <axis>, <plane> ) O320321returns the group of homologies with centre <centre> and axis322<axis> of the plane <plane>.323324325\beginexample326gap> HomologyByPair(3,[1,2,6],[4,5],P);327Error, The centre must be fixed blockwise called from328# ...329gap> GroupOfHomologies(3,[1,2,6],P);330Group(())331\endexample332333%%%%%%%%%%%%%%%%%%%%334\Section{Collineations on Baer Subplanes}335336Let $P$ be a projective plane of order $n^2$. A subplane $B$ of order337$n$ of $P$ is called *Baer subplane*. Baer suplanes are exactly the338maximal subplanes of $P$.339340\>InducedCollineation( <baerplane>, <baercoll>, <point>, <image>, <planedata>, <embedding> ) O341342If a projective plane contains a Baer subplane, collineations of the343subplane may be lifted to the full plane. If such an extension to the344full plane exists, it is uniquely determined by the image of one point345outside the Baer plane.346347Here <baercoll> is a collineation (a permutation of the points)348of the projective plane <baerplane>.349The permutation <embedding> is a permutation on the points of the full pane350which converts the enumeration of <baerplane> to that of the full plane.351This means that the image of the points of <baerplane> under <embedding>352is a subset of the points of <plane>. Namely the one representing the Baer353plane in the enumeration used for the whole plane.354<point> and <image> are points outside the Baer plane.355356The data for <baerplane> and <embedding> can be calculated using357"ProjectiveClosureOfPointSet".358359`InducedCollineation' returns a collineation of the full plane (as a360permutation on the points of <plane>) which takes <point> to <image> and361acts on the Baer plane as <baercoll> does. If no such collineation362exists, `fail' is returned.363364This method needs <plane.jpoint>. If it is unknown, it is calculated (see365"RDS:PointJoiningLinesProjectivePlane")366367368369Let's go back to an earlier example and find a planar collineation:370\beginexample371gap> G:=CyclicGroup(21);; Gdata:=PermutationRepForDiffsetCalculations(G);;372gap> AllDiffsets([2],[1..21],4,[],Gdata,1);373[ [ 2, 5, 16, 17 ], [ 2, 6, 10, 18 ] ]374gap> plane:=DevelopmentOfRDS([2,5,16,17],Gdata);;375gap> baer:=ProjectiveClosureOfPointSet([1,3,4,5],plane);;376gap> pi:=InducedCollineation(baer.closure,(),21,15,plane,baer.embedding);377(2,16)(6,18)(7,12)(9,11)(10,13)(15,21)(19,20)378gap> 21^pi;37915380gap> ForAll(OnSets([1..7],baer.embedding),i->i^pi=i);381true382\endexample383384%%%%%%%%%%%%%%%%%%%%385\Section{Invariants for Projective Planes}386387The functions `NrFanoPlanesAtPoints', `PRank@RDS', `FingerprintAntiFlag'388and `FingerprintProjPlane' calculate invariants for finite projective389planes. For more details see \cite{RoederDiss} and390\cite{MoorhouseGraphs}. The values of some of these invariants are391available from the homepages of \cite{Moorhouse} and \cite{Royle} for392many planes.393394\>NrFanoPlanesAtPoints( <points>, <plane> ) O395396For a projective plane <plane>, `NrFanoPlanesAtPoints(<points>,<plane>)'397calculates the so-called Fano invariant. That is, for each point398in <points>, the number of subplanes of order 2 (so-called Fano planes)399containing this point is calculated.400The method returns a list of pairs of the form $[<point>,<number>]$401where <number> is the number of Fano sub-planes in <point>.402403This method is faster, if <plane.jpoint> is known (see404"RDS:PointJoiningLinesProjectivePlane"). Indeed, if <plane.jpoint> is405not known, this method is very slow.406407408\beginexample409gap> G:=CyclicGroup(4^2+5);410<pc group of size 21 with 2 generators>411gap> diffset:=OneDiffset(G);412[ f1, f1*f2, f1^2*f2^4, f1*f2^5 ]413gap> P:=DevelopmentOfRDS(diffset,G);;414gap> NrFanoPlanesAtPoints([3],P);415[ [ 3, 240 ] ]416\endexample417\>IncidenceMatrix( <plane> ) O418419returns a matrix <I>, where the columns are numbered by the blocks and420the rows are numbered by points. And <I[i][j]=1> if and only if421<points[i]> is incident (contained in) <blocks[j]> (an 0 else).422423424\>PRank( <plane>, <p> ) O425426Let $I$ be the incidence matrix of the projective plane <plane> and <p> a427prime power.428The rank of $I.I^t$ as a matrix over429$GF(p)$ is called <p>-rank of the projective plane. Here $I^t$ denotes430the transposed matrix. Note that this is a method within the RDS workspace,431so it has to be called as PRank@RDS432433434\beginexample435gap> G:=CyclicGroup(2^2+3);436<pc group of size 7 with 1 generators>437gap> P:=DevelopmentOfRDS(OneDiffset(G),G);;438gap> IncidenceMatrix(P);439[ [ 1, 1, 1, 0, 0, 0, 0 ], [ 1, 0, 0, 1, 1, 0, 0 ], [ 0, 1, 0, 1, 0, 1, 0 ],440[ 1, 0, 0, 0, 0, 1, 1 ], [ 0, 0, 1, 1, 0, 0, 1 ], [ 0, 0, 1, 0, 1, 1, 0 ],441[ 0, 1, 0, 0, 1, 0, 1 ] ]442gap> PRank@RDS(P,3);4436444gap> PRank@RDS(P,2);4454446\endexample447\>FingerprintProjPlane( <plane> ) O448449For each anti-flag $(p,l)$ of a projective plane <plane> of order $n$,450define an arbitrary but fixed enumeration of the lines through $p$ and451the points on $l$. Say $l_1,\dots,l_{n+1}$ and $p_1,\dots,p_{n+1}$452The incidence relation defines a canonical bijection between the $l_i$ and453the $p_i$ and hence a permutation on the indices $1,\dots,n+1$.454Let $\sigma_{(p,l)}$ be this permutation.455456Denote the points and lines of the plane by $q_1,\dots q_{n^2+n+1}$457and $e_1,\dots,e_{n^2+n+1}$.458Define the sign matrix as $A_{ij}=sgn(\sigma_{(q_i,e_j)})$ if $(q_i,e_j)$459is an anti-flag and $=0$ if it is a flag.460Then the fingerprint is defnied as the multiset of the entries of $|AA^t|$.461462463\>FingerprintAntiFlag( <point>, <linenr>, <plane> ) O464465Let $m_1,\dots,m_{n+1}$ be the lines containing <point> and466$E_1,\dots,E_{n+1}$ the points on the line given by <linenr> such that467$E_i$ is incident with $m_i$. Now label the points of $m_i$ as468$<point>=P_{i,1},\dots,P_{i,n+1}=E_i$ and the lines of $E_i$ as469$<line>=l_1,\dots,l_{i,n+1}=m_i$.470For $i\not = j$, each $P_{j,k}$ lies on exactly one line471$l_{i,k\sigma_{i,j}}$ containing $E_i$ for some permutation $\sigma_{i,j}$472473Define a matrix $A$, where $A_{i,j}$ is the sign of $\sigma_{i,j}$ if474$i\neq j$ and $A_{i,i}=0$ for all $i$.475The partial fingerprint is the multiset of entries of $|AA^t|$ where $A^t$476denotes the transposed matrix of $A$.477478479480Look at the above example again:481\beginexample482gap> NrFanoPlanesAtPoints([1,2,3],plane);483[ [ 1, 240 ], [ 2, 240 ], [ 3, 240 ] ]484gap> Set(NrFanoPlanesAtPoints([1..plane.v],plane),i->i[2])=[240];485true486gap> PRank@RDS(plane,2);48710488gap> PRank@RDS(plane,3);48921490gap> PRank@RDS(plane,5);49120492gap> FingerprintProjPlane(plane);493[ [ 12, 420 ], [ 16, 21 ] ]494gap> FingerprintAntiFlag(1,6,plane);495[ [ 3, 20 ], [ 4, 5 ] ]496\endexample497498%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%499%%500%E501%%502503504505