![]() |
libsemigroups
v3.0.0
C++ library for semigroups and monoids
|
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
;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 (see [45]), 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!
libsemigroups
, and HPCombi
.libsemigroups
via conda, the python bindings and many helpful conversations and suggestions.WordGraph
, and to the implementation of the Ukkonen
and Kambites
classes.We thank: