Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make McAlister triple semigroups acting #507

Merged
merged 8 commits into from
Nov 23, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions doc/semieunit.xml
Original file line number Diff line number Diff line change
@@ -118,11 +118,7 @@ gap> T := McAlisterTripleSemigroup(A, x, y);
gap> S = T;
false
gap> IsIsomorphicSemigroup(S, T);
true
gap> GeneratorsOfSemigroup(T);
[ (1, ()), (4, ()), (5, ()), (1, (2,4)(3,5)) ]
gap> AsSemigroup(IsPartialPermSemigroup, T);
<inverse partial perm monoid of size 4, rank 4 with 4 generators>]]></Example>
true]]></Example>
</Description>
</ManSection>
<#/GAPDoc>
222 changes: 219 additions & 3 deletions gap/main/setup.gi
Original file line number Diff line number Diff line change
@@ -47,6 +47,15 @@ function(coll)
return IsPermGroup(UnderlyingSemigroup(R)) and IsRegularSemigroup(R);
end);

InstallMethod(IsGeneratorsOfActingSemigroup,
"for a McAlister triple element collection",
[IsMcAlisterTripleSemigroupElementCollection],
function(coll)
return
IsPermGroup(McAlisterTripleSemigroupGroup(MTSEParent(Representative(coll))));
# and McAlisterTripleSemigroupAction(MTSEParent(coll[1])) = OnPoints;
end);

# FIXME with the below uncommented many tests fail
## The HasRows and HasColumns could be removed if it was possible to apply
## immediate methods to Rees 0-matrix semigroups
@@ -94,6 +103,12 @@ function(x)
return NrMovedPoints(x![2]) + 1;
end);

InstallMethod(ActionDegree, "for a McAlister semigroup element",
[IsMcAlisterTripleSemigroupElement],
function(x)
return 0;
end);

InstallMethod(ActionDegree, "for a matrix over finite field object",
[IsMatrixOverFiniteField], DimensionOfMatrixOverSemiring);

@@ -124,6 +139,12 @@ function(coll)
return DimensionOfMatrixOverSemiring(coll[1]);
end);

InstallMethod(ActionDegree, "for a McAlister semigroup element collection",
[IsMcAlisterTripleSemigroupElementCollection],
function(coll)
return MaximumList(List(coll, x -> ActionDegree(x)));
end);

InstallMethod(ActionDegree, "for a transformation semigroup",
[IsTransformationSemigroup], DegreeOfTransformationSemigroup);

@@ -148,6 +169,12 @@ function(R)
return 0;
end);

InstallMethod(ActionDegree, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup],
function(S)
return 0;
end);

InstallMethod(ActionDegree, "for a matrix over finite field semigroup",
[IsMatrixOverFiniteFieldSemigroup],
function(S)
@@ -217,6 +244,22 @@ function(R)
end;
end);

InstallMethod(ActionRank, "for a McAlister triple semigroup element and int",
[IsMcAlisterTripleSemigroupElement, IsInt],
function(f, n)
local digraph, id;
digraph := McAlisterTripleSemigroupQuotientDigraph(MTSEParent(f));
digraph := DigraphReverse(digraph);
id := McAlisterTripleSemigroupComponents(MTSEParent(f)).id;
return Position(DigraphTopologicalSort(digraph), id[f[1]]);
end);

InstallMethod(ActionRank, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup],
function(S)
return x -> ActionDegree(S);
end);

InstallMethod(ActionRank, "for a matrix object and integer",
[IsMatrixOverFiniteField, IsInt],
function(x, i)
@@ -243,6 +286,9 @@ InstallMethod(MinActionRank, "for a bipartition semigroup",
InstallMethod(MinActionRank, "for a Rees 0-matrix subsemigroup",
[IsReesZeroMatrixSubsemigroup], x -> 0);

InstallMethod(MinActionRank, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup], x -> 1);

InstallMethod(MinActionRank, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup], x -> 0);

@@ -260,6 +306,9 @@ InstallMethod(LambdaOrbOpts, "for a bipartition semigroup",
InstallMethod(LambdaOrbOpts, "for a Rees 0-matrix subsemigroup",
[IsReesZeroMatrixSubsemigroup], S -> rec());

InstallMethod(LambdaOrbOpts, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup], S -> rec());

InstallMethod(LambdaOrbOpts, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup], s -> rec());

@@ -275,6 +324,9 @@ InstallMethod(RhoOrbOpts, "for a bipartition semigroup",
InstallMethod(RhoOrbOpts, "for a Rees 0-matrix subsemigroup",
[IsReesZeroMatrixSubsemigroup], S -> rec());

InstallMethod(RhoOrbOpts, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup], S -> rec());

InstallMethod(RhoOrbOpts, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup], s -> rec());

@@ -307,6 +359,24 @@ InstallMethod(LambdaAct, "for a Rees 0-matrix subsemigroup",
fi;
end);

InstallMethod(LambdaAct, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup],
function(S)
local act, digraph;
S := MTSEParent(Representative(S));
act := McAlisterTripleSemigroupAction(S);
digraph := McAlisterTripleSemigroupPartialOrder(S);
return
function(pt, x)
if pt = 0 then
return act(x[1], x[2] ^ -1);
fi;
return PartialOrderDigraphJoinOfVertices(digraph,
act(pt, x[2] ^ -1),
act(x[1], x[2] ^ -1));
end;
end);

InstallMethod(LambdaAct, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup],
S -> function(vsp, mat)
@@ -345,6 +415,24 @@ InstallMethod(RhoAct, "for a Rees 0-matrix subsemigroup",
fi;
end);

