# Set Operations

## `Random(M, n): MonRWS, RngIntElt -> MonRWSElt`

A random word of length at most $n$ in the generators of $M$.

## `Random(M): MonRWS -> MonRWSElt`

A random word (of length at most the order of $M$) in the generators of $M$.

## `Representative(M): MonRWS -> MonRWSElt`

## `Rep(M): MonRWS -> MonRWSElt`

An element chosen from $M$.

## `Set(M, a, b): MonRWS, RngIntElt, RngIntElt -> SetEnum`

```magma
Search: MonStgElt                    Default: "DFS"
```

Create the set of words, $w$, in $M$ with $a \le$ length$(w) \le b$. If `Search` is set to `"DFS"` (depth-first search) then words are enumerated in lexicographical order. If `Search` is set to `"BFS"` (breadth-first-search) then words are enumerated in lexicographical order for each individual length (i.e. in short-lex order). Depth-first-search is marginally quicker. Since the result is a set the words may not appear in the resultant set in the search order specified (although internally they will be enumerated in this order).

## `Set(M): MonRWS -> SetEnum`

```magma
Search: MonStgElt                    Default: "DFS"
```

Create the set of words that is the carrier set of $M$. If `Search` is set to `"DFS"` (depth-first search) then words are enumerated in lexicographical order. If `Search` is set to `"BFS"` (breadth-first-search) then words are enumerated in lexicographical order for each individual length (i.e. in short-lex order). Depth-first-search is marginally quicker. Since the result is a set the words may not appear in the resultant set in the search order specified (although internally they will be enumerated in this order).

## `Seq(M, a, b): MonRWS, RngIntElt, RngIntElt -> SeqEnum`

```magma
Search: MonStgElt                    Default: "DFS"
```

Create the sequence $S$ of words, $w$, in $M$ with $a \le$ length$(w) \le b$. If `Search` is set to `"DFS"` (depth-first search) then words will appear in $S$ in lexicographical order. If `Search` is set to `"BFS"` (breadth-first-search) then words will appear in $S$ in lexicographical order for each individual length (i.e. in short-lex order). Depth-first-search is marginally quicker.

## `Seq(M): MonRWS -> SeqEnum`

```magma
Search: MonStgElt                    Default: "DFS"
```

Create a sequence $S$ of words from the carrier set of $M$. If `Search` is set to `"DFS"` (depth-first search) then words will appear in $S$ in lexicographical order. If `Search` is set to `"BFS"` (breadth-first-search) then words will appear in $S$ in lexicographical order for each individual length (i.e. in short-lex order). Depth-first-search is marginally quicker.

## `Example: Set (ex-e2ec60)`

We construct the group $D_{22}$, together with a representative word from the group, a random word and a random word of length at most 5 from the group, and the set of elements of the group.

```magma
> FM<a,b,c,d,e,f> := FreeMonoid(6);
> Q := quo< FM | a^2=1, f^2=1,
>                d*a=a*c, e*b=b*f, d*c=c*e, d*f=a*d, a*e=e*b, b*f*c=f >;
> M<a,b,c,d,e,f> := RWSMonoid(Q);
> print Order(M);
22
> print Representative(M);
Id(M)
> print Random(M);
c * e
> print Random(M, 5);
d
> Set(M);
{ a * c, e, a * d, f, a * e, a * f, Id(M), a * c * e, b * a,
  b * d, a * d * b, b * e, c * e, a * b * a, d * b, a * b * d,
  a, a * b * e, b, c, a * b, d }
> Seq(M : Search := "BFS");
[ Id(M), a, b, c, d, e, f, a * b, a * c, a * d, a * e, a * f,
  b * a, b * d, b * e, c * e, d * b, a * b * a, a * b * d,
  a * b * e, a * c * e, a * d * b ]

```
