Finite reflection groups
Chevie.PermRootChevie.ComplexR.ReflectionChevie.PermRoot.PRGChevie.PermRoot.PermRootGroupChevie.PermRoot.TypeIrredChevie.PermRoot.TypeIrredChevie.ComplexR.codegreesChevie.ComplexR.complex_reflection_groupChevie.ComplexR.degreesChevie.ComplexR.hyperplane_orbitsChevie.ComplexR.reflectionsChevie.CoxGroups.braid_relationsChevie.Diagrams.diagramChevie.PermRoot.PermXChevie.PermRoot.PermYChevie.PermRoot.YMatrixChevie.PermRoot.actionChevie.PermRoot.asreflectionChevie.PermRoot.baseXChevie.PermRoot.bipartite_decompositionChevie.PermRoot.cartanChevie.PermRoot.cartanChevie.PermRoot.corootChevie.PermRoot.corootsChevie.PermRoot.coxeter_numberChevie.PermRoot.generic_orderChevie.PermRoot.inclusionChevie.PermRoot.inclusiongensChevie.PermRoot.independent_rootsChevie.PermRoot.invariant_formChevie.PermRoot.invariantsChevie.PermRoot.isparabolicChevie.PermRoot.number_of_hyperplanesChevie.PermRoot.number_of_reflectionsChevie.PermRoot.parabolic_closureChevie.PermRoot.parabolic_repsChevie.PermRoot.reflectionMatrixChevie.PermRoot.reflection_characterChevie.PermRoot.reflection_eigenvaluesChevie.PermRoot.reflection_representationChevie.PermRoot.reflection_representationChevie.PermRoot.reflection_representationChevie.PermRoot.reflection_subgroupChevie.PermRoot.reflsChevie.PermRoot.refltypeChevie.PermRoot.restrictionChevie.PermRoot.rootsChevie.PermRoot.rootsChevie.PermRoot.semisimplerankChevie.PermRoot.simple_conjugatingChevie.PermRoot.simple_repsChevie.PermRoot.simplecorootsChevie.PermRoot.simplerootsChevie.PermRoot.torus_orderChevie.PermRoot.unique_reflsChevie.Symbols.rankChevie.Weyl.standard_parabolicCombinat.catalanLaurentPolynomials.discriminantPermGroups.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 Rationals or Cycs).
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. Usually r and rᵛ are scaled so that rᵛ(r)=1-ζ; then s is the map on V defined by s(x)=x-rᵛ(x)r. Such roots and coroots 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 of W with larger order. 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 are 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 distinguished reflection as the lcm of the order of the reflection and of 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 ones for the reflections gens(W); these are called simple roots and coroots and simple reflections.
simpleroots(W): the simple roots as a matrix.simplecoroots(W): the simple coroots as a matrix.reflections(W)gives a list without repetitions of all reflections ofW(not only the distinguished ones), as objects of typeReflection, starting with the distinguished reflections. These objects contain more information on each reflection.
The finite irreducible complex reflection groups have been 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 simple roots and simple coroots (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 simple reflections satisfy braid relations which present the braid group associated to
W(seediagram).The field of definition of
Wis the fieldKgenerated by the traces of the elements ofWacting onV. It is a theorem thatWmay be realized as a reflection group overK.The Cartan matrix
rᵛ(r')whererandr'runs over the simple roots and coroots 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/3Let 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 0As 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)*conj(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 0Chevie.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.TypeIrred — Typea TypeIrred object classifies an irreducible finite complex reflection group, or an irreducible coset (the latter means that the group has a single orbit of irreducible components under .phi).
For an irreducible group a TypeIrred has the properties:
.rankthe semisimplerank of the group.serieswhich takes one of the values:A,:B,:D,:E,:F,:G,:H,:Ifor an irreducible Coxeter group, and is:STfor non-real groups..STfor a primitive non-real group holding the Shepard-Todd number.pand.qfor an imprimitive non-real group, holding.p=deand.q=eforG(de,e,r).
a TypeIrred may also contain information specifying a specific Cartan matrix for the given type. When there are two conjugacy classes of generators, .cartanType (assumed to be 1 if this key is absent) contains the ratio of the root lengths compared to the standard cartan matrix for that type; that is, the Cartan matrix is conjugate to the standard Cartan matrix by Diagonal([1,…,1,c,…,c]) where c=.cartanType. This this how type B (with .cartanType==2) and type C (with .cartanType==1), which have both .series==:B, are distinguished.
For an irreducible coset a TypeIrred has the properties
.orbitaVector{TypeIrred}holding the types of the groups in the orbit under.phi, such that.phisend each item to the next..phiifkis the length of.orbit, contains the permutation effected by.phi^kon the simple roots of the first item of the orbit.
In addition, a TypeIrred t for a group W or a t appearing in a .orbit for a coset of a group W contains a property
.indicesgiving the indices ingens(W)represented by the generators of the irreducible component described byt.
The .indices of a TypeIrred are always in a canonical order for a given component, such that the associated Cartan matrix is the "canonical" one. For instance, in type C, the longest root is always the first one, etc…
Chevie.PermRoot.TypeIrred — MethodTypeIrred(W::PermRootGroup)
W must be an irreducible finite complex reflection group, computed as a permutation group of a set of roots, generated by a set S of distinguished reflections. TypeIrred classifies W (returns a TypeIrred object) by using the following algorithm. It computes in order:
r=semisimplerank(W), the dimension of the space spanned by the rootsi=length(W)/factorial(r)o=the maximum order of a reflection=$max_{s∈ S}o(s)$D=all distinguished reflections ofW, theW-orbit ofSh=the Coxeter number=$(∑_{s∈ D}o(s))/r$
(r,i,o) are sufficient to determine a $G_{de,e,r}$ excepted for the ambiguity between $G_{2e,e,2}$ and $I₂(4e)$, which is resolved by h (excepted for e=1, where the two solutions are isomorphic). $G_{de,e,r}$ has $i=(de)ʳ/e$, $o=max(2,d)$, $h=ed(r-1)+d-δ_{d,1}$
(r,i,o) are also sufficient to distinguish primitive groups except for the tuples (which are resolved by h):
(G₉, G₂₄‚₆‚₂)
(G₁₂, G₁₂‚₆‚₂, I₂(24))
(G₁₃, G₂₄‚₁₂‚₂, I₂(48))
(G₂₂, G₆₀‚₃₀‚₂, I₂(120))
(G₇, G₁₄, G₂₄‚₈‚₂)
(G₈, G₁₂‚₃‚₂)
(G₁₅, G₄₈‚₁₆‚₂)
(G₁₇, G₁₂₀‚₂₄‚₂)
(G₂₁, G₁₂₀‚₄₀‚₂)Chevie.PermRoot.refltype — Functionrefltype(W::ComplexReflectionGroup or coset) or reflection_type(W)
returns the Vector{TypeIrred} which classifies W (see TypeIrred). The refltype is used for displaying W at the repl. The function indices on the result of refltypeor on a TypeIrred tells the index in gens(W) of each standard generator of the irreducible component s. In the REPL display of W, these indices are omitted when they are the expected ones (the component is in order at the expected indices).
julia> W=coxgroup(:D,3) # a D₃ is an A₃ in disorder
A₃₍₁₃₂₎
julia> t=refltype(W)
A₃₍₁₃₂₎
julia> indices(t)
3-element Vector{Int64}:
1
3
2Chevie.Symbols.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))
4rank(S) rank of symbol S.
julia> rank(CharSymbol([[1,5,6],[1,2]]))
11Chevie.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)
3Chevie.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 the rows of a matrix.
Chevie.PermRoot.simplecoroots — Functionsimplecoroots(W::ComplexReflectionGroup) the simple coroots of W (those corresponding to gens(W)) as the rows of a matrix.
Chevie.PermRoot.baseX — FunctionbaseX(W::ComplexReflectionGroup)
returns as the rows of a matrix a particular basis of the space V where W acts: the first semisimplerank(W) rows contain the coordinates on the basis of V of a basis of the root lattice (given by simpleroots(W)[independent_roots(W)]) and the last rank(W)-semisimplerank(W) ones contain the same for the orthogonal of the coroots.
When W represents a rootdatum for a reductive group, the first lines are the same as simpleroots(W).
Chevie.PermRoot.independent_roots — Functionindependent_roots(W::ComplexReflectionGroup)
A vector of indices of length semisimplerank(W) such that simpleroots(W)[independent_roots(W)] is a basis of the vector space spanned by the roots of W.
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 2Chevie.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
1Chevie.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))
4Chevie.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=342342Chevie.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 (from the right on the elements of V seen as row vectors by our conventions 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. For a rootdatum corresponding to a coset Wσ we get the action of Wσ on X(𝐓).
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 1Chevie.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))
-3reflection_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
-1Chevie.PermRoot.YMatrix — FunctionYMatrix(W,w)
Let W be a finite reflection group on the space V and let w∈ W. The function YMatrix returns the matrix of w acting on the dual V* of V. This is the linear transformation of V* 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. The resulting matrix is the transposed of the matrix reflrep(W,w), which, according to our conventions acts on the right (on the row vectors representing elements of the dual of V). For a rootdatum corresponding to a coset Wσ we get the action of Wσ on Y(𝐓).
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 1Chevie.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)
trueChevie.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)
trueChevie.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)
14400Chevie.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
2Chevie.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 Mvps 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}}}: 0LaurentPolynomials.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 2Chevie.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))
1430catalan(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)
16catalan(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¹²+1Chevie.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::ComplexReflectionGroup)
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.inclusiongens — Functioninclusion(W::ComplexReflectionGroup)
the indices of simpleroots(W) in the roots of parent(W).
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.PermRoot.action — Functionaction(W::ComplexReflectionGroup,i::Integer,p::Perm)
The elements of a PermRootGroup permute the roots of parent(W), that is are permutations on eachindex(roots(parent(W))). The function action translates this action of p∈W to eachindex(roots(W)). For a reflection subgroup we have action(W,i,p)==restriction(W,inclusion(W,i)^p) and for a parent group action(W,i,p)==i^p. The first formula is always valid since for a parent group restriction(W)==inclusion(W)==eachindex(roots(W)).
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
3Chevie.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