InstallMethod(RhoAct, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup],
function(S)
local act, digraph;
S := MTSEParent(Representative(S));
act := McAlisterTripleSemigroupAction(S);
digraph := McAlisterTripleSemigroupPartialOrder(S);
return
function(pt, x)
if pt = 0 then
return x[1];
fi;
return PartialOrderDigraphJoinOfVertices(digraph,
act(pt, x[2]),
x[1]);
end;
end);

InstallMethod(RhoAct, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup],
function(S)
@@ -370,6 +458,9 @@ end);
InstallMethod(LambdaOrbSeed, "for a Rees 0-matrix subsemigroup",
[IsReesZeroMatrixSubsemigroup], S -> -1);

InstallMethod(LambdaOrbSeed, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup], S -> 0);

InstallMethod(LambdaOrbSeed, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup],
function(S)
@@ -397,6 +488,9 @@ end);
InstallMethod(RhoOrbSeed, "for a Rees 0-matrix subsemigroup",
[IsReesZeroMatrixSubsemigroup], S -> -1);

InstallMethod(RhoOrbSeed, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup], S -> 0);

InstallMethod(RhoOrbSeed, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup], LambdaOrbSeed);

@@ -427,6 +521,14 @@ InstallMethod(LambdaFunc, "for a Rees 0-matrix subsemigroup",
return 0;
end);

InstallMethod(LambdaFunc, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup],
function(S)
local act;
act := McAlisterTripleSemigroupAction(MTSEParent(Representative(S)));
return x -> act(x[1], x[2] ^ -1);
end);

InstallMethod(LambdaFunc, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup],
s -> function(mat)
@@ -454,6 +556,12 @@ InstallMethod(RhoFunc, "for a bipartition semigroup",
InstallMethod(RhoFunc, "for a Rees 0-matrix subsemigroup",
[IsReesZeroMatrixSubsemigroup], R -> (x -> x![1]));

InstallMethod(RhoFunc, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup],
function(S)
return x -> x[1];
end);

InstallMethod(RhoFunc, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup],
function(S)
@@ -464,7 +572,7 @@ function(S)
end;
end);

# the function used to calculate the rank of lambda or rho value
# The function used to calculate the rank of lambda or rho value

InstallMethod(LambdaRank, "for a transformation semigroup",
[IsTransformationSemigroup], x -> Length);
@@ -487,6 +595,17 @@ function(x)
fi;
end);

InstallMethod(LambdaRank, "for a McAlister subsemigroup",
[IsMcAlisterTripleSubsemigroup], S ->
function(x)
local T;
if x = 0 then
return 0;
fi;
T := MTSEParent(Representative(S));
return ActionRank(MTSE(T, x, One(McAlisterTripleSemigroupGroup(T))), 0);
end);

# Why are there row spaces and matrices passed in here?
InstallMethod(LambdaRank, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup], x -> Rank);
@@ -512,6 +631,17 @@ InstallMethod(RhoRank, "for a Rees 0-matrix subsemigroup",
InstallMethod(RhoRank, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup], S -> LambdaRank(S));

InstallMethod(RhoRank, "for a McAlister subsemigroup",
[IsMcAlisterTripleSubsemigroup], S ->
function(x)
local T;
if x = 0 then
return 0;
fi;
T := MTSEParent(Representative(S));
return ActionRank(MTSE(T, x, One(McAlisterTripleSemigroupGroup(T))), 0);
end);

# if g=LambdaInverse(X, f) and X^f=Y, then Y^g=X and g acts on the right
# like the inverse of f on Y.

@@ -523,6 +653,11 @@ InstallMethod(LambdaInverse, "for a partial perm semigroup",
return f ^ -1;
end);

InstallMethod(LambdaInverse, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup], S -> function(x, f)
return f ^ -1;
end);

InstallMethod(LambdaInverse, "for a bipartition semigroup",
[IsBipartitionSemigroup], S -> BLOCKS_INV_RIGHT);

@@ -559,6 +694,11 @@ InstallMethod(RhoInverse, "for a partial perm semigroup",
return f ^ -1;
end);

InstallMethod(RhoInverse, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup], S -> function(x, f)
return f ^ -1;
end);

# JDM better method for this!!

InstallMethod(RhoInverse, "for a Rees 0-matrix subsemigroup",
@@ -636,6 +776,17 @@ end);
InstallMethod(RhoBound, "for a Rees 0-matrix semigroup",
[IsReesZeroMatrixSubsemigroup], LambdaBound);

InstallMethod(LambdaBound, "for a McAlister subsemigroup",
[IsMcAlisterTripleSubsemigroup], S ->
function(r)
local G;
G := McAlisterTripleSemigroupGroup(MTSEParent(Representative(S)));
return Size(Stabilizer(G, r));
end);

InstallMethod(RhoBound, "for a McAlister subsemigroup",
[IsMcAlisterTripleSubsemigroup], LambdaBound);

InstallMethod(LambdaBound, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup], S ->
function(r)
@@ -705,6 +856,15 @@ InstallMethod(RhoIdentity, "for a Rees 0-matrix semigroup",
return ();
end);

InstallMethod(LambdaIdentity, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup],
S -> function(r)
return ();
end);

InstallMethod(RhoIdentity, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup], LambdaIdentity);

InstallMethod(LambdaIdentity, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup], S ->
function(r)
@@ -739,6 +899,12 @@ function(x, y)
return x![2] ^ -1 * y![2];
end);

