1 | initial version |

The first example you gave is not cyclic, as seen e.g. by

```
sage: H.structure_description()
'Q8 : C27'
```

The meaning of this output can be found in GAP's manual for StructureDescription.

The second example (in your comment to tmonteil) is cyclic:

```
sage: G.<x0,x5> = FreeGroup()
sage: H = G/[x5*x0*x5*x0^-1*x5^-1*x0^-1, x0^-1*x5^-1*x0^-1*(x0^-1*x5^-3)^3*x0^-1*x5^-1]
sage: H.structure_description()
'C17'
```

In general, to find out if an element is a generator of a cyclic group you can take powers of it and see if you get the whole group. The difficulty here is that you need to put elements in a kind of normal form to compare them. Here you can do it with a confluent rewriting system:

```
sage: k = H.rewriting_system()
sage: k.make_confluent()
sage: H_reps = set([k.reduce(h) for h in H])
sage: next(h for h in H if set([k.reduce(h^m) for m in range(len(H))]) == H_reps)
x0
```

This shows `x0`

is a generator (the relation is `x0^17 == 1`

).

I'm not a group theorist, but I would guess that for finite groups such a rewriting system always exists.

Note for cyclic groups of prime order, all non-identity elements are generators, and more generally in a cyclic group of order $n$, $\varphi(n)$ of the elements are generators.

2 | No.2 Revision |

The first example you gave is not cyclic, as seen e.g. by

```
sage: H.structure_description()
'Q8 : C27'
```

The meaning of this output can be found in GAP's manual for StructureDescription.

The second example (in your comment to tmonteil) is cyclic:

```
sage: G.<x0,x5> = FreeGroup()
sage: H = G/[x5*x0*x5*x0^-1*x5^-1*x0^-1, x0^-1*x5^-1*x0^-1*(x0^-1*x5^-3)^3*x0^-1*x5^-1]
sage: H.structure_description()
'C17'
```

In general, to find out if an element is a generator of a cyclic group you can take powers of it and see if you get the whole group. The difficulty here is that you need to put elements in a kind of normal form to compare them. Here you can do it with a confluent rewriting system:

```
sage: k = H.rewriting_system()
sage: k.make_confluent()
sage: H_reps = set([k.reduce(h) for h in H])
sage:
```~~next(h ~~next((h for h in H if set([k.reduce(h^m) for m in range(len(H))]) == ~~H_reps)
~~H_reps), None)
x0

This shows `x0`

is a ~~generator (the ~~generator; the relation is `x0^17 == 1`

~~).~~. (Note there is room for optimization of this code, e.g. in calculating the powers.)

I'm not a group theorist, but I would guess that for finite groups such a rewriting system always exists.

Note for cyclic groups of prime order, all non-identity elements are generators, and more generally in a cyclic group of order $n$, $\varphi(n)$ of the elements are generators.

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.