# We determine all hyperplane complements of the Hall-Janko near octagon HJ. It
# turns out that there are, up to isomorphism, 470 such hyperplane complements.
# They will be listed in the array hypcomplements. These hyperplane complements
# have also been stored in the file HallJanko2.g and will subsequently be used
# in HallJanko3.g to determine all valuations of HJ. The universal embedding of
# HJ has vector dimension 28 (as was shown by Frohardt and Smith) and so there
# are 2^28-1 hyperplane complements. These 2^28-1 hyperplane complements can be
# constructed from the singular hyperplane complements by successively taking
# symmetric differences. This fact allows to compute all hyperplane complements
# (and hence also all valuations) in a fast way. (The total computation time on
# our PC was about # 17min 20 sec).
# The following code implements a model of the Hall-Janko near octagon with point
# set [1..315], line set lines and automorphism group g.
g:=AllPrimitiveGroups(DegreeOperation,315)[3];
orbs := Orbits(Stabilizer(g,1),[1..315]);
dist1 := Filtered(orbs,x->Size(x)=10)[1];
dist2 := Filtered(orbs,x->Size(x)=80)[1];
dist3 := Filtered(orbs,x->Size(x)=160)[1];
dist4 := Filtered(orbs,x->Size(x)=64)[1];
perp := Union([1],dist1);
line := Intersection(perp,OnSets(perp,RepresentativeAction(g,1,dist1[1])));
lines := Orbit(g,line,OnSets);
# If compl is a hyperplane complement, then the following function allows to
# determine the sizes of the various orbits of the stabilizer j of compl on the
# hyperplane (stored in l1) and on the hyperplane complement (stored in l2)
Char:=function(compl)
local j,l1,l2,orbs;
j:=Stabilizer(g,compl,OnSets);
l1:=List(Orbits(j,Difference([1..315],compl)),Length);
l2:=List(Orbits(j,compl),Length);
Sort(l1); Sort(l2);
return [l1,l2];
end;
# If compl is a hyperplane complement, then the following code determines
# representatives for the various orbits of the stabilizer of compl on the
# whole set of points.
Repr:=function(compl)
local j,orbs,repr;
j:=Stabilizer(g,compl,OnSets);
orbs:=Orbits(j,[1..315]);
repr:=Set(List(orbs,orb->orb[1]));
return repr;
end;
# We determine all singular hyperplane complements.
Singular:=List([1..315],x->OnSets(Set(dist4),RepresentativeAction(g,1,x)));
# With the following code, we can determine the symmetric difference of two
# sets A and B.
SymDif:=function(A,B)
return Union(Difference(A,B),Difference(B,A));
end;
# We now determine all hyperplane complements of the Hall-Janko near octagon. The
# code below is based on the fact that the symmetric difference of two hyperplane
# complements is again a hyperplane complement. Starting from the singular
# hyperplane complements, one can then construct all hyperplane complements by
# (successively) applying the symmetric difference construction. The code below
# makes use of the fact that there are 2^28-1 hyperplane complements, and starts
# with a list of four nonisomorphic hyperplane complements, namely the singular
# hyperplane complements and the symmetric differences of two singular hyperplane
# complements whose the deepest points lie at distance 2, 3 or 4 from each other.
compl1:=SymDif(Set(dist4),Singular[dist2[1]]);
compl2:=SymDif(Set(dist4),Singular[dist3[1]]);
compl3:=SymDif(Set(dist4),Singular[dist4[1]]);
hypcomplements:=[Set(dist4),compl1,compl2,compl3];
balance:=2^28-316;
balance:=balance-Index(g,Stabilizer(g,compl1,OnSets));
balance:=balance-Index(g,Stabilizer(g,compl2,OnSets));
balance:=balance-Index(g,Stabilizer(g,compl3,OnSets));
chars:=List(hypcomplements,Char);
last1:=1; last2:=2; last3:=5;
while balance<>0 do
hypcomplements2:=ShallowCopy(hypcomplements);
for i in [last2..Size(hypcomplements2)] do if balance<>0 then
repr:=Repr(hypcomplements2[i]);
for x in repr do if balance<>0 then
compl:=SymDif(hypcomplements2[i],Singular[x]);
char:=Char(compl);
New:=true;
for j in [last1..Size(hypcomplements)] do
if char=chars[j] and
RepresentativeAction(g,compl,hypcomplements[j],OnSets)<>fail then
New:=false; break;
fi;
od;
if New then
Append(hypcomplements,[compl]); Append(chars,[char]);
balance:=balance-Index(g,Stabilizer(g,compl,OnSets));
fi;
fi; od;
fi; od;
last1:=last2; last2:=last3; last3:=Size(hypcomplements)+1;
od;
# The hyperplane complements in the array "hypcomplements" have been stored
# in the file HallJanko2.g .