# Small subgroups of the monster

Is every group of order at most 36 isomorphic to a subgroup of the monster group?

• Wikipedia says $A_{12}$ is a subgroup of the monster, so probably? Commented Jan 16, 2023 at 20:11
• Once we've checked all cyclic groups of order at most 36 (using the list of conjugacy classes of the Monster), the hard part might be accounting for all 50 noncyclic groups of order 32. Commented Jan 16, 2023 at 21:46
• The 2-local subgroups of structure $2^{2+11+22}.(M_{24} \times S_3)$ and $2^{3+6+12+18}.(L_3(2) \times S_6)$ have odd index in the Monster. So it might be possible to construct the 2 Sylow group of order $2^{46}$ of the Monster in such a way that Magma or GAP can deal with the hard part mentioned by Noam D. Elkies. Commented Jan 16, 2023 at 22:17
• Please use a high-level tag like "gr.group-theory". I added this tag now. Commented Feb 7, 2023 at 0:08

# No, but almost.

$$\newcommand\Dic{\mathit{Dic}}$$It turns out that all isomorphism types of groups of order up to 36 occur as subgroups of the Monster with a single exception: no subgroup of the monster is isomorphic to the dicyclic group $$\Dic_{32}$$ of order 32, also known as generalized quaternion group $$Q_{32}$$, with small groups id [32,20].

### How to verify that $$Q_{32}$$ is not a subgroup.

As Martin pointed out in a comment, the Sylow 2-subgroup of the Monster is also a subgroup of two of its maximal subgroups. The excellent GAP package AtlasRep by Thomas Breuer provides access to many of these maximal subgroups. It takes some considerable time, but it is possible to extract the Sylow 2-subgroups from this in a form that is suitable for further computations. Thomas generously provided me with a file where he previously computed this (I am discussing with him how to best make this available for the general public).

Anyway: $$Q_{32}$$ has a cyclic group $$C_{16}$$ as a normal subgroup. So once we have the Sylow 2-subgroup $$S$$ of the monster in GAP, we can compute its conjugacy classes (there are 26752), and then select those of elements of order 16 (there are 378). Then for each such class we take a representative $$g$$, and compute the normalizer $$N_S(g)$$. In it, we compute conjugacy classes of elements $$h$$ of order 4 which do not centralize $$g$$, and for which $$h^2 = g^8$$ holds (that element then is the unique central involution). Then the group $$K=\langle g,h \rangle$$ might be a $$Q_{32}$$ — but most importantly, the converse holds: if there is a $$Q_{32}$$ we must find it that way.

For reference, here is the code I used (it assumes $$S$$ was already defined before):

# compute conjugacy classes; took 381 seconds on my M1 MacBook Pro
cc:=ConjugacyClasses(S);;
# restrict to elements of order 16
cc16:=Filtered(cc, c->Order(Representative(c))=16);;

for cls in cc16 do
# Print a bit so we know there is progress
Print(".\c");
# get the class representative, and compute the normalizer
g := Representative(cls);
N := Normalizer(S, g);

# rewrite as a separate pc-group, to improve performance
H := PcGroupWithPcgs(Pcgs(N));
hom:=GroupHomomorphismByImagesNC(N,H);;
# also map g over to the new group
g := Image(hom, g);

# Find elements of order 4...
Hcc := List(ConjugacyClasses(H), Representative);
Hcc := Filtered(Hcc, h -> Order(h) = 4);;
# ... which do not centralize g, but square to g^8
Hcc := Filtered(Hcc, h -> h^2 = g^8 and h*g<>g*h);

# now check if any of those generate the group we are looking for
for h in Hcc do
K:=Group(g,h);
if Size(K) = 32 and IdGroup(K) = [32,20] then
Error("found it"); # abuse GAP break loop
fi;
od;
od;


### How to verify that all other groups of order $$\leq 36$$ occur.

To be clear, I did not start with some kind of magic guess that $$Q_{32}$$ is not a subgroup, but rather I first tried to construct as many subgroups as I could. While this process is not strictly necessary for answering this question, perhaps some are interested in how I went about this, so I am recording some of it here.

First, I checked how many isomorphism types of groups of order $$\leq 36$$ there are; the GAP command Sum([1..36], NrSmallGroups); told me that there are 162.