InstallMethod(LambdaPerm, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup],
function(S)
return {x, y} -> x[2] ^ -1 * y[2];
end);

# Returns a permutation mapping LambdaFunc(S)(x) to LambdaFunc(S)(y) so that
# yx ^ -1(i) = p(i) when RhoFunc(S)(x) = RhoFunc(S)(y)!!

@@ -763,7 +929,20 @@ InstallMethod(LambdaConjugator, "for a bipartition semigroup",
InstallMethod(LambdaConjugator, "for a Rees 0-matrix subsemigroup",
[IsReesZeroMatrixSubsemigroup], S ->
function(x, y)
return ();
return (); # FIXME is this right???? This is not right!!
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This FIXME troubles me a bit, I will play around with this on Monday, and give you some feedback @ChristopherRussell. This PR looks pretty good though, thanks for persevering.

end);

InstallMethod(LambdaConjugator, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup],
function(S)
local T, G, act;
T := MTSEParent(Representative(S));
G := McAlisterTripleSemigroupGroup(T);
act := MTSUnderlyingAction(T); # MTSAction is not an action, causes problems
return {x, y} -> RepresentativeAction(G,
LambdaFunc(S)(x),
LambdaFunc(S)(y),
act);
end);

InstallMethod(LambdaConjugator, "for a matrix semigroup",
@@ -801,6 +980,12 @@ function(j, i)
return Matrix(parent)[j][i] <> 0;
end);

InstallMethod(IdempotentTester, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup], S ->
function(x, y)
return x = y;
end);

InstallMethod(IdempotentTester, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup], S -> function(x, y)
return MatrixOverFiniteFieldIdempotentTester(S, x, y);
@@ -830,6 +1015,14 @@ function(j, i)
[i, mat[j][i] ^ -1, j, mat]);
end);

InstallMethod(IdempotentCreator, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup], S ->
function(x, y)
local T;
T := MTSEParent(Representative(S));
return MTSE(T, x, One(McAlisterTripleSemigroupGroup(T)));
end);

InstallMethod(IdempotentCreator, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup], S -> function(x, y)
return MatrixOverFiniteFieldIdempotentCreator(S, x, y);
@@ -853,13 +1046,20 @@ InstallMethod(StabilizerAction, "for a bipartition semigroup",
InstallMethod(StabilizerAction, "for a Rees 0-matrix subsemigroup",
[IsReesZeroMatrixSubsemigroup], S ->
function(x, p)

if x![1] = 0 then
return x;
fi;
return Objectify(TypeObj(x), [x![1], x![2] * p, x![3], x![4]]);
end);

InstallMethod(StabilizerAction, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup], S ->
function(x, p)
local T;
T := MTSEParent(x);
return MTSE(T, x[1], x[2] * p);
end);

