diff --git a/gap/semigroups/semigraph.gi b/gap/semigroups/semigraph.gi index 551491f4e..8009e7e26 100644 --- a/gap/semigroups/semigraph.gi +++ b/gap/semigroups/semigraph.gi @@ -35,13 +35,18 @@ end); InstallMethod(AssignGeneratorVariables, "for an inverse semigroup", [IsGraphInverseSemigroup], function(S) - DoAssignGenVars(GeneratorsOfInverseSemigroup(S)); + # the zero element uses the char 0, which cannot be assigned as a variable + if DigraphNrVertices(GraphOfGraphInverseSemigroup(S)) < 2 then + Info(InfoWarning, 1, "zero element is a generator but was not assigned!"); + fi; + DoAssignGenVars(Difference(GeneratorsOfInverseSemigroup(S), + [MultiplicativeZero(S)])); end); InstallMethod(GraphInverseSemigroup, "for a digraph", [IsDigraph], function(graph) - local fam, S, gens, i; + local fam, S, gens, inv_gens, i; fam := NewFamily("GraphInverseSemigroupElementsFamily", IsGraphInverseSemigroupElement, @@ -66,15 +71,24 @@ function(graph) fam!.semigroup := S; gens := []; + inv_gens := []; + SetGraphOfGraphInverseSemigroup(S, graph); + for i in [1 .. DigraphNrVertices(graph) + DigraphNrEdges(graph)] do - Add(gens, Objectify(fam!.type, [[i], graph])); + Add(inv_gens, Objectify(fam!.type, [[i], graph])); od; - SetGeneratorsOfSemigroup(S, - Concatenation(gens, - List([1 .. DigraphNrEdges(graph)], - x -> gens[x] ^ -1))); - SetGeneratorsOfInverseSemigroup(S, gens); - SetGraphOfGraphInverseSemigroup(S, graph); + + gens := Concatenation(inv_gens, List([1 .. DigraphNrEdges(graph)], + x -> inv_gens[x] ^ -1)); + + # if the graph has 0 or 1 vertex, then the zero element is not generated by + # products of vertices and edges, so must be added to both generating sets + if DigraphNrVertices(graph) < 2 then + Add(gens, MultiplicativeZero(S)); + Add(inv_gens, MultiplicativeZero(S)); + fi; + SetGeneratorsOfSemigroup(S, gens); + SetGeneratorsOfInverseSemigroup(S, inv_gens); return S; end); @@ -286,7 +300,8 @@ InstallMethod(EdgesOfGraphInverseSemigroup, "for a graph inverse semigroup", [IsGraphInverseSemigroup], S -> Difference(GeneratorsOfInverseSemigroup(S), -VerticesOfGraphInverseSemigroup(S))); +Concatenation([MultiplicativeZero(S)], +VerticesOfGraphInverseSemigroup(S)))); InstallMethod(IndexOfVertexOfGraphInverseSemigroup, "for a graph inverse semigroup element", diff --git a/tst/standard/semigroups/grpperm.tst b/tst/standard/semigroups/grpperm.tst index 8b4151589..f6129b411 100644 --- a/tst/standard/semigroups/grpperm.tst +++ b/tst/standard/semigroups/grpperm.tst @@ -374,8 +374,8 @@ gap> iso := IsomorphismPermGroup(S); Error, the argument (a semigroup) does not satisfy IsGroupAsSemigroup # IsomorphismPermGroup: for a Integer Matrix Semigroup -gap> S := GraphInverseSemigroup(Digraph([[]])); - +gap> S := GraphInverseSemigroup(Digraph([])); + gap> iso := IsomorphismPermGroup(S);; gap> BruteForceIsoCheck(iso); BruteForceInverseCheck(iso); true diff --git a/tst/standard/semigroups/semirms.tst b/tst/standard/semigroups/semirms.tst index 92de348bc..5acce64be 100644 --- a/tst/standard/semigroups/semirms.tst +++ b/tst/standard/semigroups/semirms.tst @@ -1912,8 +1912,8 @@ true # AsSemigroup: # convert from IsGraphInverseSemigroup to IsReesMatrixSemigroup -gap> S := GraphInverseSemigroup(Digraph([[]])); - +gap> S := GraphInverseSemigroup(Digraph([])); + gap> T := AsSemigroup(IsReesMatrixSemigroup, S); gap> Size(S) = Size(T);