diff --git a/docs/source/data-structures/presentations/examples.rst b/docs/source/data-structures/presentations/examples.rst index 90903b72..11729c49 100644 --- a/docs/source/data-structures/presentations/examples.rst +++ b/docs/source/data-structures/presentations/examples.rst @@ -30,6 +30,7 @@ semigroup or monoid they define. alternating_group braid_group brauer_monoid + catalan_monoid chinese_monoid cyclic_inverse_monoid dual_symmetric_inverse_monoid diff --git a/src/libsemigroups_pybind11/presentation/examples.py b/src/libsemigroups_pybind11/presentation/examples.py index d5075548..9f7ca960 100644 --- a/src/libsemigroups_pybind11/presentation/examples.py +++ b/src/libsemigroups_pybind11/presentation/examples.py @@ -19,6 +19,7 @@ presentation_examples_braid_group as _braid_group, presentation_examples_brauer_monoid as _brauer_monoid, presentation_examples_brauer_monoid_KM07 as _brauer_monoid_KM07, + presentation_examples_catalan_monoid as _catalan_monoid, presentation_examples_chinese_monoid as _chinese_monoid, presentation_examples_chinese_monoid_CEKNH01 as _chinese_monoid_CEKNH01, presentation_examples_cyclic_inverse_monoid as _cyclic_inverse_monoid, @@ -105,6 +106,7 @@ brauer_monoid = _wrap_cxx_free_fn(_brauer_monoid) braid_group = _wrap_cxx_free_fn(_braid_group) brauer_monoid_KM07 = _wrap_cxx_free_fn(_brauer_monoid_KM07) +catalan_monoid = _wrap_cxx_free_fn(_catalan_monoid) chinese_monoid = _wrap_cxx_free_fn(_chinese_monoid) chinese_monoid_CEKNH01 = _wrap_cxx_free_fn(_chinese_monoid_CEKNH01) cyclic_inverse_monoid = _wrap_cxx_free_fn(_cyclic_inverse_monoid) diff --git a/src/presentation-examples.cpp b/src/presentation-examples.cpp index 94194a5f..e7f6c9db 100644 --- a/src/presentation-examples.cpp +++ b/src/presentation-examples.cpp @@ -1888,6 +1888,26 @@ defines a monoid of size :math:`C_n d^n` where :math:`C_n` is the :raises LibsemigroupsError: if ``n < 3`` or if ``d == 0``. .. seealso:: :any:`abacus_jones_monoid_AJP25`. +)pbdoc"); + + m.def("presentation_examples_catalan_monoid", + &examples::catalan_monoid, + py::arg("n"), + R"pbdoc( +:sig=(n: int) -> Presentation: +A presentation for the Catalan monoid. + +This function returns a monoid presentation defining the Catalan monoid of +degree *n*, using the standard generators :math:`e_1, \ldots, e_{n - 1}` and +their standard defining relations. + +:param n: the degree. +:type n: int + +:returns: The specified presentation. +:rtype: Presentation + +:raises LibsemigroupsError: if ``n < 1``. )pbdoc"); m.def("presentation_examples_abacus_jones_monoid_AJP25", diff --git a/tests/test_presentation_examples.py b/tests/test_presentation_examples.py index 1fb703f6..c9321190 100644 --- a/tests/test_presentation_examples.py +++ b/tests/test_presentation_examples.py @@ -8,7 +8,7 @@ # pylint: disable=missing-function-docstring, invalid-name -from math import factorial +from math import comb, factorial import pytest @@ -67,6 +67,7 @@ def test_monoid_status(): assert examples.alternating_group_Moo97(5).contains_empty_word() assert examples.brauer_monoid_KM07(5).contains_empty_word() + assert examples.catalan_monoid(5).contains_empty_word() assert examples.chinese_monoid_CEKNH01(5).contains_empty_word() assert examples.cyclic_inverse_monoid_Fer22_a(5).contains_empty_word() assert examples.cyclic_inverse_monoid_Fer22_b(5).contains_empty_word() @@ -163,6 +164,19 @@ def test_full_transformation_monoid(): check_full_transformation_monoid([2], examples.full_transformation_monoid) +def test_catalan_monoid(): + ReportGuard(False) + with pytest.raises(LibsemigroupsError): + examples.catalan_monoid(0) + + n = 5 + p = examples.catalan_monoid(n) + p.throw_if_bad_alphabet_or_rules() + + tc = ToddCoxeter(congruence_kind.twosided, p) + assert tc.number_of_classes() == comb(2 * n, n) // (n + 1) + + def test_partial_transformation_monoid_Shu60(): ReportGuard(False) with pytest.raises(LibsemigroupsError):