\(U_6(2):2\) as a subgroup of Conway group Co2
The subgroup generators used on this page come from https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/Co2/.
Claim
The generators are claimed to generate a maximal subgroup isomorphic to \(U_6(2):2\). More precisely, if
then
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 Co2, adds the generating pairs that define the maximal subgroup, and runs the Todd-Coxeter algorithm. It uses the additional relation \([a,b^2ab^2]^3 = 1\), which the source code marks as redundant but useful. We do not verify that this relation is redundant here.
The code took about 1 minute 8 seconds to run on a 2024 MacBook Pro M4 with 48GB of RAM:
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^5"), "")
presentation.add_rule(p, parse("(ab^2)^9"), "")
presentation.add_rule(p, parse("(a,b)^4"), "")
presentation.add_rule(p, parse("(a,b^2)^4"), "")
presentation.add_rule(p, parse("(a,bab)^3"), "")
presentation.add_rule(p, parse("(a,bab^2ab)^2"), "")
presentation.add_rule(p, parse("(a,baB^2)^3"), "")
presentation.add_rule(p, parse("(a,B^2abaB^2)^2"), "")
presentation.add_rule(p, parse("(a,b^2ab^2)^3"), "") # Redundant, but useful.
presentation.add_rule(p, parse("(abab^2aBaB^2)^7"), "")
presentation.balance(p, "abAB", "ABab")
presentation.replace_subword(p, "A", "a")
p.alphabet("Bab")
tc = ToddCoxeter(congruence_kind.onesided, p)
tc.strategy(ToddCoxeter.options.strategy.felsch)
# Add generating pairs for the maximal subgroup
tc.add_generating_pair("a", "")
tc.add_generating_pair("abab", "")
print(f"The index of the subgroup is {tc.number_of_classes()}")
The output
The truncated output of the enumeration is below:
Truncated output from the Python script
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: RUN 0 START (strategy() = felsch)
#0: ToddCoxeter: |A| = 3, |R| = 15, |u| + |v| ∈ [2, 70], ∑(|u| + |v|) = 302
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: FELSCH 0.0 START
#0: ToddCoxeter: FELSCH 0.0.0 | active | killed | defined
#0: ToddCoxeter: nodes | 3 | 0 | 3
#0: ToddCoxeter: | active | missing | % complete
#0: ToddCoxeter: edges | 5 | 4 | 55.6%
#0: ToddCoxeter: time | run 0 = 82µs | all runs = 82µs | elapsed = 132µs
++++++++++++++++++++++++++++++++
#1: ToddCoxeter: FELSCH 0.0.1 | active | killed | defined
#1: ToddCoxeter: nodes | 1,836,440 | 37,239 | 1,873,692
#1: ToddCoxeter: diff 0.0.0 | +1,836,437 | +37,239 | +1,873,689
#1: ToddCoxeter: | active | missing | % complete
#1: ToddCoxeter: edges | 4,163,654 | 1,345,666 | 75.6%
#1: ToddCoxeter: diff 0.0.0 | +4,163,649 | +1,345,662 | +20.0%
#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,697,682 | 73,383 | 3,771,084
#1: ToddCoxeter: diff 0.0.1 | +1,861,242 | +36,144 | +1,897,392
#1: ToddCoxeter: diff 0.0.0 | +3,697,679 | +73,383 | +3,771,081
#1: ToddCoxeter: | active | missing | % complete
#1: ToddCoxeter: edges | 8,383,347 | 2,709,699 | 75.6%
#1: ToddCoxeter: diff 0.0.1 | +4,219,693 | +1,364,033 | -0.0%
#1: ToddCoxeter: diff 0.0.0 | +8,383,342 | +2,709,695 | +20.0%
#1: ToddCoxeter: phase 0.0 = 2.005s | run 0 = 2.005s | all runs = 2.005s | elapsed = 2.005s
[... lines omitted ...]
++++++++++++++++++++++++++++++++
#1: ToddCoxeter: FELSCH 0.0.68 | active | killed | defined
#1: ToddCoxeter: nodes | 5,372,361 | 106,952,651 | 112,324,634
#1: ToddCoxeter: diff 0.0.67 | -31,972,961 | +31,973,060 | +0
#1: ToddCoxeter: diff 0.0.0 | +5,372,358 | +106,952,651 | +112,324,631
#1: ToddCoxeter: | active | missing | % complete
#1: ToddCoxeter: edges | 0 | 16,117,083 | 0.0%
#1: ToddCoxeter: diff 0.0.67 | +0 | -95,918,883 | +0.0%
#1: ToddCoxeter: diff 0.0.0 | -5 | +16,117,079 | -55.6%
#1: ToddCoxeter: phase 0.0 = 1min8s | run 0 = 1min8s | all runs = 1min8s | elapsed = 1min8s
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: FELSCH 0.0 STOP
#0: ToddCoxeter: FELSCH 0.0.69 | active | killed | defined
#0: ToddCoxeter: nodes | 4,600 | 112,320,034 | 112,324,634
#0: ToddCoxeter: diff 0.0.68 | -5,367,761 | +5,367,383 | +0
#0: ToddCoxeter: diff 0.0.0 | +4,597 | +112,320,034 | +112,324,631
#0: ToddCoxeter: | active | missing | % complete
#0: ToddCoxeter: edges | 13,800 | 0 | 100.0%
#0: ToddCoxeter: diff 0.0.68 | +13,800 | -16,117,083 | +100.0%
#0: ToddCoxeter: diff 0.0.0 | +13,795 | -4 | +44.4%
#0: ToddCoxeter: phase 0.0 = 1min8s | run 0 = 1min8s | all runs = 1min8s | elapsed = 1min8s
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: LOOKAHEAD 0.1 START (lookahead_extent() = full, lookahead_style() = hlt)
#0: ToddCoxeter: LOOKAHEAD 0.1.0 | active | killed | defined
#0: ToddCoxeter: nodes | 4,600 | 112,320,034 | 112,324,634
#0: ToddCoxeter: | active | missing | % complete
#0: ToddCoxeter: edges | 13,800 | 0 | 100.0%
#0: ToddCoxeter: time | run 0 = 1min8s | all runs = 1min8s | elapsed = 1min8s
#0: ToddCoxeter: triggered because there are skipped definitions (4,600 active nodes)!
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: LOOKAHEAD 0.1 STOP
#0: ToddCoxeter: LOOKAHEAD 0.1.1 | active | killed | defined
#0: ToddCoxeter: nodes | 2,300 | 112,322,334 | 112,324,634
#0: ToddCoxeter: diff 0.1.0 | -2,300 | +2,300 | +0
#0: ToddCoxeter: | active | missing | % complete
#0: ToddCoxeter: edges | 6,900 | 0 | 100.0%
#0: ToddCoxeter: diff 0.1.0 | -6,900 | +0 | +0.0%
#0: ToddCoxeter: phase 0.1 = 705µs | run 0 = 1min8s | all runs = 1min8s | elapsed = 1min8s
#0: ToddCoxeter: lookahead_next() is now max(f x a = 4,600, m = 10,000) (-4,990,000)
#0: ToddCoxeter: because f x a < n
#0: ToddCoxeter: where: a = number_of_nodes_active() = 2,300
#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,300 | 112,322,334 | 112,324,634
#0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0
#0: ToddCoxeter: diff 0.2.0 | -2,300 | +2,300 | +0
#0: ToddCoxeter: | active | missing | % complete
#0: ToddCoxeter: edges | 6,900 | 0 | 100.0%
#0: ToddCoxeter: diff 0.2.1 | +0 | +0 | +0.0%
#0: ToddCoxeter: diff 0.2.0 | -6,900 | +0 | +0.0%
#0: ToddCoxeter: phase 0.2 = 730µs | run 0 = 1min8s | all runs = 1min8s | elapsed = 1min8s
++++++++++++++++++++++++++++++++
#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 | 727µs (0%) | - (0%) | - (0%) | 1min8s (100%)
#0: ToddCoxeter: phase 0.2 = 752µs | run 0 = 1min8s | all runs = 1min8s | elapsed = 1min8s
The index of the subgroup is 2300
The computed index is the same as the claimed index: \(2,300\).