How to Get Your Hands on the Character Table of the Monster Group
I’ve been studying the Monster group and the Monstrous moonshine conjecture recently, which roughly states that the coefficients of the 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?
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) header := JoinStringsWithSeparator(ClassNames(ct), ","); # The data itself (the rows) csv := JoinStringsWithSeparator( List(Irr(ct), chi -> JoinStringsWithSeparator(chi, ",")), "\n" ); # Save the information to disk PrintTo("character-table.csv", header, "\n", csv); # Exit the application QUIT;
There are a couple of problems with this script, namely:
PrintToliterally redirects stdout to a file, so it inserts
"\\\n"whenever a line get bigger than the terminal’s width.
GAP uses scientific notation to represent large numbers, so things like
get’s printed as
1000000…— which is what we actually want.
I addressed both of this issues using a Python script that:
"\\\n"for the empty string in the file.
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 😛️