GAP (semigroups) - Chapter 15: Attributes and operations for semigroups

Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Bib Ind
[Top of Book] [Contents] [Previous Chapter] [Next Chapter]

[MathJax on]

15 Attributes and operations for semigroups
15.1 Random elements of a semigroup
15.1-1 Random
15.2 Expressing semigroup elements as words in generators
15.2-1 EvaluateWord
15.2-2 Factorization
15.2-3 MinimalFactorization
15.3 Generating sets
15.3-1 Generators
15.3-2 SmallGeneratingSet
15.3-3 IrredundantGeneratingSubset
15.4 Minimal ideals and multiplicative zeros
15.4-1 MinimalIdeal
15.4-2 RepresentativeOfMinimalIdeal
15.4-3 MultiplicativeZero
15.5 Group of units and identity elements
15.5-1 GroupOfUnits
15.6 Idempotents
15.6-1 Idempotents
15.6-2 NrIdempotents
15.6-3 IdempotentGeneratedSubsemigroup
15.7 Maximal subsemigroups
15.7-1 MaximalSubsemigroups
15.7-2 MaximalSubsemigroups
15.7-3 IsMaximalSubsemigroup
15.8 The normalizer of a semigroup
15.8-1 Normalizer
15.9 Attributes of transformation semigroups
15.9-1 ComponentRepsOfTransformationSemigroup
15.9-2 ComponentsOfTransformationSemigroup
15.9-3 CyclesOfTransformationSemigroup
15.9-4 IsTransitive
15.9-5 SmallestElementSemigroup
15.9-6 GeneratorsSmallest
15.10 Attributes of partial perm semigroups
15.10-1 ComponentRepsOfPartialPermSemigroup
15.10-2 ComponentsOfPartialPermSemigroup
15.10-3 CyclesOfPartialPerm
15.10-4 CyclesOfPartialPermSemigroup
15.11 Attributes of Rees (0-)matrix semigroups
15.11-1 RZMSDigraph
15.11-2 RZMSConnectedComponents
15.11-3 RZMSNormalization
15.11-4 RMSNormalization

### 15 Attributes and operations for semigroups

In this chapter we decribe the methods that are available in Semigroups for determining the attributes of a semigroup, and the operations which can be applied to a semigroup.

#### 15.1 Random elements of a semigroup

##### 15.1-1 Random

`‣ Random`( S ) | ( method )

Returns: A random element.

This function returns a random element of the semigroup S. If the elements of S have been calculated, then one of these is chosen randomly. Otherwise, if the data structure for S is known, then a random element of a randomly chosen \(\mathscr{R}\)-class is returned. If the data structure for S has not been calculated, then a short product (at most `2 * Length(GeneratorsOfSemigroup(S))`) of generators is returned.

#### 15.2 Expressing semigroup elements as words in generators

It is possible to express an element of a semigroup as a word in the generators of that semigroup. This section describes how to accomplish this in Semigroups.

##### 15.2-1 EvaluateWord

`‣ EvaluateWord`( gens, w ) | ( operation )

Returns: A semigroup element.

The argument gens should be a collection of generators of a semigroup and the argument w should be a list of positive integers less than or equal to the length of gens. This operation evaluates the word w in the generators gens. More precisely, `EvaluateWord` returns the equivalent of:

    Product(List(w, i -> gens[i]));

see also `Factorization` (15.2-2).

for elements of a semigroup

  When gens is a list of elements of a semigroup and w is a list of positive integers less than or equal to the length of gens, this operation returns the product `gens[w[1]] * gens[w[2]] * .. . * gens[w[n]]` when the length of w is `n`.

for elements of an inverse semigroup

  When gens is a list of elements with a semigroup inverse and w is a list of non-zero integers whose absolute value does not exceed the length of gens, this operation returns the product `gens[AbsInt(w[1])] ^ SignInt(w[1]) * .. . * gens[AbsInt(w[n])] ^ SignInt(w[n])` where `n` is the length of w.

Note that `EvaluateWord(gens, [])` returns `One(gens)` if gens belongs to the category `IsMultiplicativeElementWithOne` (Reference: IsMultiplicativeElementWithOne).

    gap> gens := [Transformation([2, 4, 4, 6, 8, 8, 6, 6]),
    > Transformation([2, 7, 4, 1, 4, 6, 5, 2]),
    > Transformation([3, 6, 2, 4, 2, 2, 2, 8]),
    > Transformation([4, 3, 6, 4, 2, 1, 2, 6]),
    > Transformation([4, 5, 1, 3, 8, 5, 8, 2])];;
    gap> S := Semigroup(gens);;
    gap> x := Transformation([1, 4, 6, 1, 7, 2, 7, 6]);;
    gap> word := Factorization(S, x);
    [ 4, 2 ]
    gap> EvaluateWord(gens, word);
    Transformation( [ 1, 4, 6, 1, 7, 2, 7, 6 ] )
    gap> S := SymmetricInverseMonoid(10);;
    gap> x := PartialPerm([1, 2, 3, 6, 8, 10], [2, 6, 7, 9, 1, 5]);
    [3,7][8,1,2,6,9][10,5]
    gap> word := Factorization(S, x);
    [ -2, -2, -2, -2, -3, -2, -2, -2, -2, -2, 5, 2, 5, 5, 2, 5, 2, 2, 2,
      2, -3, 2, 2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 3, 2 ]
    gap> EvaluateWord(GeneratorsOfSemigroup(S), word);
    [3,7][8,1,2,6,9][10,5]

##### 15.2-2 Factorization

`‣ Factorization`( S, x ) | ( operation )

Returns: A word in the generators.

for semigroups

  When S is a semigroup and x belongs to S, `Factorization` return a word in the generators of S that is equal to x. In this case, a word is a list of positive integers where an entry `i` corresponds to `GeneratorsOfSemigroups(S)[i]`. More specifically,

      EvaluateWord(GeneratorsOfSemigroup(S), Factorization(S, x)) = x;

for inverse semigroups

  When S is a inverse semigroup and x belongs to S, `Factorization` return a word in the generators of S that is equal to x. In this case, a word is a list of non-zero integers where an entry `i` corresponds to `GeneratorsOfSemigroup(S)[i]` and `-i` corresponds to `GeneratorsOfSemigroup(S)[i] ^ -1`. As in the previous case,

      EvaluateWord(GeneratorsOfSemigroup(S), Factorization(S, x)) = x;

Note that `Factorization` does not always return a word of minimum length; see `MinimalFactorization` (15.2-3).

See also `EvaluateWord` (15.2-1) and `GeneratorsOfSemigroup` (Reference: GeneratorsOfSemigroup).

    gap> gens := [Transformation([2, 2, 9, 7, 4, 9, 5, 5, 4, 8]),
    >             Transformation([4, 10, 5, 6, 4, 1, 2, 7, 1, 2])];;
    gap> S := Semigroup(gens);;
    gap> x := Transformation([1, 10, 2, 10, 1, 2, 7, 10, 2, 7]);;
    gap> word := Factorization(S, x);
    [ 2, 2, 1, 2 ]
    gap> EvaluateWord(gens, word);
    Transformation( [ 1, 10, 2, 10, 1, 2, 7, 10, 2, 7 ] )
    gap> S := SymmetricInverseMonoid(8);
    <symmetric inverse monoid of degree 8>
    gap> x := PartialPerm( [ 1, 2, 3, 4, 5, 8 ], [ 7, 1, 4, 3, 2, 6 ] );
    [5,2,1,7][8,6](3,4)
    gap> word := Factorization(S, x);
    [ -2, -2, -2, -2, -2, -2, 2, 4, 4, 2, 3, 2, -3, -2, -2, 3, 2, -3, -2,
      -2, 4, -3, -4, 2, 2, 3, -2, -3, 4, -3, -4, 2, 2, 3, -2, -3, 2, 2,
      3, -2, -3, 2, 2, 3, -2, -3, 4, -3, -4, 3, 2, -3, -2, -2, 3, 2, -3,
      -2, -2, 4, 3, -4, 3, 2, -3, -2, -2, 3, 2, -3, -2, -2, 3, 2, 2, 3,
      2, 2, 2, 2 ]
    gap> EvaluateWord(GeneratorsOfSemigroup(S), word);
    [5,2,1,7][8,6](3,4)
    gap> S := DualSymmetricInverseMonoid(6);;
    gap> x := S.1 * S.2 * S.3 * S.2 * S.1;
    <block bijection: [ 1, 6, -4 ], [ 2, -2, -3 ], [ 3, -5 ], [ 4, -6 ],
     [ 5, -1 ]>
    gap> word := Factorization(S, x);
    [ -2, -2, -2, -2, -2, 4, 2 ]
    gap> EvaluateWord(GeneratorsOfSemigroup(S), word);
    <block bijection: [ 1, 6, -4 ], [ 2, -2, -3 ], [ 3, -5 ], [ 4, -6 ],
     [ 5, -1 ]>