Let's start collecting ids (as in: "small groups library ids") of small subgroups of the monster in a list monster_ids. We start out by taking all cyclic subgroups. Also for reference collect all ids of groups of order $$\leq 36$$ so that we can more easily see which are missing in monster_ids.

all_ids := ListX([1..36],n->[1..NrSmallGroups(n)],{n,i}->[n,i]);
monster_ids := List([1..36], n->IdGroup(CyclicGroup(n)));


That's 36 groups out of 162 we found so far.

Next we know $$A_{12}$$ is a subgroup of the monster, so let's add the ids of its subgroups of order $$\leq 36$$:

# Helper which takes a groups, computes conjugacy classes of "small" subgroups,
# and returns their ids.
FindSubIds := function (G, limit)
local cc;
cc := ConjugacyClassesSubgroups(G);
cc := List(cc, Representative);
cc := Filtered(cc, g -> Size(g) <= limit);
return Set(cc, IdGroup);
end;

A12 := AlternatingGroup(12);
UniteSet(monster_ids, FindSubIds(A12, 36));


This takes about 30 seconds on my laptop, and brings us up to 127 out of 162 groups.

From here on we look at maximal subgroups of the Monster as returned by AtlasRep. We can query their names as follows

maxes := AtlasRepInfoRecord("M").structureMaxes;
Number(maxes); # there are 36 in the system


Now we can get various subgroup types from them…. First for some of the smaller ones, we can just use brute force to get some “missing” groups

# get [ 36, 4 ]
G:=AtlasGroup("L2(19).2");
UniteSet(monster_ids, FindSubIds(G, 36));

# get [ 22, 1 ]
G:=AtlasGroup("11^2:(5x2.A5)");
UniteSet(monster_ids, FindSubIds(G, 36));

# get [ 26, 1 ]
G:=AtlasGroup("13^(1+2):(3x4S4)");
UniteSet(monster_ids, FindSubIds(G, 36));


To get the missing group of order 34, compute a centralizer of a Sylow 17-group:

# get [ 34, 1 ] and groups of order 32 with ids 3, 12, 16, 36
G:=AtlasGroup("(L3(2)xS4(4):2).2");
S:=SylowSubgroup(G,17);
N:=Normalizer(G,S);
UniteSet(monster_ids, FindSubIds(N, 36));


A similar trick to get one of the missing order 36 subgroups. We can also get some groups of order 32 from a Sylow 2-subgroup

# get [ 36, 3 ]
G:=AtlasGroup("(S5xS5xS5):S3");
g := (1,2,3)(6,7,8)(11,12,13);
Assert(0, g in G);
cent := Centralizer(G, g);
UniteSet(monster_ids, FindSubIds(cent, 36));

# get groups of order 32 with ids 3, 4, 12, 13, 14, 24, 26, 29, 30, 31, 35, 36
g:=(1,2)(3,4)(6,7)(8,9)(11,12)(13,14);
Assert(0, g in G);
cent := Centralizer(G, g);
UniteSet(monster_ids, FindSubIds(cent, 36));


The last missing groups of order 24 resp. 36:

G:=AtlasGroup("(A5xU3(8):3):2");

# Normalizers of a C_9 ...
cc:=Filtered(List(ConjugacyClasses(G),Representative),g->Order(g)=9);
for g in cc do
UniteSet(monster_ids, FindSubIds(Normalizer(G,g), 36));
od;

# Normalizers of a C_12 ...
cc:=Filtered(List(ConjugacyClasses(G),Representative),g->Order(g)=12);
for g in cc do
UniteSet(monster_ids, FindSubIds(Normalizer(G,g), 36));
od;


At this point we have 148 out of 162 groups, with only [ 16, 9 ] plus 13 groups of order 32 missing.

At this point I basically started sampling random subgroups of Sylow 2-subgroups of various maximals, and finally of the full Sylow 2-subgroup of the monster. This is not completely trivial, as some subgroups are not that easy to find, but I eventually got them all — except $$Q_{32}$$. So I started searching for it more systematically, and ultimately found it is not there.

• What an awesome answer! Thank you for taking the time to walk through your thought process. Commented Feb 7, 2023 at 0:50