1: \begin{abstract}
2: In this paper we describe two different algorithms for computing the
3: congruences of a finite semigroup or monoid, and compare these to existing
4: algorithms and implementations. The first algorithm is a version of Sims' low
5: index subgroup algorithm for finding the left or right congruences of a monoid.
6: The second algorithm involves determining the distinct principal congruences,
7: and then finding all of their possible joins. Variations of this algorithm have
8: been suggested in numerous contexts by numerous authors. We show how to utilise
9: the theory of relative Green's relations, and a version of Schreier's Lemma for
10: monoids, to reduce the number of principal congruences that must be generated
11: as the first step of this approach. Both of the algorithms described in this
12: paper are implemented in the \GAP package \Semigroups, and the first algorithm is
13: available in the C++ library \libsemigroups and in its python bindings
14: \libsemigroupspybind.
15: \end{abstract}
16: