# Matrix Group Elements¶

EXAMPLES:

sage: F = GF(3); MS = MatrixSpace(F,2,2)
sage: gens = [MS([[1,0],[0,1]]),MS([[1,1],[0,1]])]
sage: G = MatrixGroup(gens); G
Matrix group over Finite Field of size 3 with 2 generators (
[1 0]  [1 1]
[0 1], [0 1]
)
sage: g = G([[1,1],[0,1]])
sage: h = G([[1,2],[0,1]])
sage: g*h
[1 0]
[0 1]


You cannot add two matrices, since this is not a group operation. You can coerce matrices back to the matrix space and add them there:

sage: g + h
Traceback (most recent call last):
...
TypeError: unsupported operand parent(s) for +:
'Matrix group over Finite Field of size 3 with 2 generators (
[1 0]  [1 1]
[0 1], [0 1]
)' and
'Matrix group over Finite Field of size 3 with 2 generators (
[1 0]  [1 1]
[0 1], [0 1]
)'

sage: g.matrix() + h.matrix()
[2 0]
[0 2]


Similarly, you cannot multiply group elements by scalars but you can do it with the underlying matrices:

sage: 2*g
Traceback (most recent call last):
...
TypeError: unsupported operand parent(s) for *: 'Integer Ring' and 'Matrix group over Finite Field of size 3 with 2 generators (
[1 0]  [1 1]
[0 1], [0 1]
)'


AUTHORS:

• David Joyner (2006-05): initial version David Joyner
• David Joyner (2006-05): various modifications to address William Stein’s TODO’s.
• William Stein (2006-12-09): many revisions.
• Volker Braun (2013-1) port to new Parent, libGAP.
• Travis Scrimshaw (2016-01): reworks class hierarchy in order to cythonize
class sage.groups.matrix_gps.group_element.MatrixGroupElement_gap

Element of a matrix group over a generic ring.

The group elements are implemented as wrappers around libGAP matrices.

INPUT:

• M – a matrix
• parent – the parent
• check – bool (default: True); if True does some type checking
• convert – bool (default: True); if True convert M to the right matrix space
list()

Return list representation of this matrix.

EXAMPLES:

sage: F = GF(3); MS = MatrixSpace(F,2,2)
sage: gens = [MS([[1,0],[0,1]]),MS([[1,1],[0,1]])]
sage: G = MatrixGroup(gens)
sage: g = G.0
sage: g
[1 0]
[0 1]
sage: g.list()
[[1, 0], [0, 1]]

matrix()

Obtain the usual matrix (as an element of a matrix space) associated to this matrix group element.

EXAMPLES:

sage: F = GF(3); MS = MatrixSpace(F,2,2)
sage: gens = [MS([[1,0],[0,1]]),MS([[1,1],[0,1]])]
sage: G = MatrixGroup(gens)
sage: m = G.gen(0).matrix(); m
[1 0]
[0 1]
sage: m.parent()
Full MatrixSpace of 2 by 2 dense matrices over Finite Field of size 3

sage: k = GF(7); G = MatrixGroup([matrix(k,2,[1,1,0,1]), matrix(k,2,[1,0,0,2])])
sage: g = G.0
sage: g.matrix()
[1 1]
[0 1]
sage: parent(g.matrix())
Full MatrixSpace of 2 by 2 dense matrices over Finite Field of size 7


Matrices have extra functionality that matrix group elements do not have:

sage: g.matrix().charpoly('t')
t^2 + 5*t + 1

multiplicative_order()

Return the order of this group element, which is the smallest positive integer $$n$$ such that $$g^n = 1$$, or +Infinity if no such integer exists.

EXAMPLES:

sage: k = GF(7)
sage: G = MatrixGroup([matrix(k,2,[1,1,0,1]), matrix(k,2,[1,0,0,2])]); G
Matrix group over Finite Field of size 7 with 2 generators (
[1 1]  [1 0]
[0 1], [0 2]
)
sage: G.order()
21
sage: G.gen(0).multiplicative_order(), G.gen(1).multiplicative_order()
(7, 3)


order is just an alias for multiplicative_order:

sage: G.gen(0).order(), G.gen(1).order()
(7, 3)

sage: k = QQ
sage: G = MatrixGroup([matrix(k,2,[1,1,0,1]), matrix(k,2,[1,0,0,2])]); G
Matrix group over Rational Field with 2 generators (
[1 1]  [1 0]
[0 1], [0 2]
)
sage: G.order()
+Infinity
sage: G.gen(0).order(), G.gen(1).order()
(+Infinity, +Infinity)

sage: gl = GL(2, ZZ);  gl
General Linear Group of degree 2 over Integer Ring
sage: g = gl.gen(2);  g
[1 1]
[0 1]
sage: g.order()
+Infinity

word_problem(gens=None)

Solve the word problem.

This method writes the group element as a product of the elements of the list gens, or the standard generators of the parent of self if gens is None.