##### 15.2-3 MinimalFactorization

`‣ MinimalFactorization`( S, x ) | ( operation )

Returns: A minimal word in the generators.

This operation returns a minimal length word in the generators of the semigroup S that equals the element x. In this case, a word is a list of positive integers where an entry `i` corresponds to `GeneratorsOfSemigroups(S)[i]`. More specifically,

    EvaluateWord(GeneratorsOfSemigroup(S), MinimalFactorization(S, x)) = x;

`MinimalFactorization` involves exhaustively enumerating S until the element x is found, and so `MinimalFactorization` may be less efficient than `Factorization` (15.2-2) for some semigroups.

Unlike `Factorization` (15.2-2) this operation does not distinguish between semigroups and inverse semigroups. See also `EvaluateWord` (15.2-1) and `GeneratorsOfSemigroup` (Reference: GeneratorsOfSemigroup).

    gap> S := Semigroup(Transformation([2, 2, 9, 7, 4, 9, 5, 5, 4, 8]),
    >                   Transformation([4, 10, 5, 6, 4, 1, 2, 7, 1, 2]));
    <transformation semigroup of degree 10 with 2 generators>
    gap> x := Transformation( [ 8, 8, 2, 2, 9, 2, 8, 8, 9, 9 ] );
    Transformation( [ 8, 8, 2, 2, 9, 2, 8, 8, 9, 9 ] )
    gap> Factorization(S, x);
    [ 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 1, 2, 1 ]
    gap> MinimalFactorization(S, x);
    [ 1, 2, 1, 1, 1, 1, 2, 2, 1 ]

#### 15.3 Generating sets

##### 15.3-1 Generators

`‣ Generators`( S ) | ( attribute )

Returns: A list of generators.

`Generators` returns a generating set that can be used to define the semigroup S. The generators of a monoid or inverse semigroup S, say, can be defined in several ways, for example, including or excluding the identity element, including or not the inverses of the generators. `Generators` uses the definition that returns the least number of generators. If no generating set for S is known, then `GeneratorsOfSemigroup` is used by default.

for a group

  `Generators(S)` is a synonym for `GeneratorsOfGroup` (Reference: GeneratorsOfGroup).

for an ideal of semigroup

  `Generators(S)` is a synonym for `GeneratorsOfSemigroupIdeal` (7.2-1).

for a semigroup

  `Generators(S)` is a synonym for `GeneratorsOfSemigroup` (Reference: GeneratorsOfSemigroup).

for a monoid

  `Generators(S)` is a synonym for `GeneratorsOfMonoid` (Reference: GeneratorsOfMonoid).

for an inverse semigroup

  `Generators(S)` is a synonym for `GeneratorsOfInverseSemigroup` (Reference: GeneratorsOfInverseSemigroup).

for an inverse monoid

  `Generators(S)` is a synonym for `GeneratorsOfInverseMonoid` (Reference: GeneratorsOfInverseMonoid).

    gap> M := Monoid(Transformation([1, 4, 6, 2, 5, 3, 7, 8, 9, 9]),
    > Transformation([6, 3, 2, 7, 5, 1, 8, 8, 9, 9]));;
    gap> GeneratorsOfSemigroup(M);
    [ IdentityTransformation,
      Transformation( [ 1, 4, 6, 2, 5, 3, 7, 8, 9, 9 ] ),
      Transformation( [ 6, 3, 2, 7, 5, 1, 8, 8, 9, 9 ] ) ]
    gap> GeneratorsOfMonoid(M);
    [ Transformation( [ 1, 4, 6, 2, 5, 3, 7, 8, 9, 9 ] ),
      Transformation( [ 6, 3, 2, 7, 5, 1, 8, 8, 9, 9 ] ) ]
    gap> Generators(M);
    [ Transformation( [ 1, 4, 6, 2, 5, 3, 7, 8, 9, 9 ] ),
      Transformation( [ 6, 3, 2, 7, 5, 1, 8, 8, 9, 9 ] ) ]
    gap> S := Semigroup(Generators(M));;
    gap> Generators(S);
    [ Transformation( [ 1, 4, 6, 2, 5, 3, 7, 8, 9, 9 ] ),
      Transformation( [ 6, 3, 2, 7, 5, 1, 8, 8, 9, 9 ] ) ]
    gap> GeneratorsOfSemigroup(S);
    [ Transformation( [ 1, 4, 6, 2, 5, 3, 7, 8, 9, 9 ] ),
      Transformation( [ 6, 3, 2, 7, 5, 1, 8, 8, 9, 9 ] ) ]

##### 15.3-2 SmallGeneratingSet

`‣ SmallGeneratingSet`( coll ) | ( attribute )

`‣ SmallSemigroupGeneratingSet`( coll ) | ( attribute )

`‣ SmallMonoidGeneratingSet`( coll ) | ( attribute )

`‣ SmallInverseSemigroupGeneratingSet`( coll ) | ( attribute )

`‣ SmallInverseMonoidGeneratingSet`( coll ) | ( attribute )

Returns: A small generating set for a semigroup.

The attributes `SmallXGeneratingSet` return a relatively small generating subset of the collection of elements coll, which can also be a semigroup. The returned value of `SmallXGeneratingSet`, where applicable, has the property that

          X(SmallXGeneratingSet(coll))=X(coll);

where `X` is any of `Semigroup` (Reference: Semigroup), `Monoid` (Reference: Monoid), `InverseSemigroup` (Reference: InverseSemigroup), or `InverseMonoid` (Reference: InverseMonoid).

If the number of generators for S is already relatively small, then these functions will often return the original generating set. These functions may return different results in different GAP sessions.

`SmallGeneratingSet` returns the smallest of the returned values of `SmallXGeneratingSet` which is applicable to coll; see `Generators` (15.3-1).

As neither irredundancy, nor minimal length are proven, these functions usually return an answer much more quickly than `IrredundantGeneratingSubset` (15.3-3). These functions can be used whenever a small generating set is desired which does not necessarily needs to be minimal.

    gap> S := Semigroup( Transformation( [ 1, 2, 3, 2, 4 ] ),
    > Transformation( [ 1, 5, 4, 3, 2 ] ),
    > Transformation( [ 2, 1, 4, 2, 2 ] ),
    > Transformation( [ 2, 4, 4, 2, 1 ] ),
    > Transformation( [ 3, 1, 4, 3, 2 ] ),
    > Transformation( [ 3, 2, 3, 4, 1 ] ),
    > Transformation( [ 4, 4, 3, 3, 5 ] ),
    > Transformation( [ 5, 1, 5, 5, 3 ] ),
    > Transformation( [ 5, 4, 3, 5, 2 ] ),
    > Transformation( [ 5, 5, 4, 5, 5 ] ) );;
    gap> SmallGeneratingSet(S);
    [ Transformation( [ 1, 5, 4, 3, 2 ] ), Transformation( [ 3, 2, 3, 4, 1 ] ),
      Transformation( [ 5, 4, 3, 5, 2 ] ), Transformation( [ 1, 2, 3, 2, 4 ] ),
      Transformation( [ 4, 4, 3, 3, 5 ] ) ]
    gap> S := RandomInverseMonoid(10000,10);;
    gap> SmallGeneratingSet(S);
    [ [ 1 .. 10 ] -> [ 3, 2, 4, 5, 6, 1, 7, 10, 9, 8 ],
      [ 1 .. 10 ] -> [ 5, 10, 8, 9, 3, 2, 4, 7, 6, 1 ],
      [ 1, 3, 4, 5, 6, 7, 8, 9, 10 ] -> [ 1, 6, 4, 8, 2, 10, 7, 3, 9 ] ]
    gap> M := MathieuGroup(24);;
    gap> mat := List([1..1000], x-> Random(G));;
    gap> Append(mat, [1..1000]*0);
    gap> mat := List([1..138], x-> List([1..57], x-> Random(mat)));;
    gap> R := ReesZeroMatrixSemigroup(G, mat);;
    gap> U := Semigroup(List([1..200], x-> Random(R)));
    <subsemigroup of 57x138 Rees 0-matrix semigroup with 100 generators>
    gap> Length(SmallGeneratingSet(U));
    84
    gap> S := RandomBipartitionSemigroup(100,4);
    <bipartition semigroup on 4 pts with 96 generators>
    gap> Length(SmallGeneratingSet(S));
    13

