Mathieu group M23 (Presentation 2)
The claims on this page come from https://brauer.maths.qmul.ac.uk/Atlas/v3/pres/M23G1-P2.
The Python script includes the additional relation \([a,b]^6 = 1\), which does not appear in the presentation displayed on the ATLAS page. We do not verify that this relation is redundant here.
Claim
\[
\mathrm{M}_{23} = \langle a, b \mid a^2 = b^4 = (ab^2)^6
= (abab^{-1}ab^2)^4
= abababab^{-1}ab^2abab^{-1}abab^{-1}abababab^{-1}ab^{-1}ab^{-1}
= abab^2abab^2abab^2ab^2ab^{-1}ab^2ab^{-1}abab^2abab^{-1}ab^2
= abab^2ab^2abab^2ab^2abab^2ab^2abab^2ab^2ab^{-1}ab^2ab^2ab^{-1}ab^2ab^2
= ababababab^2abab^{-1}abab^2ababab^{-1}ab^2abab^2ab^2abab^{-1}ab^{-1}abab^2
= 1 \rangle
\]
with
\[
|\mathrm{M}_{23}| = 10,200,960.
\]
On this page, we verify that the presentation used by the script defines a group of order \(10,200,960\).
The code
In libsemigroups_pybind11, the following script constructs the presentation for M23 and runs the Todd-Coxeter algorithm.
Code
from libsemigroups_pybind11 import (
Presentation,
ToddCoxeter,
congruence_kind,
presentation,
)
from libsemigroups_pybind11.words import parse_relations
# Setup the presentation object with the empty and inverses, so it can represent a group
p = Presentation("abAB")
p.contains_empty_word(True)
presentation.add_inverse_rules(p, "ABab")
# Add the defining relations
presentation.add_rule(p, parse_relations("a^2"), "")
presentation.add_rule(p, parse_relations("b^4"), "")
presentation.add_rule(p, parse_relations("(ab^2)^6"), "")
presentation.add_rule(p, parse_relations("(a,b)^6"), "")
presentation.add_rule(p, parse_relations("(abaBab^2)^4"), "")
presentation.add_rule(p, parse_relations("abababaBab^2abaBabaBabababaBaBaB"), "")
presentation.add_rule(
p, parse_relations("abab^2abab^2abab^2ab^2aBab^2aBabab^2abaBab^2"), ""
)
presentation.add_rule(
p,
parse_relations("abab^2ab^2abab^2ab^2abab^2ab^2abab^2ab^2aBab^2ab^2aBab^2ab^2"),
"",
)
presentation.add_rule(
p, parse_relations("ababababab^2abaBabab^2ababaBab^2abab^2ab^2abaBaBabab^2"), ""
)
# Run the Todd-Coxeter algorithm
tc = ToddCoxeter(congruence_kind.twosided, p)
tc.strategy(tc.options.strategy.felsch)
print(f"The size of the group defined by the presentation is {tc.number_of_classes()}")
The output
The truncated output of the enumeration is below:
Truncated output from the Python script
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: RUN 0 START (strategy() = felsch)
#0: ToddCoxeter: |A| = 4, |R| = 13, |u| + |v| ∈ [2, 48], ∑(|u| + |v|) = 248
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: FELSCH 0.0 START
#0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined
#0: ToddCoxeter: nodes | 1 | 0 | 1
#0: ToddCoxeter: | active | missing | % complete
#0: ToddCoxeter: edges | 0 | 4 | 0.0%
#0: ToddCoxeter: time | run 0 = 26µs | all runs = 26µs | elapsed = 72µs
++++++++++++++++++++++++++++++++
#1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined
#1: ToddCoxeter: nodes | 1,275,486 | 25,934 | 1,301,428
#1: ToddCoxeter: diff 0.0.0 | +1,275,485 | +25,934 | +1,301,427
#1: ToddCoxeter: | active | missing | % complete
#1: ToddCoxeter: edges | 3,967,993 | 1,133,951 | 77.8%
#1: ToddCoxeter: diff 0.0.0 | +3,967,993 | +1,133,947 | +77.8%
#1: ToddCoxeter: phase 0.0 = 1.005s | run 0 = 1.005s | all runs = 1.005s | elapsed = 1.005s
++++++++++++++++++++++++++++++++
#1: ToddCoxeter: FELSCH 0.0.2 | active | killed | defined
#1: ToddCoxeter: nodes | 2,506,185 | 60,138 | 2,566,339
#1: ToddCoxeter: diff 0.0.1 | +1,230,699 | +34,204 | +1,264,911
#1: ToddCoxeter: diff 0.0.0 | +2,506,184 | +60,138 | +2,566,338
#1: ToddCoxeter: | active | missing | % complete
#1: ToddCoxeter: edges | 7,801,046 | 2,223,694 | 77.8%
#1: ToddCoxeter: diff 0.0.1 | +3,833,053 | +1,089,743 | +0.0%
#1: ToddCoxeter: diff 0.0.0 | +7,801,046 | +2,223,690 | +77.8%
#1: ToddCoxeter: phase 0.0 = 2.010s | run 0 = 2.010s | all runs = 2.010s | elapsed = 2.010s
++++++++++++++++++++++++++++++++
#1: ToddCoxeter: FELSCH 0.0.3 | active | killed | defined
#1: ToddCoxeter: nodes | 3,727,047 | 96,273 | 3,823,324
#1: ToddCoxeter: diff 0.0.2 | +1,220,862 | +36,135 | +1,256,985
#1: ToddCoxeter: diff 0.0.0 | +3,727,046 | +96,273 | +3,823,323
#1: ToddCoxeter: | active | missing | % complete
#1: ToddCoxeter: edges | 11,606,914 | 3,301,274 | 77.9%
#1: ToddCoxeter: diff 0.0.2 | +3,805,868 | +1,077,580 | +0.0%
#1: ToddCoxeter: diff 0.0.0 | +11,606,914 | +3,301,270 | +77.9%
#1: ToddCoxeter: phase 0.0 = 3.011s | run 0 = 3.011s | all runs = 3.011s | elapsed = 3.011s
++++++++++++++++++++++++++++++++
#1: ToddCoxeter: FELSCH 0.0.4 | active | killed | defined
#1: ToddCoxeter: nodes | 4,908,390 | 131,357 | 5,039,763
#1: ToddCoxeter: diff 0.0.3 | +1,181,343 | +35,084 | +1,216,439
#1: ToddCoxeter: diff 0.0.0 | +4,908,389 | +131,357 | +5,039,762
#1: ToddCoxeter: | active | missing | % complete
#1: ToddCoxeter: edges | 15,288,906 | 4,344,654 | 77.9%
#1: ToddCoxeter: diff 0.0.3 | +3,681,992 | +1,043,380 | +0.0%
#1: ToddCoxeter: diff 0.0.0 | +15,288,906 | +4,344,650 | +77.9%
#1: ToddCoxeter: phase 0.0 = 4.015s | run 0 = 4.015s | all runs = 4.015s | elapsed = 4.015s
++++++++++++++++++++++++++++++++
#1: ToddCoxeter: FELSCH 0.0.5 | active | killed | defined
#1: ToddCoxeter: nodes | 6,098,758 | 169,799 | 6,268,568
#1: ToddCoxeter: diff 0.0.4 | +1,190,368 | +38,442 | +1,228,805
#1: ToddCoxeter: diff 0.0.0 | +6,098,757 | +169,799 | +6,268,567
#1: ToddCoxeter: | active | missing | % complete
#1: ToddCoxeter: edges | 18,999,097 | 5,395,935 | 77.9%
[... lines omitted ...]
#0: ToddCoxeter: diff 0.1.53 | +0 | +0 | +0
#0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0
#0: ToddCoxeter: | active | missing | % complete
#0: ToddCoxeter: edges | 40,803,840 | 0 | 100.0%
#0: ToddCoxeter: diff 0.1.53 | +0 | +0 | +0.0%
#0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0%
#0: ToddCoxeter: phase 0.1 = 53.174s | run 0 = 4min38s | all runs = 4min38s | elapsed = 4min38s
#0: ToddCoxeter: lookahead_next() is now max(f x a = 20,401,920, m = 10,000) (+15,401,920)
#0: ToddCoxeter: because a > n
#0: ToddCoxeter: where: a = number_of_nodes_active() = 10,200,960
#0: ToddCoxeter: f = lookahead_growth_factor() = 2
#0: ToddCoxeter: m = lookahead_min() = 10,000
#0: ToddCoxeter: n = lookahead_next() = 5,000,000
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: FELSCH 0.2.55 | active | killed | defined
#0: ToddCoxeter: nodes | 10,200,960 | 15,538,858 | 25,739,818
#0: ToddCoxeter: diff 0.2.54 | +0 | +0 | +0
#0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0
#0: ToddCoxeter: | active | missing | % complete
#0: ToddCoxeter: edges | 40,803,840 | 0 | 100.0%
#0: ToddCoxeter: diff 0.2.54 | +0 | +0 | +0.0%
#0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0%
#0: ToddCoxeter: phase 0.2 = 53.174s | run 0 = 4min38s | all runs = 4min38s | elapsed = 4min38s
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: RUN 0 STOP (finished)
#0: ToddCoxeter: run 0 | lookahead | lookbehind | hlt | felsch
#0: ToddCoxeter: num. phases | 1 | 0 | 0 | 1
#0: ToddCoxeter: time spent in phases | 53.174s (19%) | - (0%) | - (0%) | 3min45s (81%)
#0: ToddCoxeter: phase 0.2 = 53.410s | run 0 = 4min38s | all runs = 4min38s | elapsed = 4min38s
The size of the group defined by the presentation is 10200960
The computed size of the group matches the claimed size: \(10,200,960\).