# Euclidean Groups#

AUTHORS:

• Volker Braun: initial version

class sage.groups.affine_gps.euclidean_group.EuclideanGroup(degree, ring)[source]#

Bases: AffineGroup

A Euclidean group.

The Euclidean group $$E(A)$$ (or general affine group) of an affine space $$A$$ is the group of all invertible affine transformations from the space into itself preserving the Euclidean metric.

If we let $$A_V$$ be the affine space of a vector space $$V$$ (essentially, forgetting what is the origin) then the Euclidean group $$E(A_V)$$ is the group generated by the general linear group $$SO(V)$$ together with the translations. Recall that the group of translations acting on $$A_V$$ is just $$V$$ itself. The general linear and translation subgroups do not quite commute, and in fact generate the semidirect product

$E(A_V) = SO(V) \ltimes V.$

As such, the group elements can be represented by pairs $$(A,b)$$ of a matrix and a vector. This pair then represents the transformation

$x \mapsto A x + b.$

We can also represent this as a linear transformation in $$\dim(V) + 1$$ dimensional space as

$\begin{split}\begin{pmatrix} A & b \\ 0 & 1 \end{pmatrix}\end{split}$

and lifting $$x = (x_1, \ldots, x_n)$$ to $$(x_1, \ldots, x_n, 1)$$.

INPUT:

Something that defines an affine space. For example

• An affine space itself:

• A – affine space

• A vector space:

• V – a vector space

• Degree and base ring:

• degree – An integer. The degree of the affine group, that is, the dimension of the affine space the group is acting on.

• ring – A ring or an integer. The base ring of the affine space. If an integer is given, it must be a prime power and the corresponding finite field is constructed.

• var – (default: 'a') Keyword argument to specify the finite field generator name in the case where ring is a prime power.

EXAMPLES:

sage: E3 = EuclideanGroup(3, QQ); E3
Euclidean Group of degree 3 over Rational Field
sage: E3(matrix(QQ,[(6/7, -2/7, 3/7), (-2/7, 3/7, 6/7), (3/7, 6/7, -2/7)]), vector(QQ,[10,11,12]))
[ 6/7 -2/7  3/7]     [10]
x |-> [-2/7  3/7  6/7] x + [11]
[ 3/7  6/7 -2/7]     [12]
sage: E3([[6/7, -2/7, 3/7], [-2/7, 3/7, 6/7], [3/7, 6/7, -2/7]], [10,11,12])
[ 6/7 -2/7  3/7]     [10]
x |-> [-2/7  3/7  6/7] x + [11]
[ 3/7  6/7 -2/7]     [12]
sage: E3([6/7, -2/7, 3/7, -2/7, 3/7, 6/7, 3/7, 6/7, -2/7], [10,11,12])
[ 6/7 -2/7  3/7]     [10]
x |-> [-2/7  3/7  6/7] x + [11]
[ 3/7  6/7 -2/7]     [12]
>>> from sage.all import *
>>> E3 = EuclideanGroup(Integer(3), QQ); E3
Euclidean Group of degree 3 over Rational Field
>>> E3(matrix(QQ,[(Integer(6)/Integer(7), -Integer(2)/Integer(7), Integer(3)/Integer(7)), (-Integer(2)/Integer(7), Integer(3)/Integer(7), Integer(6)/Integer(7)), (Integer(3)/Integer(7), Integer(6)/Integer(7), -Integer(2)/Integer(7))]), vector(QQ,[Integer(10),Integer(11),Integer(12)]))
[ 6/7 -2/7  3/7]     [10]
x |-> [-2/7  3/7  6/7] x + [11]
[ 3/7  6/7 -2/7]     [12]
>>> E3([[Integer(6)/Integer(7), -Integer(2)/Integer(7), Integer(3)/Integer(7)], [-Integer(2)/Integer(7), Integer(3)/Integer(7), Integer(6)/Integer(7)], [Integer(3)/Integer(7), Integer(6)/Integer(7), -Integer(2)/Integer(7)]], [Integer(10),Integer(11),Integer(12)])
[ 6/7 -2/7  3/7]     [10]
x |-> [-2/7  3/7  6/7] x + [11]
[ 3/7  6/7 -2/7]     [12]
>>> E3([Integer(6)/Integer(7), -Integer(2)/Integer(7), Integer(3)/Integer(7), -Integer(2)/Integer(7), Integer(3)/Integer(7), Integer(6)/Integer(7), Integer(3)/Integer(7), Integer(6)/Integer(7), -Integer(2)/Integer(7)], [Integer(10),Integer(11),Integer(12)])
[ 6/7 -2/7  3/7]     [10]
x |-> [-2/7  3/7  6/7] x + [11]
[ 3/7  6/7 -2/7]     [12]

