From 6466eb2b35b22778039bd0e2927fd56996f1f83f Mon Sep 17 00:00:00 2001 From: Codex OpenAI Date: Tue, 18 Aug 2026 17:22:10 +0100 Subject: [PATCH 1/9] Add Held group --- docs/.nav.yml | 11 + docs/examples/atlas/index.md | 2 +- .../atlas/monster-sections/he/1142400.md | 182 ++++++++++++++++ .../atlas/monster-sections/he/187425.md | 183 ++++++++++++++++ .../atlas/monster-sections/he/2058.md | 176 +++++++++++++++ .../atlas/monster-sections/he/244800.md | 162 ++++++++++++++ .../atlas/monster-sections/he/266560.md | 192 ++++++++++++++++ .../atlas/monster-sections/he/29155-i.md | 181 ++++++++++++++++ .../atlas/monster-sections/he/29155-ii.md | 205 ++++++++++++++++++ .../atlas/monster-sections/he/3358656.md | 178 +++++++++++++++ .../atlas/monster-sections/he/652800.md | 182 ++++++++++++++++ .../atlas/monster-sections/he/8330.md | 153 +++++++++++++ .../atlas/monster-sections/he/999600.md | 182 ++++++++++++++++ .../atlas/monster-sections/he/index.md | 23 +- docs/stylesheets/extra.css | 9 + 15 files changed, 2015 insertions(+), 6 deletions(-) create mode 100644 docs/examples/atlas/monster-sections/he/1142400.md create mode 100644 docs/examples/atlas/monster-sections/he/187425.md create mode 100644 docs/examples/atlas/monster-sections/he/2058.md create mode 100644 docs/examples/atlas/monster-sections/he/244800.md create mode 100644 docs/examples/atlas/monster-sections/he/266560.md create mode 100644 docs/examples/atlas/monster-sections/he/29155-i.md create mode 100644 docs/examples/atlas/monster-sections/he/29155-ii.md create mode 100644 docs/examples/atlas/monster-sections/he/3358656.md create mode 100644 docs/examples/atlas/monster-sections/he/652800.md create mode 100644 docs/examples/atlas/monster-sections/he/8330.md create mode 100644 docs/examples/atlas/monster-sections/he/999600.md diff --git a/docs/.nav.yml b/docs/.nav.yml index 22914c7..cc679a5 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -44,6 +44,17 @@ nav: - "Monster sections": - "Held group He": - examples/atlas/monster-sections/he/index.md + - "S4(4):2": examples/atlas/monster-sections/he/2058.md + - "2^2.L3(4).S3": examples/atlas/monster-sections/he/8330.md + - "2^6:3.S6 (I)": examples/atlas/monster-sections/he/29155-i.md + - "2^6:3.S6 (II)": examples/atlas/monster-sections/he/29155-ii.md + - "2^(1+6).L3(2)": examples/atlas/monster-sections/he/187425.md + - "7^2:2.L2(7)": examples/atlas/monster-sections/he/244800.md + - "3.S7": examples/atlas/monster-sections/he/266560.md + - "7^(1+2):(3 x S3)": examples/atlas/monster-sections/he/652800.md + - "S4 x L3(2)": examples/atlas/monster-sections/he/999600.md + - "7:3 x L3(2)": examples/atlas/monster-sections/he/1142400.md + - "5^2:4A4": examples/atlas/monster-sections/he/3358656.md - "Fischer group Fi22": - examples/atlas/monster-sections/fi22/index.md - "Pariahs": diff --git a/docs/examples/atlas/index.md b/docs/examples/atlas/index.md index 5150c6e..0828c1a 100644 --- a/docs/examples/atlas/index.md +++ b/docs/examples/atlas/index.md @@ -113,7 +113,7 @@ see more information. Monster sections - He + He HN Th diff --git a/docs/examples/atlas/monster-sections/he/1142400.md b/docs/examples/atlas/monster-sections/he/1142400.md new file mode 100644 index 0000000..44f8d1d --- /dev/null +++ b/docs/examples/atlas/monster-sections/he/1142400.md @@ -0,0 +1,182 @@ +# $7:3 \times L_3(2)$ as a subgroup of Held group He + +The subgroup generators used on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/](https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/). + +## Claim + +$$ + \mathrm{He} = \langle a, b \mid a^2 = b^7 = (ab)^{17} + = [a, b]^6 = [a, b^3]^5 = [a, babab^{-1}abab] + = (ab)^4ab^2ab^{-3}ababab^{-1}ab^3ab^{-2}ab^2 = 1 \rangle. +$$ + +The generators are claimed to generate a maximal subgroup isomorphic to +$7:3 \times L_3(2)$. More precisely, if + +$$ + H = \langle (q^{-1})^{11}(ab^2)^4q^{11},\ b^{-1}a(ab^2)^4ab,\ \text{ where }q=ababb \rangle, +$$ + +then + +$$ + [\mathrm{He} : H] = 1,142,400. +$$ + +On this page, we verify that the subgroup generated by these words has the +claimed index. + +## The code + +In [libsemigroups_pybind11][], the following script constructs the presentation +for He, adds the generating pairs that define the maximal subgroup, and runs the +Todd-Coxeter algorithm. The source code marks three of the presentation +relations as redundant. + +```python +from libsemigroups_pybind11 import ( + Presentation, + ToddCoxeter, + congruence_kind, + presentation, +) +from libsemigroups_pybind11.words import parse_relations as parse + + +# 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("a^2"), "") +presentation.add_rule(p, parse("b^7"), "") +presentation.add_rule(p, parse("(ab)^17"), "") +presentation.add_rule(p, parse("(ab^3)^8"), "") # redundant +presentation.add_rule(p, parse("(ab^2ab^2aBBB)^3"), "") # redundant +presentation.add_rule(p, parse("(a,babaBabab)"), "") +presentation.add_rule(p, parse("(a,b^3)^5"), "") +presentation.add_rule(p, parse("(a,b)^6"), "") +presentation.add_rule( + p, parse("ab(abaBB)^2ab^2aBab^2aBB(abaB)^2"), "" +) # redundant, maybe useful. +presentation.add_rule(p, parse("(ab)^4ab^2aB^3ababaBab^3aB^2ab^2"), "") + +presentation.balance(p, "abAB", "ABab") +presentation.replace_subword(p, "A", "a") +p.alphabet("abB") + +tc = ToddCoxeter(congruence_kind.onesided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# The subgroup generators here are taken from one of the straight line +# programmes from: +# https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/ + +# takes approx 7.5 minutes +q = "ababb" +Q = ("".join(reversed(q))).replace("b", "B") +tc.add_generating_pair(parse(f"({Q})^11(ab^2)^4({q})^11"), "") +tc.add_generating_pair(parse("Ba(ab^2)^4ab"), "") + +print(f"The index of the subgroup is {tc.number_of_classes()}") +``` + +## The output + +The truncated output of the enumeration is below: + +??? info "Truncated output from the Python script" + + ``` + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 14, |u| + |v| ∈ [2, 40], ∑(|u| + |v|) = 259 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 START + #0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined + #0: ToddCoxeter: nodes | 75 | 61 | 136 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 136 | 89 | 60.4% + #0: ToddCoxeter: time | run 0 = 73µs | all runs = 73µs | elapsed = 295µs + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #1: ToddCoxeter: nodes | 2,480,272 | 49,631 | 2,529,943 + #1: ToddCoxeter: diff 0.0.0 | +2,480,197 | +49,570 | +2,529,807 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 5,256,084 | 2,184,732 | 70.6% + #1: ToddCoxeter: diff 0.0.0 | +5,255,948 | +2,184,643 | +10.2% + #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 | 4,956,987 | 103,095 | 5,060,108 + #1: ToddCoxeter: diff 0.0.1 | +2,476,715 | +53,464 | +2,530,165 + #1: ToddCoxeter: diff 0.0.0 | +4,956,912 | +103,034 | +5,059,972 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 10,505,388 | 4,365,573 | 70.6% + #1: ToddCoxeter: diff 0.0.1 | +5,249,304 | +2,180,841 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +10,505,252 | +4,365,484 | +10.2% + #1: ToddCoxeter: phase 0.0 = 2.006s | run 0 = 2.006s | all runs = 2.006s | elapsed = 2.006s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.3 | active | killed | defined + #1: ToddCoxeter: nodes | 7,477,894 | 158,644 | 7,636,556 + #1: ToddCoxeter: diff 0.0.2 | +2,520,907 | +55,549 | +2,576,448 + #1: ToddCoxeter: diff 0.0.0 | +7,477,819 | +158,583 | +7,636,420 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 15,849,138 | 6,584,544 | 70.6% + #1: ToddCoxeter: diff 0.0.2 | +5,343,750 | +2,218,971 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +15,849,002 | +6,584,455 | +10.2% + #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 | 9,900,800 | 211,433 | 10,112,265 + #1: ToddCoxeter: diff 0.0.3 | +2,422,906 | +52,789 | +2,475,709 + #1: ToddCoxeter: diff 0.0.0 | +9,900,725 | +211,372 | +10,112,129 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 20,985,770 | 8,716,630 | 70.7% + #1: ToddCoxeter: diff 0.0.3 | +5,136,632 | +2,132,086 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +20,985,634 | +8,716,541 | +10.2% + #1: ToddCoxeter: phase 0.0 = 4.016s | run 0 = 4.016s | all runs = 4.016s | elapsed = 4.016s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.5 | active | killed | defined + #1: ToddCoxeter: nodes | 12,440,550 | 269,907 | 12,710,479 + #1: ToddCoxeter: diff 0.0.4 | +2,539,750 | +58,474 | +2,598,214 + #1: ToddCoxeter: diff 0.0.0 | +12,440,475 | +269,846 | +12,710,343 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 26,370,604 | 10,951,046 | 70.7% + [... lines omitted ...] + #0: ToddCoxeter: diff 0.1.2 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 3,427,200 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.2 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 2.053s | run 0 = 7min30s | all runs = 7min30s | elapsed = 7min30s + #0: ToddCoxeter: lookahead_next() is now max(f x a = 2,284,800, m = 10,000) (-2,715,200) + #0: ToddCoxeter: because f x a < n + #0: ToddCoxeter: where: a = number_of_nodes_active() = 1,142,400 + #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.4 | active | killed | defined + #0: ToddCoxeter: nodes | 1,142,400 | 780,127,944 | 781,270,344 + #0: ToddCoxeter: diff 0.2.3 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 3,427,200 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.3 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 2.053s | run 0 = 7min30s | all runs = 7min30s | elapsed = 7min30s + ++++++++++++++++++++++++++++++++ + #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 | 2.053s (0%) | - (0%) | - (0%) | 7min28s (100%) + #0: ToddCoxeter: phase 0.2 = 2.061s | run 0 = 7min30s | all runs = 7min30s | elapsed = 7min30s + The index of the subgroup is 1142400 + ``` + +:material-checkbox-marked-circle-outline: The computed index is the same as +the claimed index: $1,142,400$. diff --git a/docs/examples/atlas/monster-sections/he/187425.md b/docs/examples/atlas/monster-sections/he/187425.md new file mode 100644 index 0000000..a2ebdbd --- /dev/null +++ b/docs/examples/atlas/monster-sections/he/187425.md @@ -0,0 +1,183 @@ +# $2^{1+6}.L_3(2)$ as a subgroup of Held group He + +The subgroup generators used on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/](https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/). + +## Claim + +$$ + \mathrm{He} = \langle a, b \mid a^2 = b^7 = (ab)^{17} + = [a, b]^6 = [a, b^3]^5 = [a, babab^{-1}abab] + = (ab)^4ab^2ab^{-3}ababab^{-1}ab^3ab^{-2}ab^2 = 1 \rangle. +$$ + +The generators are claimed to generate a maximal subgroup isomorphic to +$2^{1+6}.L_3(2)$. More precisely, if + +$$ + H = \langle ab^3,\ (pb^{-1}pb)^2(pbpb^{-1})^2,\ \text{ where }p=(ab^3)^4 \rangle, +$$ + +then + +$$ + [\mathrm{He} : H] = 187,425. +$$ + +On this page, we verify that the subgroup generated by these words has the +claimed index. + +## The code + +In [libsemigroups_pybind11][], the following script constructs the presentation +for He, adds the generating pairs that define the maximal subgroup, and runs the +Todd-Coxeter algorithm. The source code marks three of the presentation +relations as redundant. + +```python +from libsemigroups_pybind11 import ( + Presentation, + ToddCoxeter, + congruence_kind, + presentation, +) +from libsemigroups_pybind11.words import parse_relations as parse + + +# 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("a^2"), "") +presentation.add_rule(p, parse("b^7"), "") +presentation.add_rule(p, parse("(ab)^17"), "") +presentation.add_rule(p, parse("(ab^3)^8"), "") # redundant +presentation.add_rule(p, parse("(ab^2ab^2aBBB)^3"), "") # redundant +presentation.add_rule(p, parse("(a,babaBabab)"), "") +presentation.add_rule(p, parse("(a,b^3)^5"), "") +presentation.add_rule(p, parse("(a,b)^6"), "") +presentation.add_rule( + p, parse("ab(abaBB)^2ab^2aBab^2aBB(abaB)^2"), "" +) # redundant, maybe useful. +presentation.add_rule(p, parse("(ab)^4ab^2aB^3ababaBab^3aB^2ab^2"), "") + +presentation.balance(p, "abAB", "ABab") +presentation.replace_subword(p, "A", "a") +p.alphabet("abB") + +tc = ToddCoxeter(congruence_kind.onesided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# The subgroup generators here are taken from one of the straight line +# programmes from: +# https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/ + +# takes approx 4.5 minutes + +p = parse("(ab^3)^4") +tc.add_generating_pair(parse("ab^3"), "") +tc.add_generating_pair(parse(f"({p}B{p}b)^2({p}b{p}B)^2"), "") +tc.use_relations_in_extra(True) + +print(f"The index of the subgroup is {tc.number_of_classes()}") +``` + +## The output + +The truncated output of the enumeration is below: + +??? info "Truncated output from the Python script" + + ``` + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 14, |u| + |v| ∈ [2, 40], ∑(|u| + |v|) = 259 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 START + #0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined + #0: ToddCoxeter: nodes | 261 | 37 | 298 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 304 | 479 | 38.8% + #0: ToddCoxeter: time | run 0 = 104µs | all runs = 104µs | elapsed = 342µs + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #1: ToddCoxeter: nodes | 2,426,227 | 52,073 | 2,478,337 + #1: ToddCoxeter: diff 0.0.0 | +2,425,966 | +52,036 | +2,478,039 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 5,141,618 | 2,137,063 | 70.6% + #1: ToddCoxeter: diff 0.0.0 | +5,141,314 | +2,136,584 | +31.8% + #1: ToddCoxeter: phase 0.0 = 1.003s | run 0 = 1.003s | all runs = 1.003s | elapsed = 1.003s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.2 | active | killed | defined + #1: ToddCoxeter: nodes | 4,813,554 | 108,463 | 4,922,040 + #1: ToddCoxeter: diff 0.0.1 | +2,387,327 | +56,390 | +2,443,703 + #1: ToddCoxeter: diff 0.0.0 | +4,813,293 | +108,426 | +4,921,742 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 10,203,878 | 4,236,784 | 70.7% + #1: ToddCoxeter: diff 0.0.1 | +5,062,260 | +2,099,721 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +10,203,574 | +4,236,305 | +31.8% + #1: ToddCoxeter: phase 0.0 = 2.004s | run 0 = 2.004s | all runs = 2.004s | elapsed = 2.004s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.3 | active | killed | defined + #1: ToddCoxeter: nodes | 7,279,489 | 169,041 | 7,448,552 + #1: ToddCoxeter: diff 0.0.2 | +2,465,935 | +60,578 | +2,526,512 + #1: ToddCoxeter: diff 0.0.0 | +7,279,228 | +169,004 | +7,448,254 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 15,432,998 | 6,405,469 | 70.7% + #1: ToddCoxeter: diff 0.0.2 | +5,229,120 | +2,168,685 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +15,432,694 | +6,404,990 | +31.8% + #1: ToddCoxeter: phase 0.0 = 3.009s | run 0 = 3.009s | all runs = 3.009s | elapsed = 3.009s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.4 | active | killed | defined + #1: ToddCoxeter: nodes | 9,597,950 | 232,139 | 9,830,108 + #1: ToddCoxeter: diff 0.0.3 | +2,318,461 | +63,098 | +2,381,556 + #1: ToddCoxeter: diff 0.0.0 | +9,597,689 | +232,102 | +9,829,810 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 20,349,896 | 8,443,954 | 70.7% + #1: ToddCoxeter: diff 0.0.3 | +4,916,898 | +2,038,485 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +20,349,592 | +8,443,475 | +31.8% + #1: ToddCoxeter: phase 0.0 = 4.014s | run 0 = 4.014s | all runs = 4.014s | elapsed = 4.014s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.5 | active | killed | defined + #1: ToddCoxeter: nodes | 12,053,029 | 297,869 | 12,350,930 + #1: ToddCoxeter: diff 0.0.4 | +2,455,079 | +65,730 | +2,520,822 + #1: ToddCoxeter: diff 0.0.0 | +12,052,768 | +297,832 | +12,350,632 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 25,556,108 | 10,602,979 | 70.7% + [... lines omitted ...] + #0: ToddCoxeter: LOOKAHEAD 0.1.1 | active | killed | defined + #0: ToddCoxeter: nodes | 187,425 | 513,212,960 | 513,400,385 + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 562,275 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 74ms | run 0 = 4min37s | all runs = 4min37s | elapsed = 4min37s + #0: ToddCoxeter: lookahead_next() is now max(f x a = 374,850, m = 10,000) (-4,625,150) + #0: ToddCoxeter: because f x a < n + #0: ToddCoxeter: where: a = number_of_nodes_active() = 187,425 + #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.2 | active | killed | defined + #0: ToddCoxeter: nodes | 187,425 | 513,212,960 | 513,400,385 + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 562,275 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 74ms | run 0 = 4min37s | all runs = 4min37s | elapsed = 4min37s + ++++++++++++++++++++++++++++++++ + #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 | 74ms (0%) | - (0%) | - (0%) | 4min37s (100%) + #0: ToddCoxeter: phase 0.2 = 75ms | run 0 = 4min37s | all runs = 4min37s | elapsed = 4min37s + The index of the subgroup is 187425 + ``` + +:material-checkbox-marked-circle-outline: The computed index is the same as +the claimed index: $187,425$. diff --git a/docs/examples/atlas/monster-sections/he/2058.md b/docs/examples/atlas/monster-sections/he/2058.md new file mode 100644 index 0000000..735b195 --- /dev/null +++ b/docs/examples/atlas/monster-sections/he/2058.md @@ -0,0 +1,176 @@ +# $S_4(4):2$ as a subgroup of Held group He + +The subgroup generators used on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/spor/He/mag/HeG1-P1.M](https://brauer.maths.qmul.ac.uk/Atlas/spor/He/mag/HeG1-P1.M). + +## Claim + +$$ + \mathrm{He} = \langle a, b \mid a^2 = b^7 = (ab)^{17} + = [a, b]^6 = [a, b^3]^5 = [a, babab^{-1}abab] + = (ab)^4ab^2ab^{-3}ababab^{-1}ab^3ab^{-2}ab^2 = 1 \rangle. +$$ + +The generators are claimed to generate a maximal subgroup isomorphic to +$S_4(4):2$. More precisely, if + +$$ + H = \langle a,\ b^{-2}ab^2,\ b^2ab^{-2} \rangle, +$$ + +then + +$$ + [\mathrm{He} : H] = 2,058. +$$ + +On this page, we verify that the subgroup generated by these words has the +claimed index. + +## The code + +In [libsemigroups_pybind11][], the following script constructs the presentation +for He, adds the generating pairs that define the maximal subgroup, and runs the +Todd-Coxeter algorithm. The source code marks three of the presentation +relations as redundant. + +```python +from libsemigroups_pybind11 import ( + Presentation, + ToddCoxeter, + congruence_kind, + presentation, +) +from libsemigroups_pybind11.words import parse_relations as parse + + +# 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("a^2"), "") +presentation.add_rule(p, parse("b^7"), "") +presentation.add_rule(p, parse("(ab)^17"), "") +presentation.add_rule(p, parse("(ab^3)^8"), "") # redundant +presentation.add_rule(p, parse("(ab^2ab^2aBBB)^3"), "") # redundant +presentation.add_rule(p, parse("(a,babaBabab)"), "") +presentation.add_rule(p, parse("(a,b^3)^5"), "") +presentation.add_rule(p, parse("(a,b)^6"), "") +presentation.add_rule( + p, parse("ab(abaBB)^2ab^2aBab^2aBB(abaB)^2"), "" +) # redundant, maybe useful. +presentation.add_rule(p, parse("(ab)^4ab^2aB^3ababaBab^3aB^2ab^2"), "") + +presentation.balance(p, "abAB", "ABab") +presentation.replace_subword(p, "A", "a") +p.alphabet("abB") + +tc = ToddCoxeter(congruence_kind.onesided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# takes approx 1.6s + +# The generators for this subgroup are taken from: +# https://brauer.maths.qmul.ac.uk/Atlas/spor/He/mag/HeG1-P1.M + +# The generators on: +# https://brauer.maths.qmul.ac.uk/Atlas/v3/subgroup/HeG1-max1W1 +# are: +# a, (abb)-7(bababababbababb)7(abb)7 +# tc.add_generating_pair(parse("(BBa)^7(bababababbababb)^7(abb)^7"), "") +# and in the straightline programme at: +# https://brauer.maths.qmul.ac.uk/Atlas/spor/He/words/HeG1-max1W1 +# are: +# a, and (abababbab)^10 +# which is altogether rather confusing... + +tc.add_generating_pair("a", "") +tc.add_generating_pair("BBabb", "") +tc.add_generating_pair("bbaBB", "") + +print(f"The index of the subgroup is {tc.number_of_classes()}") +``` + +## The output + +The output of the enumeration is below: + +??? info "Output from the Python script" + + ``` + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 14, |u| + |v| ∈ [2, 40], ∑(|u| + |v|) = 259 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 START + #0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined + #0: ToddCoxeter: nodes | 5 | 4 | 9 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 11 | 4 | 73.3% + #0: ToddCoxeter: time | run 0 = 63µs | all runs = 63µs | elapsed = 111µs + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #1: ToddCoxeter: nodes | 2,389,517 | 86,354 | 2,475,902 + #1: ToddCoxeter: diff 0.0.0 | +2,389,512 | +86,350 | +2,475,893 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 5,071,468 | 2,097,083 | 70.7% + #1: ToddCoxeter: diff 0.0.0 | +5,071,457 | +2,097,079 | -2.6% + #1: ToddCoxeter: phase 0.0 = 1.002s | run 0 = 1.002s | all runs = 1.002s | elapsed = 1.002s + #0: ToddCoxeter: large collapse, number of coincidences 100,000 >= 100,000 = large_collapse()! + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 STOP + #0: ToddCoxeter: FELSCH 0.0.2 | active | killed | defined + #0: ToddCoxeter: nodes | 2,058 | 3,621,394 | 3,623,452 + #0: ToddCoxeter: diff 0.0.1 | -2,387,459 | +3,535,040 | +1,147,550 + #0: ToddCoxeter: diff 0.0.0 | +2,053 | +3,621,390 | +3,623,443 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 6,174 | 0 | 100.0% + #0: ToddCoxeter: diff 0.0.1 | -5,065,294 | -2,097,083 | +29.3% + #0: ToddCoxeter: diff 0.0.0 | +6,163 | -4 | +26.7% + #0: ToddCoxeter: phase 0.0 = 1.564s | run 0 = 1.564s | all runs = 1.564s | elapsed = 1.564s + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: LOOKAHEAD 0.1 START (lookahead_extent() = full, lookahead_style() = hlt) + #0: ToddCoxeter: LOOKAHEAD 0.1.0 | active | killed | defined + #0: ToddCoxeter: nodes | 2,058 | 3,621,394 | 3,623,452 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 6,174 | 0 | 100.0% + #0: ToddCoxeter: time | run 0 = 1.564s | all runs = 1.564s | elapsed = 1.564s + #0: ToddCoxeter: triggered because there are skipped definitions (2,058 active nodes)! + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: LOOKAHEAD 0.1 STOP + #0: ToddCoxeter: LOOKAHEAD 0.1.1 | active | killed | defined + #0: ToddCoxeter: nodes | 2,058 | 3,621,394 | 3,623,452 + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 6,174 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 412µs | run 0 = 1.565s | all runs = 1.565s | elapsed = 1.565s + #0: ToddCoxeter: lookahead_next() is now max(f x a = 4,116, m = 10,000) (-4,990,000) + #0: ToddCoxeter: because f x a < n + #0: ToddCoxeter: where: a = number_of_nodes_active() = 2,058 + #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.2 | active | killed | defined + #0: ToddCoxeter: nodes | 2,058 | 3,621,394 | 3,623,452 + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 6,174 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 435µs | run 0 = 1.565s | all runs = 1.565s | elapsed = 1.565s + ++++++++++++++++++++++++++++++++ + #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 | 433µs (0%) | - (0%) | - (0%) | 1.564s (100%) + #0: ToddCoxeter: phase 0.2 = 456µs | run 0 = 1.565s | all runs = 1.565s | elapsed = 1.565s + The index of the subgroup is 2058 + ``` + +:material-checkbox-marked-circle-outline: The computed index is the same as +the claimed index: $2,058$. diff --git a/docs/examples/atlas/monster-sections/he/244800.md b/docs/examples/atlas/monster-sections/he/244800.md new file mode 100644 index 0000000..d53de18 --- /dev/null +++ b/docs/examples/atlas/monster-sections/he/244800.md @@ -0,0 +1,162 @@ +# $7^2:2.L_2(7)$ as a subgroup of Held group He + +The subgroup generators used on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/spor/He/words/HeG1-max6W1](https://brauer.maths.qmul.ac.uk/Atlas/spor/He/words/HeG1-max6W1). + +## Claim + +$$ + \mathrm{He} = \langle a, b \mid a^2 = b^7 = (ab)^{17} + = [a, b]^6 = [a, b^3]^5 = [a, babab^{-1}abab] + = (ab)^4ab^2ab^{-3}ababab^{-1}ab^3ab^{-2}ab^2 = 1 \rangle. +$$ + +The generators are claimed to generate a maximal subgroup isomorphic to +$7^2:2.L_2(7)$. More precisely, if + +$$ + H = \langle (ab)^5b^2a,\ b \rangle, +$$ + +then + +$$ + [\mathrm{He} : H] = 244,800. +$$ + +On this page, we verify that the subgroup generated by these words has the +claimed index. + +## The code + +In [libsemigroups_pybind11][], the following script constructs the presentation +for He, adds the generating pairs that define the maximal subgroup, and runs the +Todd-Coxeter algorithm. The source code marks three of the presentation +relations as redundant. + +```python +from libsemigroups_pybind11 import ( + Presentation, + ToddCoxeter, + congruence_kind, + presentation, +) +from libsemigroups_pybind11.words import parse_relations as parse + + +# 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("a^2"), "") +presentation.add_rule(p, parse("b^7"), "") +presentation.add_rule(p, parse("(ab)^17"), "") +presentation.add_rule(p, parse("(ab^3)^8"), "") # redundant +presentation.add_rule(p, parse("(ab^2ab^2aBBB)^3"), "") # redundant +presentation.add_rule(p, parse("(a,babaBabab)"), "") +presentation.add_rule(p, parse("(a,b^3)^5"), "") +presentation.add_rule(p, parse("(a,b)^6"), "") +presentation.add_rule( + p, parse("ab(abaBB)^2ab^2aBab^2aBB(abaB)^2"), "" +) # redundant, maybe useful. +presentation.add_rule(p, parse("(ab)^4ab^2aB^3ababaBab^3aB^2ab^2"), "") + +presentation.balance(p, "abAB", "ABab") +presentation.replace_subword(p, "A", "a") +p.alphabet("abB") + +tc = ToddCoxeter(congruence_kind.onesided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# takes approx 1.6s + +# The words are from: +# https://brauer.maths.qmul.ac.uk/Atlas/spor/He/words/HeG1-max6W1 +tc.add_generating_pair(parse("(ab)^5b^2a"), "") +tc.add_generating_pair("b", "") + +print(f"The by index of the subgroup is {tc.number_of_classes()}") +``` + +## The output + +The output of the enumeration is below: + +??? info "Output from the Python script" + + ``` + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 14, |u| + |v| ∈ [2, 40], ∑(|u| + |v|) = 259 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 START + #0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined + #0: ToddCoxeter: nodes | 12 | 1 | 13 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 16 | 20 | 44.4% + #0: ToddCoxeter: time | run 0 = 104µs | all runs = 104µs | elapsed = 314µs + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #1: ToddCoxeter: nodes | 999,860 | 1,081,844 | 2,081,604 + #1: ToddCoxeter: diff 0.0.0 | +999,848 | +1,081,843 | +2,081,591 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 2,169,279 | 830,301 | 72.3% + #1: ToddCoxeter: diff 0.0.0 | +2,169,263 | +830,281 | +27.9% + #1: ToddCoxeter: phase 0.0 = 1.005s | run 0 = 1.005s | all runs = 1.005s | elapsed = 1.005s + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 STOP + #0: ToddCoxeter: FELSCH 0.0.2 | active | killed | defined + #0: ToddCoxeter: nodes | 244,800 | 1,839,761 | 2,084,561 + #0: ToddCoxeter: diff 0.0.1 | -755,060 | +757,917 | +2,957 + #0: ToddCoxeter: diff 0.0.0 | +244,788 | +1,839,760 | +2,084,548 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 734,400 | 0 | 100.0% + #0: ToddCoxeter: diff 0.0.1 | -1,434,879 | -830,301 | +27.7% + #0: ToddCoxeter: diff 0.0.0 | +734,384 | -20 | +55.6% + #0: ToddCoxeter: phase 0.0 = 1.515s | run 0 = 1.516s | all runs = 1.516s | elapsed = 1.516s + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: LOOKAHEAD 0.1 START (lookahead_extent() = full, lookahead_style() = hlt) + #0: ToddCoxeter: LOOKAHEAD 0.1.0 | active | killed | defined + #0: ToddCoxeter: nodes | 244,800 | 1,839,761 | 2,084,561 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 734,400 | 0 | 100.0% + #0: ToddCoxeter: time | run 0 = 1.516s | all runs = 1.516s | elapsed = 1.516s + #0: ToddCoxeter: triggered because there are skipped definitions (244,800 active nodes)! + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: LOOKAHEAD 0.1 STOP + #0: ToddCoxeter: LOOKAHEAD 0.1.1 | active | killed | defined + #0: ToddCoxeter: nodes | 244,800 | 1,839,761 | 2,084,561 + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 734,400 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 100ms | run 0 = 1.616s | all runs = 1.616s | elapsed = 1.616s + #0: ToddCoxeter: lookahead_next() is now max(f x a = 489,600, m = 10,000) (-4,510,400) + #0: ToddCoxeter: because f x a < n + #0: ToddCoxeter: where: a = number_of_nodes_active() = 244,800 + #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.2 | active | killed | defined + #0: ToddCoxeter: nodes | 244,800 | 1,839,761 | 2,084,561 + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 734,400 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 100ms | run 0 = 1.616s | all runs = 1.616s | elapsed = 1.616s + ++++++++++++++++++++++++++++++++ + #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 | 100ms (6%) | - (0%) | - (0%) | 1.515s (94%) + #0: ToddCoxeter: phase 0.2 = 101ms | run 0 = 1.617s | all runs = 1.617s | elapsed = 1.617s + The by index of the subgroup is 244800 + ``` + +:material-checkbox-marked-circle-outline: The computed index is the same as +the claimed index: $244,800$. diff --git a/docs/examples/atlas/monster-sections/he/266560.md b/docs/examples/atlas/monster-sections/he/266560.md new file mode 100644 index 0000000..633ad97 --- /dev/null +++ b/docs/examples/atlas/monster-sections/he/266560.md @@ -0,0 +1,192 @@ +# $3.S_7$ as a subgroup of Held group He + +The subgroup generators used on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/](https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/). + +## Claim + +$$ + \mathrm{He} = \langle a, b \mid a^2 = b^7 = (ab)^{17} + = [a, b]^6 = [a, b^3]^5 = [a, babab^{-1}abab] + = (ab)^4ab^2ab^{-3}ababab^{-1}ab^3ab^{-2}ab^2 = 1 \rangle. +$$ + +The generators are claimed to generate a maximal subgroup isomorphic to +$3.S_7$. More precisely, if + +$$ + H = \langle a,\ b^3ab^2ab^{-1}ab^3 \rangle, +$$ + +then + +$$ + [\mathrm{He} : H] = 266,560. +$$ + +On this page, we verify that the subgroup generated by these words has the +claimed index. + +## The code + +In [libsemigroups_pybind11][], the following script constructs the presentation +for He, adds the generating pairs that define the maximal subgroup, and runs the +Todd-Coxeter algorithm. The source code marks three of the presentation +relations as redundant. + +```python +from libsemigroups_pybind11 import ( + Presentation, + ToddCoxeter, + congruence_kind, + presentation, +) +from libsemigroups_pybind11.words import parse_relations as parse + + +# 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("a^2"), "") +presentation.add_rule(p, parse("b^7"), "") +presentation.add_rule(p, parse("(ab)^17"), "") +presentation.add_rule(p, parse("(ab^3)^8"), "") # redundant +presentation.add_rule(p, parse("(ab^2ab^2aBBB)^3"), "") # redundant +presentation.add_rule(p, parse("(a,babaBabab)"), "") +presentation.add_rule(p, parse("(a,b^3)^5"), "") +presentation.add_rule(p, parse("(a,b)^6"), "") +presentation.add_rule( + p, parse("ab(abaBB)^2ab^2aBab^2aBB(abaB)^2"), "" +) # redundant, maybe useful. +presentation.add_rule(p, parse("(ab)^4ab^2aB^3ababaBab^3aB^2ab^2"), "") + +presentation.balance(p, "abAB", "ABab") +presentation.replace_subword(p, "A", "a") +p.alphabet("abB") + +tc = ToddCoxeter(congruence_kind.onesided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# takes approx 5s + +# These generators are from the webpages of the ATLAS +tc.add_generating_pair("a", "") +tc.add_generating_pair(parse("b^3ab^2aBab^3"), "") + +print(f"The index of the subgroup is {tc.number_of_classes()}") +``` + +## The output + +The output of the enumeration is below: + +??? info "Output from the Python script" + + ``` + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 14, |u| + |v| ∈ [2, 40], ∑(|u| + |v|) = 259 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 START + #0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined + #0: ToddCoxeter: nodes | 12 | 0 | 12 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 14 | 22 | 38.9% + #0: ToddCoxeter: time | run 0 = 52µs | all runs = 52µs | elapsed = 194µs + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #1: ToddCoxeter: nodes | 2,441,115 | 72,800 | 2,513,948 + #1: ToddCoxeter: diff 0.0.0 | +2,441,103 | +72,800 | +2,513,936 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 5,177,771 | 2,145,574 | 70.7% + #1: ToddCoxeter: diff 0.0.0 | +5,177,757 | +2,145,552 | +31.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 | 4,760,613 | 184,070 | 4,944,702 + #1: ToddCoxeter: diff 0.0.1 | +2,319,498 | +111,270 | +2,430,754 + #1: ToddCoxeter: diff 0.0.0 | +4,760,601 | +184,070 | +4,944,690 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 10,102,170 | 4,179,669 | 70.7% + #1: ToddCoxeter: diff 0.0.1 | +4,924,399 | +2,034,095 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +10,102,156 | +4,179,647 | +31.8% + #1: ToddCoxeter: phase 0.0 = 2.009s | run 0 = 2.009s | all runs = 2.009s | elapsed = 2.009s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.3 | active | killed | defined + #1: ToddCoxeter: nodes | 7,003,728 | 378,125 | 7,381,870 + #1: ToddCoxeter: diff 0.0.2 | +2,243,115 | +194,055 | +2,437,168 + #1: ToddCoxeter: diff 0.0.0 | +7,003,716 | +378,125 | +7,381,858 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 14,866,661 | 6,144,523 | 70.8% + #1: ToddCoxeter: diff 0.0.2 | +4,764,491 | +1,964,854 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +14,866,647 | +6,144,501 | +31.9% + #1: ToddCoxeter: phase 0.0 = 3.014s | run 0 = 3.014s | all runs = 3.014s | elapsed = 3.014s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.4 | active | killed | defined + #1: ToddCoxeter: nodes | 8,202,622 | 1,337,951 | 9,540,372 + #1: ToddCoxeter: diff 0.0.3 | +1,198,894 | +959,826 | +2,158,502 + #1: ToddCoxeter: diff 0.0.0 | +8,202,610 | +1,337,951 | +9,540,360 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 17,363,740 | 7,244,126 | 70.6% + #1: ToddCoxeter: diff 0.0.3 | +2,497,079 | +1,099,603 | -0.2% + #1: ToddCoxeter: diff 0.0.0 | +17,363,726 | +7,244,104 | +31.7% + #1: ToddCoxeter: phase 0.0 = 4.019s | run 0 = 4.019s | all runs = 4.019s | elapsed = 4.020s + #0: ToddCoxeter: large collapse, number of coincidences 100,000 >= 100,000 = large_collapse()! + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 STOP + #0: ToddCoxeter: FELSCH 0.0.5 | active | killed | defined + #0: ToddCoxeter: nodes | 266,560 | 9,273,871 | 9,540,431 + #0: ToddCoxeter: diff 0.0.4 | -7,936,062 | +7,935,920 | +59 + #0: ToddCoxeter: diff 0.0.0 | +266,548 | +9,273,871 | +9,540,419 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 799,680 | 0 | 100.0% + #0: ToddCoxeter: diff 0.0.4 | -16,564,060 | -7,244,126 | +29.4% + #0: ToddCoxeter: diff 0.0.0 | +799,666 | -22 | +61.1% + #0: ToddCoxeter: phase 0.0 = 4.668s | run 0 = 4.668s | all runs = 4.668s | elapsed = 4.668s + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: LOOKAHEAD 0.1 START (lookahead_extent() = full, lookahead_style() = hlt) + #0: ToddCoxeter: LOOKAHEAD 0.1.0 | active | killed | defined + #0: ToddCoxeter: nodes | 266,560 | 9,273,871 | 9,540,431 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 799,680 | 0 | 100.0% + #0: ToddCoxeter: time | run 0 = 4.668s | all runs = 4.668s | elapsed = 4.668s + #0: ToddCoxeter: triggered because there are skipped definitions (266,560 active nodes)! + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: LOOKAHEAD 0.1 STOP + #0: ToddCoxeter: LOOKAHEAD 0.1.1 | active | killed | defined + #0: ToddCoxeter: nodes | 266,560 | 9,273,871 | 9,540,431 + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 799,680 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 113ms | run 0 = 4.781s | all runs = 4.781s | elapsed = 4.781s + #0: ToddCoxeter: lookahead_next() is now max(f x a = 533,120, m = 10,000) (-4,466,880) + #0: ToddCoxeter: because f x a < n + #0: ToddCoxeter: where: a = number_of_nodes_active() = 266,560 + #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.2 | active | killed | defined + #0: ToddCoxeter: nodes | 266,560 | 9,273,871 | 9,540,431 + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 799,680 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 113ms | run 0 = 4.781s | all runs = 4.781s | elapsed = 4.781s + ++++++++++++++++++++++++++++++++ + #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 | 113ms (2%) | - (0%) | - (0%) | 4.668s (98%) + #0: ToddCoxeter: phase 0.2 = 114ms | run 0 = 4.783s | all runs = 4.783s | elapsed = 4.783s + The index of the subgroup is 266560 + ``` + +:material-checkbox-marked-circle-outline: The computed index is the same as +the claimed index: $266,560$. diff --git a/docs/examples/atlas/monster-sections/he/29155-i.md b/docs/examples/atlas/monster-sections/he/29155-i.md new file mode 100644 index 0000000..0ea132c --- /dev/null +++ b/docs/examples/atlas/monster-sections/he/29155-i.md @@ -0,0 +1,181 @@ +# $2^6:3.S_6$ (I) as a subgroup of Held group He + +The subgroup generators used on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/](https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/). + +## Claim + +$$ + \mathrm{He} = \langle a, b \mid a^2 = b^7 = (ab)^{17} + = [a, b]^6 = [a, b^3]^5 = [a, babab^{-1}abab] + = (ab)^4ab^2ab^{-3}ababab^{-1}ab^3ab^{-2}ab^2 = 1 \rangle. +$$ + +The generators are claimed to generate a maximal subgroup isomorphic to +$2^6:3.S_6$. More precisely, if + +$$ + H = \langle a,\ ab^{-2}ab^3ab^{-3}ab^{-1} \rangle, +$$ + +then + +$$ + [\mathrm{He} : H] = 29,155. +$$ + +On this page, we verify that the subgroup generated by these words has the +claimed index. + +## The code + +In [libsemigroups_pybind11][], the following script constructs the presentation +for He, adds the generating pairs that define the maximal subgroup, and runs the +Todd-Coxeter algorithm. The source code marks three of the presentation +relations as redundant. + +```python +from libsemigroups_pybind11 import ( + Presentation, + ToddCoxeter, + congruence_kind, + presentation, +) +from libsemigroups_pybind11.words import parse_relations as parse + + +# 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("a^2"), "") +presentation.add_rule(p, parse("b^7"), "") +presentation.add_rule(p, parse("(ab)^17"), "") +presentation.add_rule(p, parse("(ab^3)^8"), "") # redundant +presentation.add_rule(p, parse("(ab^2ab^2aBBB)^3"), "") # redundant +presentation.add_rule(p, parse("(a,babaBabab)"), "") +presentation.add_rule(p, parse("(a,b^3)^5"), "") +presentation.add_rule(p, parse("(a,b)^6"), "") +presentation.add_rule( + p, parse("ab(abaBB)^2ab^2aBab^2aBB(abaB)^2"), "" +) # redundant, maybe useful. +presentation.add_rule(p, parse("(ab)^4ab^2aB^3ababaBab^3aB^2ab^2"), "") + +presentation.balance(p, "abAB", "ABab") +presentation.replace_subword(p, "A", "a") +p.alphabet("abB") + +tc = ToddCoxeter(congruence_kind.onesided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# The subgroup generators here are taken from one of the straight line +# programmes from: +# https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/ + +# takes approx 20s + +tc.add_generating_pair("a", "") +tc.add_generating_pair("aBBabbbaBBBaB", "") + +print(f"The index of the subgroup is {tc.number_of_classes()}") +``` + +## The output + +The truncated output of the enumeration is below: + +??? info "Truncated output from the Python script" + + ``` + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 14, |u| + |v| ∈ [2, 40], ∑(|u| + |v|) = 259 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 START + #0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined + #0: ToddCoxeter: nodes | 12 | 0 | 12 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 14 | 22 | 38.9% + #0: ToddCoxeter: time | run 0 = 59µs | all runs = 59µs | elapsed = 110µs + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #1: ToddCoxeter: nodes | 2,473,292 | 58,553 | 2,531,861 + #1: ToddCoxeter: diff 0.0.0 | +2,473,280 | +58,553 | +2,531,849 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 5,243,526 | 2,176,350 | 70.7% + #1: ToddCoxeter: diff 0.0.0 | +5,243,512 | +2,176,328 | +31.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 | 4,907,283 | 123,428 | 5,030,726 + #1: ToddCoxeter: diff 0.0.1 | +2,433,991 | +64,875 | +2,498,865 + #1: ToddCoxeter: diff 0.0.0 | +4,907,271 | +123,428 | +5,030,714 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 10,405,718 | 4,316,131 | 70.7% + #1: ToddCoxeter: diff 0.0.1 | +5,162,192 | +2,139,781 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +10,405,704 | +4,316,109 | +31.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 | 7,356,730 | 202,010 | 7,558,764 + #1: ToddCoxeter: diff 0.0.2 | +2,449,447 | +78,582 | +2,528,038 + #1: ToddCoxeter: diff 0.0.0 | +7,356,718 | +202,010 | +7,558,752 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 15,602,237 | 6,467,953 | 70.7% + #1: ToddCoxeter: diff 0.0.2 | +5,196,519 | +2,151,822 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +15,602,223 | +6,467,931 | +31.8% + #1: ToddCoxeter: phase 0.0 = 3.015s | run 0 = 3.015s | all runs = 3.015s | elapsed = 3.015s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.4 | active | killed | defined + #1: ToddCoxeter: nodes | 9,645,930 | 298,259 | 9,944,212 + #1: ToddCoxeter: diff 0.0.3 | +2,289,200 | +96,249 | +2,385,448 + #1: ToddCoxeter: diff 0.0.0 | +9,645,918 | +298,259 | +9,944,200 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 20,461,214 | 8,476,576 | 70.7% + #1: ToddCoxeter: diff 0.0.3 | +4,858,977 | +2,008,623 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +20,461,200 | +8,476,554 | +31.8% + #1: ToddCoxeter: phase 0.0 = 4.020s | run 0 = 4.020s | all runs = 4.020s | elapsed = 4.020s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.5 | active | killed | defined + #1: ToddCoxeter: nodes | 12,015,424 | 393,537 | 12,408,973 + #1: ToddCoxeter: diff 0.0.4 | +2,369,494 | +95,278 | +2,464,761 + #1: ToddCoxeter: diff 0.0.0 | +12,015,412 | +393,537 | +12,408,961 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 25,491,801 | 10,554,471 | 70.7% + [... lines omitted ...] + #0: ToddCoxeter: LOOKAHEAD 0.1.1 | active | killed | defined + #0: ToddCoxeter: nodes | 29,155 | 44,559,134 | 44,588,289 + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 87,465 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 8ms | run 0 = 20.191s | all runs = 20.191s | elapsed = 20.192s + #0: ToddCoxeter: lookahead_next() is now max(f x a = 58,310, m = 10,000) (-4,941,690) + #0: ToddCoxeter: because f x a < n + #0: ToddCoxeter: where: a = number_of_nodes_active() = 29,155 + #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.2 | active | killed | defined + #0: ToddCoxeter: nodes | 29,155 | 44,559,134 | 44,588,289 + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 87,465 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 8ms | run 0 = 20.191s | all runs = 20.191s | elapsed = 20.192s + ++++++++++++++++++++++++++++++++ + #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 | 8ms (0%) | - (0%) | - (0%) | 20.183s (100%) + #0: ToddCoxeter: phase 0.2 = 8ms | run 0 = 20.192s | all runs = 20.192s | elapsed = 20.192s + The index of the subgroup is 29155 + ``` + +:material-checkbox-marked-circle-outline: The computed index is the same as +the claimed index: $29,155$. diff --git a/docs/examples/atlas/monster-sections/he/29155-ii.md b/docs/examples/atlas/monster-sections/he/29155-ii.md new file mode 100644 index 0000000..dcc6f83 --- /dev/null +++ b/docs/examples/atlas/monster-sections/he/29155-ii.md @@ -0,0 +1,205 @@ +# $2^6:3.S_6$ (II) as a subgroup of Held group He + +The subgroup generators used on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/](https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/). + +## Claim + +$$ + \mathrm{He} = \langle a, b \mid a^2 = b^7 = (ab)^{17} + = [a, b]^6 = [a, b^3]^5 = [a, babab^{-1}abab] + = (ab)^4ab^2ab^{-3}ababab^{-1}ab^3ab^{-2}ab^2 = 1 \rangle. +$$ + +The generators are claimed to generate a maximal subgroup isomorphic to +$2^6:3.S_6$. More precisely, if + +$$ + H = \langle a,\ ab^{-2}ab^2ab^{-3}ab^{-1} \rangle, +$$ + +then + +$$ + [\mathrm{He} : H] = 29,155. +$$ + +On this page, we verify that the subgroup generated by these words has the +claimed index. + +## The code + +In [libsemigroups_pybind11][], the following script constructs the presentation +for He, adds the generating pairs that define the maximal subgroup, and runs the +Todd-Coxeter algorithm. The source code marks three of the presentation +relations as redundant. + +```python +from libsemigroups_pybind11 import ( + Presentation, + ToddCoxeter, + congruence_kind, + presentation, +) +from libsemigroups_pybind11.words import parse_relations as parse + + +# 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("a^2"), "") +presentation.add_rule(p, parse("b^7"), "") +presentation.add_rule(p, parse("(ab)^17"), "") +presentation.add_rule(p, parse("(ab^3)^8"), "") # redundant +presentation.add_rule(p, parse("(ab^2ab^2aBBB)^3"), "") # redundant +presentation.add_rule(p, parse("(a,babaBabab)"), "") +presentation.add_rule(p, parse("(a,b^3)^5"), "") +presentation.add_rule(p, parse("(a,b)^6"), "") +presentation.add_rule( + p, parse("ab(abaBB)^2ab^2aBab^2aBB(abaB)^2"), "" +) # redundant, maybe useful. +presentation.add_rule(p, parse("(ab)^4ab^2aB^3ababaBab^3aB^2ab^2"), "") + +presentation.balance(p, "abAB", "ABab") +presentation.replace_subword(p, "A", "a") +p.alphabet("abB") + +tc = ToddCoxeter(congruence_kind.onesided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# The subgroup generators here are taken from one of the straight line +# programmes from: +# https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/ + +# takes approx 5s + +tc.add_generating_pair("a", "") +tc.add_generating_pair("aBBabbaBBBaB", "") + +print(f"The index of the subgroup is {tc.number_of_classes()}") +``` + +## The output + +The output of the enumeration is below: + +??? info "Output from the Python script" + + ``` + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 14, |u| + |v| ∈ [2, 40], ∑(|u| + |v|) = 259 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 START + #0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined + #0: ToddCoxeter: nodes | 11 | 0 | 11 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 13 | 20 | 39.4% + #0: ToddCoxeter: time | run 0 = 55µs | all runs = 55µs | elapsed = 103µs + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #1: ToddCoxeter: nodes | 2,450,610 | 56,933 | 2,507,577 + #1: ToddCoxeter: diff 0.0.0 | +2,450,599 | +56,933 | +2,507,566 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 5,195,501 | 2,156,329 | 70.7% + #1: ToddCoxeter: diff 0.0.0 | +5,195,488 | +2,156,309 | +31.3% + #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 | 4,857,043 | 122,296 | 4,979,354 + #1: ToddCoxeter: diff 0.0.1 | +2,406,433 | +65,363 | +2,471,777 + #1: ToddCoxeter: diff 0.0.0 | +4,857,032 | +122,296 | +4,979,343 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 10,299,694 | 4,271,435 | 70.7% + #1: ToddCoxeter: diff 0.0.1 | +5,104,193 | +2,115,106 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +10,299,681 | +4,271,415 | +31.3% + #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 | 7,241,525 | 226,832 | 7,468,390 + #1: ToddCoxeter: diff 0.0.2 | +2,384,482 | +104,536 | +2,489,036 + #1: ToddCoxeter: diff 0.0.0 | +7,241,514 | +226,832 | +7,468,379 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 15,360,734 | 6,363,841 | 70.7% + #1: ToddCoxeter: diff 0.0.2 | +5,061,040 | +2,092,406 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +15,360,721 | +6,363,821 | +31.3% + #1: ToddCoxeter: phase 0.0 = 3.015s | run 0 = 3.015s | all runs = 3.015s | elapsed = 3.015s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.4 | active | killed | defined + #1: ToddCoxeter: nodes | 9,527,319 | 309,104 | 9,836,440 + #1: ToddCoxeter: diff 0.0.3 | +2,285,794 | +82,272 | +2,368,050 + #1: ToddCoxeter: diff 0.0.0 | +9,527,308 | +309,104 | +9,836,429 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 20,212,108 | 8,369,849 | 70.7% + #1: ToddCoxeter: diff 0.0.3 | +4,851,374 | +2,006,008 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +20,212,095 | +8,369,829 | +31.3% + #1: ToddCoxeter: phase 0.0 = 4.020s | run 0 = 4.020s | all runs = 4.020s | elapsed = 4.020s + #0: ToddCoxeter: large collapse, number of coincidences 100,000 >= 100,000 = large_collapse()! + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.5 | active | killed | defined + #1: ToddCoxeter: nodes | 45,650 | 11,465,859 | 11,511,509 + #1: ToddCoxeter: diff 0.0.4 | -9,481,669 | +11,156,755 | +1,675,069 + #1: ToddCoxeter: diff 0.0.0 | +45,639 | +11,465,859 | +11,511,498 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 70,390 | 66,560 | 51.4% + #1: ToddCoxeter: diff 0.0.4 | -20,141,718 | -8,303,289 | -19.3% + #1: ToddCoxeter: diff 0.0.0 | +70,377 | +66,540 | +12.0% + #1: ToddCoxeter: phase 0.0 = 5.025s | run 0 = 5.025s | all runs = 5.025s | elapsed = 5.025s + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 STOP + #0: ToddCoxeter: FELSCH 0.0.6 | active | killed | defined + #0: ToddCoxeter: nodes | 29,155 | 11,482,367 | 11,511,522 + #0: ToddCoxeter: diff 0.0.5 | -16,495 | +16,508 | +13 + #0: ToddCoxeter: diff 0.0.0 | +29,144 | +11,482,367 | +11,511,511 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 87,465 | 0 | 100.0% + #0: ToddCoxeter: diff 0.0.5 | +17,075 | -66,560 | +48.6% + #0: ToddCoxeter: diff 0.0.0 | +87,452 | -20 | +60.6% + #0: ToddCoxeter: phase 0.0 = 5.029s | run 0 = 5.029s | all runs = 5.029s | elapsed = 5.029s + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: LOOKAHEAD 0.1 START (lookahead_extent() = full, lookahead_style() = hlt) + #0: ToddCoxeter: LOOKAHEAD 0.1.0 | active | killed | defined + #0: ToddCoxeter: nodes | 29,155 | 11,482,367 | 11,511,522 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 87,465 | 0 | 100.0% + #0: ToddCoxeter: time | run 0 = 5.029s | all runs = 5.029s | elapsed = 5.029s + #0: ToddCoxeter: triggered because there are skipped definitions (29,155 active nodes)! + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: LOOKAHEAD 0.1 STOP + #0: ToddCoxeter: LOOKAHEAD 0.1.1 | active | killed | defined + #0: ToddCoxeter: nodes | 29,155 | 11,482,367 | 11,511,522 + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 87,465 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 9ms | run 0 = 5.038s | all runs = 5.038s | elapsed = 5.039s + #0: ToddCoxeter: lookahead_next() is now max(f x a = 58,310, m = 10,000) (-4,941,690) + #0: ToddCoxeter: because f x a < n + #0: ToddCoxeter: where: a = number_of_nodes_active() = 29,155 + #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.2 | active | killed | defined + #0: ToddCoxeter: nodes | 29,155 | 11,482,367 | 11,511,522 + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 87,465 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 9ms | run 0 = 5.039s | all runs = 5.039s | elapsed = 5.039s + ++++++++++++++++++++++++++++++++ + #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 | 9ms (0%) | - (0%) | - (0%) | 5.029s (100%) + #0: ToddCoxeter: phase 0.2 = 9ms | run 0 = 5.039s | all runs = 5.039s | elapsed = 5.039s + The index of the subgroup is 29155 + ``` + +:material-checkbox-marked-circle-outline: The computed index is the same as +the claimed index: $29,155$. diff --git a/docs/examples/atlas/monster-sections/he/3358656.md b/docs/examples/atlas/monster-sections/he/3358656.md new file mode 100644 index 0000000..9140b17 --- /dev/null +++ b/docs/examples/atlas/monster-sections/he/3358656.md @@ -0,0 +1,178 @@ +# $5^2:4A_4$ as a subgroup of Held group He + +The subgroup generators used on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/](https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/). + +## Claim + +$$ + \mathrm{He} = \langle a, b \mid a^2 = b^7 = (ab)^{17} + = [a, b]^6 = [a, b^3]^5 = [a, babab^{-1}abab] + = (ab)^4ab^2ab^{-3}ababab^{-1}ab^3ab^{-2}ab^2 = 1 \rangle. +$$ + +The generators are claimed to generate a maximal subgroup isomorphic to +$5^2:4A_4$. More precisely, if + +$$ + H = \langle a,\ abab^2ab^{-3}ab \rangle, +$$ + +then + +$$ + [\mathrm{He} : H] = 3,358,656. +$$ + +On this page, we verify that the subgroup generated by these words has the +claimed index. + +## The code + +In [libsemigroups_pybind11][], the following script constructs the presentation +for He, adds the generating pairs that define the maximal subgroup, and runs the +Todd-Coxeter algorithm. The source code marks three of the presentation +relations as redundant. + +```python +from libsemigroups_pybind11 import ( + Presentation, + ToddCoxeter, + congruence_kind, + presentation, +) +from libsemigroups_pybind11.words import parse_relations as parse + + +# 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("a^2"), "") +presentation.add_rule(p, parse("b^7"), "") +presentation.add_rule(p, parse("(ab)^17"), "") +presentation.add_rule(p, parse("(ab^3)^8"), "") # redundant +presentation.add_rule(p, parse("(ab^2ab^2aBBB)^3"), "") # redundant +presentation.add_rule(p, parse("(a,babaBabab)"), "") +presentation.add_rule(p, parse("(a,b^3)^5"), "") +presentation.add_rule(p, parse("(a,b)^6"), "") +presentation.add_rule( + p, parse("ab(abaBB)^2ab^2aBab^2aBB(abaB)^2"), "" +) # redundant, maybe useful. +presentation.add_rule(p, parse("(ab)^4ab^2aB^3ababaBab^3aB^2ab^2"), "") + +presentation.balance(p, "abAB", "ABab") +presentation.replace_subword(p, "A", "a") +p.alphabet("abB") + +tc = ToddCoxeter(congruence_kind.onesided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# takes approx 54s + +# These generators are from the webpages of the ATLAS +tc.add_generating_pair("a", "") +tc.add_generating_pair(parse("abab^2aB^3ab"), "") + +print(f"The index of the subgroup is {tc.number_of_classes()}") +``` + +## The output + +The truncated output of the enumeration is below: + +??? info "Truncated output from the Python script" + + ``` + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 14, |u| + |v| ∈ [2, 40], ∑(|u| + |v|) = 259 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 START + #0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined + #0: ToddCoxeter: nodes | 10 | 0 | 10 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 12 | 18 | 40.0% + #0: ToddCoxeter: time | run 0 = 54µs | all runs = 54µs | elapsed = 231µs + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #1: ToddCoxeter: nodes | 2,432,372 | 62,383 | 2,494,757 + #1: ToddCoxeter: diff 0.0.0 | +2,432,362 | +62,383 | +2,494,747 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 5,157,707 | 2,139,409 | 70.7% + #1: ToddCoxeter: diff 0.0.0 | +5,157,695 | +2,139,391 | +30.7% + #1: ToddCoxeter: phase 0.0 = 1.004s | run 0 = 1.004s | all runs = 1.004s | elapsed = 1.004s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.2 | active | killed | defined + #1: ToddCoxeter: nodes | 4,842,108 | 140,945 | 4,983,074 + #1: ToddCoxeter: diff 0.0.1 | +2,409,736 | +78,562 | +2,488,317 + #1: ToddCoxeter: diff 0.0.0 | +4,842,098 | +140,945 | +4,983,064 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 10,271,116 | 4,255,208 | 70.7% + #1: ToddCoxeter: diff 0.0.1 | +5,113,409 | +2,115,799 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +10,271,104 | +4,255,190 | +30.7% + #1: ToddCoxeter: phase 0.0 = 2.009s | run 0 = 2.009s | all runs = 2.009s | elapsed = 2.009s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.3 | active | killed | defined + #1: ToddCoxeter: nodes | 7,158,599 | 221,358 | 7,379,979 + #1: ToddCoxeter: diff 0.0.2 | +2,316,491 | +80,413 | +2,396,905 + #1: ToddCoxeter: diff 0.0.0 | +7,158,589 | +221,358 | +7,379,969 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 15,187,405 | 6,288,392 | 70.7% + #1: ToddCoxeter: diff 0.0.2 | +4,916,289 | +2,033,184 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +15,187,393 | +6,288,374 | +30.7% + #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 | 9,255,773 | 422,754 | 9,678,545 + #1: ToddCoxeter: diff 0.0.3 | +2,097,174 | +201,396 | +2,298,566 + #1: ToddCoxeter: diff 0.0.0 | +9,255,763 | +422,754 | +9,678,535 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 19,641,556 | 8,125,763 | 70.7% + #1: ToddCoxeter: diff 0.0.3 | +4,454,151 | +1,837,371 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +19,641,544 | +8,125,745 | +30.7% + #1: ToddCoxeter: phase 0.0 = 4.016s | run 0 = 4.016s | all runs = 4.016s | elapsed = 4.016s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.5 | active | killed | defined + #1: ToddCoxeter: nodes | 6,914,229 | 3,237,712 | 10,151,941 + #1: ToddCoxeter: diff 0.0.4 | -2,341,544 | +2,814,958 | +473,396 + #1: ToddCoxeter: diff 0.0.0 | +6,914,219 | +3,237,712 | +10,151,931 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 14,845,037 | 5,897,650 | 71.6% + [... lines omitted ...] + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 10,075,968 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.10 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 10.090s | run 0 = 54.796s | all runs = 54.796s | elapsed = 54.796s + #0: ToddCoxeter: lookahead_next() is now n x f = 10,000,000 (+5,000,000) + #0: ToddCoxeter: because: l < (l + a) / t = 839,664 + #0: ToddCoxeter: where: a = number_of_nodes_active() = 3,358,656 + #0: ToddCoxeter: f = lookahead_growth_factor() = 2 + #0: ToddCoxeter: l = nodes killed in lookahead = 0 + #0: ToddCoxeter: n = lookahead_next() = 5,000,000 + #0: ToddCoxeter: t = lookahead_growth_threshold() = 4 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.2.12 | active | killed | defined + #0: ToddCoxeter: nodes | 3,358,656 | 7,414,887 | 10,773,543 + #0: ToddCoxeter: diff 0.2.11 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 10,075,968 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.11 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 10.090s | run 0 = 54.796s | all runs = 54.796s | elapsed = 54.796s + ++++++++++++++++++++++++++++++++ + #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 | 10.090s (18%) | - (0%) | - (0%) | 44.705s (82%) + #0: ToddCoxeter: phase 0.2 = 10.147s | run 0 = 54.852s | all runs = 54.852s | elapsed = 54.852s + The index of the subgroup is 3358656 + ``` + +:material-checkbox-marked-circle-outline: The computed index is the same as +the claimed index: $3,358,656$. diff --git a/docs/examples/atlas/monster-sections/he/652800.md b/docs/examples/atlas/monster-sections/he/652800.md new file mode 100644 index 0000000..6798e0c --- /dev/null +++ b/docs/examples/atlas/monster-sections/he/652800.md @@ -0,0 +1,182 @@ +# $7^{1+2}:(3 \times S_3)$ as a subgroup of Held group He + +The subgroup generators used on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/](https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/). + +## Claim + +$$ + \mathrm{He} = \langle a, b \mid a^2 = b^7 = (ab)^{17} + = [a, b]^6 = [a, b^3]^5 = [a, babab^{-1}abab] + = (ab)^4ab^2ab^{-3}ababab^{-1}ab^3ab^{-2}ab^2 = 1 \rangle. +$$ + +The generators are claimed to generate a maximal subgroup isomorphic to +$7^{1+2}:(3 \times S_3)$. More precisely, if + +$$ + H = \langle (b^{-1}a)^7(ab^2)^6(ab)^7,\ (q^{-1})^5(ab^2)^2q^5,\ \text{ where }q=ababb \rangle, +$$ + +then + +$$ + [\mathrm{He} : H] = 652,800. +$$ + +On this page, we verify that the subgroup generated by these words has the +claimed index. + +## The code + +In [libsemigroups_pybind11][], the following script constructs the presentation +for He, adds the generating pairs that define the maximal subgroup, and runs the +Todd-Coxeter algorithm. The source code marks three of the presentation +relations as redundant. + +```python +from libsemigroups_pybind11 import ( + Presentation, + ToddCoxeter, + congruence_kind, + presentation, +) +from libsemigroups_pybind11.words import parse_relations as parse + + +# 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("a^2"), "") +presentation.add_rule(p, parse("b^7"), "") +presentation.add_rule(p, parse("(ab)^17"), "") +presentation.add_rule(p, parse("(ab^3)^8"), "") # redundant +presentation.add_rule(p, parse("(ab^2ab^2aBBB)^3"), "") # redundant +presentation.add_rule(p, parse("(a,babaBabab)"), "") +presentation.add_rule(p, parse("(a,b^3)^5"), "") +presentation.add_rule(p, parse("(a,b)^6"), "") +presentation.add_rule( + p, parse("ab(abaBB)^2ab^2aBab^2aBB(abaB)^2"), "" +) # redundant, maybe useful. +presentation.add_rule(p, parse("(ab)^4ab^2aB^3ababaBab^3aB^2ab^2"), "") + +presentation.balance(p, "abAB", "ABab") +presentation.replace_subword(p, "A", "a") +p.alphabet("abB") + +tc = ToddCoxeter(congruence_kind.onesided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# The subgroup generators here are taken from one of the straight line +# programmes from: +# https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/ + +# takes approx 2.5 minutes +q = "ababb" +Q = ("".join(reversed(q))).replace("b", "B") +tc.add_generating_pair(parse("(Ba)^7(ab^2)^6(ab)^7"), "") +tc.add_generating_pair(parse(f"({Q})^5(ab^2)^2({q})^5"), "") + +print(f"The index of the subgroup is {tc.number_of_classes()}") +``` + +## The output + +The truncated output of the enumeration is below: + +??? info "Truncated output from the Python script" + + ``` + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 14, |u| + |v| ∈ [2, 40], ∑(|u| + |v|) = 259 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 START + #0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined + #0: ToddCoxeter: nodes | 57 | 43 | 100 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 100 | 71 | 58.5% + #0: ToddCoxeter: time | run 0 = 81µs | all runs = 81µs | elapsed = 302µs + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #1: ToddCoxeter: nodes | 2,498,917 | 52,325 | 2,551,269 + #1: ToddCoxeter: diff 0.0.0 | +2,498,860 | +52,282 | +2,551,169 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 5,296,218 | 2,200,533 | 70.6% + #1: ToddCoxeter: diff 0.0.0 | +5,296,118 | +2,200,462 | +12.2% + #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 | 4,989,394 | 110,077 | 5,099,485 + #1: ToddCoxeter: diff 0.0.1 | +2,490,477 | +57,752 | +2,548,216 + #1: ToddCoxeter: diff 0.0.0 | +4,989,337 | +110,034 | +5,099,385 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 10,576,096 | 4,392,086 | 70.7% + #1: ToddCoxeter: diff 0.0.1 | +5,279,878 | +2,191,553 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +10,575,996 | +4,392,015 | +12.2% + #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 | 7,541,248 | 170,690 | 7,711,948 + #1: ToddCoxeter: diff 0.0.2 | +2,551,854 | +60,613 | +2,612,463 + #1: ToddCoxeter: diff 0.0.0 | +7,541,191 | +170,647 | +7,711,848 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 15,986,986 | 6,636,758 | 70.7% + #1: ToddCoxeter: diff 0.0.2 | +5,410,890 | +2,244,672 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +15,986,886 | +6,636,687 | +12.2% + #1: ToddCoxeter: phase 0.0 = 3.015s | run 0 = 3.015s | all runs = 3.015s | elapsed = 3.015s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.4 | active | killed | defined + #1: ToddCoxeter: nodes | 9,990,510 | 226,874 | 10,217,405 + #1: ToddCoxeter: diff 0.0.3 | +2,449,262 | +56,184 | +2,505,457 + #1: ToddCoxeter: diff 0.0.0 | +9,990,453 | +226,831 | +10,217,305 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 21,180,244 | 8,791,286 | 70.7% + #1: ToddCoxeter: diff 0.0.3 | +5,193,258 | +2,154,528 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +21,180,144 | +8,791,215 | +12.2% + #1: ToddCoxeter: phase 0.0 = 4.020s | run 0 = 4.020s | all runs = 4.020s | elapsed = 4.020s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.5 | active | killed | defined + #1: ToddCoxeter: nodes | 12,531,004 | 287,403 | 12,818,441 + #1: ToddCoxeter: diff 0.0.4 | +2,540,494 | +60,529 | +2,601,036 + #1: ToddCoxeter: diff 0.0.0 | +12,530,947 | +287,360 | +12,818,341 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 26,567,136 | 11,025,876 | 70.7% + [... lines omitted ...] + #0: ToddCoxeter: LOOKAHEAD 0.1.1 | active | killed | defined + #0: ToddCoxeter: nodes | 652,800 | 251,782,228 | 252,435,028 + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 1,958,400 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 572ms | run 0 = 2min24s | all runs = 2min24s | elapsed = 2min24s + #0: ToddCoxeter: lookahead_next() is now max(f x a = 1,305,600, m = 10,000) (-3,694,400) + #0: ToddCoxeter: because f x a < n + #0: ToddCoxeter: where: a = number_of_nodes_active() = 652,800 + #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.2 | active | killed | defined + #0: ToddCoxeter: nodes | 652,800 | 251,782,228 | 252,435,028 + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 1,958,400 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 572ms | run 0 = 2min24s | all runs = 2min24s | elapsed = 2min24s + ++++++++++++++++++++++++++++++++ + #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 | 572ms (0%) | - (0%) | - (0%) | 2min23s (100%) + #0: ToddCoxeter: phase 0.2 = 576ms | run 0 = 2min24s | all runs = 2min24s | elapsed = 2min24s + The index of the subgroup is 652800 + ``` + +:material-checkbox-marked-circle-outline: The computed index is the same as +the claimed index: $652,800$. diff --git a/docs/examples/atlas/monster-sections/he/8330.md b/docs/examples/atlas/monster-sections/he/8330.md new file mode 100644 index 0000000..fe5bcf9 --- /dev/null +++ b/docs/examples/atlas/monster-sections/he/8330.md @@ -0,0 +1,153 @@ +# $2^2.L_3(4).S_3$ as a subgroup of Held group He + +The subgroup generators used on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/spor/He/words/HeG1-max2W1](https://brauer.maths.qmul.ac.uk/Atlas/spor/He/words/HeG1-max2W1). + +## Claim + +$$ + \mathrm{He} = \langle a, b \mid a^2 = b^7 = (ab)^{17} + = [a, b]^6 = [a, b^3]^5 = [a, babab^{-1}abab] + = (ab)^4ab^2ab^{-3}ababab^{-1}ab^3ab^{-2}ab^2 = 1 \rangle. +$$ + +The generators are claimed to generate a maximal subgroup isomorphic to +$2^2.L_3(4).S_3$. More precisely, if + +$$ + H = \langle a,\ bab^2 \rangle, +$$ + +then + +$$ + [\mathrm{He} : H] = 8,330. +$$ + +On this page, we verify that the subgroup generated by these words has the +claimed index. + +## The code + +In [libsemigroups_pybind11][], the following script constructs the presentation +for He, adds the generating pairs that define the maximal subgroup, and runs the +Todd-Coxeter algorithm. The source code marks three of the presentation +relations as redundant. + +```python +from libsemigroups_pybind11 import ( + Presentation, + ToddCoxeter, + congruence_kind, + presentation, +) +from libsemigroups_pybind11.words import parse_relations as parse + + +# 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("a^2"), "") +presentation.add_rule(p, parse("b^7"), "") +presentation.add_rule(p, parse("(ab)^17"), "") +presentation.add_rule(p, parse("(ab^3)^8"), "") # redundant +presentation.add_rule(p, parse("(ab^2ab^2aBBB)^3"), "") # redundant +presentation.add_rule(p, parse("(a,babaBabab)"), "") +presentation.add_rule(p, parse("(a,b^3)^5"), "") +presentation.add_rule(p, parse("(a,b)^6"), "") +presentation.add_rule( + p, parse("ab(abaBB)^2ab^2aBab^2aBB(abaB)^2"), "" +) # redundant, maybe useful. +presentation.add_rule(p, parse("(ab)^4ab^2aB^3ababaBab^3aB^2ab^2"), "") + +presentation.balance(p, "abAB", "ABab") +presentation.replace_subword(p, "A", "a") +p.alphabet("abB") + +tc = ToddCoxeter(congruence_kind.onesided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# The subgroup generators here are taken from: +# https://brauer.maths.qmul.ac.uk/Atlas/spor/He/words/HeG1-max2W1 + +# takes approx 231ms + +tc.add_generating_pair("a", "") +tc.add_generating_pair("babb", "") + +print(f"The index of the subgroup is {tc.number_of_classes()}") +``` + +## The output + +The output of the enumeration is below: + +??? info "Output from the Python script" + + ``` + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 14, |u| + |v| ∈ [2, 40], ∑(|u| + |v|) = 259 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 START + #0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined + #0: ToddCoxeter: nodes | 4 | 0 | 4 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 6 | 6 | 50.0% + #0: ToddCoxeter: time | run 0 = 60µs | all runs = 60µs | elapsed = 106µs + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 STOP + #0: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #0: ToddCoxeter: nodes | 8,330 | 506,595 | 514,925 + #0: ToddCoxeter: diff 0.0.0 | +8,326 | +506,595 | +514,921 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 24,990 | 0 | 100.0% + #0: ToddCoxeter: diff 0.0.0 | +24,984 | -6 | +50.0% + #0: ToddCoxeter: phase 0.0 = 222ms | run 0 = 222ms | all runs = 222ms | elapsed = 222ms + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: LOOKAHEAD 0.1 START (lookahead_extent() = full, lookahead_style() = hlt) + #0: ToddCoxeter: LOOKAHEAD 0.1.0 | active | killed | defined + #0: ToddCoxeter: nodes | 8,330 | 506,595 | 514,925 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 24,990 | 0 | 100.0% + #0: ToddCoxeter: time | run 0 = 222ms | all runs = 222ms | elapsed = 222ms + #0: ToddCoxeter: triggered because there are skipped definitions (8,330 active nodes)! + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: LOOKAHEAD 0.1 STOP + #0: ToddCoxeter: LOOKAHEAD 0.1.1 | active | killed | defined + #0: ToddCoxeter: nodes | 8,330 | 506,595 | 514,925 + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 24,990 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 1ms | run 0 = 224ms | all runs = 224ms | elapsed = 224ms + #0: ToddCoxeter: lookahead_next() is now max(f x a = 16,660, m = 10,000) (-4,983,340) + #0: ToddCoxeter: because f x a < n + #0: ToddCoxeter: where: a = number_of_nodes_active() = 8,330 + #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.2 | active | killed | defined + #0: ToddCoxeter: nodes | 8,330 | 506,595 | 514,925 + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 24,990 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 2ms | run 0 = 224ms | all runs = 224ms | elapsed = 224ms + ++++++++++++++++++++++++++++++++ + #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 | 2ms (1%) | - (0%) | - (0%) | 222ms (99%) + #0: ToddCoxeter: phase 0.2 = 2ms | run 0 = 224ms | all runs = 224ms | elapsed = 224ms + The index of the subgroup is 8330 + ``` + +:material-checkbox-marked-circle-outline: The computed index is the same as +the claimed index: $8,330$. diff --git a/docs/examples/atlas/monster-sections/he/999600.md b/docs/examples/atlas/monster-sections/he/999600.md new file mode 100644 index 0000000..c3186e4 --- /dev/null +++ b/docs/examples/atlas/monster-sections/he/999600.md @@ -0,0 +1,182 @@ +# $S_4 \times L_3(2)$ as a subgroup of Held group He + +The subgroup generators used on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/](https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/). + +## Claim + +$$ + \mathrm{He} = \langle a, b \mid a^2 = b^7 = (ab)^{17} + = [a, b]^6 = [a, b^3]^5 = [a, babab^{-1}abab] + = (ab)^4ab^2ab^{-3}ababab^{-1}ab^3ab^{-2}ab^2 = 1 \rangle. +$$ + +The generators are claimed to generate a maximal subgroup isomorphic to +$S_4 \times L_3(2)$. More precisely, if + +$$ + H = \langle (q^{-1})^2(ab^2)^6q^2,\ (ab)^6(ab^2)^4(b^{-1}a)^6,\ \text{ where }q=ababb \rangle, +$$ + +then + +$$ + [\mathrm{He} : H] = 999,600. +$$ + +On this page, we verify that the subgroup generated by these words has the +claimed index. + +## The code + +In [libsemigroups_pybind11][], the following script constructs the presentation +for He, adds the generating pairs that define the maximal subgroup, and runs the +Todd-Coxeter algorithm. The source code marks three of the presentation +relations as redundant. + +```python +from libsemigroups_pybind11 import ( + Presentation, + ToddCoxeter, + congruence_kind, + presentation, +) +from libsemigroups_pybind11.words import parse_relations as parse + + +# 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("a^2"), "") +presentation.add_rule(p, parse("b^7"), "") +presentation.add_rule(p, parse("(ab)^17"), "") +presentation.add_rule(p, parse("(ab^3)^8"), "") # redundant +presentation.add_rule(p, parse("(ab^2ab^2aBBB)^3"), "") # redundant +presentation.add_rule(p, parse("(a,babaBabab)"), "") +presentation.add_rule(p, parse("(a,b^3)^5"), "") +presentation.add_rule(p, parse("(a,b)^6"), "") +presentation.add_rule( + p, parse("ab(abaBB)^2ab^2aBab^2aBB(abaB)^2"), "" +) # redundant, maybe useful. +presentation.add_rule(p, parse("(ab)^4ab^2aB^3ababaBab^3aB^2ab^2"), "") + +presentation.balance(p, "abAB", "ABab") +presentation.replace_subword(p, "A", "a") +p.alphabet("abB") + +tc = ToddCoxeter(congruence_kind.onesided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# The subgroup generators here are taken from one of the straight line +# programmes from: +# https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/He/ + +# takes approx 2.5 minutes +q = "ababb" +Q = ("".join(reversed(q))).replace("b", "B") +tc.add_generating_pair(parse(f"({Q})^2(ab^2)^6({q})^2"), "") +tc.add_generating_pair(parse("(ab)^6(ab^2)^4(Ba)^6"), "") + +print(f"The index of the subgroup is {tc.number_of_classes()}") +``` + +## The output + +The truncated output of the enumeration is below: + +??? info "Truncated output from the Python script" + + ``` + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 14, |u| + |v| ∈ [2, 40], ∑(|u| + |v|) = 259 + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: FELSCH 0.0 START + #0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined + #0: ToddCoxeter: nodes | 48 | 25 | 73 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 74 | 70 | 51.4% + #0: ToddCoxeter: time | run 0 = 70µs | all runs = 70µs | elapsed = 264µs + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #1: ToddCoxeter: nodes | 2,473,159 | 53,957 | 2,527,133 + #1: ToddCoxeter: diff 0.0.0 | +2,473,111 | +53,932 | +2,527,060 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 5,242,117 | 2,177,360 | 70.7% + #1: ToddCoxeter: diff 0.0.0 | +5,242,043 | +2,177,290 | +19.3% + #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 | 4,992,438 | 112,926 | 5,105,379 + #1: ToddCoxeter: diff 0.0.1 | +2,519,279 | +58,969 | +2,578,246 + #1: ToddCoxeter: diff 0.0.0 | +4,992,390 | +112,901 | +5,105,306 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 10,583,240 | 4,394,074 | 70.7% + #1: ToddCoxeter: diff 0.0.1 | +5,341,123 | +2,216,714 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +10,583,166 | +4,394,004 | +19.3% + #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 | 7,553,726 | 174,059 | 7,727,802 + #1: ToddCoxeter: diff 0.0.2 | +2,561,288 | +61,133 | +2,622,423 + #1: ToddCoxeter: diff 0.0.0 | +7,553,678 | +174,034 | +7,727,729 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 16,014,216 | 6,646,962 | 70.7% + #1: ToddCoxeter: diff 0.0.2 | +5,430,976 | +2,252,888 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +16,014,142 | +6,646,892 | +19.3% + #1: ToddCoxeter: phase 0.0 = 3.015s | run 0 = 3.015s | all runs = 3.015s | elapsed = 3.015s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.4 | active | killed | defined + #1: ToddCoxeter: nodes | 10,022,736 | 236,866 | 10,259,624 + #1: ToddCoxeter: diff 0.0.3 | +2,469,010 | +62,807 | +2,531,822 + #1: ToddCoxeter: diff 0.0.0 | +10,022,688 | +236,841 | +10,259,551 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 21,250,224 | 8,817,984 | 70.7% + #1: ToddCoxeter: diff 0.0.3 | +5,236,008 | +2,171,022 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +21,250,150 | +8,817,914 | +19.3% + #1: ToddCoxeter: phase 0.0 = 4.020s | run 0 = 4.020s | all runs = 4.020s | elapsed = 4.020s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.5 | active | killed | defined + #1: ToddCoxeter: nodes | 12,591,904 | 299,790 | 12,891,716 + #1: ToddCoxeter: diff 0.0.4 | +2,569,168 | +62,924 | +2,632,092 + #1: ToddCoxeter: diff 0.0.0 | +12,591,856 | +299,765 | +12,891,643 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 26,698,162 | 11,077,550 | 70.7% + [... lines omitted ...] + #0: ToddCoxeter: diff 0.1.1 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 2,998,800 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.1 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 1.339s | run 0 = 2min31s | all runs = 2min31s | elapsed = 2min31s + #0: ToddCoxeter: lookahead_next() is now max(f x a = 1,999,200, m = 10,000) (-3,000,800) + #0: ToddCoxeter: because f x a < n + #0: ToddCoxeter: where: a = number_of_nodes_active() = 999,600 + #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.3 | active | killed | defined + #0: ToddCoxeter: nodes | 999,600 | 287,397,473 | 288,397,073 + #0: ToddCoxeter: diff 0.2.2 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 2,998,800 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.2 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 1.339s | run 0 = 2min31s | all runs = 2min31s | elapsed = 2min31s + ++++++++++++++++++++++++++++++++ + #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 | 1.339s (1%) | - (0%) | - (0%) | 2min29s (99%) + #0: ToddCoxeter: phase 0.2 = 1.346s | run 0 = 2min31s | all runs = 2min31s | elapsed = 2min31s + The index of the subgroup is 999600 + ``` + +:material-checkbox-marked-circle-outline: The computed index is the same as +the claimed index: $999,600$. diff --git a/docs/examples/atlas/monster-sections/he/index.md b/docs/examples/atlas/monster-sections/he/index.md index 75b5801..506d69f 100644 --- a/docs/examples/atlas/monster-sections/he/index.md +++ b/docs/examples/atlas/monster-sections/he/index.md @@ -1,10 +1,23 @@ # Held group He -> Order: $4,030,387,200$ +On this page, we provide links to verifications that the generators of maximal +subgroups of the Held group He from the ATLAS generate subgroups of the correct +index. -> Presentation: -> $\langle a, b \mid a^2 = b^7 = (ab)^{17} = [a, b]^6 = [a, b^3]^5 = [a, babab^{−1}abab] = (ab)^4ab^2ab^{−3}ababab^{−1}ab^3ab^{−2}ab^2 = 1 \rangle$ +
-!!! info "Work in Progress" +| Subgroup | Subgroup order | Index in He | Verification | +| :------- | -------------: | ----------: | :----------: | +| [$S_4(4):2$](2058.md) | $1,958,400$ | $2,058$ | :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | +| [$2^2.L_3(4).S_3$](8330.md) | $483,840$ | $8,330$ | :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | +| [$2^6:3.S_6$](29155-i.md) | $138,240$ | $29,155$ | :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | +| [$2^6:3.S_6$](29155-ii.md) | $138,240$ | $29,155$ | :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | +| [$2^{1+6}.L_3(2)$](187425.md) | $21,504$ | $187,425$ | :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | +| [$7^2:2.L_2(7)$](244800.md) | $16,464$ | $244,800$ | :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | +| [$3.S_7$](266560.md) | $15,120$ | $266,560$ | :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | +| [$7^{1+2}:(3 \times S_3)$](652800.md) | $6,174$ | $652,800$ | :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | +| [$S_4 \times L_3(2)$](999600.md) | $4,032$ | $999,600$ | :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | +| [$7:3 \times L_3(2)$](1142400.md) | $3,528$ | $1,142,400$ | :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | +| [$5^2:4A_4$](3358656.md) | $1,200$ | $3,358,656$ | :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | - This page is a work in progress. +
diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index dea2783..ff10c3c 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -26,6 +26,15 @@ text-decoration: none; } +.center-table { + text-align: center; +} + +.center-table th:not(:last-child), +.center-table td:not(:last-child) { + border-right: 0.05rem solid var(--md-typeset-table-color); +} + .correct-size { background-color: #4dac26; } From 8c0c01945004d3d282d6571f7bff57375cc09679 Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Tue, 18 Aug 2026 19:54:34 +0100 Subject: [PATCH 2/9] Make M23 pages consistent with Held --- docs/.nav.yml | 7 +++---- docs/examples/atlas/mathieu/m23/index.md | 24 +++++++++++++----------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/docs/.nav.yml b/docs/.nav.yml index cc679a5..38e1670 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -25,10 +25,9 @@ nav: - "Mathieu group M22": examples/atlas/mathieu/m22.md - "Mathieu group M23": - examples/atlas/mathieu/m23/index.md - - "M11, P1": examples/atlas/mathieu/m23/p1_m11.md - - "M22, P1": examples/atlas/mathieu/m23/p1_m22.md - - "M11, P2": examples/atlas/mathieu/m23/p2_m11.md - - "M22, P2": examples/atlas/mathieu/m23/p2_m22.md + - "M11": + - "Presentation 1": examples/atlas/mathieu/m23/p1_m11.md + - "Presentation 2": examples/atlas/mathieu/m23/p2_m11.md - "Mathieu group M24": - examples/atlas/mathieu/m24/index.md - "Leech lattice groups": diff --git a/docs/examples/atlas/mathieu/m23/index.md b/docs/examples/atlas/mathieu/m23/index.md index 270bc16..4a7bf94 100644 --- a/docs/examples/atlas/mathieu/m23/index.md +++ b/docs/examples/atlas/mathieu/m23/index.md @@ -2,17 +2,19 @@ On this page, we provide links to verifications that the maximal subgroups of the Mathieu group M~23~ define groups of the correct index. Two presentations -are given for M~23~, and two maximal subgroups have generating pairs specified. +are given for M~23~. Both successful verifications concern the maximal subgroup +M~11~. -## Maximal subgroups +
-We attempted to verify the following maximal subgroups: +| Subgroup | Subgroup order | Index in M~23~ | Verification | +| :------- | -------------: | -------------: | :----------: | +| $M_{22}$ | $443,520$ | $23$ | | +| $L_3(4):2_2$ | $40,320$ | $253$ | | +| $2^4:A_7$ | $40,320$ | $253$ | | +| $A_8$ | $20,160$ | $506$ | | +| $M_{11}$ | $7,920$ | $1,288$ | [$P_1$](p1_m11.md) :material-checkbox-marked-circle-outline:{ style="color: #00c853" } [$P_2$](p2_m11.md) :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | +| $2^4:(3 \times A_5):2$ | $5,760$ | $1,771$ | | +| $23:11$ | $253$ | $40,320$ | | -- [Mathieu group M11 (Presentation 1)](p1_m11.md) - :material-checkbox-marked-circle-outline:{ style="color: #00c853" } -- [Mathieu group M22 (Presentation 1)](p1_m22.md) - :material-minus-circle-outline: -- [Mathieu group M11 (Presentation 2)](p2_m11.md) - :material-checkbox-marked-circle-outline:{ style="color: #00c853" } -- [Mathieu group M22 (Presentation 2)](p2_m22.md) - :material-minus-circle-outline: +
From 764a5f72e5028e3e5d0d0477ef61127bbb704a39 Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Tue, 18 Aug 2026 20:05:04 +0100 Subject: [PATCH 3/9] Revert "Make M23 pages consistent with Held" This reverts commit 8c0c01945004d3d282d6571f7bff57375cc09679. --- docs/.nav.yml | 7 ++++--- docs/examples/atlas/mathieu/m23/index.md | 24 +++++++++++------------- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/docs/.nav.yml b/docs/.nav.yml index 38e1670..cc679a5 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -25,9 +25,10 @@ nav: - "Mathieu group M22": examples/atlas/mathieu/m22.md - "Mathieu group M23": - examples/atlas/mathieu/m23/index.md - - "M11": - - "Presentation 1": examples/atlas/mathieu/m23/p1_m11.md - - "Presentation 2": examples/atlas/mathieu/m23/p2_m11.md + - "M11, P1": examples/atlas/mathieu/m23/p1_m11.md + - "M22, P1": examples/atlas/mathieu/m23/p1_m22.md + - "M11, P2": examples/atlas/mathieu/m23/p2_m11.md + - "M22, P2": examples/atlas/mathieu/m23/p2_m22.md - "Mathieu group M24": - examples/atlas/mathieu/m24/index.md - "Leech lattice groups": diff --git a/docs/examples/atlas/mathieu/m23/index.md b/docs/examples/atlas/mathieu/m23/index.md index 4a7bf94..270bc16 100644 --- a/docs/examples/atlas/mathieu/m23/index.md +++ b/docs/examples/atlas/mathieu/m23/index.md @@ -2,19 +2,17 @@ On this page, we provide links to verifications that the maximal subgroups of the Mathieu group M~23~ define groups of the correct index. Two presentations -are given for M~23~. Both successful verifications concern the maximal subgroup -M~11~. +are given for M~23~, and two maximal subgroups have generating pairs specified. -
+## Maximal subgroups -| Subgroup | Subgroup order | Index in M~23~ | Verification | -| :------- | -------------: | -------------: | :----------: | -| $M_{22}$ | $443,520$ | $23$ | | -| $L_3(4):2_2$ | $40,320$ | $253$ | | -| $2^4:A_7$ | $40,320$ | $253$ | | -| $A_8$ | $20,160$ | $506$ | | -| $M_{11}$ | $7,920$ | $1,288$ | [$P_1$](p1_m11.md) :material-checkbox-marked-circle-outline:{ style="color: #00c853" } [$P_2$](p2_m11.md) :material-checkbox-marked-circle-outline:{ style="color: #00c853" } | -| $2^4:(3 \times A_5):2$ | $5,760$ | $1,771$ | | -| $23:11$ | $253$ | $40,320$ | | +We attempted to verify the following maximal subgroups: -
+- [Mathieu group M11 (Presentation 1)](p1_m11.md) + :material-checkbox-marked-circle-outline:{ style="color: #00c853" } +- [Mathieu group M22 (Presentation 1)](p1_m22.md) + :material-minus-circle-outline: +- [Mathieu group M11 (Presentation 2)](p2_m11.md) + :material-checkbox-marked-circle-outline:{ style="color: #00c853" } +- [Mathieu group M22 (Presentation 2)](p2_m22.md) + :material-minus-circle-outline: From 915c0e64b59116af0804fe415b2dd6008214503c Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Tue, 18 Aug 2026 20:12:26 +0100 Subject: [PATCH 4/9] M24 move file for consistency --- docs/.nav.yml | 3 +-- docs/examples/atlas/mathieu/{m24/index.md => m24.md} | 0 2 files changed, 1 insertion(+), 2 deletions(-) rename docs/examples/atlas/mathieu/{m24/index.md => m24.md} (100%) diff --git a/docs/.nav.yml b/docs/.nav.yml index cc679a5..6891990 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -29,8 +29,7 @@ nav: - "M22, P1": examples/atlas/mathieu/m23/p1_m22.md - "M11, P2": examples/atlas/mathieu/m23/p2_m11.md - "M22, P2": examples/atlas/mathieu/m23/p2_m22.md - - "Mathieu group M24": - - examples/atlas/mathieu/m24/index.md + - "Mathieu group M24": examples/atlas/mathieu/m24.md - "Leech lattice groups": - examples/atlas/leech-lattice/hs.md - "Janko group J2, Hall-Janko group HJ": diff --git a/docs/examples/atlas/mathieu/m24/index.md b/docs/examples/atlas/mathieu/m24.md similarity index 100% rename from docs/examples/atlas/mathieu/m24/index.md rename to docs/examples/atlas/mathieu/m24.md From 7072a46f600f438e1225753762f530180f89ad18 Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Tue, 18 Aug 2026 20:17:01 +0100 Subject: [PATCH 5/9] M23 complete enum added --- docs/.nav.yml | 2 + docs/examples/atlas/index.md | 2 +- docs/examples/atlas/mathieu/m23/index.md | 13 +- docs/examples/atlas/mathieu/m23/p1.md | 167 ++++++++++++++++++++++ docs/examples/atlas/mathieu/m23/p2.md | 172 +++++++++++++++++++++++ 5 files changed, 352 insertions(+), 4 deletions(-) create mode 100644 docs/examples/atlas/mathieu/m23/p1.md create mode 100644 docs/examples/atlas/mathieu/m23/p2.md diff --git a/docs/.nav.yml b/docs/.nav.yml index 6891990..9fe13a6 100644 --- a/docs/.nav.yml +++ b/docs/.nav.yml @@ -25,6 +25,8 @@ nav: - "Mathieu group M22": examples/atlas/mathieu/m22.md - "Mathieu group M23": - examples/atlas/mathieu/m23/index.md + - "Presentation 1": examples/atlas/mathieu/m23/p1.md + - "Presentation 2": examples/atlas/mathieu/m23/p2.md - "M11, P1": examples/atlas/mathieu/m23/p1_m11.md - "M22, P1": examples/atlas/mathieu/m23/p1_m22.md - "M11, P2": examples/atlas/mathieu/m23/p2_m11.md diff --git a/docs/examples/atlas/index.md b/docs/examples/atlas/index.md index 0828c1a..e28a62a 100644 --- a/docs/examples/atlas/index.md +++ b/docs/examples/atlas/index.md @@ -78,7 +78,7 @@ see more information. M22 - + M23 diff --git a/docs/examples/atlas/mathieu/m23/index.md b/docs/examples/atlas/mathieu/m23/index.md index 270bc16..ba46a36 100644 --- a/docs/examples/atlas/mathieu/m23/index.md +++ b/docs/examples/atlas/mathieu/m23/index.md @@ -1,8 +1,15 @@ # Mathieu group M~23~ -On this page, we provide links to verifications that the maximal subgroups of -the Mathieu group M~23~ define groups of the correct index. Two presentations -are given for M~23~, and two maximal subgroups have generating pairs specified. +On this page, we provide links to verifications of two presentations of the +Mathieu group M~23~, and to attempts to verify the indices of two of its maximal +subgroups. + +## Presentations + +- [Presentation 1](p1.md) + :material-checkbox-marked-circle-outline:{ style="color: #00c853" } +- [Presentation 2](p2.md) + :material-checkbox-marked-circle-outline:{ style="color: #00c853" } ## Maximal subgroups diff --git a/docs/examples/atlas/mathieu/m23/p1.md b/docs/examples/atlas/mathieu/m23/p1.md new file mode 100644 index 0000000..e65d11b --- /dev/null +++ b/docs/examples/atlas/mathieu/m23/p1.md @@ -0,0 +1,167 @@ +# Mathieu group M~23~ (Presentation 1) + +The claims on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/v3/pres/M23G1-P1](https://brauer.maths.qmul.ac.uk/Atlas/v3/pres/M23G1-P1). + +The Python script includes the additional relation +$(abab^2ab^2)^6 = 1$, which its source marks as redundant and useful. We do +not verify that redundancy here. + +## Claim + +$$ + \mathrm{M}_{23} = \langle a, b \mid a^2 = b^4 = (ab)^{23} + = (ab^2)^6 = [a, b]^6 = (abab^{-1}ab^2)^4 + = (ab)^3ab^{-1}ab^2(abab^{-1})^2(ab)^3(ab^{-1})^3 + = (abab^2)^3(ab^2ab^{-1})^2abab^2abab^{-1}ab^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 M~23~ and runs the Todd-Coxeter algorithm. + +```python +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)^23"), "") +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("(ab)^3aBab^2(abaB)^2(ab)^3(aB)^3"), "") +presentation.add_rule( + p, parse_relations("(abab^2ab^2)^6"), "" +) # Is redundant, but very useful. +presentation.add_rule(p, parse_relations("(abab^2)^3(ab^2aB)^2abab^2abaBab^2"), "") +presentation.replace_subword(p, "A", "a") +p.alphabet("Bab") + +# Run the Todd-Coxeter algorithm +tc = ToddCoxeter(congruence_kind.twosided, p) +tc.strategy(ToddCoxeter.options.strategy.felsch) + +# Takes approx. 2.5 minutes + +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: + +??? info "Truncated output from the Python script" + + ``` + Bab + ++++++++++++++++++++++++++++++++ + #0: ToddCoxeter: RUN 0 START (strategy() = felsch) + #0: ToddCoxeter: |A| = 3, |R| = 13, |u| + |v| ∈ [2, 48], ∑(|u| + |v|) = 246 + ++++++++++++++++++++++++++++++++ + #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 | 3 | 0.0% + #0: ToddCoxeter: time | run 0 = 22µs | all runs = 22µs | elapsed = 66µs + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined + #1: ToddCoxeter: nodes | 1,822,250 | 36,043 | 1,858,318 + #1: ToddCoxeter: diff 0.0.0 | +1,822,249 | +36,043 | +1,858,317 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 4,253,812 | 1,212,938 | 77.8% + #1: ToddCoxeter: diff 0.0.0 | +4,253,812 | +1,212,935 | +77.8% + #1: ToddCoxeter: phase 0.0 = 1.000s | run 0 = 1.000s | all runs = 1.000s | elapsed = 1.000s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.2 | active | killed | defined + #1: ToddCoxeter: nodes | 3,655,607 | 83,517 | 3,739,139 + #1: ToddCoxeter: diff 0.0.1 | +1,833,357 | +47,474 | +1,880,821 + #1: ToddCoxeter: diff 0.0.0 | +3,655,606 | +83,517 | +3,739,138 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 8,538,514 | 2,428,307 | 77.9% + #1: ToddCoxeter: diff 0.0.1 | +4,284,702 | +1,215,369 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +8,538,514 | +2,428,304 | +77.9% + #1: ToddCoxeter: phase 0.0 = 2.001s | run 0 = 2.001s | all runs = 2.001s | elapsed = 2.001s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.3 | active | killed | defined + #1: ToddCoxeter: nodes | 5,466,932 | 137,547 | 5,604,495 + #1: ToddCoxeter: diff 0.0.2 | +1,811,325 | +54,030 | +1,865,356 + #1: ToddCoxeter: diff 0.0.0 | +5,466,931 | +137,547 | +5,604,494 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 12,774,618 | 3,626,178 | 77.9% + #1: ToddCoxeter: diff 0.0.2 | +4,236,104 | +1,197,871 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +12,774,618 | +3,626,175 | +77.9% + #1: ToddCoxeter: phase 0.0 = 3.006s | run 0 = 3.006s | all runs = 3.006s | elapsed = 3.006s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.4 | active | killed | defined + #1: ToddCoxeter: nodes | 7,294,223 | 190,832 | 7,485,071 + #1: ToddCoxeter: diff 0.0.3 | +1,827,291 | +53,285 | +1,880,576 + #1: ToddCoxeter: diff 0.0.0 | +7,294,222 | +190,832 | +7,485,070 + #1: ToddCoxeter: | active | missing | % complete + #1: ToddCoxeter: edges | 17,048,446 | 4,834,223 | 77.9% + #1: ToddCoxeter: diff 0.0.3 | +4,273,828 | +1,208,045 | +0.0% + #1: ToddCoxeter: diff 0.0.0 | +17,048,446 | +4,834,220 | +77.9% + #1: ToddCoxeter: phase 0.0 = 4.011s | run 0 = 4.011s | all runs = 4.011s | elapsed = 4.011s + ++++++++++++++++++++++++++++++++ + #1: ToddCoxeter: FELSCH 0.0.5 | active | killed | defined + #1: ToddCoxeter: nodes | 9,065,055 | 235,680 | 9,300,749 + #1: ToddCoxeter: diff 0.0.4 | +1,770,832 | +44,848 | +1,815,678 + #1: ToddCoxeter: diff 0.0.0 | +9,065,054 | +235,680 | +9,300,748 + #1: ToddCoxeter: | active | missing | % complete + [... lines omitted ...] + #0: ToddCoxeter: diff 0.1.51 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 30,602,880 | 0 | 100.0% + #0: ToddCoxeter: diff 0.1.51 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.1.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.1 = 51.591s | run 0 = 2min29s | all runs = 2min29s | elapsed = 2min29s + #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.53 | active | killed | defined + #0: ToddCoxeter: nodes | 10,200,960 | 33,207,284 | 43,408,244 + #0: ToddCoxeter: diff 0.2.52 | +0 | +0 | +0 + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0 + #0: ToddCoxeter: | active | missing | % complete + #0: ToddCoxeter: edges | 30,602,880 | 0 | 100.0% + #0: ToddCoxeter: diff 0.2.52 | +0 | +0 | +0.0% + #0: ToddCoxeter: diff 0.2.0 | +0 | +0 | +0.0% + #0: ToddCoxeter: phase 0.2 = 51.591s | run 0 = 2min29s | all runs = 2min29s | elapsed = 2min29s + ++++++++++++++++++++++++++++++++ + #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 | 51.591s (35%) | - (0%) | - (0%) | 1min37s (65%) + #0: ToddCoxeter: phase 0.2 = 51.708s | run 0 = 2min29s | all runs = 2min29s | elapsed = 2min29s + The size of the group defined by the presentation is 10200960 + ``` + +:material-checkbox-marked-circle-outline: The computed size of the group +matches the claimed size: $10,200,960$. diff --git a/docs/examples/atlas/mathieu/m23/p2.md b/docs/examples/atlas/mathieu/m23/p2.md new file mode 100644 index 0000000..9b35075 --- /dev/null +++ b/docs/examples/atlas/mathieu/m23/p2.md @@ -0,0 +1,172 @@ +# Mathieu group M~23~ (Presentation 2) + +The claims on this page come from +[https://brauer.maths.qmul.ac.uk/Atlas/v3/pres/M23G1-P2](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 M~23~ and runs the Todd-Coxeter algorithm. + +```python +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: + +??? info "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 + ``` + +:material-checkbox-marked-circle-outline: The computed size of the group +matches the claimed size: $10,200,960$. From 8fd1e4ed7623374b29ff712abb8298340cf9436b Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Tue, 18 Aug 2026 20:31:29 +0100 Subject: [PATCH 6/9] Rm empty files --- docs/examples/cong-latt.md | 0 docs/examples/gis.md | 0 docs/examples/stephen.md | 0 docs/examples/trans-rep.md | 0 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/examples/cong-latt.md delete mode 100644 docs/examples/gis.md delete mode 100644 docs/examples/stephen.md delete mode 100644 docs/examples/trans-rep.md diff --git a/docs/examples/cong-latt.md b/docs/examples/cong-latt.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/examples/gis.md b/docs/examples/gis.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/examples/stephen.md b/docs/examples/stephen.md deleted file mode 100644 index e69de29..0000000 diff --git a/docs/examples/trans-rep.md b/docs/examples/trans-rep.md deleted file mode 100644 index e69de29..0000000 From dc4492aa40770a4bdee829eedfa6b9430cc8dc8d Mon Sep 17 00:00:00 2001 From: James Mitchell Date: Tue, 18 Aug 2026 20:54:48 +0100 Subject: [PATCH 7/9] Tweak the key --- docs/examples/atlas/index.md | 30 +++++++++++++++++------------- docs/stylesheets/extra.css | 6 +++++- 2 files changed, 22 insertions(+), 14 deletions(-) diff --git a/docs/examples/atlas/index.md b/docs/examples/atlas/index.md index e28a62a..b3f031a 100644 --- a/docs/examples/atlas/index.md +++ b/docs/examples/atlas/index.md @@ -97,13 +97,13 @@ see more information. J2 - Co1 + Co1 Co2 - Co3 + Co3 McL - Suz + Suz @@ -114,15 +114,15 @@ see more information. He - HN - Th + HN + Th Fi22 - Fi23 - Fi24' - B - M + Fi23 + Fi24' + B + M @@ -135,7 +135,7 @@ see more information. J1 - O'N + O'N J3 @@ -143,7 +143,7 @@ see more information. J4 - Ly + Ly @@ -181,13 +181,14 @@ see more information. presentation has at least 1 subgroup of the correct index. - +