##### 15.3-3 IrredundantGeneratingSubset

`‣ IrredundantGeneratingSubset`( coll ) | ( operation )

Returns: A list of irredundant generators.

If coll is a collection of elements of a semigroup, then this function returns a subset `U` of coll such that no element of `U` is generated by the other elements of `U`.

    gap> S := Semigroup( Transformation( [ 5, 1, 4, 6, 2, 3 ] ),
    > Transformation( [ 1, 2, 3, 4, 5, 6 ] ),
    > Transformation( [ 4, 6, 3, 4, 2, 5 ] ),
    > Transformation( [ 5, 4, 6, 3, 1, 3 ] ),
    > Transformation( [ 2, 2, 6, 5, 4, 3 ] ),
    > Transformation( [ 3, 5, 5, 1, 2, 4 ] ),
    > Transformation( [ 6, 5, 1, 3, 3, 4 ] ),
    > Transformation( [ 1, 3, 4, 3, 2, 1 ] ) );;
    gap> IrredundantGeneratingSubset(S);
    [ Transformation( [ 1, 3, 4, 3, 2, 1 ] ),
      Transformation( [ 2, 2, 6, 5, 4, 3 ] ),
      Transformation( [ 3, 5, 5, 1, 2, 4 ] ),
      Transformation( [ 5, 1, 4, 6, 2, 3 ] ),
      Transformation( [ 5, 4, 6, 3, 1, 3 ] ),
      Transformation( [ 6, 5, 1, 3, 3, 4 ] ) ]
    gap> S := RandomInverseMonoid(1000,10);
    <inverse partial perm monoid on 10 pts with 1000 generators>
    gap> SmallGeneratingSet(S);
    [ [ 1 .. 10 ] -> [ 6, 5, 1, 9, 8, 3, 10, 4, 7, 2 ],
      [ 1 .. 10 ] -> [ 1, 4, 6, 2, 8, 5, 7, 10, 3, 9 ],
      [ 1, 2, 3, 4, 6, 7, 8, 9 ] -> [ 7, 5, 10, 1, 8, 4, 9, 6 ]
      [ 1 .. 9 ] -> [ 4, 3, 5, 7, 10, 9, 1, 6, 8 ] ]
    gap> IrredundantGeneratingSubset(last);
    [ [ 1 .. 9 ] -> [ 4, 3, 5, 7, 10, 9, 1, 6, 8 ],
      [ 1 .. 10 ] -> [ 1, 4, 6, 2, 8, 5, 7, 10, 3, 9 ],
      [ 1 .. 10 ] -> [ 6, 5, 1, 9, 8, 3, 10, 4, 7, 2 ] ]
    gap> S := RandomBipartitionSemigroup(1000,4);
    <bipartition semigroup on 4 pts with 749 generators>
    gap> SmallGeneratingSet(S);
    [ <bipartition: [ 1, -3 ], [ 2, -2 ], [ 3, -1 ], [ 4, -4 ]>,
      <bipartition: [ 1, 3, -2 ], [ 2, -1, -3 ], [ 4, -4 ]>,
      <bipartition: [ 1, -4 ], [ 2, 4, -1, -3 ], [ 3, -2 ]>,
      <bipartition: [ 1, -1, -3 ], [ 2, -4 ], [ 3, 4, -2 ]>,
      <bipartition: [ 1, -2, -4 ], [ 2 ], [ 3, -3 ], [ 4, -1 ]>,
      <bipartition: [ 1, -2 ], [ 2, -1, -3 ], [ 3, 4, -4 ]>,
      <bipartition: [ 1, 3, -1 ], [ 2, -3 ], [ 4, -2, -4 ]>,
      <bipartition: [ 1, -1 ], [ 2, 4, -4 ], [ 3, -2, -3 ]>,
      <bipartition: [ 1, 3, -1 ], [ 2, -2 ], [ 4, -3, -4 ]>,
      <bipartition: [ 1, 2, -2 ], [ 3, -1, -4 ], [ 4, -3 ]>,
      <bipartition: [ 1, -2, -3 ], [ 2, -4 ], [ 3 ], [ 4, -1 ]>,
      <bipartition: [ 1, -1 ], [ 2, 4, -3 ], [ 3, -2 ], [ -4 ]>,
      <bipartition: [ 1, -3 ], [ 2, -1 ], [ 3, 4, -4 ], [ -2 ]>,
      <bipartition: [ 1, 2, -4 ], [ 3, -1 ], [ 4, -2 ], [ -3 ]>,
      <bipartition: [ 1, -3 ], [ 2, -4 ], [ 3, -1, -2 ], [ 4 ]> ]
    gap> IrredundantGeneratingSubset(last);
    [ <bipartition: [ 1, 2, -4 ], [ 3, -1 ], [ 4, -2 ], [ -3 ]>,
      <bipartition: [ 1, 3, -1 ], [ 2, -2 ], [ 4, -3, -4 ]>,
      <bipartition: [ 1, 3, -2 ], [ 2, -1, -3 ], [ 4, -4 ]>,
      <bipartition: [ 1, -1 ], [ 2, 4, -3 ], [ 3, -2 ], [ -4 ]>,
      <bipartition: [ 1, -3 ], [ 2, -1 ], [ 3, 4, -4 ], [ -2 ]>,
      <bipartition: [ 1, -3 ], [ 2, -2 ], [ 3, -1 ], [ 4, -4 ]>,
      <bipartition: [ 1, -3 ], [ 2, -4 ], [ 3, -1, -2 ], [ 4 ]>,
      <bipartition: [ 1, -2, -3 ], [ 2, -4 ], [ 3 ], [ 4, -1 ]>,
      <bipartition: [ 1, -2, -4 ], [ 2 ], [ 3, -3 ], [ 4, -1 ]> ]

#### 15.4 Minimal ideals and multiplicative zeros

In this section we describe the attributes of a semigroup that can be found using the Semigroups package.

##### 15.4-1 MinimalIdeal

`‣ MinimalIdeal`( S ) | ( attribute )

Returns: The minimal ideal of a semigroup.

The minimal ideal of a semigroup is the least ideal with respect to containment.

It is significantly easier to find the minimal \(\mathscr{D}\)-class of a semigroup, than to find its \(\mathscr{D}\)-classes.

See also `RepresentativeOfMinimalIdeal` (15.4-2), `PartialOrderOfDClasses` (14.1-10), `IsGreensLessThanOrEqual` (Reference: IsGreensLessThanOrEqual), and `MinimalDClass` (14.1-6).

    gap> S := Semigroup(
    > Transformation( [ 3, 4, 1, 3, 6, 3, 4, 6, 10, 1 ] ),
    > Transformation( [ 8, 2, 3, 8, 4, 1, 3, 4, 9, 7 ] ));;
    gap> MinimalIdeal(S);
    <simple transformation semigroup ideal of degree 10 with 1 generator>
    gap> Elements(MinimalIdeal(S));
    [ Transformation( [ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 ] ),
      Transformation( [ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 ] ),
      Transformation( [ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 ] ),
      Transformation( [ 6, 6, 6, 6, 6, 6, 6, 6, 6, 6 ] ),
      Transformation( [ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 ] ) ]
    gap> x := Transformation( [ 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 ] );;
    gap> D := DClass(S, x);;
    gap> ForAll(GreensDClasses(S), x-> IsGreensLessThanOrEqual(D, x));
    true
    gap> MinimalIdeal(POI(10));
    <partial perm group of rank 10>
    gap> MinimalIdeal(BrauerMonoid(6));
    <simple bipartition semigroup ideal of degree 6 with 1 generator>

