Finite real reflection groups¶
Let \(V\) be a finite-dimensional real vector space. A reflection of \(V\) is an operator \(r \in \operatorname{GL}(V)\) that has order \(2\) and fixes pointwise a hyperplane in \(V\). In the present implementation, finite real reflection groups are tied with a root system.
Finite real reflection groups with root systems have been classified according to finite Cartan-Killing types. For more definitions and classification types of finite complex reflection groups, see Wikipedia article Complex_reflection_group.
The point of entry to work with reflection groups is ReflectionGroup()
which can be used with finite Cartan-Killing types:
sage: ReflectionGroup(['A',2]) # optional - gap3
Irreducible real reflection group of rank 2 and type A2
sage: ReflectionGroup(['F',4]) # optional - gap3
Irreducible real reflection group of rank 4 and type F4
sage: ReflectionGroup(['H',3]) # optional - gap3
Irreducible real reflection group of rank 3 and type H3
AUTHORS:
- Christian Stump (initial version 2011–2015)
Warning
Uses the GAP3 package Chevie which is available as an
experimental package (installed by sage -i gap3
) or to
download by hand from Jean Michel’s website.
Todo
- Implement descents, left/right descents,
has_descent
,first_descent
directly in this class, since the generic implementation is much slower.
-
class
sage.combinat.root_system.reflection_group_real.
IrreducibleRealReflectionGroup
(W_types, index_set=None, hyperplane_index_set=None, reflection_index_set=None)¶ Bases:
sage.combinat.root_system.reflection_group_real.RealReflectionGroup
,sage.combinat.root_system.reflection_group_complex.IrreducibleComplexReflectionGroup
Initialize
self
.TESTS:
sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: TestSuite(W).run() # optional - gap3
-
class
sage.combinat.root_system.reflection_group_real.
RealReflectionGroup
(W_types, index_set=None, hyperplane_index_set=None, reflection_index_set=None)¶ Bases:
sage.combinat.root_system.reflection_group_complex.ComplexReflectionGroup
A real reflection group given as a permutation group.
See also
-
class
Element
¶ Bases:
sage.combinat.root_system.reflection_group_complex.ComplexReflectionGroup.Element
-
action
(vec, side='right', on_space='primal')¶ Return the image of
vec
under the action ofself
.INPUT:
vec
– vector in the basis given by the simple rootside
– optional (default:"right"
) whether the action ofself
is on the"left"
or on the"right"
on_space
– optional (default:"primal"
) whether to act as the reflection representation on the given basis, or to act on the dual reflection representation on the dual basis
EXAMPLES:
sage: W = ReflectionGroup(['A',2]) # optional - gap3 sage: for w in W: # optional - gap3 ....: print("%s %s"%(w.reduced_word(), # optional - gap3 ....: [w.action(weight,side="left") for weight in W.fundamental_weights()])) # optional - gap3 [] [(2/3, 1/3), (1/3, 2/3)] [2] [(2/3, 1/3), (1/3, -1/3)] [1] [(-1/3, 1/3), (1/3, 2/3)] [1, 2] [(-1/3, 1/3), (-2/3, -1/3)] [2, 1] [(-1/3, -2/3), (1/3, -1/3)] [1, 2, 1] [(-1/3, -2/3), (-2/3, -1/3)]
TESTS:
sage: W = ReflectionGroup(['B',3]) # optional - gap3 sage: all(w.action(alpha,side="right") == w.action_on_root(alpha,side="right") # optional - gap3 ....: for w in W for alpha in W.simple_roots()) # optional - gap3 True sage: all(w.action(alpha,side="left") == w.action_on_root(alpha,side="left") #optional - gap3 ....: for w in W for alpha in W.simple_roots()) # optional - gap3 True
-
action_on_root
(root, side='right')¶ Return the root obtained by applying
self
toroot
.INPUT:
root
– the root to act onside
– optional (default:"right"
) whether the action is on the left or on the right
EXAMPLES:
sage: W = ReflectionGroup(['A',2]) # optional - gap3 sage: for w in W: # optional - gap3 ....: print("%s %s"%(w.reduced_word(), # optional - gap3 ....: [w.action_on_root(beta,side="left") for beta in W.positive_roots()])) # optional - gap3 [] [(1, 0), (0, 1), (1, 1)] [2] [(1, 1), (0, -1), (1, 0)] [1] [(-1, 0), (1, 1), (0, 1)] [1, 2] [(0, 1), (-1, -1), (-1, 0)] [2, 1] [(-1, -1), (1, 0), (0, -1)] [1, 2, 1] [(0, -1), (-1, 0), (-1, -1)] sage: W = ReflectionGroup(['A',2]) # optional - gap3 sage: for w in W: # optional - gap3 ....: print("%s %s"%(w.reduced_word(), # optional - gap3 ....: [w.action_on_root(beta,side="right") for beta in W.positive_roots()])) # optional - gap3 [] [(1, 0), (0, 1), (1, 1)] [2] [(1, 1), (0, -1), (1, 0)] [1] [(-1, 0), (1, 1), (0, 1)] [1, 2] [(-1, -1), (1, 0), (0, -1)] [2, 1] [(0, 1), (-1, -1), (-1, 0)] [1, 2, 1] [(0, -1), (-1, 0), (-1, -1)]
-
action_on_root_indices
(i, side='right')¶ Return the action on the set of roots.
INPUT:
i
– index of the root to act onside
– optional (default:"right"
) whether the action is on the left or on the right
EXAMPLES:
sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: w = W.w0 # optional - gap3 sage: N = len(W.roots()) # optional - gap3 sage: [w.action_on_root_indices(i,side="left") for i in range(N)] # optional - gap3 [8, 7, 6, 10, 9, 11, 2, 1, 0, 4, 3, 5] sage: W = ReflectionGroup(['A',2], reflection_index_set=['A','B','C']) # optional - gap3 sage: w = W.w0 # optional - gap3 sage: N = len(W.roots()) # optional - gap3 sage: [w.action_on_root_indices(i,side="left") for i in range(N)] # optional - gap3 [4, 3, 5, 1, 0, 2]
-
has_descent
(i, side='left', positive=False)¶ Return whether
i
is a descent (or ascent) ofself
.This is done by testing whether
i
is mapped byself
to a negative root.INPUT:
i
– an index of a simple reflectionside
(default:'right'
) –'left'
or'right'
positive
(default:False
) – a boolean
EXAMPLES:
sage: W = ReflectionGroup(["A",3]) # optional - gap3 sage: s = W.simple_reflections() # optional - gap3 sage: (s[1]*s[2]).has_descent(1) # optional - gap3 True sage: (s[1]*s[2]).has_descent(2) # optional - gap3 False
-
has_left_descent
(i)¶ Return whether
i
is a left descent ofself
.This is done by testing whether
i
is mapped byself
to a negative root.EXAMPLES:
sage: W = ReflectionGroup(["A",3]) # optional - gap3 sage: s = W.simple_reflections() # optional - gap3 sage: (s[1]*s[2]).has_left_descent(1) # optional - gap3 True sage: (s[1]*s[2]).has_left_descent(2) # optional - gap3 False
-
inversion_set
(side='right')¶ Return the inversion set of
self
.This is the set \(\{\beta \in \Phi^+ : s(\beta) \in \Phi^-\}\), where \(s\) is
self
.EXAMPLES:
sage: W = ReflectionGroup(['A',2]) # optional - gap3 sage: for w in W: # optional - gap3 ....: print("%s %s"%(w.reduced_word(), w.inversion_set())) # optional - gap3 [] [] [2] [(0, 1)] [1] [(1, 0)] [1, 2] [(1, 0), (1, 1)] [2, 1] [(0, 1), (1, 1)] [1, 2, 1] [(0, 1), (1, 0), (1, 1)] sage: W.from_reduced_word([1,2]).inversion_set(side="left") # optional - gap3 [(0, 1), (1, 1)]
-
left_coset_representatives
()¶ Return the left coset representatives of
self
.See also
EXAMPLES:
sage: W = ReflectionGroup(['A',2]) # optional - gap3 sage: for w in W: # optional - gap3 ....: lcr = w.left_coset_representatives() # optional - gap3 ....: print("%s %s"%(w.reduced_word(), # optional - gap3 ....: [v.reduced_word() for v in lcr])) # optional - gap3 [] [[], [2], [1], [1, 2], [2, 1], [1, 2, 1]] [2] [[], [2], [1]] [1] [[], [1], [2, 1]] [1, 2] [[]] [2, 1] [[]] [1, 2, 1] [[], [2], [1, 2]]
-
length
()¶ Return the length of
self
in generating reflections.This is the minimal numbers of generating reflections needed to obtain
self
.EXAMPLES:
sage: W = ReflectionGroup(['A',2]) # optional - gap3 sage: for w in W: # optional - gap3 ....: print("%s %s"%(w.reduced_word(), w.length())) # optional - gap3 [] 0 [2] 1 [1] 1 [1, 2] 2 [2, 1] 2 [1, 2, 1] 3
-
matrix
(side='right', on_space='primal')¶ Return
self
as a matrix acting on the underlying vector space.side
– optional (default:"right"
) whether the action ofself
is on the"left"
or on the"right"
on_space
– optional (default:"primal"
) whether to act as the reflection representation on the given basis, or to act on the dual reflection representation on the dual basis
EXAMPLES:
sage: W = ReflectionGroup(['A',2]) # optional - gap3 sage: for w in W: # optional - gap3 ....: w.reduced_word() # optional - gap3 ....: [w.to_matrix(), w.to_matrix(on_space="dual")] # optional - gap3 [] [ [1 0] [1 0] [0 1], [0 1] ] [2] [ [ 1 1] [ 1 0] [ 0 -1], [ 1 -1] ] [1] [ [-1 0] [-1 1] [ 1 1], [ 0 1] ] [1, 2] [ [-1 -1] [ 0 -1] [ 1 0], [ 1 -1] ] [2, 1] [ [ 0 1] [-1 1] [-1 -1], [-1 0] ] [1, 2, 1] [ [ 0 -1] [ 0 -1] [-1 0], [-1 0] ]
TESTS:
sage: W = ReflectionGroup(['F',4]) # optional - gap3 sage: all(w.to_matrix(side="left") == W.from_reduced_word(reversed(w.reduced_word())).to_matrix(side="right").transpose() for w in W) # optional - gap3 True sage: all(w.to_matrix(side="right") == W.from_reduced_word(reversed(w.reduced_word())).to_matrix(side="left").transpose() for w in W) # optional - gap3 True
-
reduced_word_in_reflections
()¶ Return a word in the reflections to obtain
self
.EXAMPLES:
sage: W = ReflectionGroup(['A',2], index_set=['a','b'], reflection_index_set=['A','B','C']) # optional - gap3 sage: [(w.reduced_word(), w.reduced_word_in_reflections()) for w in W] # optional - gap3 [([], []), (['b'], ['B']), (['a'], ['A']), (['a', 'b'], ['A', 'B']), (['b', 'a'], ['A', 'C']), (['a', 'b', 'a'], ['C'])]
See also
reduced_word()
-
right_coset_representatives
()¶ Return the right coset representatives of
self
.EXAMPLES:
sage: W = ReflectionGroup(['A',2]) # optional - gap3 sage: for w in W: # optional - gap3 ....: rcr = w.right_coset_representatives() # optional - gap3 ....: print("%s %s"%(w.reduced_word(), # optional - gap3 ....: [v.reduced_word() for v in rcr])) # optional - gap3 [] [[], [2], [1], [2, 1], [1, 2], [1, 2, 1]] [2] [[], [2], [1]] [1] [[], [1], [1, 2]] [1, 2] [[]] [2, 1] [[]] [1, 2, 1] [[], [2], [2, 1]]
-
to_matrix
(side='right', on_space='primal')¶ Return
self
as a matrix acting on the underlying vector space.side
– optional (default:"right"
) whether the action ofself
is on the"left"
or on the"right"
on_space
– optional (default:"primal"
) whether to act as the reflection representation on the given basis, or to act on the dual reflection representation on the dual basis
EXAMPLES:
sage: W = ReflectionGroup(['A',2]) # optional - gap3 sage: for w in W: # optional - gap3 ....: w.reduced_word() # optional - gap3 ....: [w.to_matrix(), w.to_matrix(on_space="dual")] # optional - gap3 [] [ [1 0] [1 0] [0 1], [0 1] ] [2] [ [ 1 1] [ 1 0] [ 0 -1], [ 1 -1] ] [1] [ [-1 0] [-1 1] [ 1 1], [ 0 1] ] [1, 2] [ [-1 -1] [ 0 -1] [ 1 0], [ 1 -1] ] [2, 1] [ [ 0 1] [-1 1] [-1 -1], [-1 0] ] [1, 2, 1] [ [ 0 -1] [ 0 -1] [-1 0], [-1 0] ]
TESTS:
sage: W = ReflectionGroup(['F',4]) # optional - gap3 sage: all(w.to_matrix(side="left") == W.from_reduced_word(reversed(w.reduced_word())).to_matrix(side="right").transpose() for w in W) # optional - gap3 True sage: all(w.to_matrix(side="right") == W.from_reduced_word(reversed(w.reduced_word())).to_matrix(side="left").transpose() for w in W) # optional - gap3 True
-
-
RealReflectionGroup.
almost_positive_roots
()¶ Return the almost positive roots of
self
.EXAMPLES:
sage: W = ReflectionGroup(['A',3], ['B',2]) # optional - gap3 sage: W.almost_positive_roots() # optional - gap3 [(-1, 0, 0, 0, 0), (0, -1, 0, 0, 0), (0, 0, -1, 0, 0), (0, 0, 0, -1, 0), (0, 0, 0, 0, -1), (1, 0, 0, 0, 0), (0, 1, 0, 0, 0), (0, 0, 1, 0, 0), (0, 0, 0, 1, 0), (0, 0, 0, 0, 1), (1, 1, 0, 0, 0), (0, 1, 1, 0, 0), (0, 0, 0, 1, 1), (1, 1, 1, 0, 0), (0, 0, 0, 2, 1)] sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: W.almost_positive_roots() # optional - gap3 [(-1, 0, 0), (0, -1, 0), (0, 0, -1), (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 0), (0, 1, 1), (1, 1, 1)]
-
RealReflectionGroup.
bipartite_index_set
()¶ Return the bipartite index set of a real reflection group.
EXAMPLES:
sage: W = ReflectionGroup(["A",5]) # optional - gap3 sage: W.bipartite_index_set() # optional - gap3 [[1, 3, 5], [2, 4]] sage: W = ReflectionGroup(["A",5],index_set=['a','b','c','d','e']) # optional - gap3 sage: W.bipartite_index_set() # optional - gap3 [['a', 'c', 'e'], ['b', 'd']]
-
RealReflectionGroup.
cartan_type
()¶ Return the Cartan type of
self
.EXAMPLES:
sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: W.cartan_type() # optional - gap3 ['A', 3] sage: W = ReflectionGroup(['A',3], ['B',2]) # optional - gap3 sage: W.cartan_type() # optional - gap3 A3xB2
-
RealReflectionGroup.
coxeter_matrix
()¶ Return the Coxeter matrix associated to
self
.EXAMPLES:
sage: G = ReflectionGroup(['A',3]) # optional - gap3 sage: G.coxeter_matrix() # optional - gap3 [1 3 2] [3 1 3] [2 3 1]
-
RealReflectionGroup.
fundamental_weight
(i)¶ Return the fundamental weight with index
i
.EXAMPLES:
sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: [ W.fundamental_weight(i) for i in W.index_set() ] # optional - gap3 [(3/4, 1/2, 1/4), (1/2, 1, 1/2), (1/4, 1/2, 3/4)]
-
RealReflectionGroup.
fundamental_weights
()¶ Return the fundamental weights of
self
in terms of the simple roots.The fundamental weights are defined by \(s_j(\omega_i) = \omega_i - \delta_{i=j}\alpha_j\) for the simple reflection \(s_j\) with corresponding simple roots \(\alpha_j\).
In other words, the transpose Cartan matrix sends the weight basis to the root basis. Observe again that the action here is defined as a right action, see the example below.
EXAMPLES:
sage: W = ReflectionGroup(['A',3], ['B',2]) # optional - gap3 sage: W.fundamental_weights() # optional - gap3 Finite family {1: (3/4, 1/2, 1/4, 0, 0), 2: (1/2, 1, 1/2, 0, 0), 3: (1/4, 1/2, 3/4, 0, 0), 4: (0, 0, 0, 1, 1/2), 5: (0, 0, 0, 1, 1)} sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: W.fundamental_weights() # optional - gap3 Finite family {1: (3/4, 1/2, 1/4), 2: (1/2, 1, 1/2), 3: (1/4, 1/2, 3/4)} sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: S = W.simple_reflections() # optional - gap3 sage: N = W.fundamental_weights() # optional - gap3 sage: for i in W.index_set(): # optional - gap3 ....: for j in W.index_set(): # optional - gap3 ....: print("{} {} {} {}".format(i, j, N[i], N[i]*S[j].to_matrix())) 1 1 (3/4, 1/2, 1/4) (-1/4, 1/2, 1/4) 1 2 (3/4, 1/2, 1/4) (3/4, 1/2, 1/4) 1 3 (3/4, 1/2, 1/4) (3/4, 1/2, 1/4) 2 1 (1/2, 1, 1/2) (1/2, 1, 1/2) 2 2 (1/2, 1, 1/2) (1/2, 0, 1/2) 2 3 (1/2, 1, 1/2) (1/2, 1, 1/2) 3 1 (1/4, 1/2, 3/4) (1/4, 1/2, 3/4) 3 2 (1/4, 1/2, 3/4) (1/4, 1/2, 3/4) 3 3 (1/4, 1/2, 3/4) (1/4, 1/2, -1/4)
-
RealReflectionGroup.
iteration
(algorithm='breadth', tracking_words=True)¶ Return an iterator going through all elements in
self
.INPUT:
algorithm
(default:'breadth'
) – must be one of the following:'breadth'
- iterate over in a linear extension of the weak order'depth'
- iterate by a depth-first-search
tracking_words
(default:True
) – whether or not to keep track of the reduced words and store them in_reduced_word
Note
The fastest iteration is the depth first algorithm without tracking words. In particular,
'depth'
is ~1.5x faster.EXAMPLES:
sage: W = ReflectionGroup(["B",2]) # optional - gap3 sage: for w in W.iteration("breadth",True): # optional - gap3 ....: print("%s %s"%(w, w._reduced_word)) # optional - gap3 () [] (1,3)(2,6)(5,7) [1] (1,5)(2,4)(6,8) [0] (1,7,5,3)(2,4,6,8) [0, 1] (1,3,5,7)(2,8,6,4) [1, 0] (2,8)(3,7)(4,6) [1, 0, 1] (1,7)(3,5)(4,8) [0, 1, 0] (1,5)(2,6)(3,7)(4,8) [0, 1, 0, 1] sage: for w in W.iteration("depth", False): w # optional - gap3 () (1,3)(2,6)(5,7) (1,5)(2,4)(6,8) (1,3,5,7)(2,8,6,4) (1,7)(3,5)(4,8) (1,7,5,3)(2,4,6,8) (2,8)(3,7)(4,6) (1,5)(2,6)(3,7)(4,8)
-
RealReflectionGroup.
permutahedron
(point=None)¶ Return the permutahedron of
self
.This is the convex hull of the point
point
in the weight basis under the action ofself
on the underlying vector space \(V\).INPUT:
point
– optional, a point given by its coordinates in the weight basis (default is \((1, 1, 1, \ldots)\))
Note
The result is expressed in the root basis coordinates.
EXAMPLES:
sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: W.permutahedron() # optional - gap3 A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 24 vertices sage: W = ReflectionGroup(['A',3],['B',2]) # optional - gap3 sage: W.permutahedron() # optional - gap3 A 5-dimensional polyhedron in QQ^5 defined as the convex hull of 192 vertices
TESTS:
sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: W.permutahedron([3,5,8]) # optional - gap3 A 3-dimensional polyhedron in QQ^3 defined as the convex hull of 24 vertices
-
RealReflectionGroup.
positive_roots
()¶ Return the positive roots of
self
.EXAMPLES:
sage: W = ReflectionGroup(['A',3], ['B',2]) # optional - gap3 sage: W.positive_roots() # optional - gap3 [(1, 0, 0, 0, 0), (0, 1, 0, 0, 0), (0, 0, 1, 0, 0), (0, 0, 0, 1, 0), (0, 0, 0, 0, 1), (1, 1, 0, 0, 0), (0, 1, 1, 0, 0), (0, 0, 0, 1, 1), (1, 1, 1, 0, 0), (0, 0, 0, 2, 1)] sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: W.positive_roots() # optional - gap3 [(1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 0), (0, 1, 1), (1, 1, 1)]
-
RealReflectionGroup.
reflection_to_positive_root
(r)¶ Return the positive root orthogonal to the given reflection.
EXAMPLES:
sage: W = ReflectionGroup(['A',2]) # optional - gap3 sage: for r in W.reflections(): print(W.reflection_to_positive_root(r)) # optional - gap3 (1, 0) (0, 1) (1, 1)
-
RealReflectionGroup.
right_coset_representatives
(J)¶ Return the right coset representatives of
self
for the parabolic subgroup generated by the simple reflections inJ
.EXAMPLES:
sage: W = ReflectionGroup(["A",3]) # optional - gap3 sage: for J in Subsets([1,2,3]): W.right_coset_representatives(J) # optional - gap3 [(), (2,5)(3,9)(4,6)(8,11)(10,12), (1,4)(2,8)(3,5)(7,10)(9,11), (1,7)(2,4)(5,6)(8,10)(11,12), (1,2,10)(3,6,5)(4,7,8)(9,12,11), (1,4,6)(2,3,11)(5,8,9)(7,10,12), (1,6,4)(2,11,3)(5,9,8)(7,12,10), (1,7)(2,6)(3,9)(4,5)(8,12)(10,11), (1,10,2)(3,5,6)(4,8,7)(9,11,12), (1,2,3,12)(4,5,10,11)(6,7,8,9), (1,5,9,10)(2,12,8,6)(3,4,7,11), (1,6)(2,9)(3,8)(5,11)(7,12), (1,8)(2,7)(3,6)(4,10)(9,12), (1,10,9,5)(2,6,8,12)(3,11,7,4), (1,12,3,2)(4,11,10,5)(6,9,8,7), (1,3)(2,12)(4,10)(5,11)(6,8)(7,9), (1,5,12)(2,9,4)(3,10,8)(6,7,11), (1,8,11)(2,5,7)(3,12,4)(6,10,9), (1,11,8)(2,7,5)(3,4,12)(6,9,10), (1,12,5)(2,4,9)(3,8,10)(6,11,7), (1,3,7,9)(2,11,6,10)(4,8,5,12), (1,9,7,3)(2,10,6,11)(4,12,5,8), (1,11)(3,10)(4,9)(5,7)(6,12), (1,9)(2,8)(3,7)(4,11)(5,10)(6,12)] [(), (2,5)(3,9)(4,6)(8,11)(10,12), (1,4)(2,8)(3,5)(7,10)(9,11), (1,2,10)(3,6,5)(4,7,8)(9,12,11), (1,4,6)(2,3,11)(5,8,9)(7,10,12), (1,6,4)(2,11,3)(5,9,8)(7,12,10), (1,2,3,12)(4,5,10,11)(6,7,8,9), (1,5,9,10)(2,12,8,6)(3,4,7,11), (1,6)(2,9)(3,8)(5,11)(7,12), (1,3)(2,12)(4,10)(5,11)(6,8)(7,9), (1,5,12)(2,9,4)(3,10,8)(6,7,11), (1,3,7,9)(2,11,6,10)(4,8,5,12)] [(), (2,5)(3,9)(4,6)(8,11)(10,12), (1,7)(2,4)(5,6)(8,10)(11,12), (1,4,6)(2,3,11)(5,8,9)(7,10,12), (1,7)(2,6)(3,9)(4,5)(8,12)(10,11), (1,10,2)(3,5,6)(4,8,7)(9,11,12), (1,2,3,12)(4,5,10,11)(6,7,8,9), (1,10,9,5)(2,6,8,12)(3,11,7,4), (1,12,3,2)(4,11,10,5)(6,9,8,7), (1,8,11)(2,5,7)(3,12,4)(6,10,9), (1,12,5)(2,4,9)(3,8,10)(6,11,7), (1,11)(3,10)(4,9)(5,7)(6,12)] [(), (1,4)(2,8)(3,5)(7,10)(9,11), (1,7)(2,4)(5,6)(8,10)(11,12), (1,2,10)(3,6,5)(4,7,8)(9,12,11), (1,6,4)(2,11,3)(5,9,8)(7,12,10), (1,10,2)(3,5,6)(4,8,7)(9,11,12), (1,5,9,10)(2,12,8,6)(3,4,7,11), (1,8)(2,7)(3,6)(4,10)(9,12), (1,12,3,2)(4,11,10,5)(6,9,8,7), (1,3)(2,12)(4,10)(5,11)(6,8)(7,9), (1,11,8)(2,7,5)(3,4,12)(6,9,10), (1,9,7,3)(2,10,6,11)(4,12,5,8)] [(), (2,5)(3,9)(4,6)(8,11)(10,12), (1,4,6)(2,3,11)(5,8,9)(7,10,12), (1,2,3,12)(4,5,10,11)(6,7,8,9)] [(), (1,4)(2,8)(3,5)(7,10)(9,11), (1,2,10)(3,6,5)(4,7,8)(9,12,11), (1,6,4)(2,11,3)(5,9,8)(7,12,10), (1,5,9,10)(2,12,8,6)(3,4,7,11), (1,3)(2,12)(4,10)(5,11)(6,8)(7,9)] [(), (1,7)(2,4)(5,6)(8,10)(11,12), (1,10,2)(3,5,6)(4,8,7)(9,11,12), (1,12,3,2)(4,11,10,5)(6,9,8,7)] [()]
-
RealReflectionGroup.
root_to_reflection
(root)¶ Return the reflection along the given
root
.EXAMPLES:
sage: W = ReflectionGroup(['A',2]) # optional - gap3 sage: for beta in W.roots(): W.root_to_reflection(beta) # optional - gap3 (1,4)(2,3)(5,6) (1,3)(2,5)(4,6) (1,5)(2,4)(3,6) (1,4)(2,3)(5,6) (1,3)(2,5)(4,6) (1,5)(2,4)(3,6)
-
RealReflectionGroup.
simple_root
(i)¶ Return the simple root with index
i
.EXAMPLES:
sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: W.simple_root(1) # optional - gap3 (1, 0, 0)
-
RealReflectionGroup.
simple_root_index
(i)¶ Return the index of the simple root \(\alpha_i\).
This is the position of \(\alpha_i\) in the list of simple roots.
EXAMPLES:
sage: W = ReflectionGroup(['A',3]) # optional - gap3 sage: [W.simple_root_index(i) for i in W.index_set()] # optional - gap3 [0, 1, 2]
-
class
-
sage.combinat.root_system.reflection_group_real.
ReflectionGroup
(*args, **kwds)¶ Construct a finite (complex or real) reflection group as a Sage permutation group by fetching the permutation representation of the generators from chevie’s database.
INPUT:
can be one or multiple of the following:
- a triple \((r, p, n)\) with \(p\) divides \(r\), which denotes the group \(G(r, p, n)\)
- an integer between \(4\) and \(37\), which denotes an exceptional irreducible complex reflection group
- a finite Cartan-Killing type
EXAMPLES:
Finite reflection groups can be constructed from
Cartan-Killing classification types:
sage: W = ReflectionGroup(['A',3]); W # optional - gap3 Irreducible real reflection group of rank 3 and type A3 sage: W = ReflectionGroup(['H',4]); W # optional - gap3 Irreducible real reflection group of rank 4 and type H4 sage: W = ReflectionGroup(['I',5]); W # optional - gap3 Irreducible real reflection group of rank 2 and type I2(5)
the complex infinite family \(G(r,p,n)\) with \(p\) divides \(r\):
sage: W = ReflectionGroup((1,1,4)); W # optional - gap3 Irreducible real reflection group of rank 3 and type A3 sage: W = ReflectionGroup((2,1,3)); W # optional - gap3 Irreducible real reflection group of rank 3 and type B3
Chevalley-Shepard-Todd exceptional classification types:
sage: W = ReflectionGroup(23); W # optional - gap3 Irreducible real reflection group of rank 3 and type H3
Cartan types and matrices:
sage: ReflectionGroup(CartanType(['A',2])) # optional - gap3 Irreducible real reflection group of rank 2 and type A2 sage: ReflectionGroup(CartanType((['A',2],['A',2]))) # optional - gap3 Reducible real reflection group of rank 4 and type A2 x A2 sage: C = CartanMatrix(['A',2]) # optional - gap3 sage: ReflectionGroup(C) # optional - gap3 Irreducible real reflection group of rank 2 and type A2
multiples of the above:
sage: W = ReflectionGroup(['A',2],['B',2]); W # optional - gap3 Reducible real reflection group of rank 4 and type A2 x B2 sage: W = ReflectionGroup(['A',2],4); W # optional - gap3 Reducible complex reflection group of rank 4 and type A2 x ST4 sage: W = ReflectionGroup((4,2,2),4); W # optional - gap3 Reducible complex reflection group of rank 4 and type G(4,2,2) x ST4