1 | initial version |

In your example you rely on multiplication of integers modulo 10, so any group using this operation will be the unit group of $\mathbb{Z}/10\mathbb{Z}$. However, number 2 and 4 cannot be there as they are not invertible modulo 10. So, perhaps you mean semigroup (monoid) rather than a group.

Monoid for your example can be constructed as follows:

```
mygens = [1,2,3,4]
R = IntegerModRing(10)
G = R.submonoid( Family({n:R(e) for n,e in enumerate(mygens)}) )
```

Then multiplication table can be constructed with `OperationTable`

:

```
from sage.matrix.operation_table import OperationTable
print( OperationTable(G, operation=operator.mul, names='elements') )
```

which gives:

```
* 1 2 3 4 6 8 9 7
+----------------
1| 1 2 3 4 6 8 9 7
2| 2 4 6 8 2 6 8 4
3| 3 6 9 2 8 4 7 1
4| 4 8 2 6 4 2 6 8
6| 6 2 8 4 6 8 4 2
8| 8 6 4 2 8 4 2 6
9| 9 8 7 6 4 2 1 3
7| 7 4 1 8 2 6 3 9
```

2 | No.2 Revision |

In your example you rely on multiplication of integers modulo 10, so any group using this operation will be a subgroup of the unit group of $\mathbb{Z}/10\mathbb{Z}$. However, ~~number ~~numbers 2 and 4 cannot be there as they are not invertible modulo 10. So, perhaps you mean semigroup (monoid) rather than a group.

Monoid for your example can be constructed as follows:

```
mygens = [1,2,3,4]
R = IntegerModRing(10)
G = R.submonoid( Family({n:R(e) for n,e in enumerate(mygens)}) )
```

Then multiplication table can be constructed with `OperationTable`

:

```
from sage.matrix.operation_table import OperationTable
print( OperationTable(G, operation=operator.mul, names='elements') )
```

which gives:

```
* 1 2 3 4 6 8 9 7
+----------------
1| 1 2 3 4 6 8 9 7
2| 2 4 6 8 2 6 8 4
3| 3 6 9 2 8 4 7 1
4| 4 8 2 6 4 2 6 8
6| 6 2 8 4 6 8 4 2
8| 8 6 4 2 8 4 2 6
9| 9 8 7 6 4 2 1 3
7| 7 4 1 8 2 6 3 9
```

3 | No.3 Revision |

In your example you rely on multiplication of integers modulo 10, so any group using this operation will be a subgroup of the unit group of $\mathbb{Z}/10\mathbb{Z}$. However, numbers 2 and 4 cannot be there as they are not invertible modulo 10. So, perhaps you mean semigroup (monoid) rather than a group.

~~Monoid ~~Semigroup for your example can be constructed as follows:

```
mygens = [1,2,3,4]
R = IntegerModRing(10)
G =
```~~R.submonoid( Family({n:R(e) ~~R.subsemigroup( (R(g) for ~~n,e ~~g in ~~enumerate(mygens)}) ~~mygens), one=R(1) )

Then multiplication table can be constructed with `OperationTable`

:

```
from sage.matrix.operation_table import OperationTable
print( OperationTable(G, operation=operator.mul, names='elements') )
```

which gives:

```
* 1 2 3 4 6 8 9 7
+----------------
1| 1 2 3 4 6 8 9 7
2| 2 4 6 8 2 6 8 4
3| 3 6 9 2 8 4 7 1
4| 4 8 2 6 4 2 6 8
6| 6 2 8 4 6 8 4 2
8| 8 6 4 2 8 4 2 6
9| 9 8 7 6 4 2 1 3
7| 7 4 1 8 2 6 3 9
```

4 | No.4 Revision |

In your example you rely on multiplication of integers modulo 10, so any group using this operation will be a subgroup of the unit group of $\mathbb{Z}/10\mathbb{Z}$. However, numbers 2 and 4 cannot be there as they are not invertible modulo 10. So, perhaps you mean semigroup (monoid) rather than a group.

Semigroup $G$ for your example can be constructed as follows:

```
mygens = [1,2,3,4]
R = IntegerModRing(10)
G = R.subsemigroup( (R(g) for g in mygens), one=R(1) )
```

Then multiplication table can be constructed with `OperationTable`

:

```
from sage.matrix.operation_table import OperationTable
print( OperationTable(G, operation=operator.mul, names='elements') )
```

which gives:

```
* 1 2 3 4 6 8 9 7
+----------------
1| 1 2 3 4 6 8 9 7
2| 2 4 6 8 2 6 8 4
3| 3 6 9 2 8 4 7 1
4| 4 8 2 6 4 2 6 8
6| 6 2 8 4 6 8 4 2
8| 8 6 4 2 8 4 2 6
9| 9 8 7 6 4 2 1 3
7| 7 4 1 8 2 6 3 9
```

**ADDED.** When $G$ represent a group, we can explicitly create its isomorphic permutation group (subgroup of $\mathrm{Sym}(G)$). For example:

```
mygens = [1,3]
R = IntegerModRing(10)
G = R.subsemigroup( (R(g) for g in mygens), one=R(1) )
P = PermutationGroup([[G(g)*b for b in G] for g in mygens], domain=G)
print("elements of P:",list(P))
M = {g:P([G(g)*b for b in G]) for g in G} # map from G to P
print("map G->P:",M)
```

prints

```
elements of P: [(), (1,9)(3,7), (1,7,9,3), (1,3,9,7)]
map G->P: {1: (), 3: (1,3,9,7), 9: (1,9)(3,7), 7: (1,7,9,3)}
```

5 | No.5 Revision |

In your example you rely on multiplication of integers modulo 10, so any group using this operation will be a subgroup of the unit group of $\mathbb{Z}/10\mathbb{Z}$. However, numbers 2 and 4 cannot be there as they are not invertible modulo 10. So, perhaps you mean semigroup (monoid) rather than a group.

Semigroup $G$ for your example can be constructed as follows:

```
mygens = [1,2,3,4]
R = IntegerModRing(10)
G = R.subsemigroup( (R(g) for g in mygens), one=R(1) )
```

Then multiplication table can be constructed with `OperationTable`

:

```
from sage.matrix.operation_table import OperationTable
print( OperationTable(G, operation=operator.mul, names='elements') )
```

which gives:

```
* 1 2 3 4 6 8 9 7
+----------------
1| 1 2 3 4 6 8 9 7
2| 2 4 6 8 2 6 8 4
3| 3 6 9 2 8 4 7 1
4| 4 8 2 6 4 2 6 8
6| 6 2 8 4 6 8 4 2
8| 8 6 4 2 8 4 2 6
9| 9 8 7 6 4 2 1 3
7| 7 4 1 8 2 6 3 9
```

**ADDED.** When $G$ ~~represent ~~represents a group, we can explicitly create its isomorphic permutation group $P$ (subgroup of ~~$\mathrm{Sym}(G)$). For ~~$\mathrm{Sym}(G)$) as in the following example:

```
mygens = [1,3]
R = IntegerModRing(10)
G = R.subsemigroup( (R(g) for g in mygens), one=R(1) )
P = PermutationGroup([[G(g)*b for b in G] for g in mygens], domain=G)
print("elements of P:",list(P))
M = {g:P([G(g)*b for b in G]) for g in G} # map from G to P
print("map G->P:",M)
```

~~prints~~which prints:

```
elements of P: [(), (1,9)(3,7), (1,7,9,3), (1,3,9,7)]
map G->P: {1: (), 3: (1,3,9,7), 9: (1,9)(3,7), 7: (1,7,9,3)}
```

Copyright Sage, 2010. Some rights reserved under creative commons license. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.