0c061d8
# libsemigroups
0c061d8
0c061d8
[libsemigroups](https://libsemigroups.readthedocs.io/) is a C++14 library
0c061d8
containing implementations of several algorithms for computing finite, and
0c061d8
finitely presented, semigroups and monoids. Namely:
0c061d8
0c061d8
- the [Froidure-Pin algorithm](https://www.irif.fr/~jep/PDF/Rio.pdf) for
0c061d8
  computing finite semigroups;
0c061d8
- the [Todd-Coxeter algorithm](https://en.wikipedia.org/wiki/Todd%E2%80%93Coxeter_algorithm)
0c061d8
  for finitely presented semigroups and monoids; see also
0c061d8
  [this paper](https://arxiv.org/abs/2203.11148);
0c061d8
- the [Knuth-Bendix algorithm](https://en.wikipedia.org/wiki/Knuth%E2%80%93Bendix_completion_algorithm)
0c061d8
  for finitely presented semigroups and monoids;
0c061d8
- the [Schreier-Sims algorithm](https://en.wikipedia.org/wiki/Schreier%E2%80%93Sims_algorithm)
0c061d8
  for permutation groups;
0c061d8
- a preliminary implementation of the
0c061d8
  [Konieczny](https://link.springer.com/article/10.1007/BF02573672) and
0c061d8
  [Lallement-McFadden](https://www.sciencedirect.com/science/article/pii/S0747717108800570)
0c061d8
  algorithm for computing finite semigroups which act on sets;
0c061d8
- an implementation of the
0c061d8
  [Radoszewski-Rytter](https://link.springer.com/chapter/10.1007/978-3-642-11266-9_55)
0c061d8
  algorithm for testing equivalence of words in free bands.
0c061d8
- an implementation of the algorithm for solving the word problem
0c061d8
  for small overlap monoids, and for computing normal forms in such monoids;
0c061d8
  see [Kambites](https://doi.org/10.1016/j.jalgebra.2008.09.038),
0c061d8
  [Kambites](https://doi.org/10.1016/j.jalgebra.2008.12.028), and
0c061d8
  [Mitchell-Tsalakou](http://arxiv.org/abs/2105.12125).
0c061d8
0c061d8
Libsemigroups is partly based on
0c061d8
["Algorithms for computing finite semigroups"](https://www.irif.fr/~jep/PDF/Rio.pdf),
0c061d8
["Expository Slides"](https://www.irif.fr/~jep/PDF/Exposes/StAndrews.pdf), and
0c061d8
[Semigroupe 2.01](https://www.irif.fr/~jep/Logiciels/Semigroupe2.0/semigroupe2.html)
0c061d8
by [Jean-Eric Pin](https://www.irif.fr/~jep/).
0c061d8
0c061d8
Libsemigroups is used in the
0c061d8
[Semigroups package](https://semigroups.github.io/Semigroups/) for
0c061d8
[GAP](https://www.gap-system.org/), and it is possible to use libsemigroups
0c061d8
directly in Python 3 via the package `libsemigroups_pybind11`.  The development
0c061d8
version of libsemigroups is available on
0c061d8
[github](https://github.com/libsemigroups/libsemigroups), and some related
0c061d8
projects are [here](https://github.com/libsemigroups).
0c061d8
0c061d8
The main classes in libsemigroups are named after the algorithms they
0c061d8
implement; see, for example, `libsemigroups::FroidurePin`,
0c061d8
`libsemigroups::Konieczny`, `libsemigroups::congruence::ToddCoxeter`,
0c061d8
`libsemigroups::fpsemigroup::Kambites`,
0c061d8
`libsemigroups::fpsemigroup::KnuthBendix`, and `libsemigroups::SchreierSims`.
0c061d8
0c061d8
The implementations in `libsemigroups::FroidurePin`,
0c061d8
`libsemigroups::Konieczny`, and `libsemigroups::SchreierSims` are generic and
0c061d8
easily adapted to user-defined types.
0c061d8
0c061d8
Libsemigroups uses: [HPCombi](https://github.com/hivert/HPCombi) which uses
0c061d8
the SSE and AVX instruction sets for very fast manipulation of
0c061d8
transformations, partial permutations, permutations, and boolean matrices of
0c061d8
small size; [catch](https://github.com/catchorg/Catch2) for tests;
0c061d8
[fmt](https://github.com/fmtlib/fmt) for reporting; and
0c061d8
[eigen](http://eigen.tuxfamily.org/) for some linear algebra computations.