libsemigroups is a C++17 library containing implementations of several algorithms for computing finite, and finitely presented, semigroups and monoids. The main algorithms implemented in libsemigroups are:
libsemigroups::FroidurePin class template;libsemigroups::Kambites;libsemigroups::KnuthBendix;libsemigroups::Sims1 and libsemigroups::Sims2;libsemigroups::Konieczny;libsemigroups::freeband_equal_to;libsemigroups::SchreierSims;w this procedure is for determining words equivalent to w or that are left divisors of w) in the class template libsemigroups::Stephen;libsemigroups::ToddCoxeter; see also "The Todd–Coxeter algorithm for semigroups and monoids".libsemigroups is partly based on Algorithms for computing finite semigroups, Expository Slides, and Semigroupe 2.01 by Jean-Eric Pin.
libsemigroups is used in the Semigroups package for GAP, and it is possible to use libsemigroups directly in Python 3 via the package libsemigroups_pybind11. The development version of libsemigroups is available on github, and some related projects are here.
The main classes in libsemigroups are named after the algorithms they implement; see, for example, libsemigroups::FroidurePin, libsemigroups::Konieczny, libsemigroups::ToddCoxeter, libsemigroups::Kambites, libsemigroups::KnuthBendix, libsemigroups::SchreierSims, libsemigroups::Sims1, libsemigroups::Sims2, or libsemigroups::Stephen.
libsemigroups is a modern open source C++ library designed to be:
libsemigroups originate from the authors and contributors; and the other algorithms are adapted from the literature (see above for details);libsemigroups::FroidurePin, libsemigroups::Konieczny, and libsemigroups::SchreierSims are generic and can be adapted to user-defined types;libsemigroups can be fine-tuned via many settings, and used interactively via the functions libsemigroups::Runner::run_for and libsemigroups::Runner::run_until;libsemigroups objects (see the to function) is easy; there are many helper functions to streamline common tasks; high quality exception messages are implemented throughout the code base (although you don't have to use these if you don't want to); long running algorithms can provide detailed feedback on their progress (see libsemigroups::ReportGuard); many data structures can be visualised using graphviz (see libsemigroups::Dot and Visualisation); and there are hundreds of examples in the tests directory.libsemigroups is designed with performance in mind; several classes implement parallel algorithms (libsemigroups::Sims1, libsemigroups::Sims2, libsemigroups::Congruence); we provide some "winner takes all" mechanisms for running algorithms concurrently (see libsemigroups::Congruence); there are _no_checks versions of most functions if performance is critical.See the documentation https://libsemigroups.github.io/libsemigroups/.
See the installation page for more info.
If you find any problems with libsemigroups, or have any suggestions for features that you'd like to see, please use the issue tracker.
libsemigroups uses:
We'd like to thank the authors and contributors to these excellent projects!
We thank: