From d3b22afb996035cdabaaf1978919900f9a2c705a Mon Sep 17 00:00:00 2001 From: Wilf Wilson Date: Thu, 19 Oct 2017 12:43:04 +0100 Subject: [PATCH] semipperm: fix IsomorphismPPermSemigroup/Monoid Previously, these methods encountered unexpected errors for perm groups with 0 generators. This adds a special case for such groups. Resolves #1783 --- lib/semipperm.gi | 14 ++++++++-- ...-10-19-IsomorphismPartialPermSemigroup.tst | 27 ++++++++++++++++++ tst/testinstall/semipperm.tst | 28 +++++++++++++++++++ 3 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 tst/testbugfix/2017-10-19-IsomorphismPartialPermSemigroup.tst diff --git a/lib/semipperm.gi b/lib/semipperm.gi index 472d5dc574..6609bf5897 100644 --- a/lib/semipperm.gi +++ b/lib/semipperm.gi @@ -356,7 +356,11 @@ function(G) local dom, S; dom := MovedPoints(G); - S := InverseMonoid(List(GeneratorsOfGroup(G), p -> AsPartialPerm(p, dom))); + if IsEmpty(GeneratorsOfGroup(G)) then + S := InverseMonoid(EmptyPartialPerm()); + else + S := InverseMonoid(List(GeneratorsOfGroup(G), p -> AsPartialPerm(p, dom))); + fi; UseIsomorphismRelation(G, S); SetIsGroupAsSemigroup(S, true); @@ -373,8 +377,12 @@ function(G) local dom, S; dom := MovedPoints(G); - S := InverseSemigroup(List(GeneratorsOfGroup(G), - p -> AsPartialPerm(p, dom))); + if IsEmpty(GeneratorsOfGroup(G)) then + S := InverseSemigroup(EmptyPartialPerm()); + else + S := InverseSemigroup(List(GeneratorsOfGroup(G), + p -> AsPartialPerm(p, dom))); + fi; UseIsomorphismRelation(G, S); SetIsGroupAsSemigroup(S, true); diff --git a/tst/testbugfix/2017-10-19-IsomorphismPartialPermSemigroup.tst b/tst/testbugfix/2017-10-19-IsomorphismPartialPermSemigroup.tst new file mode 100644 index 0000000000..9e146cd275 --- /dev/null +++ b/tst/testbugfix/2017-10-19-IsomorphismPartialPermSemigroup.tst @@ -0,0 +1,27 @@ +# Issue related to IsomorphismPartialPermSemigroup and +# IsomorphismPartialPermMonoid for a trivial perm group with 0 generators +# Examples reported on issue #1783 on github.com/gap-system/gap +gap> iso := [];; +gap> iso[1] := IsomorphismPartialPermSemigroup(SymmetricGroup(1)); +MappingByFunction( Group(()), , function( p ) ... end, ) +gap> iso[2] := IsomorphismPartialPermSemigroup(Group([()])); +MappingByFunction( Group(()), , function( p ) ... end, ) +gap> iso[3] := IsomorphismPartialPermSemigroup(Group([], ())); +MappingByFunction( Group(()), , function( p ) ... end, ) +gap> iso[4] := IsomorphismPartialPermMonoid(SymmetricGroup(1)); +MappingByFunction( Group(()), , function( p ) ... end, ) +gap> iso[5] := IsomorphismPartialPermMonoid(Group([()])); +MappingByFunction( Group(()), , function( p ) ... end, ) +gap> iso[6] := IsomorphismPartialPermMonoid(Group([], ())); +MappingByFunction( Group(()), , function( p ) ... end, ) +gap> ForAll(iso, map -> () ^ map = EmptyPartialPerm()); +true +gap> inv := List(iso, InverseGeneralMapping);; +gap> ForAll(inv, map -> EmptyPartialPerm() ^ map = ()); +true diff --git a/tst/testinstall/semipperm.tst b/tst/testinstall/semipperm.tst index 82401d4e10..e36eb5afd8 100644 --- a/tst/testinstall/semipperm.tst +++ b/tst/testinstall/semipperm.tst @@ -333,6 +333,20 @@ gap> BruteForceIsoCheck(last); true gap> BruteForceInverseCheck(last2); true +gap> IsomorphismPartialPermSemigroup(Group([()])); +MappingByFunction( Group(()), , function( p ) ... end, ) +gap> BruteForceIsoCheck(last); +true +gap> BruteForceInverseCheck(last2); +true +gap> IsomorphismPartialPermSemigroup(Group([], ())); +MappingByFunction( Group(()), , function( p ) ... end, ) +gap> BruteForceIsoCheck(last); +true +gap> BruteForceInverseCheck(last2); +true gap> IsomorphismPartialPermMonoid(Group((1,2,3))); MappingByFunction( Group([ (1,2,3) ]), , function( p ) ... end, ) @@ -340,6 +354,20 @@ gap> BruteForceIsoCheck(last); true gap> BruteForceInverseCheck(last2); true +gap> IsomorphismPartialPermMonoid(Group([()])); +MappingByFunction( Group(()), , function( p ) ... end, ) +gap> BruteForceIsoCheck(last); +true +gap> BruteForceInverseCheck(last2); +true +gap> IsomorphismPartialPermMonoid(Group([], ())); +MappingByFunction( Group(()), , function( p ) ... end, ) +gap> BruteForceIsoCheck(last); +true +gap> BruteForceInverseCheck(last2); +true # Test SymmetricInverseMonoid gap> SymmetricInverseMonoid(-1);