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);