diff --git a/doc/semiex.xml b/doc/semiex.xml
index cbd9c45cd..f1a00a095 100644
--- a/doc/semiex.xml
+++ b/doc/semiex.xml
@@ -8,6 +8,25 @@
#############################################################################
##
+<#GAPDoc Label="FullDomainPartitionMonoid">
+
+
+ A full domain partition monoid.
+
+ If n is a non-negative integer, then FullDomainPartitionMonoid
+ returns the full domain partition monoid of degree n. The full domain partition monoid is the subsemigroup of the partition monoid consisting of all bipartitions with their domain equal to [1 .. n] (the domain of a bipartition is defined in Chapter , see ). As described in
+
+ S := FullDomainPartitionMonoid(5);
+
+gap> Size(S);
+19921]]>
+
+
+<#/GAPDoc>
+
+
+
<#GAPDoc Label="EndomorphismsPartition">
diff --git a/doc/z-chap07.xml b/doc/z-chap07.xml
index 426f890cf..e816257ab 100644
--- a/doc/z-chap07.xml
+++ b/doc/z-chap07.xml
@@ -68,6 +68,7 @@
<#Include Label = "PlanarPartitionMonoid">
<#Include Label = "ModularPartitionMonoid">
<#Include Label = "ApsisMonoid">
+ <#Include Label = "FullDomainPartitionMonoid"/>
diff --git a/gap/semigroups/semiex.gd b/gap/semigroups/semiex.gd
index fb262d845..f7ba7b063 100644
--- a/gap/semigroups/semiex.gd
+++ b/gap/semigroups/semiex.gd
@@ -74,6 +74,8 @@ DeclareOperation("SingularPlanarPartitionMonoid", [IsPosInt]);
DeclareOperation("ModularPartitionMonoid", [IsPosInt, IsPosInt]);
DeclareOperation("SingularModularPartitionMonoid", [IsPosInt, IsPosInt]);
+DeclareOperation("FullDomainPartitionMonoid", [IsInt]);
+
# Matrix over finite field semigroups
DeclareOperation("GeneralLinearMonoid", [IsPosInt, IsPosInt]);
diff --git a/gap/semigroups/semiex.gi b/gap/semigroups/semiex.gi
index 67696fefe..7ba716801 100644
--- a/gap/semigroups/semiex.gi
+++ b/gap/semigroups/semiex.gi
@@ -1353,6 +1353,28 @@ function(n)
return Monoid(UnitriangularBooleanMatMonoid(n), gens);
end);
+InstallMethod(FullDomainPartitionMonoid, "for an integer",
+[IsInt],
+function(n)
+ local gens;
+
+ if n < 0 then
+ ErrorNoReturn("the argument (an int) is not >= 0");
+ elif n = 0 then
+ return Monoid(Bipartition([]));
+ elif n = 1 then
+ return Monoid(Bipartition([[1], [-1]]));
+ fi;
+
+ gens := List(GeneratorsOfGroup(SymmetricGroup(n)), x -> AsBipartition(x, n));
+ Add(gens, Bipartition(Concatenation([[1, 2, -1, -2]],
+ List([3 .. n], x -> [x, -x]))));
+ Add(gens, Bipartition(Concatenation([[1, 2, -2], [-1]],
+ List([3 .. n], x -> [x, -x]))));
+
+ return Monoid(gens);
+end);
+
#############################################################################
## 3. Standard examples - calculated generators
#############################################################################
diff --git a/tst/standard/semigroups/semiex.tst b/tst/standard/semigroups/semiex.tst
index bda823392..391b22cbf 100644
--- a/tst/standard/semigroups/semiex.tst
+++ b/tst/standard/semigroups/semiex.tst
@@ -2008,6 +2008,23 @@ gap> S := TriangularBooleanMatMonoid(n);
gap> Size(S);
64
+#Test FullDomainPartitionMonoid
+gap> FullDomainPartitionMonoid(-1);
+Error, the argument (an int) is not >= 0
+gap> FullDomainPartitionMonoid(0);
+
+gap> FullDomainPartitionMonoid(1);
+
+gap> FullDomainPartitionMonoid(5);
+
+gap> Size(FullDomainPartitionMonoid(5));
+19921
+gap> Size(FullDomainPartitionMonoid(4)) = Sum([1 .. 4], i ->
+> Sum([i .. 4], j -> Stirling2(4, i) *
+> Stirling2(4, j) * Factorial(j) /
+> Factorial(j - i)));
+true
+
# Test ReflexiveBooleanMatMonoid
gap> ReflexiveBooleanMatMonoid(1);