# Semigroupe¶

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