Applications of the mmgroup package
Introduction
Some applications using the mmgroup package can be downloaded from the github repository
https://github.com/Martin-Seysen/mmgroup .
In that repository each application is stored in a subdirectory of
directory applications
.
The mmgroup package must be installed before running any of these applications, as described in the API reference of this project.
Representing the Monster as a Hurwitz group
We want to find a presentation of the Monster as a Hurwitz group.
Description of the task to be done
Wilson [Wil01] has shown that the Monster group is a Hurwitz group, i.e. a group generated by two elements \(a, b\) satisfying the relations \(a^2 = b^3 = (ab)^7 = 1\).
In a MathOverflow question is has been asked for the smallest possible order of the commutator \([a,b] = a^{-1} b^{-1} a b\) of \(a\) and \(b\) in such a presentation of the Monster, see
https://mathoverflow.net/q/363882 .
Using the implementation of the Monster group in the mmgroup project, it is now possible to find a non-trivial upper bound for that commutator. The purpose of this application is to find generators \(a, b\) of the Monster satisfying the relations given above, so that we can compute the order of the commutator \([a,b]\).
In [Wil01] Wilson has given explicit generators \(a\) (in class 2B) and \(b\) (in class 3B) of the Monster satifying the relations given above. It appears to be extremely difficult to translate these two generators from the language used in [Wil01] to the language used in our mmgroup package. Since not all such pairs \(a, b\) must be isomorphic (via conjugation), we also want to find several such pairs. So we have to reimplement the search for such pairs here.
At the time of writing this document we have found 7 pairs of such generators \(a, b\); and in both cases the commmutator \([a,b]\) has order 39. I thank Gabriel Goller in Augsburg, Germany for computing most of these pairs.
Python scripts referred in the following subsections can be found
in subdirectory applications/Hurwitz
of the repository.
Searching for pairs of generators
Let \(G_{x0}\) be the subgroup of the Monster of structure \(2^{1+24}.\mbox{Co}_1\) as defined in the API reference of this package, and let \(z_{-1}\) be the central involution in that subgroup. Then for generating a pair \(a, b\) as above, we put \(a = z_{-1}\) . Then we search for a random \(g_3 \in G_{x0}\) of order 3 with \(\chi_1(g_3) = 53\), so that \(g_3\) is in class 3B of the Monster. Here \(\chi_1\) is the character of degree 196883 of the Monster. With the mmgroup package we can compute that character in much less than a second. For a fixed \(g_3\) we generate a large number of (sufficiently) random elements \(g_e\) of the Monster and we put \(g = g_e^{-1} g_3 g_e\). If \(z g\) has order 7 then \((a, b) = (z, g)\) is a candidate for a pair of generators, and we store \(g_3\) and \(g_e\) in a file for further processing.
The python script find_generators.py
searches for pairs
\((a, b)\) as above, and stores the corresponding elements
\(g_3, g_e\) in file Hurwitz_order7.txt
.
Here for checking the order of \(a b\) we simply check
that \(v \cdot (a b)^7 = v\) for a random vector \(v\)
in the 196883-dimensional representation of the Monster
modulo 3.
This is by far the most time-consuming computation in the
whole application. Wilson [Wil01] reports a success rate of
one over 64 millions for finding a suitable pair. Using
all CPUs of the authors’s computer, we can check about
12 million candidates per day, so that our search has to run
for about a week.
Verifying pairs of generators
Given a pair \((a, b)\) satisfying the relations \(a^2 = b^3 = (ab)^7 = 1\), we also have to verify that \(a\) and \(b\) actually generate the Monster group and not just a proper subgroup of the Monster. Here the strategy in [Wil01] is to compute random elements in the group \(\langle a, b \rangle\) generated by \(a\) and \(b\), until one finds an element \(h_1\) of order 94 and an element \(h_2\) or order 41, 59, or 71. According to [Wil01], every proper subgroup of the Monster containing an element of order 94 is contained in a maximal subgroup of structure \(2.B\), where \(B\) is the Baby Monster. But none of the primes 41, 59, or 71 divides the order of \(B\); so \(h_1\) and \(h_2\) generate the Monster.
We compute a certificate for checking that \(a\) and \(b\) generate the Monster as follows. Put \(H(a, b, n) = \prod_{i=0}^{63} a b^{1+\nu_i}\) for elements \(a, b\) of the Monster, and an integer \(0 \leq n < 2^{64}\) with binary representation \(n = \sum_{i=0}^{63} \nu_i \cdot 2^i, \nu_i \in \{0,1\}\). If \(a\) and \(b\) generate the Monster then we can effectively find integers \(n_1, n_2\) such that \(H(a, b, n_1)\) has order 94 and \(H(a, b, n_2)\) has order 41, 59, or 71.
The script parse_found.py
reads the file Hurwitz_order7.txt
discussed in the previous section and checks if pair of candidates
in that file actually generates the Monster. If this is the case
for a pair then it stores that pair plus a certificate for that
pair in a list in file hurwitz_monster_samples.py
.
Computing such a certificate take a few minutes for a pair
\((a, b)\) on the author’s computer, which is negligible
compared to the effort for finding such a pair.
Using pairs of generators
For using a pair of generators of the Monster, the user may
simply import the file hurwitz_monster_samples.py
. This file
essentially contains a list of pairs of elements of the Monster,
so that each of these pairs generates the Monster as a Hurwitz
group. That list also contains certificates for these pairs as
discussed in the last section.
A precomputed file hurwitz_monster_samples.py
containing
(at least) two such pairs is stored in the git
repository
of the project.
The script hurwitz_verify.py
checks all pairs
\((a,b)\) contained in file hurwitz_monster_samples.py
and displays the order of the commutator \([a,b]\). This
activity takes just a few seconds for each pair.
Mapping the Coxeter group \(Y_{555}\) into the Bimonster
Sample programs dealing with the group \(Y_{555}\) and the Bimonster
The implementation of the Coxeter group \(Y_{555}\) and the Bimonster has now been integrated into the mmgroup project. Documentation see The Coxeter group Y_{555} and the Bimonster in the API reference.
This directory now just contains a few tiny self-explaining applications of the implementation of \(Y_{555}\) and the BiMonster.
Computing standard generators of the Monster
This application computes standard generators of the Monster.
The standard generators (a, b)
of the Monster satisfy the following
properties:
a
is in class 2A, b
is in class 3B and ab
has order 29,
see
https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/M/
Function standard_generators
in file stdgen.py
in this
application computes standard generators of the Monster (if this has not
yet been done) and stores them in the file standard_generators.py
.