InstallMethod(StabilizerAction, "for a matrix semigroup",
[IsMatrixOverFiniteFieldSemigroup], S ->
function(x, y)
@@ -886,6 +1086,10 @@ InstallMethod(IsActingSemigroupWithFixedDegreeMultiplication,
"for an acting Rees 0-matrix subsemigroup",
[IsReesZeroMatrixSubsemigroup and IsActingSemigroup], ReturnFalse);

InstallMethod(IsActingSemigroupWithFixedDegreeMultiplication,
"for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup and IsActingSemigroup], ReturnFalse);

InstallTrueMethod(IsActingSemigroupWithFixedDegreeMultiplication,
IsMatrixOverFiniteFieldSemigroup);

@@ -913,6 +1117,14 @@ function(S)
end;
end);

InstallMethod(SchutzGpMembership, "for a McAlister triple subsemigroup",
[IsMcAlisterTripleSubsemigroup],
function(S)
return function(stab, x)
return SiftedPermutation(stab, x) = ();
end;
end);

InstallMethod(SchutzGpMembership, "for a bipartition semigroup",
[IsBipartitionSemigroup],
function(S)
@@ -941,6 +1153,10 @@ InstallMethod(FakeOne, "for a bipartition collection",
InstallMethod(FakeOne, "for a Rees 0-matrix semigroup element collection",
[IsReesZeroMatrixSemigroupElementCollection], R -> SEMIGROUPS.UniversalFakeOne);

InstallMethod(FakeOne, "for a McAlister triple semigroup element collection",
[IsMcAlisterTripleSemigroupElementCollection],
S -> SEMIGROUPS.UniversalFakeOne);

# Matrix semigroup elements
InstallMethod(FakeOne, "for an FFE coll coll coll",
[IsFFECollCollColl], One);
48 changes: 38 additions & 10 deletions gap/semigroups/semieunit.gd
Original file line number Diff line number Diff line change
@@ -28,11 +28,14 @@ DeclareRepresentation("IsMcAlisterTripleSemigroupElementRep",
and IsPositionalObjectRep, 3);

DeclareCategoryCollections("IsMcAlisterTripleSemigroupElement");
DeclareSynonym("IsMTSE", IsMcAlisterTripleSemigroupElement);
DeclareSynonymAttr("IsMTSE", IsMcAlisterTripleSemigroupElement);
DeclareSynonymAttr("IsMcAlisterTripleSemigroup",
IsInverseSemigroup and IsGeneratorsOfInverseSemigroup
and IsMcAlisterTripleSemigroupElementCollection
and IsWholeFamily and IsEnumerableSemigroupRep);
and IsWholeFamily and IsActingSemigroup);
DeclareSynonymAttr("IsMTS", IsMcAlisterTripleSemigroup);
DeclareSynonym("IsMcAlisterTripleSubsemigroup",
IsMcAlisterTripleSemigroupElementCollection and IsSemigroup);

# This is a representation for McAlister triple semigroup, which are
# created via the function McAlisterTripleSemigroup.
@@ -43,6 +46,9 @@ DeclareSynonymAttr("IsMcAlisterTripleSemigroup",
# McAlisterTripleSemigroupPartialOrder
# McAlisterTripleSemigroupSemilattice
# McAlisterTripleSemigroupAction
# McAlisterTripleSemigroupUnderlyingAction
# McAlisterTripleSemigroupActionHomomorphism
# GeneratorsOfSemigroup
#
# their purpose is described in the section of the user manual on McAlister
# triple semigroups.
@@ -64,19 +70,41 @@ DeclareOperation("McAlisterTripleSemigroup",
DeclareOperation("McAlisterTripleSemigroup",
[IsPermGroup, IsDigraph, IsHomogeneousList]);

# Attributes for McAlister triple semigroups
# Attributes for McAlister triple subsemigroups
DeclareAttribute("McAlisterTripleSemigroupGroup",
IsMcAlisterTripleSemigroup and IsWholeFamily);
IsMcAlisterTripleSubsemigroup);
DeclareSynonymAttr("MTSGroup", McAlisterTripleSemigroupGroup);
DeclareAttribute("McAlisterTripleSemigroupAction",
IsMcAlisterTripleSemigroup and IsWholeFamily);
IsMcAlisterTripleSubsemigroup);
DeclareSynonymAttr("MTSAction", McAlisterTripleSemigroupAction);
DeclareAttribute("McAlisterTripleSemigroupPartialOrder",
IsMcAlisterTripleSemigroup and IsWholeFamily);
IsMcAlisterTripleSubsemigroup);
DeclareSynonymAttr("MTSPartialOrder", McAlisterTripleSemigroupPartialOrder);
DeclareAttribute("McAlisterTripleSemigroupSemilattice",
IsMcAlisterTripleSemigroup and IsWholeFamily);
DeclareAttribute("McAlisterTripleSemigroupElmList",
IsMcAlisterTripleSemigroup and IsWholeFamily);
IsMcAlisterTripleSubsemigroup);
DeclareSynonymAttr("MTSSemilattice", McAlisterTripleSemigroupSemilattice);
DeclareAttribute("McAlisterTripleSemigroupActionHomomorphism",
IsMcAlisterTripleSubsemigroup);
DeclareSynonymAttr("MTSActionHomomorphism",
McAlisterTripleSemigroupActionHomomorphism);
DeclareAttribute("McAlisterTripleSemigroupUnderlyingAction",
IsMcAlisterTripleSubsemigroup);
DeclareSynonymAttr("MTSUnderlyingAction",
McAlisterTripleSemigroupUnderlyingAction);
DeclareAttribute("McAlisterTripleSemigroupSemilatticeVertexLabelInverseMap",
IsMcAlisterTripleSubsemigroup);
DeclareSynonymAttr("MTSSemilatticeVertexLabelInverseMap",
McAlisterTripleSemigroupSemilatticeVertexLabelInverseMap);
DeclareAttribute("OneImmutable",
IsMcAlisterTripleSemigroup and IsWholeFamily and IsMonoid);
DeclareAttribute("McAlisterTripleSemigroupComponents",
IsMcAlisterTripleSubsemigroup);
DeclareSynonymAttr("MTSComponents",
McAlisterTripleSemigroupComponents);
DeclareAttribute("McAlisterTripleSemigroupQuotientDigraph",
IsMcAlisterTripleSubsemigroup);
DeclareSynonymAttr("MTSQuotientDigraph",
McAlisterTripleSemigroupQuotientDigraph);

