Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 0 additions & 9 deletions docs/case-studies/index.md

This file was deleted.

185 changes: 185 additions & 0 deletions docs/examples/atlas/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
# Verifying presentations in the ATLAS of Finite Groups

In this example, we will verify the validity of the presentations of the
sporadic groups as given in [this ATLAS][atlas].
In particular, where possible, we will use the Todd-Coxeter algorithm to check
that the size of group defined by the presentations is equal to the claimed
size. Where the claimed size of the group is very large, we will instead
calculate the size of small-index subgroups.

??? info "libsemigroups_pybind11 version"

All examples provided on the subsequent subpages were run using
libsemigroups_pybind11 version 1.4.4 on a laptop with a 13th Gen Intel(R)
Core(TM) i7-13700H processor and 64 GB RAM.

??? info "Defining groups with monoid presentations"

The presentations provided for the groups in the ATLAS are
*group presentations*. This means that it is assumed that there is
multiplicative identity $1$, and that each generator $a$ has an inverse
$a^{-1}$ such that $aa^{-1} = a^{-1}a = 1$. In [libsemigroups_pybind11][],
however, presentations are either *semigroup presentations* or
*monoid presentations*, depending whether the relations of the presentation
are allowed to contain the empty word $\varepsilon$. Therefore, we will need
to add extra generators and relations to a monoid presentation to define a
group.

Suppose that a group $G$ is defined by the group presentation
$\langle{A \mid R }\rangle_{\text{grp}}$. Then $G$ can also be defined by
the monoid presentation
$\langle{A \sqcup A^{-1} \mid R \cup R' }\rangle_{\text{mon}}$ where
$A^{-1}$ is a set disjoint from $A$ containing letters that will be treated
as inverses for the letters in $A$, and $R'$ is the set of relations of the
form $aa^{-1} = \varepsilon$ and $a^{-1}a = \varepsilon$.

In the subsequent subpages, we will use lowercase letters for the
generators that are given in the presentations in the ATLAS, and their
uppercase counterparts to represent their inverses. Therefore, many of our
examples will in a similar way to:

```py
from libsemigroups_pybind11 import presentation, Presentation
p = presentation("abAB")
p.contains_empty_word(True)
presentation.add_inverse_rules(p, "ABab")
```

The algorithms in [libsemigroups_pybind11][] were written for semigroups and
monoids. This means that there are no group-specific optimisations.

The following tables summarise the results of this project. Click on a group
to see more information.

<div class="row">
<div class="column">
<div class="atlas-summary">
<table>
<tr>
<th colspan="5">Mathieu groups</th>
</tr>
<tr>
<td class="correct-size">
<a href="mathieu/m11">M<sub>11</sub></a>
</td>
<td class="correct-size">
<a href="mathieu/m12">M<sub>12</sub></a>
</td>
<td class="correct-size">
<a href="mathieu/m22">M<sub>22</sub></a>
</td>
<td class="correct-index">
<a href="mathieu/m23">M<sub>23</sub></a>
</td>
<td class="correct-index">
<a href="mathieu/m24">M<sub>24</sub></a>
</td>
</tr>
</table>
</div>
<div class="atlas-summary">
<table>
<tr>
<th colspan="7">Leech lattice groups</th>
</tr>
<tr>
<td class="could-not-verify"><a href="leech-lattice/hs">HS</a></td>
<td>
<a href="leech-lattice/j2">J<sub>2</sub></a>
</td>
<td class="no-presentation">Co<sub>1</sub></td>
<td>
<a href="leech-lattice/co2">Co<sub>2</sub></a>
</td>
<td class="no-presentation">Co<sub>3</sub></td>
<td><a href="leech-lattice/mcl">McL</a></td>
<td class="no-presentation">Suz</td>
</tr>
</table>
</div>
<div class="atlas-summary">
<table>
<tr>
<th colspan="8">Monster sections</th>
</tr>
<tr>
<td><a href="monster-sections/he">He</a></td>
<td class="no-presentation">HN</td>
<td class="no-presentation">Th</td>
<td>
<a href="monster-sections/fi22">Fi<sub>22</sub></a>
</td>
<td class="no-presentation">Fi<sub>23</sub></td>
<td class="no-presentation">Fi<sub>24</sub>'</td>
<td class="no-presentation">B</td>
<td class="no-presentation">M</td>
</tr>
</table>
</div>
<div class="atlas-summary">
<table>
<tr>
<th colspan="6">Pariahs</th>
</tr>
<tr>
<td>
<a href="pariahs/j1">J<sub>1</sub></a>
</td>
<td class="no-presentation">O'N</td>
<td>
<a href="pariahs/j3">J<sub>3</sub></a>
</td>
<td><a href="pariahs/ru">Ru</a></td>
<td>
<a href="pariahs/j4">J<sub>4</sub></a>
</td>
<td class="no-presentation">Ly</td>
</tr>
</table>
</div>
<div class="atlas-summary">
<table>
<tr>
<th>Miscellaneous</th>
</tr>
<tr>
<td><a href="misc/t">T</a></td>
</tr>
</table>
</div>
</div>

<div class="column">
<div class="atlas-summary">
<table>
<tr>
<th>Legend</th>
</tr>
<tr>
<td class="correct-size">
The presentation defines a group of the correct size
</td>
</tr>
<tr>
<td class="correct-index">
The presentation has a subgroup of the correct size
</td>
</tr>
<tr>
<td class="incorrect-size">
The presentation defines a group of the incorrect size
</td>
</tr>
<tr>
<td class="could-not-verify">Todd-Coxeter did not terminate</td>
</tr>
<tr>
<td class="no-presentation">No presentation is provided</td>
</tr>
</table>
</div>
</div>
</div>

[atlas]: https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/
[libsemigroups_pybind11]: https://libsemigroups.github.io/libsemigroups_pybind11/index.html
12 changes: 12 additions & 0 deletions docs/examples/atlas/leech-lattice/co2/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# Conway group Co~2~

> Order: $42,305,421,312,000$

> Presentation: TODO

On this page, we provide links to verifications that the maximal subgroups of
the Conway group Co~2~ define groups of the correct order.

## Maximal subgroups

The following are maximal subgroups that have been verified:
28 changes: 28 additions & 0 deletions docs/examples/atlas/leech-lattice/hs.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Higman-Sims group HS

> Order: $44,352,000$

> Presentation: TODO

On this page, we verify that the above claimed presentation of the Higman-Sims group HS
defines a group of order $44,352,000$.

## The code

=== "Python"

Coming soon!

=== "ACE"

Coming soon!

## The output

=== "Python"

Coming soon!

=== "ACE"

Coming soon!
28 changes: 28 additions & 0 deletions docs/examples/atlas/leech-lattice/j2.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Janko group J~2~

> Order: $604,800$

> Presentation: TODO

On this page, we verify that the above claimed presentation of the Janko group J~2~
defines a group of order $604,800$.

## The code

=== "Python"

Coming soon!

=== "ACE"

Coming soon!

## The output

=== "Python"

Coming soon!

=== "ACE"

Coming soon!
12 changes: 12 additions & 0 deletions docs/examples/atlas/leech-lattice/mcl/index.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
# McLaughlin group McL

> Order: $898,128,000$

> Presentation: TODO

On this page, we provide links to verifications that the maximal subgroups of
the McLaughlin group McL define groups of the correct order.

## Maximal subgroups

The following are maximal subgroups that have been verified:
105 changes: 105 additions & 0 deletions docs/examples/atlas/mathieu/m11.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# Mathieu group M~11~

> Order: $7,920$

> Presentation:
> $\langle{ a, b \mid a^2 = b^4 = (ab)^{11} = (ab^2)^6 = ababab^{−1}abab^2ab^{−1}abab^{−1}ab^{−1} = 1 }\rangle$

On this page, we verify that the above claimed presentation of the Mathieu group
M~11~ defines a group of order $7,920$.

## The code

=== "Python"

In [libsemigroups_pybind11][], the following script constructs the
presentation for M~11~ 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)^11"), "")
presentation.add_rule(p, parse_relations("(ab^2)^6"), "")
presentation.add_rule(p, parse_relations("ababaBabab^2aBabaBaB"), "")

