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 commutator \([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.