The algorithm implemented in the class FroidurePin is based on Algorithms for computing finite semigroups, Expository Slides, and Semigroupe 2.01 by Jean-Eric Pin.

Some of the features of Semigroupe 2.01 are not yet implemented in FroidurePin, this is a work in progress. Missing features include those for:

  • Green’s relations, or classes

  • finding a zero

  • minimal ideal, principal left/right ideals, or indeed any ideals

  • inverses

  • local submonoids

  • the kernel

  • variety tests.

These may be included in a future version.

libsemigroups performs roughly the same as Semigroupe 2.01 when there is a known upper bound on the size of the semigroup being enumerated, and this is used to initialise the data structures for the semigroup; see libsemigroups::FroidurePin::reserve for more details. Note that in Semigroupe 2.01 it is always necessary to provide such an upper bound, but in libsemigroups it is not.

The FroidurePin class has some advantages over Semigroupe 2.01

  • there is a (hopefully) convenient C++ API, which makes it relatively easy to create and manipulate semigroups and monoids

  • more types of elements are supported

  • it is relatively straightforward to add support for further types of elements

  • it is possible to enumerate a certain number of elements of a semigroup or monoid (say if you are looking for an element with a particular property), to stop, and then to start the enumeration again at a later point

  • it is possible to add more generators after a semigroup or monoid has been constructed, without losing or having to recompute any information that was previously known