How to Get Your Hands on the Character Table of the Monster Group (Mar 14th, 2021)

I’ve been studying the Monster group and the Monstrous moonshine conjecture recently, which roughly states that the coefficients of the $j$ modular function

are given by the dimensions of complex representations of the Monster group. I then prepared a small lecture on (the rough outline) of Borcherds' proof of the conjecture to some of my friends.

In the process of preparing the presentation I came across the need for the character table of the Monster (for complex representations) — I wanted to make an accurate illustration of how large it is. Then came the questing: How do I get my hands on the character table of the Monster group?

If you’re only looking for a file with the table you can get it at /data/monster-group-character-table.csv

The table was computed by Fisher, Livingstone and Thorne even before the Monster was first constructed, so I imagined I would be able to find it in the internet somewhere. Unfortunately this was not the case.

After searching around a bit I came across a GAP script that exports the table to CSV (see this StackExchange answer). For those of you who don’t know, GAP is a computer algebra system with fairly sophisticated functions for group-theoretic stuff and related fields. Here goes the script:

``````# The character table
ct := CharacterTable("M");

# The header of the table (the names of the conjugacy classes of Monster)

# The data itself (the rows)
csv := JoinStringsWithSeparator(
List(Irr(ct), chi -> JoinStringsWithSeparator(chi, ",")),
"\n"
);

# Save the information to disk

# Exit the application
QUIT;``````

There are a couple of problems with this script, namely:

1. `PrintTo` literally redirects stdout to a file, so it inserts `"\\\n"` whenever a line get bigger than the terminal’s width.
2. GAP uses scientific notation to represent large numbers, so things like ${10}^{56}$ get’s printed as `E(56)` instead of `1000000…​` — which is what we actually want.

I addressed both of this issues using a Python script that:

1. Replaced `"\\\n"` for the empty string in the file.
2. Evaluated each cell of the table using `eval`. I had to define a function called `E` — which does the obvious thing — so that Python could interpret them.

After that, I converted the table to a (stylized) representation in LaTeX and rendered it to SVG. I leave the details of converting the CSV data to LaTeX internal format for tables and rendering this as an exercise to the reader. Here goes the final illustration:

I hope this helps someone in the future 😛️