Skip to content

\(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

\[ \mathrm{Co}_2 = \langle a, b \mid a^2 = b^5 = (ab^2)^9 = [a,b]^4 = [a,b^2]^4 = [a,bab]^3 = [a,bab^2ab]^2 = [a,bab^{-2}]^3 = [a,b^{-2}abab^{-2}]^2 = (abab^2ab^{-1}ab^{-2})^7 = 1 \rangle. \]

The generators are claimed to generate a maximal subgroup isomorphic to \(U_6(2):2\). More precisely, if

\[ H = \langle a,\ (ab)^2 \rangle, \]

then

\[ [\mathrm{Co}_2 : H] = 2,300. \]

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\).