##### 15.4-2 RepresentativeOfMinimalIdeal

`‣ RepresentativeOfMinimalIdeal`( S ) | ( attribute )

`‣ RepresentativeOfMinimalDClass`( S ) | ( attribute )

Returns: An element of the minimal ideal of a semigroup.

The minimal ideal of a semigroup is the least ideal with respect to containment.

This method returns a representative element of the minimal ideal of S without having to create the minimal ideal itself. In general, beyond being a member of the minimal ideal, the returned element is not guaranteed to have any special properties. However, the element will coincide with the zero element of S if one exists.

This method works particularly well if S is a semigroup of transformations or partial permutations.

See also `MinimalIdeal` (15.4-1) and `MinimalDClass` (14.1-6).

    gap> S := SymmetricInverseSemigroup(10);;
    gap> RepresentativeOfMinimalIdeal(S);
    <empty partial perm>
    gap> B := Semigroup([
    > Bipartition( [ [ 1, 2 ], [ 3, 6, -2 ], [ 4, 5, -3, -4 ],
    >  [ -1, -6 ], [ -5 ] ] ),
    > Bipartition( [ [ 1, -1 ], [ 2 ], [ 3 ], [ 4, -3 ],
    >  [ 5, 6, -5, -6 ], [ -2, -4 ] ] ) ]);;
    gap> RepresentativeOfMinimalIdeal(B);
    <bipartition: [ 1, 2 ], [ 3, 6 ], [ 4, 5 ], [ -1, -5, -6 ],
     [ -2, -4 ], [ -3 ]>
    gap> S := Semigroup(Transformation( [ 5, 1, 6, 2, 2, 4 ] ),
    >                   Transformation( [ 3, 5, 5, 1, 6, 2 ] ));;
    gap> RepresentativeOfMinimalDClass(S);
    Transformation( [ 1, 2, 2, 5, 5, 1 ] )
    gap> MinimalDClass(S);
    <Green's D-class: Transformation( [ 1, 2, 2, 5, 5, 1 ] )>

##### 15.4-3 MultiplicativeZero

`‣ MultiplicativeZero`( S ) | ( attribute )

Returns: The zero element of a semigroup.

`MultiplicativeZero` returns the zero element of the semigroup S if it exists and `fail` if it does not. See also `MultiplicativeZero` (Reference: MultiplicativeZero).

    gap> S := Semigroup( Transformation( [ 1, 4, 2, 6, 6, 5, 2 ] ),
    >                    Transformation( [ 1, 6, 3, 6, 2, 1, 6 ] ));;
    gap> MultiplicativeZero(S);
    Transformation( [ 1, 1, 1, 1, 1, 1, 1 ] )
    gap> S := Semigroup(Transformation( [ 2, 8, 3, 7, 1, 5, 2, 6 ] ),
    >                   Transformation( [ 3, 5, 7, 2, 5, 6, 3, 8 ] ),
    >                   Transformation( [ 6, 7, 4, 1, 4, 1, 6, 2 ] ),
    >                   Transformation( [ 8, 8, 5, 1, 7, 5, 2, 8 ] ));;
    gap> MultiplicativeZero(S);
    fail
    gap> S := InverseSemigroup(
    > PartialPerm( [ 1, 3, 4 ], [ 5, 3, 1 ] ),
    > PartialPerm( [ 1, 2, 3, 4 ], [ 4, 3, 1, 2 ] ),
    > PartialPerm( [ 1, 3, 4, 5 ], [ 2, 4, 5, 3 ] ) );;
    gap> MultiplicativeZero(S);
    <empty partial perm>
    gap> S := PartitionMonoid(6);
    <regular bipartition monoid of degree 6 with 4 generators>
    gap> MultiplicativeZero(S);
    fail
    gap> S := DualSymmetricInverseMonoid(6);
    <inverse bipartition monoid of degree 6 with 3 generators>
    gap> MultiplicativeZero(S);
    <block bijection: [ 1, 2, 3, 4, 5, 6, -1, -2, -3, -4, -5, -6 ]>

#### 15.5 Group of units and identity elements

##### 15.5-1 GroupOfUnits

`‣ GroupOfUnits`( S ) | ( attribute )

Returns: The group of units of a semigroup or `fail`.

`GroupOfUnits` returns the group of units of the semigroup S as a subsemigroup of S if it exists and returns `fail` if it does not. Use `IsomorphismPermGroup` (6.5-2) if you require a permutation representation of the group of units.

If a semigroup S has an identity `e`, then the group of units of S is the set of those `s` in S such that there exists `t` in S where `s*t=t*s=e`. Equivalently, the group of units is the \(\mathscr{H}\)-class of the identity of S.

See also `GreensHClassOfElement` (Reference: GreensHClassOfElement), `IsMonoidAsSemigroup` (17.1-11), and `MultiplicativeNeutralElement` (Reference: MultiplicativeNeutralElement).

    gap> S := Semigroup(
    > Transformation( [ 1, 2, 5, 4, 3, 8, 7, 6 ] ),
    > Transformation( [ 1, 6, 3, 4, 7, 2, 5, 8 ] ),
    > Transformation( [ 2, 1, 6, 7, 8, 3, 4, 5 ] ),
    > Transformation( [ 3, 2, 3, 6, 1, 6, 1, 2 ] ),
    > Transformation( [ 5, 2, 3, 6, 3, 4, 7, 4 ] ) );;
    gap> Size(S);
    5304
    gap> StructureDescription(GroupOfUnits(S));
    "C2 x S4"
    gap> S := InverseSemigroup(
    > PartialPerm( [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ],
    >              [ 2, 4, 5, 3, 6, 7, 10, 9, 8, 1 ] ),
    > PartialPerm( [ 1, 2, 3, 4, 5, 6, 7, 8, 10 ],
    >              [ 8, 2, 3, 1, 4, 5, 10, 6, 9 ] ) );;
    gap> StructureDescription(GroupOfUnits(S));
    "C8"
    gap> S := InverseSemigroup(
    > PartialPerm( [ 1, 3, 4 ], [ 4, 3, 5 ] ),
    > PartialPerm( [ 1, 2, 3, 5 ], [ 3, 1, 5, 2 ] ) );;
    gap> GroupOfUnits(S);
    fail
    gap> S := Semigroup(
    > Bipartition( [ [ 1, 2, 3, -1, -3 ], [ -2 ] ] ),
    > Bipartition( [ [ 1, -1 ], [ 2, 3, -2, -3 ] ] ),
    > Bipartition( [ [ 1, -2 ], [ 2, -3 ], [ 3, -1 ] ] ),
    > Bipartition( [ [ 1 ], [ 2, 3, -2 ], [ -1, -3 ] ] ) );;
    gap> StructureDescription(GroupOfUnits(S));
    "C3"

#### 15.6 Idempotents

##### 15.6-1 Idempotents

`‣ Idempotents`( obj[, n] ) | ( attribute )

Returns: A list of idempotents.

The argument obj should be a semigroup, \(\mathscr{D}\)-class, \(\mathscr{H}\)-class, \(\mathscr{L}\)-class, or \(\mathscr{R}\)-class.

If the optional second argument n is present and obj is a semigroup, then a list of the idempotents in obj of rank n is returned. If you are only interested in the idempotents of a given rank, then the second version of the function will probably be faster. However, if the optional second argument is present, then nothing is stored in obj and so every time the function is called the computation must be repeated.

This functions produce essentially the same output as the GAP library function with the same name; see `Idempotents` (Reference: Idempotents). The main difference is that this function can be applied to a wider class of objects as described above.