# Operations for relating to McAlister triple semigroups
DeclareAttribute("IsomorphismMcAlisterTripleSemigroup",
@@ -91,7 +119,7 @@ DeclareSynonym("MTSE", McAlisterTripleSemigroupElement);
# Operations for McAlister triple semigroup elements
DeclareAttribute("McAlisterTripleSemigroupElementParent",
IsMcAlisterTripleSemigroupElementRep);
DeclareSynonym("MTSEParent", McAlisterTripleSemigroupElementParent);
DeclareSynonymAttr("MTSEParent", McAlisterTripleSemigroupElementParent);
DeclareOperation("ELM_LIST", [IsMcAlisterTripleSemigroupElementRep, IsPosInt]);

# Inverse semigroup methods
719 changes: 466 additions & 253 deletions gap/semigroups/semieunit.gi

Large diffs are not rendered by default.

73 changes: 50 additions & 23 deletions tst/standard/semieunit.tst
Original file line number Diff line number Diff line change
@@ -101,26 +101,43 @@ documentation for more detail,
gap> ps := InverseSemigroup([PartialPerm([2, 3, 4, 5], [1, 3, 5, 4]),
> PartialPerm([2, 3, 4, 5], [1, 4, 5, 3])]);;
gap> Mps := IsomorphismSemigroup(IsMcAlisterTripleSemigroup, ps);;
gap> Image(Mps);
[ (1, ()), (1, (2,3)), (1, (1,2)), (1, (1,2,3)), (1, (1,3,2)), (1, (1,3)),
(2, ()), (2, (2,3)), (2, (1,2,3)), (2, (1,3)), (3, ()), (3, (2,3)),
(3, (1,2)), (3, (1,3,2)) ]
gap> Range(Mps);
<McAlister triple semigroup over Group([ (1,5,6)(2,3,4), (1,4)(2,6)(3,5) ])>
gap> AsSemigroup(IsMcAlisterTripleSemigroup, ps);
<McAlister triple semigroup over Group([ (2,3), (1,2,3) ])>
<McAlister triple semigroup over Group([ (1,5,6)(2,3,4), (1,4)(2,6)(3,5) ])>
gap> ps := InverseSemigroup([PartialPerm([1, 4, 6, 7], [1, 4, 6, 7]),
> PartialPerm([2, 3, 6, 7], [2, 3, 6, 7]), PartialPerm([6, 7], [6, 7]),
> PartialPerm([2, 3, 5, 6, 7], [2, 3, 5, 6, 7]),
> PartialPerm([1, 4, 6, 7], [2, 3, 7, 6]),
> PartialPerm([2, 3, 6, 7], [1, 4, 7, 6]), PartialPerm([6, 7], [7, 6])]);;
gap> Mps := IsomorphismSemigroup(IsMcAlisterTripleSemigroup, ps);;
gap> Image(Mps);
[ (1, ()), (1, (1,2)), (2, ()), (3, ()), (3, (1,2)), (5, ()), (5, (1,2)) ]
gap> Elements(Range(Mps));
[ (1, ()), (1, (1,2)), (2, ()), (3, ()), (3, (1,2)), (5, ()), (5, (1,2)) ]
gap> IsWholeFamily(Image(Mps));
gap> Range(Mps);
<McAlister triple semigroup over Group([ (1,2) ])>
gap> Elements(Range(Mps));;
gap> IsWholeFamily(Range(Mps));
true
gap> AsSemigroup(IsMcAlisterTripleSemigroup, ps);
<McAlister triple semigroup over Group([ (1,2) ])>
gap> G := Semigroup(PartialPerm([1, 2, 3], [2, 3, 1]));;
gap> iso := IsomorphismSemigroup(IsMcAlisterTripleSemigroup, G);;
gap> PartialPerm([1, 2, 3], [2, 3, 1]) ^ iso;;

#T# McAlister triple subsemigroup methods
gap> S := Semigroup(Elements(Range(Mps)){[1, 2, 3]});
<McAlister triple subsemigroup over Group([ (1,2) ])>
gap> attr := [MTSSemilattice, MTSGroup, MTSPartialOrder, MTSAction,
> MTSActionHomomorphism, MTSUnderlyingAction, MTSComponents,
> MTSQuotientDigraph, MTSSemilatticeVertexLabelInverseMap];;
gap> M := Range(Mps);;
gap> ForAll(attr, A -> A(S) = A(M));
true
gap> Print(Semigroup(Elements(M1){[1, 2, 3]}), "\n");
Semigroup([ MTSE(McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digrap\
h( [ [ 1 ], [ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), [ 1 .. 4 ]), 1, ()), M\
TSE(McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ], [\
1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), [ 1 .. 4 ]), 1, (4,5)), MTSE(McAlis\
terTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ], [ 1, 2 ], [\
1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), [ 1 .. 4 ]), 1, (3,4)) ]

