Curver’s load() function automatically builds the Lickorish generators [FarbMarg12] for any punctured surface from its genus \(g\) and number of punctures \(n\). This consists of four families of Dehn twists \(a_i, b_i, c_i, d_i, p_i\) and a family of half-twists \(s_i\). The \(p_i\) twists are parallel to \(a_{g-1}\) and are arranged as shown below:

MCG generators

For example:

>>> S = curver.load(5, 4)
>>> S
Mapping class group < a_0, a_1, a_2, a_3, a_4, b_0, b_1, b_2, b_3, b_4, c_0, c_1, c_2, c_3, d_1, d_2, d_3, d_4, p_1, p_2, p_3, s_0, s_1, s_2, s_3 > on A_0wUXPZwTTUvsjvktbsTgIgjJ7aqCDyJNKbtky0Ajvrz4SWEQ+5CjlC9F1

Of course, as shown by Humphries, this generating set is redundant. For example, following the proof of Theorem 4.14 of [FarbMarg12]:

>>> h = S('b_3.c_2.b_2.a_2.c_1.b_1.b_2.c_1.c_2.b_2.b_3.c_2.a_2.b_2.c_1.b_1')  # h(a_1) == a_3.
>>> h * S('a_1') * h**-1 == S('a_3')

There are also many relations in these generating sets:

>>> S = curver.load(2, 5)
>>> S('b_0.b_1') == S('b_1.b_0')  # Commutativity.
>>> S('a_0.b_0.a_0') == S('b_0.a_0.b_0')  # Braiding.
>>> S('(a_0.b_0.c_0.b_1)^10') == S('(s_1.s_2.s_3.s_4)^5')  # Chain.

>>> S = curver.load(3, 2)
>>> S('a_0.b_0.c_0.b_1.c_1.b_2.p_1').order()  # Another chain.

As expected, when \(g = 0\) only the half-twists are provided:

>>> S = curver.load(0, 6)
>>> S
Mapping class group < s_0, s_1, s_2, s_3, s_4, s_5 > on c-ZlgeM906o-354

These correspond to the half-twists \(s_i\) that interchange the \(i^{\textrm{th}}\) and \((i+1)^{\textrm{st}}\) punctures:

MCG generators

Alternatively, this function can also be used to load a flipper surface with its corresponding generators. For low-complexity surfaces these generators often have simpler names. For example:

>>> curver.load('S_1_2')
Mapping class group < a, b, c, x > on 6-WKSv
>>> curver.load(1, 2)
Mapping class group < a_0, b_0, p_1, s_0, s_1 > on 6-WKSv