Instead of specifying the complete matrix/vector information, you can also create special group elements:

sage: E3.linear([6/7, -2/7, 3/7, -2/7, 3/7, 6/7, 3/7, 6/7, -2/7])
[ 6/7 -2/7  3/7]     [0]
x |-> [-2/7  3/7  6/7] x + [0]
[ 3/7  6/7 -2/7]     [0]
sage: E3.reflection([4,5,6])
[ 45/77 -40/77 -48/77]     [0]
x |-> [-40/77  27/77 -60/77] x + [0]
[-48/77 -60/77   5/77]     [0]
sage: E3.translation([1,2,3])
[1 0 0]     [1]
x |-> [0 1 0] x + [2]
[0 0 1]     [3]
>>> from sage.all import *
>>> E3.linear([Integer(6)/Integer(7), -Integer(2)/Integer(7), Integer(3)/Integer(7), -Integer(2)/Integer(7), Integer(3)/Integer(7), Integer(6)/Integer(7), Integer(3)/Integer(7), Integer(6)/Integer(7), -Integer(2)/Integer(7)])
[ 6/7 -2/7  3/7]     [0]
x |-> [-2/7  3/7  6/7] x + [0]
[ 3/7  6/7 -2/7]     [0]
>>> E3.reflection([Integer(4),Integer(5),Integer(6)])
[ 45/77 -40/77 -48/77]     [0]
x |-> [-40/77  27/77 -60/77] x + [0]
[-48/77 -60/77   5/77]     [0]
>>> E3.translation([Integer(1),Integer(2),Integer(3)])
[1 0 0]     [1]
x |-> [0 1 0] x + [2]
[0 0 1]     [3]

Some additional ways to create Euclidean groups:

sage: A = AffineSpace(2, GF(4,'a'));  A                                         # needs sage.rings.finite_rings
Affine Space of dimension 2 over Finite Field in a of size 2^2
sage: G = EuclideanGroup(A); G                                                  # needs sage.rings.finite_rings
Euclidean Group of degree 2 over Finite Field in a of size 2^2
sage: G is EuclideanGroup(2,4)  # shorthand                                     # needs sage.rings.finite_rings
True

sage: V = ZZ^3;  V
Ambient free module of rank 3 over the principal ideal domain Integer Ring
sage: EuclideanGroup(V)
Euclidean Group of degree 3 over Integer Ring

sage: EuclideanGroup(2, QQ)
Euclidean Group of degree 2 over Rational Field
>>> from sage.all import *
>>> A = AffineSpace(Integer(2), GF(Integer(4),'a'));  A                                         # needs sage.rings.finite_rings
Affine Space of dimension 2 over Finite Field in a of size 2^2
>>> G = EuclideanGroup(A); G                                                  # needs sage.rings.finite_rings
Euclidean Group of degree 2 over Finite Field in a of size 2^2
>>> G is EuclideanGroup(Integer(2),Integer(4))  # shorthand                                     # needs sage.rings.finite_rings
True

>>> V = ZZ**Integer(3);  V
Ambient free module of rank 3 over the principal ideal domain Integer Ring
>>> EuclideanGroup(V)
Euclidean Group of degree 3 over Integer Ring

>>> EuclideanGroup(Integer(2), QQ)
Euclidean Group of degree 2 over Rational Field

REFERENCES:

random_element()[source]#

Return a random element of this group.

EXAMPLES:

sage: G = EuclideanGroup(4, GF(3))
sage: G.random_element()  # random
[2 1 2 1]     [1]
[1 2 2 1]     [0]
x |-> [2 2 2 2] x + [1]
[1 1 2 2]     [2]
sage: G.random_element() in G
True
>>> from sage.all import *
>>> G = EuclideanGroup(Integer(4), GF(Integer(3)))
>>> G.random_element()  # random
[2 1 2 1]     [1]
[1 2 2 1]     [0]
x |-> [2 2 2 2] x + [1]
[1 1 2 2]     [2]
>>> G.random_element() in G
True