INPUT:

• gens – a list/tuple/iterable of elements (or objects that can be converted to group elements), or None (default). By default, the generators of the parent group are used.

OUTPUT:

A factorization object that contains information about the order of factors and the exponents. A ValueError is raised if the group element cannot be written as a word in gens.

ALGORITHM:

Use GAP, which has optimized algorithms for solving the word problem (the GAP functions EpimorphismFromFreeGroup and PreImagesRepresentative).

EXAMPLES:

sage: G = GL(2,5); G
General Linear Group of degree 2 over Finite Field of size 5
sage: G.gens()
(
[2 0]  [4 1]
[0 1], [4 0]
)
sage: G(1).word_problem([G.gen(0)])
1
sage: type(_)
<class 'sage.structure.factorization.Factorization'>

sage: g = G([0,4,1,4])
sage: g.word_problem()
([4 1]
[4 0])^-1


Next we construct a more complicated element of the group from the generators:

sage: s,t = G.0, G.1
sage: a = (s * t * s); b = a.word_problem(); b
([2 0]
[0 1]) *
([4 1]
[4 0]) *
([2 0]
[0 1])
sage: flatten(b)
[
[2 0]     [4 1]     [2 0]
[0 1], 1, [4 0], 1, [0 1], 1
]
sage: b.prod() == a
True


We solve the word problem using some different generators:

sage: s = G([2,0,0,1]); t = G([1,1,0,1]); u = G([0,-1,1,0])
sage: a.word_problem([s,t,u])
([2 0]
[0 1])^-1 *
([1 1]
[0 1])^-1 *
([0 4]
[1 0]) *
([2 0]
[0 1])^-1


We try some elements that don’t actually generate the group:

sage: a.word_problem([t,u])
Traceback (most recent call last):
...
ValueError: word problem has no solution


AUTHORS:

• David Joyner and William Stein
• David Loeffler (2010): fixed some bugs
• Volker Braun (2013): LibGAP
class sage.groups.matrix_gps.group_element.MatrixGroupElement_generic

Element of a matrix group over a generic ring.

The group elements are implemented as Sage matrices.

INPUT:

• M – a matrix
• parent – the parent
• check – bool (default: True); if True, then
does some type checking
• convert – bool (default: True); if True, then convert M to the right matrix space

EXAMPLES:

sage: W = CoxeterGroup(['A',3], base_ring=ZZ)
sage: g = W.an_element()
sage: g
[ 0  0 -1]
[ 1  0 -1]
[ 0  1 -1]

inverse()

Return the inverse group element

OUTPUT:

A matrix group element.

EXAMPLES:

sage: W = CoxeterGroup(['A',3], base_ring=ZZ)
sage: g = W.an_element()
sage: ~g
[-1  1  0]
[-1  0  1]
[-1  0  0]
sage: g * ~g == W.one()
True
sage: ~g * g == W.one()
True

sage: W = CoxeterGroup(['B',3])
sage: W.base_ring()
Number Field in a with defining polynomial x^2 - 2 with a = 1.414213562373095?
sage: g = W.an_element()
sage: ~g
[-1  1  0]
[-1  0  a]
[-a  0  1]

is_one()

Return whether self is the identity of the group.

EXAMPLES:

sage: W = CoxeterGroup(['A',3])
sage: g = W.gen(0)
sage: g.is_one()
False

sage: W.an_element().is_one()
False
sage: W.one().is_one()
True

list()

Return list representation of this matrix.

EXAMPLES:

sage: W = CoxeterGroup(['A',3], base_ring=ZZ)
sage: g = W.gen(0)
sage: g
[-1  1  0]
[ 0  1  0]
[ 0  0  1]
sage: g.list()
[[-1, 1, 0], [0, 1, 0], [0, 0, 1]]

matrix()

Obtain the usual matrix (as an element of a matrix space) associated to this matrix group element.

One reason to compute the associated matrix is that matrices support a huge range of functionality.

EXAMPLES:

sage: W = CoxeterGroup(['A',3], base_ring=ZZ)
sage: g = W.gen(0)
sage: g.matrix()
[-1  1  0]
[ 0  1  0]
[ 0  0  1]
sage: parent(g.matrix())
Full MatrixSpace of 3 by 3 dense matrices over Integer Ring


Matrices have extra functionality that matrix group elements do not have:

sage: g.matrix().charpoly('t')
t^3 - t^2 - t + 1

sage.groups.matrix_gps.group_element.is_MatrixGroupElement(x)

Test whether x is a matrix group element

INPUT:

• x – anything.

OUTPUT:

Boolean.

EXAMPLES:

sage: from sage.groups.matrix_gps.group_element import is_MatrixGroupElement
sage: is_MatrixGroupElement('helloooo')
False

sage: G = GL(2,3)
sage: is_MatrixGroupElement(G.an_element())
True