\(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/.
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. We do not verify that these relations are redundant here.
Code
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:
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
The computed index is the same as the claimed index: \(266,560\).