This implements a general Coxeter group as a matrix group by using the reflection representation.
AUTHORS:
Bases: sage.groups.matrix_gps.finitely_generated.FinitelyGeneratedMatrixGroup_generic, sage.structure.unique_representation.UniqueRepresentation
A Coxeter group represented as a matrix group.
Let be a Coxeter system and we construct a vector space
over
with a basis of
and inner product
where we have if
. Next we
define a representation
by
This representation is faithful so we can represent the Coxeter group
by the set of matrices
acting on
.
INPUT:
For more on creating Coxeter groups, see CoxeterGroup().
Todo
Currently the label is implemented as
in the Coxeter
matrix.
EXAMPLES:
We can create Coxeter groups from Coxeter matrices:
sage: W = CoxeterGroup([[1, 6, 3], [6, 1, 10], [3, 10, 1]])
sage: W
Coxeter group over Universal Cyclotomic Field with Coxeter matrix:
[ 1 6 3]
[ 6 1 10]
[ 3 10 1]
sage: W.gens()
(
[ -1 -E(12)^7 + E(12)^11 1]
[ 0 1 0]
[ 0 0 1],
[ 1 0 0]
[-E(12)^7 + E(12)^11 -1 E(20) - E(20)^9]
[ 0 0 1],
[ 1 0 0]
[ 0 1 0]
[ 1 E(20) - E(20)^9 -1]
)
sage: m = matrix([[1,3,3,3], [3,1,3,2], [3,3,1,2], [3,2,2,1]])
sage: W = CoxeterGroup(m)
sage: W.gens()
(
[-1 1 1 1] [ 1 0 0 0] [ 1 0 0 0] [ 1 0 0 0]
[ 0 1 0 0] [ 1 -1 1 0] [ 0 1 0 0] [ 0 1 0 0]
[ 0 0 1 0] [ 0 0 1 0] [ 1 1 -1 0] [ 0 0 1 0]
[ 0 0 0 1], [ 0 0 0 1], [ 0 0 0 1], [ 1 0 0 -1]
)
sage: a,b,c,d = W.gens()
sage: (a*b*c)^3
[ 5 1 -5 7]
[ 5 0 -4 5]
[ 4 1 -4 4]
[ 0 0 0 1]
sage: (a*b)^3
[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]
sage: b*d == d*b
True
sage: a*c*a == c*a*c
True
We can create the matrix representation over different base rings and with
different index sets. Note that the base ring must contain all
where
is the Coxeter matrix:
sage: W = CoxeterGroup(m, base_ring=RR, index_set=['a','b','c','d'])
sage: W.base_ring()
Real Field with 53 bits of precision
sage: W.index_set()
('a', 'b', 'c', 'd')
sage: CoxeterGroup(m, base_ring=ZZ)
Coxeter group over Integer Ring with Coxeter matrix:
[1 3 3 3]
[3 1 3 2]
[3 3 1 2]
[3 2 2 1]
sage: CoxeterGroup([[1,4],[4,1]], base_ring=QQ)
Traceback (most recent call last):
...
TypeError: unable to convert sqrt(2) to a rational
Using the well-known conversion between Coxeter matrices and Coxeter graphs, we can input a Coxeter graph. Following the standard convention, edges with no label (i.e. labelled by None) are treated as 3:
sage: G = Graph([(0,3,None), (1,3,15), (2,3,7), (0,1,3)])
sage: W = CoxeterGroup(G); W
Coxeter group over Universal Cyclotomic Field with Coxeter matrix:
[ 1 3 2 3]
[ 3 1 2 15]
[ 2 2 1 7]
[ 3 15 7 1]
sage: G2 = W.coxeter_graph()
sage: CoxeterGroup(G2) is W
True
Because there currently is no class for , labels
of
are given by
in the Coxeter matrix:
sage: G = Graph([(0,1,None), (1,2,4), (0,2,oo)])
sage: W = CoxeterGroup(G)
sage: W.coxeter_matrix()
[ 1 3 -1]
[ 3 1 4]
[-1 4 1]
We can also create Coxeter groups from Cartan types using the implementation keyword:
sage: W = CoxeterGroup(['D',5], implementation="reflection")
sage: W
Coxeter group over Universal Cyclotomic Field with Coxeter matrix:
[1 3 2 2 2]
[3 1 3 2 2]
[2 3 1 3 3]
[2 2 3 1 2]
[2 2 3 2 1]
sage: W = CoxeterGroup(['H',3], implementation="reflection")
sage: W
Coxeter group over Universal Cyclotomic Field with Coxeter matrix:
[1 3 2]
[3 1 5]
[2 5 1]
Bases: sage.groups.matrix_gps.group_element.MatrixGroupElement_generic
A Coxeter group element.
Return the matrix of self in the canonical faithful representation, which is self as a matrix.
EXAMPLES:
sage: W = CoxeterGroup(['A',3], implementation="reflection")
sage: a,b,c = W.gens()
sage: elt = a*b*c
sage: elt.canonical_matrix()
[ 0 0 -1]
[ 1 0 -1]
[ 0 1 -1]
Return whether i is a right descent of self.
A Coxeter system has a root system defined as
and we define the positive
(resp. negative) roots
by all
(resp.`c_s leq 0`). In particular, we note
that if
then
and if
then
.
Thus
is a right descent if
or equivalently if the matrix representing
has all entries
of the
-th column being non-positive.
INPUT:
EXAMPLES:
sage: W = CoxeterGroup(['A',3], implementation="reflection")
sage: a,b,c = W.gens()
sage: elt = b*a*c
sage: map(lambda i: elt.has_right_descent(i), [1, 2, 3])
[True, False, True]
Return the canonical faithful representation of self, which is self.
EXAMPLES:
sage: W = CoxeterGroup([[1,3],[3,1]])
sage: W.canonical_representation() is W
True
Return the Coxeter graph of self.
EXAMPLES:
sage: W = CoxeterGroup(['H',3], implementation="reflection")
sage: G = W.coxeter_graph(); G
Graph on 3 vertices
sage: G.edges()
[(1, 2, None), (2, 3, 5)]
sage: CoxeterGroup(G) is W
True
sage: G = Graph([(0, 1, 3), (1, 2, oo)])
sage: W = CoxeterGroup(G)
sage: W.coxeter_graph() == G
True
sage: CoxeterGroup(W.coxeter_graph()) is W
True
Return the Coxeter matrix of self.
EXAMPLES:
sage: W = CoxeterGroup([[1,3],[3,1]])
sage: W.coxeter_matrix()
[1 3]
[3 1]
sage: W = CoxeterGroup(['H',3])
sage: W.coxeter_matrix()
[1 3 2]
[3 1 5]
[2 5 1]
Return the index set of self.
EXAMPLES:
sage: W = CoxeterGroup([[1,3],[3,1]])
sage: W.index_set()
(0, 1)
sage: W = CoxeterGroup([[1,3],[3,1]], index_set=['x', 'y'])
sage: W.index_set()
('x', 'y')
sage: W = CoxeterGroup(['H',3])
sage: W.index_set()
(1, 2, 3)
Return the simple reflection .
INPUT:
EXAMPLES:
sage: W = CoxeterGroup(['A',3], implementation="reflection")
sage: W.simple_reflection(1)
[-1 1 0]
[ 0 1 0]
[ 0 0 1]
sage: W.simple_reflection(2)
[ 1 0 0]
[ 1 -1 1]
[ 0 0 1]
sage: W.simple_reflection(3)
[ 1 0 0]
[ 0 1 0]
[ 0 1 -1]