See also `IsRegularDClass` (Reference: IsRegularDClass), `IsRegularClass` (14.3-2) `IsGroupHClass` (Reference: IsGroupHClass), `NrIdempotents` (15.6-2), and `GroupHClass` (14.4-1).

    gap> S := Semigroup(Transformation([2, 3, 4, 1]),
    >                   Transformation([3, 3, 1, 1]));;
    gap> Idempotents(S, 1);
    [  ]
    gap> AsSet(Idempotents(S, 2));
    [ Transformation( [ 1, 1, 3, 3 ] ), Transformation( [ 1, 3, 3, 1 ] ),
      Transformation( [ 2, 2, 4, 4 ] ), Transformation( [ 4, 2, 2, 4 ] ) ]
    gap> AsSet(Idempotents(S));
    [ Transformation( [ 1, 1, 3, 3 ] ), IdentityTransformation,
      Transformation( [ 1, 3, 3, 1 ] ), Transformation( [ 2, 2, 4, 4 ] ),
      Transformation( [ 4, 2, 2, 4 ] ) ]
    gap> x := Transformation([2, 2, 4, 4]);;
    gap> R := GreensRClassOfElement(S, x);;
    gap> Idempotents(R);
    [ Transformation( [ 1, 1, 3, 3 ] ), Transformation( [ 2, 2, 4, 4 ] ) ]
    gap> x := Transformation([4, 2, 2, 4]);;
    gap> L := GreensLClassOfElement(S, x);;
    gap> AsSet(Idempotents(L));
    [ Transformation( [ 2, 2, 4, 4 ] ), Transformation( [ 4, 2, 2, 4 ] ) ]
    gap> D := DClassOfLClass(L);;
    gap> AsSet(Idempotents(D));
    [ Transformation( [ 1, 1, 3, 3 ] ), Transformation( [ 1, 3, 3, 1 ] ),
      Transformation( [ 2, 2, 4, 4 ] ), Transformation( [ 4, 2, 2, 4 ] ) ]
    gap> L := GreensLClassOfElement(S, Transformation([3, 1, 1, 3]));;
    gap> AsSet(Idempotents(L));
    [ Transformation( [ 1, 1, 3, 3 ] ), Transformation( [ 1, 3, 3, 1 ] ) ]
    gap> H := GroupHClass(D);
    <Green's H-class: Transformation( [ 1, 1, 3, 3 ] )>
    gap> Idempotents(H);
    [ Transformation( [ 1, 1, 3, 3 ] ) ]
    gap> S := InverseSemigroup(
    > PartialPerm([1, 2, 3, 4, 5, 7],
    >             [10, 6, 3, 4, 9, 1]),
    > PartialPerm([1, 2, 3, 4, 5, 6, 7, 8],
    >             [6, 10, 7, 4, 8, 2, 9, 1]));;
    gap> Idempotents(S, 1);
    [ <identity partial perm on [ 4 ]> ]
    gap> Idempotents(S, 0);
    [  ]

##### 15.6-2 NrIdempotents

`‣ NrIdempotents`( obj ) | ( attribute )

Returns: A positive integer.

This function returns the number of idempotents in obj where obj can be a semigroup, \(\mathscr{D}\)-, \(\mathscr{L}\)-, \(\mathscr{H}\)-, or \(\mathscr{R}\)-class. If the actual idempotents are not required, then it is more efficient to use `NrIdempotents(obj)` than `Length(Idempotents(obj))` since the idempotents themselves are not created when `NrIdempotents` is called.

See also `Idempotents` (Reference: Idempotents) and `Idempotents` (15.6-1), `IsRegularDClass` (Reference: IsRegularDClass), `IsRegularClass` (14.3-2) `IsGroupHClass` (Reference: IsGroupHClass), and `GroupHClass` (14.4-1).

    gap> S := Semigroup(Transformation([2, 3, 4, 1]),
    >                   Transformation([3, 3, 1, 1]));;
    gap> NrIdempotents(S);
    5
    gap> f := Transformation([2, 2, 4, 4]);;
    gap> R := GreensRClassOfElement(S, f);;
    gap> NrIdempotents(R);
    2
    gap> f := Transformation([4, 2, 2, 4]);;
    gap> L := GreensLClassOfElement(S, f);;
    gap> NrIdempotents(L);
    2
    gap> D := DClassOfLClass(L);;
    gap> NrIdempotents(D);
    4
    gap> L := GreensLClassOfElement(S, Transformation([3, 1, 1, 3]));;
    gap> NrIdempotents(L);
    2
    gap> H := GroupHClass(D);;
    gap> NrIdempotents(H);
    1
    gap> S := InverseSemigroup(
    > PartialPerm([1, 2, 3, 5, 7, 9, 10],
    >              [6, 7, 2, 9, 1, 5, 3]),
    > PartialPerm([1, 2, 3, 5, 6, 7, 9, 10],
    >             [8, 1, 9, 4, 10, 5, 6, 7]));;
    gap> NrIdempotents(S);
    236
    gap> f := PartialPerm([2, 3, 7, 9, 10],
    >                     [7, 2, 1, 5, 3]);;
    gap> D := DClassNC(S, f);;
    gap> NrIdempotents(D);
    13

##### 15.6-3 IdempotentGeneratedSubsemigroup

`‣ IdempotentGeneratedSubsemigroup`( S ) | ( attribute )

Returns: A semigroup.

`IdempotentGeneratedSubsemigroup` returns the subsemigroup of the semigroup S generated by the idempotents of S.

See also `Idempotents` (15.6-1) and `SmallGeneratingSet` (15.3-2).

    gap> S := Semigroup(
    >  Transformation( [ 1, 1 ] ),
    >  Transformation( [ 2, 1 ] ),
    >  Transformation( [ 1, 2, 2 ] ),
    >  Transformation( [ 1, 2, 3, 4, 5, 1 ] ),
    >  Transformation( [ 1, 2, 3, 4, 5, 5 ] ),
    >  Transformation( [ 1, 2, 3, 4, 6, 5 ] ),
    >  Transformation( [ 1, 2, 3, 5, 4 ] ),
    >  Transformation( [ 1, 2, 3, 7, 4, 5, 7 ] ),
    >  Transformation( [ 1, 2, 4, 8, 8, 3, 8, 7 ] ),
    >  Transformation( [ 1, 2, 8, 4, 5, 6, 7, 8 ] ),
    >  Transformation( [ 7, 7, 7, 4, 5, 6, 1 ] ) );;
    gap> IdempotentGeneratedSubsemigroup(S);
    <transformation monoid of degree 8 with 19 generators>
    gap> S := SymmetricInverseSemigroup(5);
    <symmetric inverse monoid of degree 5>
    gap> IdempotentGeneratedSubsemigroup(S);
    <inverse partial perm monoid of rank 5 with 5 generators>
    gap> S := DualSymmetricInverseSemigroup(5);
    <inverse bipartition monoid of degree 5 with 3 generators>
    gap> IdempotentGeneratedSubsemigroup(S);
    <inverse bipartition monoid of degree 5 with 10 generators>
    gap> IsSemilattice(last);
    true

#### 15.7 Maximal subsemigroups

##### 15.7-1 MaximalSubsemigroups

`‣ MaximalSubsemigroups`( S ) | ( attribute )

Returns: The maximal subsemigroups of S.

If S is a semigroup, then `MaximalSubsemigroups` returns a list of the maximal subsemigroups of S.

A maximal subsemigroup of S is a proper subsemigroup of S which is contained in no other proper subsemigroups of S.

The method for this function are based on [GGR68].

    gap> S := FullTransformationSemigroup(4);
    <full transformation monoid of degree 4>
    gap> MaximalSubsemigroups(S);
    [ <transformation semigroup of degree 4 with 3 generators>,
      <transformation semigroup of degree 4 with 5 generators>,
      <transformation semigroup of degree 4 with 4 generators>,
      <transformation semigroup of degree 4 with 4 generators>,
      <transformation semigroup of degree 4 with 5 generators>,
      <transformation semigroup of degree 4 with 5 generators>,
      <transformation semigroup of degree 4 with 5 generators>,
      <transformation semigroup of degree 4 with 5 generators>,
      <transformation semigroup of degree 4 with 4 generators> ]
    gap> D := DClass(S, Transformation([2, 2]));
    <Green's D-class: Transformation( [ 2, 3, 1, 2 ] )>
    gap> R := PrincipalFactor(D);
    <Rees 0-matrix semigroup 6x4 over Group([ (1,2,3), (1,2) ])>
    gap> MaximalSubsemigroups(R);
    [ <Rees 0-matrix semigroup 6x3 over Group([ (1,2,3), (1,2) ])>,
      <Rees 0-matrix semigroup 6x3 over Group([ (1,2,3), (1,2) ])>,
      <Rees 0-matrix semigroup 6x3 over Group([ (1,2,3), (1,2) ])>,
      <Rees 0-matrix semigroup 6x3 over Group([ (1,2,3), (1,2) ])>,
      <Rees 0-matrix semigroup 5x4 over Group([ (1,2,3), (1,2) ])>,
      <Rees 0-matrix semigroup 5x4 over Group([ (1,2,3), (1,2) ])>,
      <Rees 0-matrix semigroup 5x4 over Group([ (1,2,3), (1,2) ])>,
      <Rees 0-matrix semigroup 5x4 over Group([ (1,2,3), (1,2) ])>,
      <Rees 0-matrix semigroup 5x4 over Group([ (1,2,3), (1,2) ])>,
      <Rees 0-matrix semigroup 5x4 over Group([ (1,2,3), (1,2) ])>,
      <subsemigroup of 6x4 Rees 0-matrix semigroup with 23 generators>,
      <subsemigroup of 6x4 Rees 0-matrix semigroup with 23 generators>,
      <subsemigroup of 6x4 Rees 0-matrix semigroup with 21 generators>,
      <subsemigroup of 6x4 Rees 0-matrix semigroup with 23 generators>,
      <subsemigroup of 6x4 Rees 0-matrix semigroup with 21 generators>,
      <subsemigroup of 6x4 Rees 0-matrix semigroup with 21 generators>,
      <subsemigroup of 6x4 Rees 0-matrix semigroup with 23 generators>,
      <subsemigroup of 6x4 Rees 0-matrix semigroup with 21 generators>,
      <subsemigroup of 6x4 Rees 0-matrix semigroup with 21 generators>,
      <subsemigroup of 6x4 Rees 0-matrix semigroup with 21 generators> ]