#T# AsSemigroup with bad input
gap> T := Semigroup([PartialPerm([1], [3]),
@@ -131,26 +148,25 @@ the semigroup is not E-unitary,

#T# Other McAlisterTripleSemigroup tests
gap> G := SymmetricGroup([2 .. 5]);;
gap> x := Digraph([[1], [1, 2], [1, 3], [1, 4], [1, 5]]);
<digraph with 5 vertices, 9 edges>
gap> y := Digraph([[1], [1, 2], [1, 3], [1, 4]]);
<digraph with 4 vertices, 7 edges>
gap> x := Digraph([[1], [1, 2], [1, 3], [1, 4], [1, 5]]);;
gap> y := Digraph([[1], [1, 2], [1, 3], [1, 4]]);;
gap> M := McAlisterTripleSemigroup(G, x, y, OnPoints);
<McAlister triple semigroup over Sym( [ 2 .. 5 ] )>
gap> IsIsomorphicSemigroup(M, McAlisterTripleSemigroup(G, x, x));
false
gap> IsInverseSemigroup(Semigroup(GeneratorsOfSemigroup(M)));
true
gap> elms := Enumerator(M);;
gap> String(elms[1]);
"MTSE(McAlisterTripleSemigroup(SymmetricGroup( [ 2 .. 5 ] ), Digraph( [ [ 1 ],\
[ 1, 2 ], [ 1, 3 ], [ 1, 4 ], [ 1, 5 ] ] ), [ 1 .. 4 ]), 1, ())"
gap> String(elms[1]){[1 .. 40]};
"MTSE(McAlisterTripleSemigroup(SymmetricG"
gap> OneImmutable(M);
Error, Semigroups: OneImutable (for McAlister triple semigroup): usage,
the argument must be a monoid,
fail
gap> M1 := McAlisterTripleSemigroup(G, x, [1, 2]);;
gap> OneImmutable(M1);
(2, ())
gap> x1 := DigraphFromDiSparse6String(".P__@_@_@__D_D_D__H_H_H_@DH_@DHL_@DHL_@DHLp?`abcdefghijklmno");;
gap> y1 := InducedSubdigraph(x1, [1, 2, 3, 4, 6, 10, 11, 14, 15]);;
gap> McAlisterTripleSemigroup(AutomorphismGroup(x1), x1, y1);;

#T# McAlister triple semigroup elements
gap> MTSE(M, 4, (2, 4)(3, 5)) * MTSE(M, 4, (2, 5, 3, 4));
@@ -161,6 +177,10 @@ gap> M = MTSEParent(MTSE(M, 1, (4, 5)));
true
gap> M = McAlisterTripleSemigroupElementParent(MTSE(M, 1, (4, 5)));
true
gap> LeftOne(MTSE(M, 4, (2, 4)(3, 5))) = MTSE(M, 4, ());
true
gap> RightOne(MTSE(M, 4, (2, 4)(3, 5))) = MTSE(M, 2, ());
true
gap> MTSE(M, 10, (2, 3, 4, 5));
Error, Semigroups: McAlisterTripleSemigroupElement: usage,
second argument should be a vertex label of the join-semilattice of the McAlis\
@@ -214,7 +234,7 @@ gap> M7 := McAlisterTripleSemigroup(Group((5, 6)), x4, x4);;
gap> IsomorphismSemigroups(M6, M7);
fail

#T# IsomorphicSemigroups with bad input
#T# IsomorphismSemigroups with bad input
gap> x1 := Digraph([[1], [1, 2], [1, 3]]);;
gap> G := Group((2, 3));;
gap> M1 := McAlisterTripleSemigroup(G, x1, x1);;
@@ -239,8 +259,7 @@ fail
#T# IsomorphismSemigroups, where RepresentativeAction fails
gap> gr := DigraphFromDigraph6String("+H_A?GC_Q@G~wA?G");
<digraph with 9 vertices, 20 edges>
gap> G := Group((1, 2, 3)(4, 5, 6), (8, 9));
Group([ (1,2,3)(4,5,6), (8,9) ])
gap> G := Group((1, 2, 3)(4, 5, 6), (8, 9));;
gap> S1 := McAlisterTripleSemigroup(G, gr, [1, 4, 5, 7, 8]);
<McAlister triple semigroup over Group([ (1,2,3)(4,5,6), (8,9) ])>
gap> S2 := McAlisterTripleSemigroup(G, gr, [3, 6, 7, 8, 9]);
@@ -289,7 +308,8 @@ gap> S := McAlisterTripleSemigroup(Group((4, 5)),
gap> IsFInverseSemigroup(S);
false

#T# EUnitaryInverseCover
#T# EUnitaryInverseCover
#TODO: Add checks that these covers are idempotent separating homomorphisms
gap> S := InverseMonoid([PartialPermNC([1, 3], [1, 3]),
> PartialPermNC([1, 2], [3, 1]), PartialPermNC([1, 2], [3, 2])]);;
gap> cov := EUnitaryInverseCover(S);;
@@ -311,6 +331,13 @@ gap> S := Semigroup([Bipartition([[1, 3, -1, -2, -3], [2]]),
gap> EUnitaryInverseCover(S);
Error, Semigroups: EUnitaryInverseCover: usage,
the argument must be an inverse semigroup,
gap> S := InverseSemigroup([PartialPerm([1, 2, 4], [4, 3, 2]),
> PartialPerm([1, 3], [3, 4])]);;
gap> cov := EUnitaryInverseCover(S);;
gap> IsEUnitaryInverseSemigroup(Source(cov));
true
gap> S = Range(cov);
true

#T# SEMIGROUPS_UnbindVariables
gap> Unbind(A);
215 changes: 213 additions & 2 deletions tst/standard/setup.tst
Original file line number Diff line number Diff line change
@@ -29,6 +29,9 @@ gap> IsGeneratorsOfActingSemigroup(Elements(R));
true
gap> IsGeneratorsOfActingSemigroup(SLM(2, 2));
true
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3]), Digraph([[1], [1, 2], [1, 3]]), [1, 2]);;
gap> IsGeneratorsOfActingSemigroup(M);
true

# ActionDegree

@@ -55,6 +58,11 @@ gap> R := ReesZeroMatrixSemigroup(SymmetricGroup(3), [[()]]);;
gap> Set(R, ActionDegree);
[ 0, 1, 3, 4 ]

# ActionDegree, for a MTS element
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3]), Digraph([[1], [1, 2], [1, 3]]), [1, 2]);;
gap> ActionDegree(M.1);
0

# ActionDegree, for a matrix over finite field object
gap> ActionDegree(Matrix(GF(2 ^ 2),
> [[Z(2) ^ 0, 0 * Z(2)], [0 * Z(2), 0 * Z(2)]]));
@@ -85,6 +93,11 @@ gap> ActionDegree([R.1, MultiplicativeZero(R)]);
gap> ActionDegree([MultiplicativeZero(R)]);
0

# ActionDegree, for an MTS element collection
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3]), Digraph([[1], [1, 2], [1, 3]]), [1, 2]);;
gap> ActionDegree(Generators(M));
0

# ActionDegree, for a matrix object collection
gap> ActionDegree([Matrix(GF(2),
> [[0 * Z(2), 0 * Z(2)], [0 * Z(2), 0 * Z(2)]]),
@@ -116,6 +129,11 @@ gap> ActionDegree(R);
gap> ActionDegree(Semigroup(MultiplicativeZero(R)));
0

# ActionDegree, for an MTS subsemigroup
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3]), Digraph([[1], [1, 2], [1, 3]]), [1, 2]);;
gap> ActionDegree(Semigroup(Representative(M)));
0

# ActionDegree, for a matrix over finite field semigroup
gap> ActionDegree(GLM(2, 2));
2
@@ -171,6 +189,16 @@ gap> rank(RMSElement(R, 1, (2, 3), 1));
gap> rank(MultiplicativeZero(R));
0

# ActionRank, for an MTS semigroup and subsemigroup
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3]), Digraph([[1], [1, 2], [1, 3]]), [1, 2]);;
gap> rank := ActionRank(M);;
gap> rank(Representative(M));
0
gap> S := Semigroup(Representative(M));;
gap> rank := ActionRank(S);;
gap> rank(Representative(S));
0

