diff --git a/doc/semitrans.xml b/doc/semitrans.xml index f3153b9a2..e3709b839 100644 --- a/doc/semitrans.xml +++ b/doc/semitrans.xml @@ -384,3 +384,30 @@ gap> FixedPointsOfTransformationSemigroup(S); <#/GAPDoc> + +<#GAPDoc Label="WreathProduct"> + + + A transformation semigroup. + + If M is a transformation monoid (or a permutation group) of degree + m, and S is a transformation semigroup (or permutation + group) of degree s, the operation + WreathProduct(M, S) returns the wreath product of + M and S, in terms of an embedding in the full + transformation monoid of degree m * s. + + T := FullTransformationMonoid(3);; +gap> C := Group((1, 3));; +gap> W := WreathProduct(T, C);; +gap> Size(W); +39366 +gap> WW := WreathProduct(C, T);; +gap> Size(WW); +216 +]]> + + + +<#/GAPDoc> diff --git a/doc/z-chap06.xml b/doc/z-chap06.xml index 1306ace2e..504ef540c 100644 --- a/doc/z-chap06.xml +++ b/doc/z-chap06.xml @@ -359,6 +359,7 @@ true]]> <#Include Label = "SubsemigroupByProperty"> <#Include Label = "InverseSubsemigroupByProperty"> <#Include Label = "DirectProduct"> + <#Include Label = "WreathProduct">
diff --git a/doc/z-chap13.xml b/doc/z-chap13.xml index c49038202..845f0ddfa 100644 --- a/doc/z-chap13.xml +++ b/doc/z-chap13.xml @@ -201,7 +201,7 @@ <#Include Label = "Normalizer">
- + diff --git a/doc/z-chap15.xml b/doc/z-chap15.xml index 09347b028..941147f46 100644 --- a/doc/z-chap15.xml +++ b/doc/z-chap15.xml @@ -51,7 +51,6 @@
- Properties of inverse semigroups diff --git a/gap/semigroups/semitrans.gd b/gap/semigroups/semitrans.gd index 7c23f790c..87f4c3223 100644 --- a/gap/semigroups/semitrans.gd +++ b/gap/semigroups/semitrans.gd @@ -39,3 +39,7 @@ DeclareAttribute("EndomorphismMonoid", IsDigraph); DeclareOperation("EndomorphismMonoid", [IsDigraph, IsHomogeneousList]); DeclareOperation("DirectProductOp", [IsList, IsSemigroup]); + +DeclareOperation("WreathProduct", + [IsMultiplicativeElementCollection, + IsMultiplicativeElementCollection]); diff --git a/gap/semigroups/semitrans.gi b/gap/semigroups/semitrans.gi index 4a14878ee..540bfebc0 100644 --- a/gap/semigroups/semitrans.gi +++ b/gap/semigroups/semitrans.gi @@ -753,6 +753,77 @@ function(S) return t; end); +InstallMethod(WreathProduct, +"for a transformation monoid and a permutation group", +[IsTransformationMonoid, IsPermGroup], +function(M, G) + return WreathProduct(M, AsMonoid(IsTransformationMonoid, G)); +end); + +InstallMethod(WreathProduct, +"for a permutation group and a transformation semigroup", +[IsPermGroup, IsTransformationSemigroup], +function(G, S) + return WreathProduct(AsMonoid(IsTransformationMonoid, G), S); +end); + +InstallMethod(WreathProduct, +"for a transformation monoid and a transformation semigroup", +[IsTransformationMonoid, IsTransformationSemigroup], +function(M, S) + local maps, newmap, gensM, gensS, next, reps, orbs, gen1, n, i, s, x, m, y, + rimage; + if not IsMonoidAsSemigroup(S) then + ErrorNoReturn("Semigroups: WreathProduct: usage,\n", + "the second argument should be a monoid (as semigroup),"); + fi; + + m := DegreeOfTransformationCollection(M); + + gensM := List(GeneratorsOfMonoid(M), x -> ImageListOfTransformation(x, m)); + gensS := GeneratorsOfSemigroup(S); + + orbs := List(ComponentsOfTransformationSemigroup(S), Minimum); + n := DegreeOfTransformationCollection(S); + rimage := [1 .. n]; + + for x in orbs do + for y in gensS do + RemoveSet(rimage, x ^ y); + od; + od; + + maps := []; # final generating set for the wreath product + + # move copies of M as by the action induced by S + next := [1 .. m * n]; + for s in gensS do + for i in [1 .. n] do + next{[1 .. m] + (i - 1) * m} := [1 .. m] + (i ^ s - 1) * m; + od; + Add(maps, Transformation(next)); + od; + + gen1 := gensS[1]; + for i in orbs do + newmap := ShallowCopy(ImageListOfTransformation(maps[1], m * n)); + for x in gensM do + newmap{[1 .. m] + (i - 1) * m} := x + (i ^ gen1 - 1) * m; + Add(maps, Transformation(newmap)); + od; + od; + + for i in rimage do + newmap := OnTuples([1 .. m * n], maps[1]); + for x in gensM do + newmap{[1 .. m] + (i - 1) * m} := x + (i ^ gen1 - 1) * m; + Add(maps, Transformation(newmap)); + od; + od; + + return Semigroup(maps); +end); + ############################################################################# # ?. Isomorphisms ############################################################################# diff --git a/tst/standard/semitrans.tst b/tst/standard/semitrans.tst index 53d9c5c71..e367c09b7 100644 --- a/tst/standard/semitrans.tst +++ b/tst/standard/semitrans.tst @@ -2813,6 +2813,45 @@ gap> Unbind(rels); gap> Unbind(x); gap> Unbind(y); +#T# Tests wreath product of transf. semgp. and perm. group +gap> T := FullTransformationMonoid(3);; +gap> C := Group((1, 3));; +gap> TC := WreathProduct(T, C);; +gap> Size(TC) = 39366; +true +gap> CC := AsMonoid(IsTransformationMonoid, C);; +gap> DP := DirectProduct(T, CC);; +gap> IsSubsemigroup(TC, DP); +true +gap> C := Group((1, 2));; +gap> TC := WreathProduct(T, C);; +gap> Size(TC) = 1458; +true +gap> CC := AsMonoid(IsTransformationMonoid, C);; +gap> DP := DirectProduct(T, CC);; +gap> IsSubsemigroup(TC, DP); +true + +#T# Test wreath product of perm. group and transf. semgp. +gap> W := WreathProduct(Group((1, 2)), FullTransformationMonoid(3));; +gap> Size(W); +216 +gap> Transformation([5, 6, 1, 2, 3, 4]) in W; +true +gap> Transformation([5, 5, 1, 2, 3, 4]) in W; +false + +#T# Tests wreath product of a monoid not satisfying IsTransformationMonoid +gap> S := Semigroup(Transformation([1, 2, 3, 3, 3]));; +gap> C := Group((1, 2));; +gap> WW := WreathProduct(C, S);; +gap> Size(WW); +32 +gap> Transformation([2, 1, 4, 3, 6, 5, 6, 5, 6, 5]) in WW; +true +gap> Transformation([2, 1, 4, 3, 6, 5, 6, 5, 7, 8]) in WW; +false + #E# gap> SEMIGROUPS.StopTest(); gap> STOP_TEST("Semigroups package: standard/semitrans.tst");