##### 15.7-2 MaximalSubsemigroups

`‣ MaximalSubsemigroups`( R, H ) | ( operation )

Returns: The maximal subsemigroups of a Rees (0)-matrix semigroup corresponding to a maximal subgroup of the underlying group.

Suppose that R is a regular Rees (0-)matrix semigroup of the form mathcalM[G; I, J; P] where G is a group and P is a |J| by |I| matrix with entries in G∪{0} . If H is a maximal subgroup of G, then this function returns the maximal subsemigroups of R which are isomorphic to mathcalM[H; I, J; P].

The method used in this function is based on Remark 1 of [GGR68].

    gap> R := ReesZeroMatrixSemigroup(Group([(1, 2), (3, 4)]),
    > [ [ (), (1,2) ], [ (), (1,2) ] ]);
    <Rees 0-matrix semigroup 2x2 over Group([ (1,2), (3,4) ])>
    gap> G := UnderlyingSemigroup(R);
    Group([ (1,2), (3,4) ])
    gap> H := Group((1,2));
    Group([ (1,2) ])
    gap> max := MaximalSubsemigroups(R, H);
    [ <subsemigroup of 2x2 Rees 0-matrix semigroup with 6 generators> ]
    gap> IsMaximalSubsemigroup(R, max[1]);
    true

##### 15.7-3 IsMaximalSubsemigroup

`‣ IsMaximalSubsemigroup`( S, T ) | ( operation )

Returns: `true` or `false`.

If S and T are semigroups, then `IsMaximalSubsemigroup` returns true if and only if T is a maximal subsemigroup of S.

A proper subsemigroup T of a semigroup S is a maximal if T is not contained in any other proper subsemigroups of S.

    gap> S := FullTransformationSemigroup(4);
    <full transformation monoid of degree 4>
    gap> T := Semigroup(Transformation([3, 4, 1, 2]),
    >                   Transformation([1, 4, 2, 3]),
    >                   Transformation([2, 1, 1, 3]));
    <transformation semigroup of degree 4 with 3 generators>
    gap> IsMaximalSubsemigroup(S, T);
    true
    gap> R := Semigroup(Transformation([3, 4, 1, 2]),
    >                   Transformation([1, 4, 2, 2]),
    >                   Transformation([2, 1, 1, 3]));
    <transformation semigroup of degree 4 with 3 generators>
    gap> IsMaximalSubsemigroup(S, R);
    false

#### 15.8 The normalizer of a semigroup

##### 15.8-1 Normalizer

`‣ Normalizer`( G, S[, opts] ) | ( operation )

`‣ Normalizer`( S[, opts] ) | ( operation )

Returns: A permutation group.

In its first form, this function returns the normalizer of the transformation, partial perm, or bipartition semigroup S in the permutation group G. In its second form, the normalizer of S in the symmetric group on `[1 .. n]` where `n` is the degree of S is returned.

The normalizer of a transformation semigroup S in a permutation group G in the subgroup `H` of G consisting of those elements in `g` in G conjugating S to S, i.e. `S ^ g = S`.

Analogous definitions can be given for a partial perm and bipartition semigroups.

The method used by this operation is based on Section 3 in [ABMN10].

The optional final argument opts allows you to specify various options, which determine how the normalizer is calculated. The values of these options can dramatically change the time it takes for this operation to complete. In different situations, different options give the best performance.

The argument opts should be a record, and the available options are:

random

  If this option has the value `true`, then the non-deterministic algorithms in genss are used in `Normalizer`. So, there is some chance that `Normalizer` will return an incorrect result in this case, but these methods can also be much faster than the deterministic algorithms which are used if this option is `false`.

  The default value for this option is `false`.

lambdastab

  If this option has the value `true`, then `Normalizer` initially finds the setwise stabilizer of the images or right blocks of the semigroup S. Sometimes this improves the performance of `Normalizer` and sometimes it does not. If this option in `false`, then this setwise stabilizer is not found.

  The default value for this option is `true`.

rhostab

  If this option has the value `true`, then `Normalizer` initially finds the setwise stabilizer of the kernels, domains, or left blocks of the semigroup S. Sometimes this improves the performance of `Normalizer` and sometimes it does not. If this option is `false`, the this setwise stabilizer is not found.

  If S is an inverse semigroup, then this option is ignored.

  The default value for this option is `true`.

    gap> S := BrauerMonoid(8);
    <regular bipartition monoid on 8 pts with 3 generators>
    gap> StructureDescription(Normalizer(S));
    "S8"
    gap> S := InverseSemigroup(
    > PartialPerm([1, 2, 3, 4, 5], [2, 5, 6, 3, 8]),
    > PartialPerm([1, 2, 4, 7, 8], [3, 6, 2, 5, 7]));;
    gap> Normalizer(S, rec(random:=true, lambdastab:=false));
    #I  Have 33389 points.
    #I  Have 40136 points in new orbit.
    Group(())

#### 15.9 Attributes of transformation semigroups

##### 15.9-1 ComponentRepsOfTransformationSemigroup

`‣ ComponentRepsOfTransformationSemigroup`( S ) | ( attribute )

Returns: The representatives of components of a transformation semigroup.

This function returns the representatives of the components of the action of the transformation semigroup S on the set of positive integers not greater than the degree of S.

The representatives are the least set of points such that every point can be reached from some representative under the action of S.

    gap> S := Semigroup(
    > Transformation([11, 11, 9, 6, 4, 1, 4, 1, 6, 7, 12, 5]),
    > Transformation([12, 10, 7, 10, 4, 1, 12, 9, 11, 9, 1, 12]));;
    gap> ComponentRepsOfTransformationSemigroup(S);
    [ 2, 3, 8 ]

##### 15.9-2 ComponentsOfTransformationSemigroup

`‣ ComponentsOfTransformationSemigroup`( S ) | ( attribute )

Returns: The components of a transformation semigroup.

This function returns the components of the action of the transformation semigroup S on the set of positive integers not greater than the degree of S; the components of S partition this set.

    gap> S := Semigroup(
    > Transformation([11, 11, 9, 6, 4, 1, 4, 1, 6, 7, 12, 5]),
    > Transformation([12, 10, 7, 10, 4, 1, 12, 9, 11, 9, 1, 12]));;
    gap> ComponentsOfTransformationSemigroup(S);
    [ [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 ] ]

##### 15.9-3 CyclesOfTransformationSemigroup

`‣ CyclesOfTransformationSemigroup`( S ) | ( attribute )

Returns: The cycles of a transformation semigroup.

