libsemigroups is a C++11 library containing implementations of several algorithms for computing finite and finitely presented semigroups. Namely:
the Froidure-Pin algorithm for computing finite semigroups :cite:`Froidure1997aa`;
the Todd-Coxeter algorithm for finitely presented semigroups and monoids;
the Knuth-Bendix algorithm for finitely presented semigroups and monoids;
the Schreier-Sims algorithm for permutation groups.
libsemigroups is partly based on Algorithms for computing finite semigroups, Expository Slides, and Semigroupe 2.01 by Jean-Eric Pin.
The main classes in libsemigroups are named after the algorithms they implement; for example, libsemigroups::FroidurePin, libsemigroups::congruence::ToddCoxeter, libsemigroups::fpsemigroup::KnuthBendix, and libsemigroups::SchreierSims.
The implementations in libsemigroups::FroidurePin and libsemigroups::SchreierSims are generic and easily adapted to user-defined types.
libsemigroups uses: HPCombi which uses the SSE and AVX instruction sets for very fast manipulation of transformations, partial permutations, permutations, and boolean matrices of small size; catch for tests; and fmt for reporting.
See the documentation <https://libsemigroups.readthedocs.io/en/latest/>.
Installation instructions are here <https://libsemigroups.readthedocs.io/en/latest/install.html>.
If you find any problems with libsemigroups, or have any suggestions for features that you'd like to see, please use the issue tracker.
We acknowledge financial support from the OpenDreamKit Horizon 2020 European Research Infrastructures project (#676541) (primarily for the python bindings).
We thank the Carnegie Trust for the Universities of Scotland for funding the PhD scholarship of J. Jonušas when he worked on this project.
We thank the Engineering and Physical Sciences Research Council (EPSRC) for funding the PhD scholarship of M. Torpey when he worked on this project (EP/M506631/1).