@@ -327,3 +327,60 @@ function(S)
327327 UseIsomorphismRelation(H, G);
328328 return H;
329329end );
330+
331+ InstallMethod(IsomorphismSemigroup,
332+ " for IsStrongSemilatticeOfSemigroups and a Clifford semigroup" ,
333+ [ IsStrongSemilatticeOfSemigroups, IsSemigroup and IsFinite] ,
334+ function (filt, S )
335+ local A, idemps, n, D, N, L, classes, idemp, DC, H, map, SSS, i, j;
336+ # decomposes a finite Clifford semigroup S into a strong semilattice of
337+ # groups and returns an SSS object.
338+ if not (IsCliffordSemigroup(S) and IsFinite(S)) then
339+ TryNextMethod ();
340+ fi ;
341+ # There should be one idempotent per D-class, i.e. per semilattice element
342+ # since the semilattice decomposition is by J-classes, and J = D here
343+ A := Semigroup(Idempotents(S));
344+ idemps := Elements(A);
345+ n := Size(idemps);
346+
347+ # create semilattice
348+ D := DigraphReflexiveTransitiveReduction(Digraph(NaturalPartialOrder(A)));
349+ # currently wrong way round
350+ D := DigraphReverse(D);
351+ N := OutNeighbours(D);
352+
353+ # populate list of semigroups in semilattice.
354+ # keep a list of D-classes at the same time, to figure out where elements are
355+ L := [] ;
356+ classes := [] ;
357+ for i in [ 1 .. n] do
358+ idemp := idemps[ i] ; # the idempotent of this D-class
359+ DC := DClass(S, idemp);
360+ Add(L, Semigroup(DC));
361+ Add(classes, DC);
362+ od ;
363+
364+ # populate list of homomorphisms
365+ H := [] ;
366+ for i in [ 1 .. n] do
367+ idemp := idemps[ i] ;
368+ Add(H, [] );
369+ for j in N[ i] do
370+ map := function (elm )
371+ return idemp * elm;
372+ end ;
373+ Add(H[ i] , MappingByFunction(L[ j] , L[ i] , map));
374+ od ;
375+ od ;
376+
377+ SSS := StrongSemilatticeOfSemigroups(D, L, H);
378+
379+ return MagmaIsomorphismByFunctionsNC(S,
380+ SSS,
381+ x -> SSSE(SSS,
382+ Position(classes,
383+ DClass(S, x)),
384+ x),
385+ x -> x![ 3 ] );
386+ end );
0 commit comments