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)

Bases: sage.groups.matrix_gps.finitely_generated.FinitelyGeneratedMatrixGroup_generic, sage.structure.unique_representation.UniqueRepresentation

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)

Bases: sage.groups.matrix_gps.group_element.MatrixGroupElement_generic

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

Next topic

Linear Groups

This Page