diff --git a/src/libsemigroups_pybind11/transf.py b/src/libsemigroups_pybind11/transf.py index 912d5b52..80075ebd 100644 --- a/src/libsemigroups_pybind11/transf.py +++ b/src/libsemigroups_pybind11/transf.py @@ -123,6 +123,11 @@ def __ge__(self: Self, other) -> bool: return other < self or self == other def __mul__(self: Self, other: Self): + if self.degree() != other.degree(): + raise ValueError( + "the arguments (transformations) must have equal degree, " + f"but found {self.degree()} and {other.degree()}" + ) result = one(self) result.product_inplace(self, other) return result diff --git a/src/transf.cpp b/src/transf.cpp index 69920a0f..9e5126e0 100644 --- a/src/transf.cpp +++ b/src/transf.cpp @@ -733,7 +733,7 @@ fewer points requiring less space per point. m.def("transf_inverse", py::overload_cast(&inverse)); } // bind_perm - } // namespace + } // namespace void init_transf(py::module& m) { // Transformations diff --git a/tests/test_transf.py b/tests/test_transf.py index 9d5bd65a..3ffbb6fa 100644 --- a/tests/test_transf.py +++ b/tests/test_transf.py @@ -300,3 +300,12 @@ def test_transf_return_policy(): assert x.copy() is not x assert x.images() is not x.images() assert x.increase_degree_by(2) is x + + +def test_transf_mult_diff_degrees(): + for T in (Transf, PPerm, Perm): + x, y = T([0]), T([0, 1]) + with pytest.raises(ValueError): + assert x * y == x + with pytest.raises(ValueError): + assert y * x == y