# Run the Todd-Coxeter algorithm
tc = ToddCoxeter(congruence_kind.twosided, p)
tc.run()

assert tc.number_of_classes() == 7920
```

=== "ACE"

Coming soon!

## The output

=== "Python"

Running the above Python script produces the following output:

```
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: RUN 0 START (strategy() = hlt)
#0: ToddCoxeter: |A| = 4, |R| = 9, |u| + |v| ∈ [2, 22], ∑(|u| + |v|) = 73
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: HLT 0.0 START
#0: ToddCoxeter: HLT 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 = 28µs | all runs = 28µs | elapsed = 92µs
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: HLT 0.0 STOP
#0: ToddCoxeter: HLT 0.0.1 | active | killed | defined
#0: ToddCoxeter: nodes | 7,920 | 1,992,427 | 2,000,347
#0: ToddCoxeter: diff 0.0.0 | +7,919 | +1,992,427 | +2,000,346
#0: ToddCoxeter: | active | missing | % complete
#0: ToddCoxeter: edges | 31,680 | 0 | 100.0%
#0: ToddCoxeter: diff 0.0.0 | +31,680 | -4 | +100.0%
#0: ToddCoxeter: phase 0.0 = 176ms | run 0 = 176ms | all runs = 176ms | elapsed = 176ms
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: HLT 0.1.2 | active | killed | defined
#0: ToddCoxeter: nodes | 7,920 | 1,992,427 | 2,000,347
#0: ToddCoxeter: diff 0.1.1 | +0 | +0 | +0
#0: ToddCoxeter: diff 0.1.0 | +7,919 | +1,992,427 | +2,000,346
#0: ToddCoxeter: | active | missing | % complete
#0: ToddCoxeter: edges | 31,680 | 0 | 100.0%
#0: ToddCoxeter: diff 0.1.1 | +0 | +0 | +0.0%
#0: ToddCoxeter: diff 0.1.0 | +31,680 | -4 | +100.0%
#0: ToddCoxeter: phase 0.1 = 176ms | run 0 = 176ms | all runs = 176ms | elapsed = 176ms
++++++++++++++++++++++++++++++++
#0: ToddCoxeter: RUN 0 STOP (finished)
#0: ToddCoxeter: run 0 | lookahead | lookbehind | hlt | felsch
#0: ToddCoxeter: num. phases | 0 | 0 | 1 | 0
#0: ToddCoxeter: time spent in phases | - (0%) | - (0%) | 176ms (100%) | - (0%)
#0: ToddCoxeter: phase 0.1 = 176ms | run 0 = 176ms | all runs = 176ms | elapsed = 176ms
```

=== "ACE"

Coming soon!

:simple-ticktick: The computed size of the group matches the size of the group
provided on [the ATLAS][atlas]: $7,920$.

!!! note

The output you see when you run the script yourself might be different from
the above; the numbers produced and time taken will depend on the machine
you are using. However, the size of the group that is reported should be
the same as above.

[atlas]: https://brauer.maths.qmul.ac.uk/Atlas/v3/spor/
[libsemigroups_pybind11]:
https://libsemigroups.github.io/libsemigroups_pybind11/index.html
Loading