How to Get Your Hands on the Character Table of the Monster Simple Group

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

j(τ)=q1+744+196884q+21493760q2+, q=e2πiτ

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)
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:

  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 1056 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:

The Monster Group Character Table
The Monster Group Character Table

I hope this helps someone in the future 😛️