It works for groups in the database, but not in general, due to some cases missing or being not quite right.
@glukemorgan provided an alternative implementation which is based on the GAP function ONanScottType. I am reproducing it below.
We should just use that, but I'd like to also add a bunch of tests for it to .tst, both by running it on groups in the library, and also by running it against examples outside of the library. Luke, if you can provide some relevant examples (ones that are treated wrong by the current method and right by the new one), that would be great. Ideally 1-2 examples for each possible case, if you have.
Here is the code we could use. I'd suggest to diff it one last time against ONanScottType. It also should probably start by a check for IsQuasiprimitive and error out otherwise, just like ONanScottType does.
# this code is a modified version of the ONanScottType function that is present in gap.
# modified by Luke Morgan
# I only modified the section where ASreg is allowed for quasiprimitive.
PraegerONanScottType:=function(G)
local dom,s,cs,t,ts,o,m,stb;
dom:=MovedPoints(G);
s:=Socle(G);
if IsAbelian(s) then
return "HA";
elif IsSimpleGroup(s) then
return "AS"; # checks only if socle is simple, could be regular
elif Length(dom)=Size(s) then
return "TW";
else
# LM: now the socle is a non-abelian non-simple group
# so the group now is of type 3 or 4. Next we determine a simple socle
# factor and a direct product of all but one socle factor.
# simple socle factor.
# as default stab chain chooses pts lexicographically, this is likely a
# stored stabilizer
stb:=Stabilizer(s,SmallestMovedPoint(s));
cs:=CompositionSeries(s);
t:=cs[Length(cs)-1]; # t is one simple factor
m:=cs[2]; # m is a T^k-1, t is in m by comp series construction
# now test Dixon&Mortimer, p.126, Case 1: R1 (projection of pt. stab
# onto one direct factor) is proper subgroup of T1.
#if Size(ClosureSubgroup(m,stb))<Size(s) then
# Since m is normal, this projection is a proper subgroup iff m does not
# act transitively
if not IsTransitive(m,dom) then
return "PA"; # Product action of type 2 with transitive
fi;
# Now we are in case 2, R1=T1. Group must be diagonal (3) or product
# action of diagonal with transitive (4). For diagonal case the point
# stabilizer must have the order of t, for product case it must be a
# power of the order of t
if Size(stb)=Size(t) then # type 3
# in the a case the socle is not minimal
#if Size(NormalClosure(G,t))<Size(s) then
if Length(Orbit(G,t))<Length(cs)-1 then # conjugates of t do not cover socle
return "HS";
else
return "SD"; # G has unique minimal normal subgroup
fi;
else
# Same argument as for 3:
#if Size(NormalClosure(G,t))<Size(s) then
if Length(Orbit(G,t))<Length(cs)-1 then
return "HC";
else
return "CD";
fi;
fi;
fi;
end;
It works for groups in the database, but not in general, due to some cases missing or being not quite right.
@glukemorgan provided an alternative implementation which is based on the GAP function
ONanScottType
. I am reproducing it below.We should just use that, but I'd like to also add a bunch of tests for it to
.tst
, both by running it on groups in the library, and also by running it against examples outside of the library. Luke, if you can provide some relevant examples (ones that are treated wrong by the current method and right by the new one), that would be great. Ideally 1-2 examples for each possible case, if you have.Here is the code we could use. I'd suggest to diff it one last time against
ONanScottType
. It also should probably start by a check forIsQuasiprimitive
and error out otherwise, just likeONanScottType
does.