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
¶ Bases:
sage.groups.libgap_wrapper.ElementLibGAP
Element of a matrix group over a generic ring.
The group elements are implemented as wrappers around libGAP matrices.
INPUT:
M
– a matrixparent
– the parentcheck
– bool (default:True
); ifTrue
does some type checkingconvert
– bool (default:True
); ifTrue
convertM
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 formultiplicative_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 ifgens
is None.INPUT:
gens
– a list/tuple/iterable of elements (or objects that can be converted to group elements), orNone
(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 ingens
.ALGORITHM:
Use GAP, which has optimized algorithms for solving the word problem (the GAP functions
EpimorphismFromFreeGroup
andPreImagesRepresentative
).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
¶ Bases:
sage.structure.element.MultiplicativeGroupElement
Element of a matrix group over a generic ring.
The group elements are implemented as Sage matrices.
INPUT:
M
– a matrixparent
– the parentcheck
– bool (default:True
); ifTrue
, thendoes some type checking
convert
– bool (default:True
); ifTrue
, then convertM
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 elementINPUT:
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