# We implement the group g=L_3(4):2^2
g:=AllPrimitiveGroups(DegreeOperation,105)[3];
# We determine all central involutions of the group g.
while true do
r:=Random(g);
if Order(r)=2 and Size(Centralizer(g,r))=64*4 then break; fi;
od;
2A:=Set(ConjugacyClass(g,r));
# Consider now the transitive action of g on 2A by conjugation. We determine
# the suborbits of this action.
centr:=Centralizer(g,2A[1]);
suborbs:=[]; Remainder:=ShallowCopy(2A);
while Remainder <> [] do
conj:=Set(ConjugacyClass(centr,Remainder[1]));
Append(suborbs,[conj]);
SubtractSet(Remainder,conj);
od;
Sub0:=Filtered(suborbs,x->Size(x)=1)[1];
Sub1A:=Filtered(suborbs,x->Size(x)=2)[1];
Sub1B:=Filtered(suborbs,x->Size(x)=8)[1];
Sub2A:=Filtered(suborbs,x->Size(x)=16)[1];
Sub2B:=Filtered(suborbs,x->Size(x)=32)[1];
Sub3A:=Filtered(suborbs,x->Size(x)=64 and Order(2A[1]*x[1])=4)[1];
Sub3B:=Filtered(suborbs,x->Size(x)=64 and Order(2A[1]*x[1])=3)[1];
Sub4:=Filtered(suborbs,x->Size(x)=128)[1];
# We verify that the only central involutions that commute with 2A[1] are
# those involutions contained in Sub0, Sub1A, Sub1B and Sub2A. If this is
# indeed the case, then Status1 will be true.
Status1:= Comm(2A[1],Sub0[1])=() and Comm(2A[1],Sub1A[1])=() and
Comm(2A[1],Sub1B[1])=() and Comm(2A[1],Sub2A[1])=() and
Comm(2A[1],Sub2B[1])<>() and Comm(2A[1],Sub3A[1])<>() and
Comm(2A[1],Sub3B[1])<>() and Comm(2A[1],Sub4[1])<>();
# We verify that if x is an involution belonging to Sub1A, Sub1B or Sub2A,
# then 2A[1] * x is also a central involution belonging to the same suborbit.
# If this is the case, then Status2 will be true.
Status2 := (2A[1]*Sub1A[1] in Sub1A) and (2A[1]*Sub1B[1] in Sub1B) and
(2A[1]*Sub2A[1] in Sub2A);
# Suppose x <> 2A[1] is a central involution commuting with 2A[1], and denote by
# N the normalizer (in g) of the group generated by 2A[1] and x. Then we show that
# (1) N has size 768 if x belongs to Sub1A,
# (2) N has size 192 if x belongs to Sub1B,
# (3) N has size 96 if x belongs to Sub2A.
# If these claims are true then Status3 will be true.
Status3 := Size(Normalizer(g,Group([2A[1],Sub1A[1]])))=768 and
Size(Normalizer(g,Group([2A[1],Sub1B[1]])))=192 and
Size(Normalizer(g,Group([2A[1],Sub2A[1]])))=96;
# Suppose x<>2A[1] is a central involution, and denote by H(x) the group generated
# by 2A[1] and x. We verify that the following holds:
# (1) if x in Sub1A, then H(x) is isomorphic with C_2 x C_2,
# (2) if x in Sub1B, then H(x) is isomorphic with C_2 x C_2,
# (3) if x in Sub2A, then H(x) is isomorphic with C_2 x C_2,
# (4) if x in Sub2B, then H(x) is isomorphic with D_8,
# (5) if x in Sub3A, then H(x) is isomorphic with D_8,
# (6) if x in Sub3B, then H(x) is isomorphic with S_3,
# (7) if x in Sub4, then H(x) is isomorphic with D_{10}.
# f these claims are true, then Status4 will be true.
Status4:= Order(2A[1]*Sub1A[1])=2 and Order(2A[1]*Sub1B[1])=2 and
Order(2A[1]*Sub2A[1])=2 and Order(2A[1]*Sub2B[1])=4 and
Order(2A[1]*Sub3A[1])=4 and Order(2A[1]*Sub3B[1])=3 and
Order(2A[1]*Sub4[1])=5;
# We now construct the lines of the G_2(4)-near octagon. The group g has two orbits
# on the set of lines, namely lines1 and lines2. Every central involution is
# contained in a unique line of lines1. So, lines1 is a spread of the geometry.
line1:=Set([2A[1],Sub1A[1],2A[1]*Sub1A[1]]);
lines1:=Orbit(g,line1,OnSets);
line2:=Set([2A[1],Sub1B[1],2A[1]*Sub1B[1]]);
lines2:=Orbit(g,line2,OnSets);
lines:=Union(lines1,lines2);
# With the following code we can determine the suborbit in which a central
# involution lies.
PointType:=function(x)
if x in Sub0 then return "0"; fi;
if x in Sub1A then return "1A"; fi;
if x in Sub1B then return "1B"; fi;
if x in Sub2A then return "2A"; fi;
if x in Sub2B then return "2B"; fi;
if x in Sub3A then return "3A"; fi;
if x in Sub3B then return "3B"; fi;
if x in Sub4 then return "4"; fi;
end;
# With the following code we can determine the suborbit with respect to x in
# which the central involution y lies.
distance1:=function(x,y)
local r;
r:=RepresentativeAction(g,x,2A[1]);
return PointType(y^r);
end;
# With the following code we can determine the distance between the points
# x and y.
distance2:=function(x,y)
local T;
T:=distance1(x,y);
if T="0" then return 0; fi;
if T in ["1A","1B"] then return 1; fi;
if T in ["2A","2B"] then return 2; fi;
if T in ["3A","3B"] then return 3; fi;
if T="4" then return 4; fi;
end;
# With the following code we can determine the suborbits to which the central
# involutions of a line L belong. This information will be stored in an array
# (the line type of L).
LineType:=function(L)
local help;
help:=List(L,PointType); Sort(help);
return help;
end;
# We determine all line types and all line types of the spread elements.
Linetypes:=Set(List(lines,LineType));
SpreadLinetypes:=Set(List(lines1,LineType));
# If x is a central involution, then the following code gives the line types
# of all lines containing x.
ThroughPoint:=function(x)
local A,B;
A:=Filtered(lines,l->x in l);
B:=List(A,LineType); Sort(B);
return B;
end;