Finite reflection groups
Chevie.PermRoot
Chevie.ComplexR.Reflection
Chevie.PermRoot.PRG
Chevie.PermRoot.PermRootGroup
Chevie.ComplexR.codegrees
Chevie.ComplexR.complex_reflection_group
Chevie.ComplexR.degrees
Chevie.ComplexR.hyperplane_orbits
Chevie.ComplexR.reflections
Chevie.CoxGroups.braid_relations
Chevie.Diagrams.diagram
Chevie.PermRoot.PermX
Chevie.PermRoot.PermY
Chevie.PermRoot.YMatrix
Chevie.PermRoot.asreflection
Chevie.PermRoot.bipartite_decomposition
Chevie.PermRoot.cartan
Chevie.PermRoot.cartan
Chevie.PermRoot.coroot
Chevie.PermRoot.coroots
Chevie.PermRoot.coxeter_number
Chevie.PermRoot.generic_order
Chevie.PermRoot.inclusion
Chevie.PermRoot.invariant_form
Chevie.PermRoot.invariants
Chevie.PermRoot.isparabolic
Chevie.PermRoot.number_of_hyperplanes
Chevie.PermRoot.number_of_reflections
Chevie.PermRoot.parabolic_closure
Chevie.PermRoot.parabolic_reps
Chevie.PermRoot.rank
Chevie.PermRoot.reflectionMatrix
Chevie.PermRoot.reflection_character
Chevie.PermRoot.reflection_eigenvalues
Chevie.PermRoot.reflection_representation
Chevie.PermRoot.reflection_representation
Chevie.PermRoot.reflection_representation
Chevie.PermRoot.reflection_subgroup
Chevie.PermRoot.refls
Chevie.PermRoot.restriction
Chevie.PermRoot.roots
Chevie.PermRoot.roots
Chevie.PermRoot.semisimplerank
Chevie.PermRoot.simple_conjugating
Chevie.PermRoot.simple_reps
Chevie.PermRoot.simplecoroots
Chevie.PermRoot.simpleroots
Chevie.PermRoot.torus_order
Chevie.PermRoot.unique_refls
Chevie.Weyl.standard_parabolic
Combinat.catalan
LaurentPolynomials.discriminant
PermGroups.Perms.reflection_length
Chevie.PermRoot
— ModuleLet V
be a vector space over a subfield K
of the complex numbers (in Julia the elements of K
will be usually represented by Rational
s or Cyc
s).
A complex reflection is an element s∈ GL(V)
of finite order whose fixed point set is a hyperplane, the reflecting hyperplane Hₛ
of s
.
Most of the time we abbreviate "complex reflection" to reflection; in some literature "reflection" is reserved for s
of order 2 and otherwise pseudo-reflection is used.
A reflection s
has a unique eigenvalue ζₛ
not equal to 1
, which is a root of unity; if K
is a subfield of the real numbers, ζₛ
is necessarily equal to -1
and s
is of order 2. An eigenvector r∈ V
of s
for the eigenvalue ζₛ
is called a root of s
and a linear form rᵛ
on V
of kernel Hₛ
is called a coroot of s
. If r
and rᵛ
are normalized so that rᵛ(r)=1-ζ
, then s
is the map on V
defined by s(x)=x-rᵛ(x)r
. Such a normalized root and coroot for s
are unique up to scaling the root and inversely scaling the coroot.
A finite complex reflection group W
is a finite group generated by complex reflections. Since whenever W
contains a reflection s
it contains its powers, W
is always generated by reflections s
such that ζₛ==E(d)
where d
is the order of s
; we can also assume that s
is not a power of another reflection with larger order d
. Such a reflection is called a distinguished reflection of W
; it is a canonical generator of the cyclic subgroup of W
centralizing Hₛ
. The generators of the complex reflection groups we construct are always distinguished reflections; the set of distinguished reflections are in bijection with the reflecting hyperplanes. In a real reflection group all reflections are distinguished.
It is much more efficient to compute with permutation groups than with matrix groups; hence we use for computing with a finite complex reflection group W
a permutation representation on a W
-invariant set of root and coroot vectors for reflections of W
; that is, a set R
of pairs (r,rᵛ)∈ V×Vᵛ
invariant by W
and such that every distinguished reflection in W
is determined by some pair in R
(see reflectionMatrix
). Using a W
-invariant set implies that there may be several pairs determining the same reflection, which differ by roots of unity. This generalizes the usual construction for Coxeter groups (the case K=ℝ
) where to each reflection of W
is associated two roots, one positive and one negative.
A complex reflection group is irreducible if the representation V
is irreducible. For irreducible complex reflection groups, there are at least as many roots for a given reflection as the order of the center of W
.
The following methods are always defined for finite complex reflection groups:
gens(W)
: the (distinguished) reflections which generateW
, given as permutations of the roots.reflrep(W)
gives them as matrices.roots(W)
: the list of roots ofW
.coroots(W)
: the list of coroots, in the same order as the roots.refls(W)
: a list of distinguished reflections ofW
, as permutations. This list is of same length as the roots, and itsi
-th element is the distinguished reflection for thei
-th root, so it will have repetitions.unique_refls(W)
returns a sublist of1:length(roots(W))
such that the distinguished reflections around the corresponding roots reach one time only each distinguished reflection ofW
.
The lists roots
, coroots
and refls
starts with the "generating" ones (those corresponding to gens(W)
).
simpleroots(W)
: the generating roots as a matrix.simplecoroots(W)
: the generating coroots as a matrix.reflections(W)
gives a list without repetitions of all reflections ofW
(not only the distinguished ones), as objects of typeReflection
. These objects contain more information on each reflection.
The finite irreducible complex reflection groups have been completely classified by Shephard and Todd, see ShephardTodd1954. They consist of one infinite family G(de,e,r)
depending on 3 parameters (which includes the infinite families of Weyl groups), and 34 exceptional groups which have been given by Shephard and Todd names which range from G₄
to G₃₇
. These exceptional groups include the exceptional Weyl groups, e.g., coxgroup(:E,8)
is the same as G₃₇
.
We provide functions to build any finite reflection group, either by giving a list of roots and coroots defining the generating reflections (see PRG
), or in terms of the classification (see complex_reflection_group
). In the context e.g. of Weyl groups, one wants to describe the particular root system chosen in term of the traditional classification of crystallographic root systems. This is done via calls to the function coxeter_group
(see the module Weyl
). There is not yet a general theory on how to construct a nice set of roots for a non-real reflection group; the roots chosen here where obtained case-by-case; however, they satisfy several important properties:
The generating reflections satisfy braid relations which present the braid group associated to
W
(seediagram
).The field of definition of
W
is the fieldK
generated by the traces of the elements ofW
acting onV
. It is a theorem thatW
may be realized as a reflection group overK
.The Cartan matrix
rᵛ(r')
wherer
andr'
runs over the roots and coroots for the generating reflections has entries in the ringℤₖ
of integers ofK
, and the other roots (resp. coroots) are linear combinations with coefficients inℤₖ
of a linearly independent subset of them.
It turns out that all representations of W
are defined over the field of definition K
(see. Benard1976 and D.~Bessis' thesis). This has been known for a long time in the case K=ℚ
, the case of Weyl groups, whose representations are all integral.
julia> W=complex_reflection_group(4)
G₄
julia> gens(W) # as permutations of the 24 roots
2-element Vector{Perm{Int16}}:
(1,3,9)(2,4,7)(5,10,18)(6,11,16)(8,12,19)(13,15,20)(14,17,21)(22,23,24)
(1,5,13)(2,6,10)(3,7,14)(4,8,15)(9,16,22)(11,12,17)(18,19,23)(20,21,24)
julia> length(unique(refls(W)))
4
julia> length(refls(W)) # 24=4*(number of roots of unity in ℚ (ζ₃))
24
julia> reflrep(W) # the generators as matrices
2-element Vector{Matrix{Cyc{Rational{Int64}}}}:
[1 0; 0 ζ₃]
[√-3/3 -ζ₃²√-3/3; (-3+√-3)/3 -ζ₃√-3/3]
For almost all irreducible complex reflection groups, the generating matrices for W
we give have coefficients in the field of definition K
. Further, the set of matrices for all elements of W
is globally invariant under the Galois group of K/ℚ
, thus the Galois action induces automorphisms of W
. The exceptions are G₂₂, G₂₇
where the matrices are in a degree two extension of K
(this is needed to have a globally invariant model, see MarinMichel2010) and some dihedral groups, as well as H₃
and H₄
, where the matrices given (the usual Coxeter reflection representation over K
) are not globally invariant (but one can get invariant ones by chevieget(:H4,:InvariantModel)
).
julia> braid_relations(W) # as tuples of equal words in the generators
1-element Vector{Tuple{Vector{Int64}, Vector{Int64}}}:
([1, 2, 1], [2, 1, 2])
julia> diagram(W) # the same in pictures
③ ——③ G₄
1 2
julia> cartan(W)
2×2 Matrix{Cyc{Rational{Int64}}}:
ζ₃²√-3 ζ₃²
-ζ₃² ζ₃²√-3
julia> simpleroots(W)
2×2 Matrix{Cyc{Rational{Int64}}}:
0 ζ₃²√-3
2ζ₃² ζ₃²
julia> simplecoroots(W)
2×2 Matrix{Cyc{Rational{Int64}}}:
0 1
√-3/3 √-3/3
Let SV
be the symmetric algebra of V
. The invariants of W
in SV
are called the polynomial invariants of W
. If n=dim V
, they are generated as a polynomial ring by n
homogeneous algebraically independent polynomials f₁,…,fₙ
. The polynomials fᵢ
are not uniquely determined but their degrees are. The fᵢ
are called the basic invariants of W
, and their degrees the reflection degrees of W
; the function degrees(W)
returns these invariants.
Let I
be the ideal generated by the homogeneous invariants of positive degree in SV
. Then SV/I
is isomorphic to the regular representation of W
as a W
-module. It is thus a graded (by the degree of elements of SV
) version of the regular representation of W
. The polynomial which gives the graded multiplicity of a character φ
of W
in the graded module SV/I
is called the fake degree of φ
. The function fakedegrees
returns these polynomials.
julia> degrees(W)
2-element Vector{Int64}:
4
6
julia> fakedegrees(W,Pol(:x))
7-element Vector{Pol{Int64}}:
1
x⁴
x⁸
x⁷+x⁵
x⁵+x³
x³+x
x⁶+x⁴+x²
Chevie.PermRoot.asreflection
— Functionasreflection(s::Matrix [,r::AbstractVector])
s
should be is a square matrix, and if given r
should be a vector of length size(s,1)
. The function determines if s
is the matrix of a complex reflection (resp. if r
is given if it is the matrix of a reflection of root r
; the point of giving r
is to specify exactly the desired root and coroot, which otherwise are determined only up to a scalar and its inverse). The function returns nothing
if s
if is not a reflection (resp. not a reflection with root r
), and otherwise returns a named tuple with four fields:
.root
: the root of the reflection s
(equal to r
if given)
.coroot
: the coroot of s
.eigenvalue
: the non-trivial eigenvalue of s
.isunitary
: a boolean which is true
if and only if s
is unitary with respect to the usual scalar product (then s
is determined by the root and the eigenvalue as reflectionMatrix(.root,.eigenvalue)
)
julia> asreflection([-1 0 0;1 1 0;0 0 1])
(root = [2, 0, 0], coroot = Rational{Int64}[1, -1//2, 0], eig = -1, isunitary = false)
julia> asreflection([-1 0 0;1 1 0;0 0 1],[1,0,0])
(root = [1, 0, 0], coroot = Rational{Int64}[2, -1, 0], eig = -1, isunitary = false)
Chevie.PermRoot.reflectionMatrix
— FunctionreflectionMatrix(root, coroot)
the matrix of the reflection with a given root and coroot.
A (complex) reflection is a finite order element s
of GL(V)
, the linear group of a vector space over a subfield of the complex numbers, whose fixed points form a hyperplane H
(the reflecting hyperplane of s
); an eigenvector r
for the non-trivial eigenvalue ζ
(a root of unity) is called a root of s
. If we choose a linear form rᵛ
defining H
such that rᵛ(r)=1-ζ
(a coroot of s
) then s
is given by x↦ x-rᵛ(x)r
.
A way of specifying s
is by giving a root and a coroot, which are uniquely determined by s
up to multiplication of the root by a scalar and of the coroot by the inverse scalar. The function reflectionMatrix
gives the matrix of the corresponding reflection in the standard basis of V
, where the root
and the coroot
are vectors given in the standard bases of V
and Vᵛ
, so the pairing rᵛ(r)
is obtained as transpose(root)*coroot
.
julia> r=reflectionMatrix([1,0,0],[2,-1,0])
3×3 Matrix{Int64}:
-1 0 0
1 1 0
0 0 1
julia> r==reflrep(coxgroup(:A,3),1)
true
julia> r*[2,-1,0]
3-element Vector{Int64}:
-2
1
0
julia> [1 0 0]*r
1×3 Matrix{Int64}:
-1 0 0
As we see in the last lines, in Julia a matrix operates from the right on the vector space V
of row vectors and from the left on the dual space Vᵛ
of column vectors.
reflectionMatrix(r, ζ=-1)
returns the matrix of the unitary complex reflection determined by the root r
and the eigenvalue ζ
, that is, when the vector space and its dual are identified via the scalar product <x,y>=transpose(x)*y
; the coroot rᵛ
is then equal to the linear form x->(1-ζ)<x,r>/<r,r>
.
julia> reflectionMatrix([1,0,-E(3,2)])
3×3 Matrix{Cyc{Rational{Int64}}}:
0 0 ζ₃²
0 1 0
ζ₃ 0 0
Chevie.PermRoot.PermRootGroup
— TypePermRootGroup
is the type of reflection groups represented as a permutation group on a set of roots.
Chevie.ComplexR.complex_reflection_group
— Functioncomplex_reflection_group(STnumber)
or crg(STnumber)
complex_reflection_group(p,q,r)
or crg(p,q,r)
The first form of complex_reflection_group
returns the complex reflection group which has Shephard-Todd number STnumber
, see Shephard-Todd1954. The second form returns the imprimitive complex reflection group G(p,q,r)
.
julia> G=complex_reflection_group(4)
G₄
julia> degrees(G)
2-element Vector{Int64}:
4
6
julia> length(G)
24
julia> W*coxgroup(:A,2) # how to make a non-irreducible group
G₄×A₂
julia> complex_reflection_group(1,1,3) # another way to enter A₂
gl₃
julia> crg(4) # there is also a short alias
G₄
Chevie.PermRoot.PRG
— TypePRG(roots,coroots)
complex reflection group with given roots and coroots
Chevie.PermRoot.rank
— Functionrank(W::ComplexReflectionGroup)
returns the rank of W
, which is the dimension of the space where it acts.
julia> rank(complex_reflection_group(31))
4
Chevie.PermRoot.semisimplerank
— FunctionsemisimpleRank(W::ComplexReflectionGroup)
returns the semisimple rank of W
, which is the dimension of the space where it effectively acts. If W
is a reflection group on the space V
, and V₁
is the subspace generated by roots(W)
, then semisimplerank(W)
is the dimension of V₁
. The reflection group W
is called essential if V₁=V
.
julia> W=reflection_subgroup(coxgroup(:A,3),[1,3])
A₃₍₁₃₎=A₁×A₁Φ₁
julia> semisimplerank(W)
2
julia> rank(W)
3
Chevie.PermRoot.number_of_reflections
— Functionnumber_of_reflections(W::ComplexReflectionGroup)
or nref(W)
the number of reflections of W
Chevie.PermRoot.number_of_hyperplanes
— Functionnumber_of_hyperplanes(W::ComplexReflectionGroup)
or nhyp(W)
The number of reflecting hyperplanes of W
Chevie.PermRoot.coxeter_number
— Functioncoxeter_number(W::PermRootGroup,i)
or coxnum
Gordon and Griffeth GG2012 have defined the Coxeter number of an irreducible character φ
of a complex reflection group as the scalar by which the central element ∑_{s in reflections(W)}(1-s)
acts on the representation of character φ
. The function coxnum
returns the Coxeter number of the i
-th irreducible character of W
.
coxeter_number(W::PermRootGroup)
or coxnum
Gordon and Griffeth GG2012 have defined the Coxeter number of an irreducible complex reflection group as the Coxeter number of its reflection character. It is also given by the formula (nref(W)+nhyp(W))/rank(W)
; for a well-generated group it is equal to the highest reflection degree. For a non-irreducible group, the Coxeter number is the sum of those of its irreducible components.
Chevie.PermRoot.roots
— Methodroots(W::PermRootGroup)
the roots of W
Chevie.PermRoot.roots
— Methodroots(W::PermRootGroup,i)
same as roots(W)[i]
Chevie.PermRoot.coroots
— Functioncoroots(W)
the list of coroots of W
(listed in the same order as the roots)
coroots(W,i)
same as but better than coroots(W)[i]
Chevie.PermRoot.coroot
— Functioncoroot(r,λ=-1)
the coroot for a unitary reflection of root r
and eigenvalue λ
.
Chevie.PermRoot.simpleroots
— Functionsimpleroots(W::ComplexReflectionGroup)
the simple roots of W
(those corresponding to gens(W)
) as a matrix (each root is a row)
Chevie.PermRoot.simplecoroots
— Functionsimplecoroots(W::ComplexReflectionGroup)
the simple coroots of W
(those corresponding to gens(W)
) as a matrix (each coroot is a row)
Chevie.PermRoot.cartan
— Methodcartan(W::PermRootGroup)
Cartan matrix of W
.
Let s₁,…,sₙ
be reflections with associated roots rᵢ
and coroots cᵢ
. The matrix C
with entries Cᵢ,ⱼ=cᵢ(rⱼ)
is called a Cartan matrix of s₁,…,sₙ
. Since a reflection determines up to scalar a root and a coroot, C
is uniquely determined by s₁,…,sₙ
up to conjugation by a diagonal matrix.
If s₁,…,sₙ
generate a reflection group W
, then C
up to conjugation by a diagonal matrix is an invariant of the reflection representation of W
. If invertible, the matrix C
determines this representation since then the rᵢ
form a basis in which the matrix for sᵢ
differs from the identity only on the i
-th row, where the corresponding row of C
has been subtracted.
In general cartan(W)==simplecoroots(W)*permutedims(simpleroots(W))
.
julia> W=coxgroup(:A,3)
A₃
julia> cartan(W)
3×3 Matrix{Int64}:
2 -1 0
-1 2 -1
0 -1 2
Chevie.PermRoot.cartan
— Methodcartan(W::PermRootGroup,i,j)
the cartan coefficient cᵢ(rⱼ)
, the value of the linear form given by the i
-th coroot cᵢ
on the j
-th root rᵢ
of W
Chevie.PermRoot.refls
— Functionrefls(W::ComplexReflectionGroup)
a list of same length as W.roots
giving the corresponding element of W
representing a distinguished reflection. In particular this list is much longer than unique(refls(W))
since in general there are several roots corresponding to a reflection.
refls(W::ComplexReflectionGroup,i)
the element of W
representing the distinguished reflection around the i
-th root of W
(i
can be an index or a vector of indices)
Chevie.PermRoot.unique_refls
— Functionunique_refls(W::ComplexReflectionGroup)
A sublist of 1:length(roots(W))
such that the distinguished reflections around the corresponding roots reach one time only each distinguished reflection of W
.
Chevie.ComplexR.Reflection
— TypeReflection
is a struct
representing a reflection in a reflection group.
julia> W=crg(8);
julia> r=reflections(W)[7] # shows (r.W,r.rootno,r.eigen)
Reflection(G₈,1,-1)
julia> r.rootno # r is a reflection for the first root
1
julia> r.eigen # the non-trival eigenvalue, as a Root1
Root1: -1
julia> r.W # the group of which r is a reflection
G₈
julia> r==Reflection(W,1,-1) # specify r with .rootno and .eigen
true
julia> Reflection(W,1) # specify with .rootno gets the distinguished reflection
Reflection(G₈,1,ζ₄)
julia> root(r)
2-element Vector{Cyc{Rational{Int64}}}:
0
ζ₄
julia> coroot(r)
2-element Vector{Cyc{Int64}}:
0
-2ζ₄
julia> Matrix(r)
2×2 Matrix{Cyc{Rational{Int64}}}:
1 0
0 -1
julia> hyperplane(r) # the fixed hyperplane, as a rowspace
1×2 Matrix{Cyc{Rational{Int64}}}:
1 0
julia> hyperplane(r)*Matrix(r)==hyperplane(r)
true
julia> isdistinguished(r) # r is not distinguished
false
julia> exponent(r) # which power of a distinguished reflection it is
2
julia> Perm(r)
(1,8)(2,9)(3,16)(4,15)(5,17)(6,18)(7,19)(10,22)(11,21)(12,23)
julia> hyperplane_orbit(r) # r is in the first hyperplane orbit
1
julia> position_class(r) # the index of the conjugacy class of r in W
15
julia> simple_rep(r) # smallest root index affording a conjugate reflection
1
julia> word(r) # a word in the generators of r.W for r
2-element Vector{Int64}:
1
1
Chevie.ComplexR.reflections
— Functionreflections(W)
a Vector{Reflection}
of all reflections of the reflection group W
(including the non-distinguished ones; see Reflection
). reflections(W)[1:nhyp(W)]
are the distinguished reflections.
julia> W=crg(4)
G₄
julia> reflections(W)
8-element Vector{Reflection{PRG{Cyc{Rational{Int64}}, Int16}}}:
Reflection(G₄,1,ζ₃)
Reflection(G₄,2,ζ₃)
Reflection(G₄,4,ζ₃)
Reflection(G₄,5,ζ₃)
Reflection(G₄,1,ζ₃²)
Reflection(G₄,2,ζ₃²)
Reflection(G₄,4,ζ₃²)
Reflection(G₄,5,ζ₃²)
PermGroups.Perms.reflection_length
— Methodreflection_length(W::PermRootGroup,w::Perm)
or reflength
This function returns the number of eigenvalues of w
in the reflection representation which are not equal to 1. For a finite Coxeter group, this is equal to the reflection length of w
, that is the minimum number of reflections of which w
is a product. This also holds in general for a well-generated complex reflection group if w
divides for the reflection length a Coxeter element.
julia> W=coxgroup(:A,4)
A₄
julia> reflength(W,longest(W))
2
julia> reflength(W,W(1,2,3,4))
4
Chevie.PermRoot.simple_reps
— Functionsimple_reps(W)
for each root, the index of the first simple root conjugate to it (it is the index of a generator of W
).
simple_reps(W,i)
the smallest index of a root in the same W
-orbit as the i
-th root (it is the index of a generator of W
).
Chevie.PermRoot.simple_conjugating
— Functionsimple_conjugating(W::ComplexReflectionGroup)
For each index i
of a root, an element w∈ W
such that action(W,simple_reps(W,i),w)==i
.
simple_conjugating(W,i)
an element w∈ W
such that action(W,simple_reps(W,i),w)==i
. In particular W(simple_reps(W,i))^simple_conjugating(W,i)==refls(W,i)
.
Chevie.Diagrams.diagram
— Functiondiagram(W)
prints a diagram describing a presentation of the finite reflection group or spets W
julia> diagram(coxgroup(:E,8))
O 2
│
O—O—O—O—O—O—O E₈
1 3 4 5 6 7 8
julia> diagram(crg(33))
3 ② G₃₃
/^\
② ——② ——② ——②
1 2 4 5 423423=342342
Chevie.ComplexR.hyperplane_orbits
— Functionhyperplane_orbits(W::ComplexReflectionGroup)
returns a list of named tuples, one for each hyperplane orbit of the reflection group W
. If o
is the named tuple for such an orbit, and s
is the first element of gens(W)
whose hyperplane is in the orbit, it contains the following fields
.s
: index of s
in gens(W)
.order
: order of s
.cl_s
: for i in 1:order-1
, position_class(W,W(s)^i)
.N_s
: size of hyperplane orbit
.det_s
: for i in 1:order-1
, position in CharTable(W)
of detₛⁱ
, where detₛ
is the linear character taking the value det(reflrep(W,s))
on s
and 1
on non-conjugate reflections.
julia> W=coxgroup(:B,2)
B₂
julia> hyperplane_orbits(W)
2-element Vector{@NamedTuple{s::Int64, cl_s::Vector{Int64}, order::Int64, N_s::Int64, det_s::Vector{Int64}}}:
(s = 1, cl_s = [2], order = 2, N_s = 2, det_s = [5])
(s = 2, cl_s = [4], order = 2, N_s = 2, det_s = [1])
Chevie.CoxGroups.braid_relations
— Functionbraid_relations(W)
this function returns the relations which present the braid group of the reflection group W
. These are homogeneous (both sides of the same length) relations between generators in bijection with the generating reflections of W
. A presentation of W
is obtained by adding relations specifying the order of the generators.
julia> W=complex_reflection_group(29)
G₂₉
julia> braid_relations(W)
7-element Vector{Tuple{Vector{Int64}, Vector{Int64}}}:
([1, 2, 1], [2, 1, 2])
([2, 4, 2], [4, 2, 4])
([3, 4, 3], [4, 3, 4])
([2, 3, 2, 3], [3, 2, 3, 2])
([1, 3], [3, 1])
([1, 4], [4, 1])
([4, 3, 2, 4, 3, 2], [3, 2, 4, 3, 2, 4])
each relation is represented as a pair of lists, specifying that the product of the generators according to the indices on the left side is equal to the product according to the indices on the right side. See also diagram
.
Chevie.PermRoot.reflection_representation
— Methodreflection_representation(W::ComplexReflectionGroup,w)
or reflrep(W,w)
Let V
be the space on which W
acts as a reflection group and let w∈ W
, represented as a permutation of the roots. The function reflrep
returns the matrix of w
acting on V
(recall that matrices operate from the right on a vector space in Chevie
). This is the linear transformation of V
which acts trivially on the orthogonal of the coroots and has same effect as w
on the simple roots. The function makes sense more generally for a permutation of the roots induced by an element of GL(V)
which stabilizes the roots (thus in particular normalizes W
); thus it works for reflection cosets.
julia> W=reflection_subgroup(rootdatum("E7sc"),1:6)
E₇₍₁₂₃₄₅₆₎=E₆Φ₁
julia> reflrep(W,longest(W))
7×7 Matrix{Int64}:
0 0 0 0 0 -1 2
0 -1 0 0 0 0 2
0 0 0 0 -1 0 3
0 0 0 -1 0 0 4
0 0 -1 0 0 0 3
-1 0 0 0 0 0 2
0 0 0 0 0 0 1
Chevie.PermRoot.reflection_representation
— Methodreflection_representation(W::ComplexReflectionGroup)
or reflrep(W)
returns reflrep.(Ref(W),gens(W))
, that is the generators of W
as matrices.
Chevie.PermRoot.reflection_representation
— Methodreflection_representation(W,i::Integer)
or reflrep(W,i)
the matrix for the distinguished reflection around the i
-th root of W
.
Chevie.PermRoot.reflection_character
— Functionreflection_character(W::ComplexReflectionGroup,w)
or reflchar
Returns the trace of the element w
of W
as an endomorphism of the vector space V
on which W
acts.
julia> W=coxgroup(:B,3)
B₃
julia> reflchar(W,longest(W))
-3
reflection_character(W::ComplexReflectionGroup)
or reflchar
Returns the reflection character of W
. When W
is irreducible, it is CharTable(W).irr[charinfo(W).extRefl[2]]
.
julia> reflchar(coxgroup(:A,3))
5-element Vector{Int64}:
3
1
-1
0
-1
Chevie.PermRoot.YMatrix
— FunctionYMatrix(W,w)
Let W
be a finite reflection group on the space V
and let w
be an element of W
. The function YMatrix
returns the matrix of w
acting on the dual of V
. This is the linear transformation of this space which acts trivially on the orthogonal of the roots and has same effect as w
on the simple coroots. The function makes sense more generally for an element of the normalizer of W
in the whole permutation group of the coroots.
julia> W=reflection_subgroup(rootdatum("E7sc"),1:6)
E₇₍₁₂₃₄₅₆₎=E₆Φ₁
julia> YMatrix(W,longest(W))
7×7 transpose(::Matrix{Int64}) with eltype Int64:
0 0 0 0 0 -1 0
0 -1 0 0 0 0 0
0 0 0 0 -1 0 0
0 0 0 -1 0 0 0
0 0 -1 0 0 0 0
-1 0 0 0 0 0 0
2 2 3 4 3 2 1
Chevie.PermRoot.PermX
— FunctionPermX(W::ComplexReflectionGroup,M::AbstractMatrix)
Let M
be an invertible linear map of the reflection representation of W
which preserves the set of roots of parent(W)
, and normalizes W
(for the action of matrices on the right). PermX
returns the corresponding permutation of the roots of parent(W)
; it returns nothing
if M
does not normalize the set of roots of parent(W)
.
julia> W=reflection_subgroup(rootdatum("E7sc"),1:6)
E₇₍₁₂₃₄₅₆₎=E₆Φ₁
julia> PermX(W,reflrep(W,longest(W)))==longest(W)
true
Chevie.PermRoot.PermY
— FunctionPermY(W::ComplexReflectionGroup,M::AbstractMatrix)
Let M
be an invertible linear map on the dual of the reflection representation of W
which preserves the set of coroots of parent(W)
, and normalizes W
(for the action of matrices on the right). PermY
returns the corresponding permutation of the coroots of parent(W)
; it returns nothing
if M
does not normalize the set of coroots of parent(W)
.
julia> W=reflection_subgroup(rootdatum("E7sc"),1:6)
E₇₍₁₂₃₄₅₆₎=E₆Φ₁
julia> PermY(W,YMatrix(W,longest(W)))==longest(W)
true
Chevie.PermRoot.reflection_eigenvalues
— Functionreflection_eigenvalues(W)
or refleigen(W)
Let W
be a reflection group on the vector space V
. reflection_eigenvalues(W)
returns for each conjugacy class representative x
of W
(see classreps
) the eigenvalues of x
on V
, as a list of Root1
.
julia> refleigen(coxgroup(:B,2))
5-element Vector{Vector{Root1}}:
[1, 1]
[-1, 1]
[-1, -1]
[-1, 1]
[ζ₄³, ζ₄]
refleigen(W,i)
faster than refleigen(W)[i]
Chevie.ComplexR.degrees
— Methoddegrees(W::ComplexReflectionGroup)
returns a list holding the degrees of W
as a reflection group on the vector space V
on which it acts. These are the degrees d₁,…,dₙ
where n
is the dimension of V
of the basic invariants of W
in SV
. They reflect various properties of W
; in particular, their product is the cardinality of W
.
julia> W=complex_reflection_group(30)
H₄
julia> degrees(W)
4-element Vector{Int64}:
2
12
20
30
julia> length(W)
14400
Chevie.ComplexR.codegrees
— Functioncodegrees(W::ComplexReflectionGroup)
returns the vector of codegrees of W
as a reflection group on the space V
of reflrep(W)
. These are one less than the degrees of the basic derivations of W
on SV⊗ V^vee
.
julia> W=complex_reflection_group(4)
G₄
julia> codegrees(W)
2-element Vector{Int64}:
0
2
Chevie.PermRoot.invariants
— Functioninvariants(W::ComplexReflectionGroup)
returns the fundamental invariants of W
in its reflection representation V
. That is, returns a set of algebraically independent elements of the symmetric algebra of the dual of V
which generate the W
-invariant polynomial functions on V
. Each such invariant function is returned as a function: if e₁,…,eₙ
is a basis of V
and f
is the function, then the value of the polynomial function on a₁e₁+…+aₙeₙ
is obtained by calling f(a₁,…,aₙ)
. This function depends on the classification, and is dependent on the exact reflection representation of W
. So for the moment it is only implemented when the reflection representation for the irreducible components has the same Cartan matrix as the one provided by Chevie for the corresponding irreducible group. The polynomials are invariant for the natural action of the group elements as matrices; that is, if m==reflrep(W,w)
for some w
in W
, then an invariant f
satisfies f(a₁,…,aₙ)=f(v₁,…,vₙ)
where [v₁,…,vₙ]=[a₁,…,aₙ]×m
. This action is implemented on Mvp
s by the function ^
.
julia> W=coxgroup(:A,2)
A₂
julia> @Mvp x,y,z
julia> i=invariants(W);
julia> map(f->f(x,y),i)
2-element Vector{Mvp{Int64, Int64}}:
-2x²+2xy-2y²
6x²y-6xy²
julia> W=complex_reflection_group(24)
G₂₄
julia> p=invariants(W)[1](x,y,z)
Mvp{Rational{Int64}}: (14//1)x⁴+(-12//1)x²y²+(-42//1)x²yz+(21//2)x²z²+(18//7)y⁴+(-6//1)y³z+(-9//2)y²z²+(-21//8)z⁴
julia> map(v->^(v,reflrep(W,1);vars=[:x,:y,:z]),(x,y,z))
((1//2)x+(3√-7/14)y, (-√-7/2)x+(-1//2)y, z)
julia> p^reflrep(W,1)-p
Mvp{Cyc{Rational{Int64}}}: 0
LaurentPolynomials.discriminant
— Functiondiscriminant(W)
returns the discriminant of the complex reflection group W
, as a polynomial in the fundamental invariants. The discriminant is the invariant obtained by taking the product of the linear forms describing the reflecting hyperplanes of W
, each raised to the order of the corresponding reflection. The discriminant is returned as a function f
such that the discriminant in the variables a₁,…,aₙ
is obtained by calling f(a₁,…,aₙ)
. For the moment, this function is implemented only for the exceptional complex reflection groups G₄
to G₃₃
.
julia> W=complex_reflection_group(4);@Mvp x,y
julia> discriminant(W)(x,y)
Mvp{Int64}: x³-y²
Chevie.PermRoot.invariant_form
— Functioninvariant_form(W::ComplexReflectionGroup)
This function returns the matrix F
(defined up to a scalar) of an Hermitian form invariant under the action of the reflection group W
. That is, if M
is the matrix of an element of W
, then M*F*M'=F
.
julia> W=complex_reflection_group(4)
G₄
julia> invariant_form(W)
2×2 Matrix{Int64}:
1 0
0 2
Chevie.PermRoot.bipartite_decomposition
— Functionbipartite_decomposition(W)
Returns a bipartite decomposition [L,R]
of the indices of the generators of the reflection group W
, such that reflection_subgroup(W,L)
and reflection_subgroup(W,R)
are abelian subgroups, and W=reflection_subgroup(W, vcat(L,R))
. Gives an error if no such decomposition is possible.
julia> bipartite_decomposition(coxgroup(:E,8))
([1, 4, 6, 8], [3, 2, 5, 7])
Combinat.catalan
— Methodcatalan(W::ComplexReflectionGroup)
returns the Catalan Number of the irreducible complex reflection group W
. For well-generated groups, this number is equal to the number of simples in the dual Braid monoid. For other groups it was defined by Gordon and Griffeth2012. For Weyl groups, it also counts the number of antichains of roots.
julia> catalan(coxgroup(:A,7))
1430
catalan(W,i)
returns the i
-th Fuss-Catalan Number of the irreducible complex reflection group W
. For well-generated groups, this number is equal to the number of chains s₁,…,sᵢ
of simples in the dual monoid where sⱼ
divides sⱼ₊₁
. For these groups, it is also equal to ∏ⱼ(ih+dⱼ)/dⱼ
where the product runs over the reflection degrees of W
, and where h
is the Coxeter number of W
. For non-well generated groups, the definition is in Gordon and Griffeth2012.
julia> catalan(complex_reflection_group(7),2)
16
catalan(W;q=1)
, resp. catalan(W,i;q=1)
for q
a variable (like Pol()
or an Mvp
) returns the q
-Catalan number (resp. the i
-th q
-Fuss Catalan number) of W
. Again the definitions in general are in Gordon and Griffeth2012.
julia> catalan(complex_reflection_group(7),2;q=Pol())
Pol{Int64}: q⁷²+2q⁶⁰+3q⁴⁸+4q³⁶+3q²⁴+2q¹²+1
Chevie.PermRoot.generic_order
— Functiongeneric_order(W,q=Pol())
returns the generic order of W
as a polynomial in q
(the "compact" order of the Spets). This is $q^{Nₕ}Πᵢ(q^{dᵢ}-1)$ where dᵢ
are the reflection degrees and Nₕ
the number of reflecting hyperplanes. For a Weyl group, it is the order of the associated semisimple finite reductive group over the field with q
elements.
julia> PermRoot.generic_order(complex_reflection_group(4),Pol(:q))
Pol{Int64}: q¹⁴-q¹⁰-q⁸+q⁴
Chevie.PermRoot.torus_order
— Functiontorus_order(W::ComplexReflectionGroup,i,q=Pol())
returns as a polynomial in q
the toric order of the i
-th conjugacy class of W
. This is the characteristic polynomial of an element of that class on the reflection representation of W
. It is the same as the generic order of the reflection subcoset torus(W,i)
of W
determined by the trivial subgroup and a representative of the i
-th conjugacy class.
julia> W=complex_reflection_group(4)
julia> torus_order.(Ref(W),1:nconjugacy_classes(W),Pol(:q))
7-element Vector{Pol{Cyc{Int64}}}:
q²-2q+1
q²+2q+1
q²+1
q²-ζ₃q+ζ₃²
q²+ζ₃q+ζ₃²
q²+ζ₃²q+ζ₃
q²-ζ₃²q+ζ₃
Chevie.PermRoot.reflection_subgroup
— Methodreflection_subgroup(W,r)
returns the reflection subgroup of the complex reflection group W
generated by refls(W,r)
.
A reflection subgroup H
of W
is a permutation subgroup with the same additional information as W
, and some new one added which express the relationship with the parent W
:
inclusion(H)
: the indices of the roots of H
in the roots of W
parent(H)
: is set to W
.
restriction(H)
: a list of length length(roots(W))
with non-zero entries in positions inclusion(H)
bound to eachindex(roots(H))
.
A reflection group which is not a subgroup actually also has this information, set to the trivial values: inclusion(W)==restriction(W)==eachindex(roots(W))
, and parent()==W
. This allows a lot of code to be written in the same way for parent groups or reflection subgroups.
reflection_subgroup(R)
where R
is itself a reflection subgroup returns a reflection subgroup of the parent of R
.
julia> W=coxgroup(:F,4)
F₄
julia> H=reflection_subgroup(W,[1,2,11,20])
F₄₍₉‚₂‚₁‚₁₆₎=D₄₍₃₂₁₄₎
julia> [restriction(H)]
1-element Vector{Vector{Int64}}:
[1, 2, 0, 0, 5, 0, 0, 0, 3, 0 … 0, 16, 0, 19, 0, 21, 0, 22, 23, 24]
julia> reflection_subgroup(H,[1,2,3])
F₄₍₉₁₂₎=A₃₍₃₁₂₎Φ₁
Chevie.PermRoot.inclusion
— Functioninclusion(W::PermRootGroup)
the indices of the roots of W
in the roots of parent(W)
.
inclusion(W::PermRootGroup,i::Integer)
inclusion(W::PermRootGroup,v::AbstractVector{<:Integer})
same as inclusion(W)[i]
or inclusion(W)[v]
(but more efficient).
Chevie.PermRoot.restriction
— Functionrestriction(W::PermRootGroup)
A list for each root of parent(W)
, which holds 0
if the root is not a root of W
and i
if the root is the i
-th root of W
.
restriction(W::PermRootGroup,i::Integer)
restriction(W::PermRootGroup,v::AbstractVector{<:Integer})
same as restriction(W)[i]
or restriction(W)[v]
(but more efficient).
Chevie.Weyl.standard_parabolic
— Methodstandard_parabolic(W::PermRootGroup, H)
Let H
be a reflection subgroup of W
. Returns an element w∈ W
such that H^w
is a standard parabolic subgroup of W
(or nothing if H
is not parabolic or not conjugate to a standard parabolic).
Chevie.PermRoot.parabolic_reps
— Functionparabolic_reps(W)
For a Coxeter group or finite complex reflection group W
, returns a list of indices of roots of W
describing representatives of orbits of parabolic subgroups under conjugation by W
. For Coxeter groups, each orbit has a representative which is a standard parabolic subgroup, that is whose indices is a subset of eachindex(gens(W))
. This may not be the case in general.
julia> parabolic_reps(coxgroup(:A,4))
7-element Vector{Vector{Int64}}:
[]
[1]
[1, 2]
[1, 3]
[1, 2, 3]
[1, 2, 4]
[1, 2, 3, 4]
julia> parabolic_reps(complex_reflection_group(3,3,3))
7-element Vector{Vector{Int64}}:
[]
[1]
[1, 2]
[1, 3]
[1, 9]
[2, 3]
[1, 2, 3]
parabolic_reps(W,r)
If a second argument r
is given, returns only representatives of the parabolic subgroups of semisimple rank r
.
julia> parabolic_reps(coxgroup(:A,4),2)
2-element Vector{Vector{Int64}}:
[1, 2]
[1, 3]
julia> parabolic_reps(complex_reflection_group(3,3,3),2)
4-element Vector{Vector{Int64}}:
[1, 2]
[1, 3]
[1, 9]
[2, 3]
Chevie.PermRoot.parabolic_closure
— Functionparabolic_closure(W,I)
I
should be a list of indices of reflections of W
. Returns J
such that reflection_subgroup(W,J)
is the smallest parabolic subgroup of W
containing reflection_subgroup(W,I)
.
julia> W=complex_reflection_group(7)
G₇
julia> parabolic_closure(W,[1])
1-element Vector{Int64}:
1
julia> parabolic_closure(W,[1,2])
3-element Vector{Int64}:
1
2
3
Chevie.PermRoot.isparabolic
— Functionisparabolic(W)
whether the reflection subgroup W
is a parabolic subgroup of parent(W)
.
julia> W=complex_reflection_group(7)
G₇
julia> isparabolic(reflection_subgroup(W,[1,2]))
false
julia> isparabolic(reflection_subgroup(W,[1]))
true