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
be a Coxeter system. 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:
data
– a Coxeter matrix or graph or a Cartan typebase_ring
– (default: the universal cyclotomic field) the base ring which contains all valueswhere
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
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 Finite 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 Finite 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 isself
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 ofself
.A Coxeter system
has a root system defined as
and we define the positive (resp. negative) roots
by all
(resp.
). 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:
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.
bilinear_form
()¶ Return the bilinear form associated to
self
.Given a Coxeter group
with Coxeter matrix
, the associated bilinear form
is given by
If
is positive definite, then
is of finite type (and so the associated Coxeter group is a finite group). If
is positive semidefinite, then
is affine type.
EXAMPLES:
sage: W = CoxeterGroup(['D',4]) sage: W.bilinear_form() [ 1 -1/2 0 0] [-1/2 1 -1/2 -1/2] [ 0 -1/2 1 0] [ 0 -1/2 0 1]
-
CoxeterMatrixGroup.
canonical_representation
()¶ Return the canonical faithful representation of
self
, which isself
.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.
is_finite
()¶ Return
True
if this group is finite.EXAMPLES:
sage: [l for l in range(2, 9) if ....: CoxeterGroup([[1,3,2],[3,1,l],[2,l,1]]).is_finite()] ....: [2, 3, 4, 5] sage: [l for l in range(2, 9) if ....: CoxeterGroup([[1,3,2,2],[3,1,l,2],[2,l,1,3],[2,2,3,1]]).is_finite()] ....: [2, 3, 4] sage: [l for l in range(2, 9) if ....: CoxeterGroup([[1,3,2,2,2], [3,1,3,3,2], [2,3,1,2,2], ....: [2,3,2,1,l], [2,2,2,l,1]]).is_finite()] ....: [2, 3] sage: [l for l in range(2, 9) if ....: CoxeterGroup([[1,3,2,2,2], [3,1,2,3,3], [2,2,1,l,2], ....: [2,3,l,1,2], [2,3,2,2,1]]).is_finite()] ....: [2, 3] sage: [l for l in range(2, 9) if ....: CoxeterGroup([[1,3,2,2,2,2], [3,1,l,2,2,2], [2,l,1,3,l,2], ....: [2,2,3,1,2,2], [2,2,l,2,1,3], [2,2,2,2,3,1]]).is_finite()] ....: [2, 3]
-
CoxeterMatrixGroup.
order
()¶ Return the order of
self
.If the Coxeter group is finite, this uses an iterator.
EXAMPLES:
sage: W = CoxeterGroup([[1,3],[3,1]]) sage: W.order() 6 sage: W = CoxeterGroup([[1,-1],[-1,1]]) sage: W.order() +Infinity
-
CoxeterMatrixGroup.
simple_reflection
(i)¶ Return the simple reflection
.
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]