libsemigroups implements several algorithms for computing the structure of a finite semigroup or monoid. The main implementations are of the Froidure-Pin, Konieczny, and Schreier-Sims (for permutation groups) algorithms; see the links below for further details.

The implementations of these algorithms are generic, and can be easily adapted for user-defined types. In other words, it is possible to directly apply these algorithms to any type that satisfy some minimal prerequisites, via traits classes and/or the adapters described here.

Many of the classes for semigroups in libsemigroups can be used “interactively”, in the sense that they can be run for a particular amount of time, or until some condition is met; for further details see, for example, void Runner::run_for(std::chrono::nanoseconds) and Runner::run_until().

The classes for semigroups and monoids in libsemigroups are: