Over a long period time, there have been numerous people involved in developing a GAP package which deals primarily with objects in finite geometry. It all started when Max Neunhöffer visited Perth about seven years ago, and Maska Law, Sven Reichard, Michel Lavrauw and I were interested in systematically developing this package. Max is a GAP guru and taught us much about how to properly design code and he led the way on the group theoretic side of things. In fact, if it wasn’t for the GenSS and Orb packages, our package would not be as nice as it is now.
The team grew and includes contributions from Michael Pauley, Philippe Cara, Jan De Beule, Michel Lavrauw and Anton Betten.
I should also mention that there was a precursor to our package developed in Ghent (Jan was one of the authors) called PG, which mainly dealt with projective spaces, where the quadrics and Hermitian varieties were given essentially as algebraic varieties. Jan and I separated the underlying functionality of the polar spaces component of FinInG to build a separate package Forms which is a stand-alone GAP package dealing primarily with quadratic and sesquilinear forms on finite vector spaces. This allows a user to specify the form of their choice via a Gram matrix or polynomial, and there is also some code which returns a form preserved by a matrix group (up to similarity).
We are still working on FinInG, but it is more-or-less in good working order. Much of the basic functionality is quite robust now, and we are currently working on the finer points. The package can be downloaded from here and more recent versions will appear there periodically. Here is a sample of what can be done using this software; a construction of the Patterson ovoid. (In future posts, I’ll provide better and more illustrative examples of the use of FinInG).
gap> LoadPackage("FinInG");; 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], [2,1,1,0,0,0,0], [1,2,1,0,0,0,0], [1,1,2,0,0,0,0]] * One(GF(3));; gap> ovoid := Union( List(reps, x -> Orbit(psl32, x, Permuted)) );; gap> ovoid := List(ovoid, x -> VectorSpaceToElement(ps, x));; gap> planes := Planes( ps ); <planes of Q(6, 3): x_1^2+x_2^2+x_3^2+x_4^2+x_5^2+x_6^2+x_7^2=0> gap> ForAll(planes, p -> Number(ovoid, x -> x * p) = 1); true gap> g := CollineationGroup( ps ); <projective semilinear group of size 9170703360 with 3 generators> gap> stabiliser := SetwiseStabilizer(g, OnProjSubspaces, ovoid)!.setstab; <projective semilinear group with 14 generators> gap> points := AsList( Points(ps) );; gap> OrbitLengths( stabiliser, points ); [336, 28] gap> DisplayCompositionSeries( stabiliser ); G (size 1451520) | B(3,2) = O(7,2) ~ C(3,2) = S(6,2) 1 (size 1)