This function returns the cycles, or strongly connected components, of the action of the transformation semigroup S on the set of positive integers not greater than the degree of S.

    gap> S := Semigroup(
    > Transformation([11, 11, 9, 6, 4, 1, 4, 1, 6, 7, 12, 5]),
    > Transformation([12, 10, 7, 10, 4, 1, 12, 9, 11, 9, 1, 12]));;
    gap> CyclesOfTransformationSemigroup(S);
    [ [ 12 ], [ 1, 11 ], [ 1, 11, 12, 5, 4, 6 ],
      [ 1, 11, 12, 5, 4, 10, 9, 6 ], [ 1, 12, 5, 4, 6 ],
      [ 1, 12, 5, 4, 10, 9, 6 ], [ 1, 12, 5, 4, 10, 9, 11 ],
      [ 11, 12, 5, 4, 10, 9 ], [ 12, 5, 4, 10, 7 ], [ 4, 10, 7 ] ]

##### 15.9-4 IsTransitive

`‣ IsTransitive`( S[, X] ) | ( operation )

`‣ IsTransitive`( S[, n] ) | ( operation )

Returns: `true` or `false`.

A transformation semigroup S is transitive or strongly connected on the set X if for every `i, j` in X there is an element `s` in S such that `i ^ s = j`.

If the optional second argument is a positive integer n, then `IsTransitive` returns `true` if S is transitive on `[1 .. n]`, and `false` if it is not.

If the optional second argument is not provided, then the degree of S is used by default; see `DegreeOfTransformationSemigroup` (Reference: DegreeOfTransformationSemigroup).

    gap> S := Semigroup([Bipartition([[1, 2], [3, 6, -2],
    > [4, 5, -3, -4], [-1, -6], [-5]]),
    > Bipartition([[1, -4], [2, 3, 4, 5], [6], [-1, -6],
    > [-2, -3], [-5]])]);
    <bipartition semigroup of degree 6 with 2 generators>
    gap> AsTransformationSemigroup(S);
    <transformation semigroup of degree 12 with 2 generators>
    gap> IsTransitive(last);
    false
    gap> IsTransitive(AsSemigroup(Group((1,2,3))));
    true

##### 15.9-5 SmallestElementSemigroup

`‣ SmallestElementSemigroup`( S ) | ( attribute )

`‣ LargestElementSemigroup`( S ) | ( attribute )

Returns: A transformation.

These attributes return the smallest and largest element of the transformation semigroup S, respectively. Smallest means the first element in the sorted set of elements of S and largest means the last element in the set of elements.

It is not necessary to find the elements of the semigroup to determine the smallest or largest element, and this function has considerable better performance than the equivalent `Elements(S)[1]` and `Elements(S)[Size(S)]`.

    gap> S := Monoid(
    > Transformation([1, 4, 11, 11, 7, 2, 6, 2, 5, 5, 10]),
    > Transformation([2, 4, 4, 2, 10, 5, 11, 11, 11, 6, 7]));
    <transformation monoid of degree 11 with 2 generators>
    gap> SmallestElementSemigroup(S);
    IdentityTransformation
    gap> LargestElementSemigroup(S);
    Transformation( [ 11, 11, 10, 10, 7, 6, 5, 6, 2, 2, 4 ] )

##### 15.9-6 GeneratorsSmallest

`‣ GeneratorsSmallest`( S ) | ( attribute )

Returns: A generating set of transformations.

`GeneratorsSmallest` returns the lexicographically least collection `X` of transformations such that S is generated by `X` and each `X[i]` is not generated by `X[1], X[2], ..., X[i-1]`.

Note that it can be difficult to find this set of generators, and that it might contain a substantial proportion of the elements of the semigroup.

The comparison of two transformation semigroups via the lexicographic comparison of their sets of elements is the same relation as the lexicographic comparison of their `GeneratorsSmallest`. However, due to the complexity of determining the `GeneratorsSmallest`, this is not the method used by the Semigroups package when comparing transformation semigroups.

    gap> S := Monoid(
    > Transformation([1, 3, 4, 1]), Transformation([2, 4, 1, 2]),
    > Transformation([3, 1, 1, 3]), Transformation([3, 3, 4, 1]));
    <transformation monoid of degree 4 with 4 generators>
    gap> GeneratorsSmallest(S);
    [ Transformation( [ 1, 1, 1, 1 ] ), Transformation( [ 1, 1, 1, 2 ] ),
      Transformation( [ 1, 1, 1, 3 ] ), Transformation( [ 1, 1, 1 ] ),
      Transformation( [ 1, 1, 2, 1 ] ), Transformation( [ 1, 1, 2, 2 ] ),
      Transformation( [ 1, 1, 3, 1 ] ), Transformation( [ 1, 1, 3, 3 ] ),
      Transformation( [ 1, 1 ] ), Transformation( [ 1, 1, 4, 1 ] ),
      Transformation( [ 1, 2, 1, 1 ] ), Transformation( [ 1, 2, 2, 1 ] ),
      IdentityTransformation, Transformation( [ 1, 3, 1, 1 ] ),
      Transformation( [ 1, 3, 4, 1 ] ), Transformation( [ 2, 1, 1, 2 ] ),
      Transformation( [ 2, 2, 2 ] ), Transformation( [ 2, 4, 1, 2 ] ),
      Transformation( [ 3, 3, 3 ] ), Transformation( [ 3, 3, 4, 1 ] ) ]

#### 15.10 Attributes of partial perm semigroups

##### 15.10-1 ComponentRepsOfPartialPermSemigroup

`‣ ComponentRepsOfPartialPermSemigroup`( S ) | ( attribute )

Returns: The representatives of components of a partial perm semigroup.

This function returns the representatives of the components of the action of the partial perm semigroup S on the set of positive integers where it is defined.

The representatives are the least set of points such that every point can be reached from some representative under the action of S.

    gap> S := Semigroup(
    > PartialPerm([1, 2, 3, 5, 6, 7, 8, 11, 12, 16, 19],
    >     [9, 18, 20, 11, 5, 16, 8, 19, 14, 13, 1]),
    >  PartialPerm([1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 14, 16, 18, 19, 20],
    >     [13, 1, 8, 5, 4, 14, 11, 12, 9, 20, 2, 18, 7, 3, 19]));;
    gap> ComponentRepsOfPartialPermSemigroup(S);
    [ 1, 4, 6, 10, 15, 17 ]

##### 15.10-2 ComponentsOfPartialPermSemigroup

`‣ ComponentsOfPartialPermSemigroup`( S ) | ( attribute )

Returns: The components of a partial perm semigroup.

This function returns the components of the action of the partial perm semigroup S on the set of positive integers where it is defined; the components of S partition this set.

    gap> S := Semigroup(
    > PartialPerm([1, 2, 3, 5, 6, 7, 8, 11, 12, 16, 19],
    >     [9, 18, 20, 11, 5, 16, 8, 19, 14, 13, 1]),
    >  PartialPerm([1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 14, 16, 18, 19, 20],
    >     [13, 1, 8, 5, 4, 14, 11, 12, 9, 20, 2, 18, 7, 3, 19]));;
    gap> ComponentsOfPartialPermSemigroup(S);
    [ [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 16, 18, 19, 20 ],
      [ 15 ], [ 17 ] ]

##### 15.10-3 CyclesOfPartialPerm

`‣ CyclesOfPartialPerm`( x ) | ( attribute )

Returns: The cycles of a partial perm.

This function returns the cycles, or strongly connected components, of the action of the partial perm x on the set of positive integers where it is defined.

    gap> x := PartialPerm([1, 2, 3, 4, 5, 8, 10],
    >                      [3, 1, 4, 2, 5, 6, 7]);
    [8,6][10,7](1,3,4,2)(5)
    gap> CyclesOfPartialPerm(x);
    [ [ 3, 4, 2, 1 ], [ 5 ] ]

##### 15.10-4 CyclesOfPartialPermSemigroup

`‣ CyclesOfPartialPermSemigroup`( S ) | ( attribute )

Returns: The cycles of a partial perm semigroup.

This function returns the cycles, or strongly connected components, of the action of the partial perm semigroup S on the set of positive integers where it is defined.

    gap> S := Semigroup(
    > PartialPerm([1, 2, 3, 5, 6, 7, 8, 11, 12, 16, 19],
    >     [9, 18, 20, 11, 5, 16, 8, 19, 14, 13, 1]),
    >  PartialPerm([1, 2, 3, 4, 5, 6, 8, 9, 10, 12, 14, 16, 18, 19, 20],
    >     [13, 1, 8, 5, 4, 14, 11, 12, 9, 20, 2, 18, 7, 3, 19]));;
    gap> CyclesOfPartialPermSemigroup(S);
    [ [ 1, 9, 12, 14, 2, 20, 19, 3, 8, 11 ] ]