# ActionRank, for a matrix over FF
gap> x := Matrix(GF(2), [[0 * Z(2), 0 * Z(2)], [0 * Z(2), Z(2) ^ 0]]);;
gap> ActionRank(x, 10);
@@ -203,6 +231,11 @@ gap> R := ReesZeroMatrixSemigroup(Group([()]), [[(), (), 0], [(), (), ()],
gap> MinActionRank(R);
0

# MinActionRank, for a MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> MinActionRank(M);
1

# MinActionRank for a matrix over FF semigroup
gap> MinActionRank(GLM(2, 2));
0
@@ -235,6 +268,13 @@ rec( )
gap> RhoOrbOpts(R);
rec( )

# Rho/lambdaOrbOpts, for a MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> LambdaOrbOpts(M);
rec( )
gap> RhoOrbOpts(M);
rec( )

# Rho/LambdaOrbOpts for a matrix over FF semigroup
gap> LambdaOrbOpts(GLM(2, 2));
rec( )
@@ -305,6 +345,37 @@ gap> x(1, s);
gap> x(2, s);
1

# Rho/LambdaAct, for a MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> r := MTSE(M, 1, (3, 4));;
gap> s := MTSE(M, 3, (2, 3));;
gap> x := LambdaAct(M);;
gap> x(3, s);
2
gap> x(2, s);
1
gap> x(2, r);
1
gap> x(3, r);
1
gap> x(1, r);
1
gap> x(0, r);
1
gap> x := RhoAct(M);;
gap> x(3, s);
1
gap> x(2, s);
3
gap> x(2, r);
1
gap> x(3, r);
1
gap> x(1, r);
1
gap> x(0, r);
1

# Rho/LambdaAct, for a matrix over FF semigroup
gap> r := Matrix(GF(2), [[Z(2) ^ 0, Z(2) ^ 0], [Z(2) ^ 0, 0 * Z(2)]]);;
gap> s := Matrix(GF(2), [[Z(2) ^ 0, Z(2) ^ 0], [0 * Z(2), 0 * Z(2)]]);;
@@ -347,6 +418,13 @@ gap> LambdaOrbSeed(R);
gap> RhoOrbSeed(R);
-1

# Rho/LambdaOrbSeed, for an MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> LambdaOrbSeed(M);
0
gap> RhoOrbSeed(M);
0

# Rho/LambdaOrbSeed, for a matrix over FF semigroup
gap> LambdaOrbSeed(GLM(2, 2));
<rowbasis of rank 3 over GF(2)>
@@ -399,6 +477,19 @@ gap> x(MultiplicativeZero(S));
gap> x(RMSElement(S, 1, (1, 3), 2));
1

# Rho/LambdaFunc, for a MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> x := LambdaFunc(M);;
gap> x(MTSE(M, 1, ()));
1
gap> x(MTSE(M, 2, (2, 3)));
3
gap> x := RhoFunc(M);;
gap> x(MTSE(M, 1, ()));
1
gap> x(MTSE(M, 2, (2, 3)));
2

# Rho/LambdaFunc, for a matrix over FF semigroup
gap> S := GLM(2, 3);;
gap> x := LambdaFunc(S);;
@@ -454,6 +545,23 @@ gap> x(0);
gap> x(1);
4

# Rho/LambdaRank, for a MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> x := LambdaRank(M);;
gap> x(1);
2
gap> x(2);
1
gap> x(0);
0
gap> x := RhoRank(M);;
gap> x(1);
2
gap> x(2);
1
gap> x(0);
0

# Rho/LambdaRank, for a matrix over FF semigroup
gap> S := GLM(2, 3);;
gap> b := NewRowBasisOverFiniteField(IsPlistRowBasisOverFiniteFieldRep,
@@ -517,6 +625,19 @@ gap> x(0, S.1);
gap> x(2, S.1);
(2,(),1)

# Rho/LambdaInverse, for a MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> x := LambdaInverse(M);;
gap> x(2, MTSE(M, 1, ()));
(1, ())
gap> x(2, MTSE(M, 2, (2, 3)));
(3, (2,3))
gap> x := RhoInverse(M);;
gap> x(2, MTSE(M, 1, ()));
(1, ())
gap> x(2, MTSE(M, 2, (2, 3)));
(3, (2,3))

# Rho/LambdaInverse, for a matrix over FF semigroup
gap> S := GLM(2, 2);;
gap> x := LambdaInverse(S);;
@@ -573,6 +694,17 @@ infinity
gap> RhoBound(S)(5);
120

# Rho/LambdaBound, for a MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> LambdaBound(M)(5);
6
gap> LambdaBound(M)(10000);
6
gap> RhoBound(M)(5);
6
gap> RhoBound(M)(10000);
6

# Rho/LambdaBound, for a matrix over FF semigroup
gap> S := GLM(2, 2);;
gap> LambdaBound(S)(1000);
@@ -618,6 +750,13 @@ gap> LambdaIdentity(S)(2);
gap> RhoIdentity(S)(2);
()

# Rho/LambdaIdentity, for a MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> LambdaIdentity(M)(2);
()
gap> RhoIdentity(M)(2);
()

# Rho/LambdaIdentity, for a matrix over FF semigroup
gap> S := SLM(2, 2);;
gap> LambdaIdentity(S)(2);
@@ -651,6 +790,14 @@ gap> x(RMSElement(R, 1, (1, 3, 2), 1), RMSElement(R, 1, (1, 2, 3), 1));
gap> x(MultiplicativeZero(R), MultiplicativeZero(R));
()

# LambdaPerm, for a MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> x := LambdaPerm(M);;
gap> x(MTSE(M, 1, (2, 3, 4)), MTSE(M, 2, (2, 3)));
(2,4)
gap> x(MTSE(M, 2, ()), MTSE(M, 2, (2, 3)));
(2,3)

# LambdaPerm, for a matrix over FF semigroup
gap> x := LambdaPerm(GLM(2, 3));;
gap> x(Matrix(GF(3), [[Z(3) ^ 0, Z(3) ^ 0], [0 * Z(3), 0 * Z(3)]]),
@@ -681,6 +828,16 @@ gap> x := LambdaConjugator(R);;
gap> x(RMSElement(R, 1, (1, 3, 2), 1), RMSElement(R, 1, (1, 2, 3), 2));
()

# LambdaConjugator, for an MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> x := LambdaConjugator(M);;
gap> x(MTSE(M, 1, (2, 3, 4)), MTSE(M, 2, (2, 3)));
fail
gap> x(MTSE(M, 2, ()), MTSE(M, 2, (2, 3)));
(2,3)
gap> x(MTSE(M, 3, ()), MTSE(M, 2, (2, 3)));
()

# LambdaConjugator, for a matrix over FF semigroup
gap> x := LambdaConjugator(GLM(2, 3));;
gap> x(Matrix(GF(3), [[Z(3) ^ 0, 0 * Z(3)], [0 * Z(3), Z(3) ^ 0]]),
@@ -757,6 +914,31 @@ true
gap> y(2, 2);
(2,(1,2),2)

# IdempotentTester and IdempotentCreator, for an MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> x := IdempotentTester(M);;
gap> y := IdempotentCreator(M);;
gap> x(1, 1);
true
gap> x(2, 1);
false
gap> x(2, 2);
true
gap> x(3, 2);
false
gap> x(3, 3);
true
gap> y(2, 2);
(2, ())
gap> y(1, 2);
(1, ())
gap> y(1, 1);
(1, ())
gap> y(3, 2);
(3, ())
gap> y(3, 3);
(3, ())

# IdempotentTester and IdempotentCreator, for a matrix over FF semigroup
gap> S := GLM(2, 3);;
gap> x := IdempotentTester(S);;
@@ -804,6 +986,16 @@ gap> x(MultiplicativeZero(R), ());
gap> x(RMSElement(R, 1, (), 1), ());
(1,(),1)

# StabilizerAction, for a MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> x := StabilizerAction(M);;
gap> x(MTSE(M, 1, ()), ());
(1, ())
gap> x(MTSE(M, 2, (2, 3)), (2, 3));
(2, ())
gap> x(MTSE(M, 3, ()), (2, 4, 3));
(3, (2,4,3))

# StabilizerAction, for a matrix over FF semigroup
gap> S := GLM(2, 3);;
gap> x := StabilizerAction(S);;
@@ -832,6 +1024,11 @@ gap> S := ReesZeroMatrixSemigroup(Group(()), [[()]]);;
gap> IsActingSemigroupWithFixedDegreeMultiplication(Semigroup(S));
false

# IsActingSemigroupWithFixedDegreeMultiplication, for a MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> IsActingSemigroupWithFixedDegreeMultiplication(Semigroup(M));
false

# IsActingSemigroupWithFixedDegreeMultiplication, for a matrix over FF semigroup
gap> IsActingSemigroupWithFixedDegreeMultiplication(
> GLM(2, 2));
@@ -870,11 +1067,21 @@ true
# SchutzGpMembership, for an RZMS
gap> R := ReesZeroMatrixSemigroup(Group((1, 2, 3)), [[()]]);;
gap> R := Semigroup(Elements(R));;
gap> o := LambdaOrb(S);; Enumerate(o);;
gap> schutz := LambdaOrbStabChain(o, 2);;
gap> o := LambdaOrb(R);; Enumerate(o);;
gap> schutz := LambdaOrbStabChain(o, 3);;
gap> SchutzGpMembership(R)(schutz, ());
true

# SchutzGpMembership, for an MTS
gap> M := McAlisterTripleSemigroup(SymmetricGroup([2, 3, 4]), Digraph([[1], [1, 2], [1, 3], [1, 4]]), [1, 2, 3]);;
gap> M := Semigroup(Elements(M));;
gap> o := LambdaOrb(M);; Enumerate(o);;
gap> schutz := LambdaOrbStabChain(o, 3);;
gap> SchutzGpMembership(M)(schutz, ());
true

# gap> SchutzGpMembership(M)(schutz, ()); TODO: THIS DOESN'T WORK!

# SchutzGpMembership, for a matrix over FF semigroup
gap> S := Monoid([
> Matrix(GF(2), [[0 * Z(2), Z(2) ^ 0], [0 * Z(2), 0 * Z(2)]]),
@@ -903,6 +1110,10 @@ gap> FakeOne(PartitionMonoid(1));
gap> FakeOne(ReesZeroMatrixSemigroup(Group(()), [[()]]));
<universal fake one>

# FakeOne, for a MTS
gap> FakeOne(McAlisterTripleSemigroup(Group(()), Digraph([[1]]), [1]));
<universal fake one>

# FakeOne, for a matrix over FF semigroup
gap> FakeOne(GLM(2, 2));
Matrix(GF(2), [[Z(2)^0, 0*Z(2)], [0*Z(2), Z(2)^0]])