# Coxeter Groups As Matrix Groups¶

This implements a general Coxeter group as a matrix group by using the reflection representation.

AUTHORS:

• Travis Scrimshaw (2013-08-28): Initial version
class sage.groups.matrix_gps.coxeter_group.CoxeterMatrixGroup(coxeter_matrix, base_ring, index_set)

A Coxeter group represented as a matrix group.

Let $$(W, S)$$ be a Coxeter system and we construct a vector space $$V$$ over $$\RR$$ with a basis of $$\{ \alpha_s \}_{s \in S}$$ and inner product

$B(\alpha_s, \alpha_t) = -\cos\left( \frac{\pi}{m_{st}} \right)$

where we have $$B(\alpha_s, \alpha_t) = -1$$ if $$m_{st} = \infty$$. Next we define a representation $$\sigma_s : V \to V$$ by

$\sigma_s \lambda = \lambda - 2 B(\alpha_s, \lambda) \alpha_s.$

This representation is faithful so we can represent the Coxeter group $$W$$ by the set of matrices $$\sigma_s$$ acting on $$V$$.

INPUT:

• data – a Coxeter matrix or graph or a Cartan type
• base_ring – (default: the universal cyclotomic field) the base ring which contains all values $$\cos(\pi/m_{ij})$$ where $$(m_{ij})_{ij}$$ is the Coxeter matrix
• index_set – (optional) an indexing set for the generators

For more on creating Coxeter groups, see CoxeterGroup().

Todo

Currently the label $$\infty$$ is implemented as $$-1$$ 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 $$2*\cos(\pi/m_{ij})$$ where $$(m_{ij})_{ij}$$ 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 $$\ZZ \cup \{ \infty \}$$, labels of $$\infty$$ are given by $$-1$$ 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]

class Element(parent, M, check=True, convert=True)

A Coxeter group element.

canonical_matrix()

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]

has_right_descent(i)

Return whether i is a right descent of self.

A Coxeter system $$(W, S)$$ has a root system defined as $$\{ w(\alpha_s) \}_{w \in W}$$ and we define the positive (resp. negative) roots $$\alpha = \sum_{s \in S} c_s \alpha_s$$ by all $$c_s \geq 0$$ (resp.c_s leq 0). In particular, we note that if $$\ell(w s) > \ell(w)$$ then $$w(\alpha_s) > 0$$ and if $$\ell(ws) < \ell(w)$$ then $$w(\alpha_s) < 0$$. Thus $$i \in I$$ is a right descent if $$w(\alpha_{s_i}) < 0$$ or equivalently if the matrix representing $$w$$ has all entries of the $$i$$-th column being non-positive.

INPUT:

• i – an element in the index set

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]

CoxeterMatrixGroup.canonical_representation()

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

CoxeterMatrixGroup.coxeter_graph()

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

CoxeterMatrixGroup.coxeter_matrix()

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]

CoxeterMatrixGroup.index_set()

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)

CoxeterMatrixGroup.simple_reflection(i)

Return the simple reflection $$s_i$$.

INPUT:

• i – an element from the index set

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]


#### Previous topic

Matrix Group Homsets

Linear Groups