#### 15.11 Attributes of Rees (0-)matrix semigroups

##### 15.11-1 RZMSDigraph

`‣ RZMSDigraph`( R ) | ( attribute )

Returns: A digraph.

If R is an n by m Rees 0-matrix semigroup M^0[I, T, Λ; P] (so that I = {1,2,...,n} and Λ = {1,2,...,m}) then `RZMSDigraph` returns a symmetric bipartite digraph with n+m vertices. An index i ∈ I corresponds to the vertex i and an index j ∈ Λ corresponds to the vertex j + n.

Two vertices v and w in `RZMSDigraph(`R`)` are adjacent if and only if v∈ I, w - n∈ Λ, and `P[w - n][v]` ≠ 0.

This digraph is commonly called the Graham-Houghton graph of R.

    gap> R := PrincipalFactor(
    > DClass(FullTransformationMonoid(5),
    >        Transformation( [ 2, 4, 1, 5, 5 ] )));
    <Rees 0-matrix semigroup 10x5 over Group([ (1,2,3,4), (1,2) ])>
    gap> gr := RZMSDigraph(R);
    <digraph with 15 vertices, 40 edges>
    gap> e := DigraphEdges(gr)[1];
    [ 1, 11 ]
    gap> Matrix(R)[e[2] - 10][e[1]] <> 0;
    true

##### 15.11-2 RZMSConnectedComponents

`‣ RZMSConnectedComponents`( R ) | ( attribute )

Returns: The connected components of a Rees 0-matrix semigroup.

If R is an n by m Rees 0-matrix semigroup M^0[I, T, Λ; P] (so that I = {1,2,...,n} and Λ = {1,2,...,m}) then `RZMSConnectedComponents` returns the connected components of R.

Connectedness is an equivalence relation on the indices of R: the equivalence classes of the relation are called the connected components of R, and two indices in I ∪ Λ are connected if and only if their corresponding vertices in `RZMSDigraph(`R`)` are connected (see `RZMSDigraph` (15.11-1)). If R has n connected components, then `RZMSConnectedComponents` will return a list of pairs:

`[ [` I_1, Λ_1`],` ...`, [` I_k, Λ_k`] ]`

where I = I_1 ⊔ ⋯ ⊔ I_k, Λ = Λ_1 ⊔ ⋯ ⊔ Λ_k, and for each l the set I_l∪Λ_l is a connected component of R. Note that at most one of I_l and Λ_l is possibly empty. The ordering of the connected components in the result in unspecified.

    gap> R := ReesZeroMatrixSemigroup(SymmetricGroup(5),
    > [ [ (), 0, (1,3), (4,5), 0 ],
    >   [ 0, (), 0, 0, (1,3,4,5) ],
    >   [ 0, 0, (1,5)(2,3), 0, 0 ],
    >   [ 0, (2,3)(1,4), 0, 0, 0 ] ]);
    <Rees 0-matrix semigroup 5x4 over Sym( [ 1 .. 5 ] )>
    gap> RZMSConnectedComponents(R);
    [ [ [ 1, 3, 4 ], [ 1, 3 ] ], [ [ 2, 5 ], [ 2, 4 ] ] ]

##### 15.11-3 RZMSNormalization

`‣ RZMSNormalization`( R ) | ( attribute )

Returns: An isomorphism.

If R is an n by m Rees 0-matrix semigroup M^0[I, T, Λ; P] then `RZMSNormalization` returns an isomorphism from R to a Rees 0-matrix semigroup S = M^0[I, T, Λ; Q]. The structure matrix Q is obtained by normalizing P (see `Matrix` (Reference: Matrix)) and has the following properties:

- The matrix Q is in block diagonal form, and the blocks are ordered by decreasing size along the leading diagonal. The blocks are the `RZMSConnectedComponents` (15.11-2) of S.

- If Q has any rows/columns consisting entries of zeroes, then they will be the final rows/columns of Q.

- If T is a group, then the first non-zero entry of every row and every column is equal to 1_T.

- The first non-zero entry of a row occurs no sooner than the first non-zero entry of the previous row.

- The first non-zero entry of a column occurs no sooner than the first non-zero entry of the previous column.

If T is a group, then the non-zero entries of Q are chosen so that S has an additional property. Let the index sets I and Λ be decomposed according to the `RZMSConnectedComponents` (15.11-2) of S, giving that I=I_1⊔...⊔ I_k and Λ=Λ_1⊔...⊔Λ_k. For each r let Q_r be the sub-matrix of Q defined by I_r and Λ_r, and let T_r be the subgroup of T generated by the non-zero entries of Q_r. Then the idempotent generated subsemigroup of S is equal to:

- ⋃_r = 1^k M^0[I_r, T_r, Λ_r, Q_r], where the zeroes of these Rees 0-matrix semigroups are all identified with the zero of S.

The normalization given by `RZMSNormalization` is based on Theorem 2 of [Gra68] and is sometimes called Graham normal form. Note that isomorphic Rees 0-matrix semigroups can have normalizations which are not equal.

    gap> R := ReesZeroMatrixSemigroup(Group(()),
    > [ [ 0, (), 0 ],
    >   [ (), 0, 0 ],
    >   [ 0, 0, () ] ]);
    <Rees 0-matrix semigroup 3x3 over Group(())>
    gap> iso := RZMSNormalization(R);
    MappingByFunction( <Rees 0-matrix semigroup 3x3 over Group(())>,
    <Rees 0-matrix semigroup 3x3 over Group(())>
     , function( x ) ... end, function( x ) ... end )
    gap> S := Range(iso);
    <Rees 0-matrix semigroup 3x3 over Group(())>
    gap> Matrix(S);
    [ [ (), 0, 0 ], [ 0, (), 0 ], [ 0, 0, () ] ]
    gap> R := ReesZeroMatrixSemigroup(SymmetricGroup(4),
    > [ [ 0, 0, 0, (1,3,2) ],
    >   [ (2,3), 0, 0, 0 ],
    >   [ 0, 0, (1,3), (1,2) ],
    >   [ 0, (4,1,2,3), 0, 0 ] ]);
    <Rees 0-matrix semigroup 4x4 over Sym( [ 1 .. 4 ] )>
    gap> S := Range(RZMSNormalization(R));
    <Rees 0-matrix semigroup 4x4 over Sym( [ 1 .. 4 ] )>
    gap> Matrix(S);
    [ [ (), (), 0, 0 ], [ 0, (), 0, 0 ], [ 0, 0, (), 0 ], [ 0, 0, 0, () ]
     ]

##### 15.11-4 RMSNormalization

`‣ RMSNormalization`( R ) | ( attribute )

Returns: An isomorphism.

If R is a Rees matrix semigroup over a group `G`, then `RMSNormalization` returns an isomorphism from R to a normalized Rees matrix semigroup `S` over `G`.

The semigroup `S` is normalized in the sense that the first entry of each row and column of the `Matrix` (Reference: Matrix) of `S` is the identity of `G`.

    gap> R := ReesMatrixSemigroup(SymmetricGroup(4),
    > [ [ (1,2), (2,4,3), (2,1,4) ],
    >   [ (1,3,2), (1,2)(3,4), () ],
    >   [ (2,3), (1,3,2,4), (2,3) ] ]);
    <Rees matrix semigroup 3x3 over Sym( [ 1 .. 4 ] )>
    gap> iso := RMSNormalization(R);
    MappingByFunction( <Rees matrix semigroup 3x3 over Sym( [ 1 .. 4 ] )>
     , <Rees matrix semigroup 3x3 over Sym( [ 1 .. 4 ] )>
     , function( x ) ... end, function( x ) ... end )
    gap> S := Range(iso);
    <Rees matrix semigroup 3x3 over Sym( [ 1 .. 4 ] )>
    gap> Matrix(S);
    [ [ (), (), () ], [ (), (1,2), (1,4,2,3) ], [ (), (1,4,2,3), (2,4) ] ]

[Top of Book] [Contents] [Previous Chapter] [Next Chapter]
Goto Chapter: Top 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Bib Ind

generated by GAPDoc2HTML