Finite reflection groups

Chevie.PermRootModule

Let 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. 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 generate W, given as permutations of the roots. reflrep(W) gives them as matrices.

  • roots(W): the list of roots of W.

  • coroots(W): the list of coroots, in the same order as the roots.

  • refls(W): a list of distinguished reflections of W, as permutations. This list is of same length as the roots, and its i-th element is the distinguished reflection for the i-th root, so it will have repetitions. unique_refls(W) returns 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.

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 of W (not only the distinguished ones), as objects of type Reflection. 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 (see diagram).

  • The field of definition of W is the field K generated by the traces of the elements of W acting on V. It is a theorem that W may be realized as a reflection group over K.

  • The Cartan matrix rᵛ(r') where r and r' runs over the roots and coroots for the generating reflections has entries in the ring ℤₖ of integers of K, 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²
source
Chevie.PermRoot.asreflectionFunction

asreflection(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)
source
Chevie.PermRoot.reflectionMatrixFunction

reflectionMatrix(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.

source

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
source
Chevie.ComplexR.complex_reflection_groupFunction

complex_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₄
source
Chevie.PermRoot.rankFunction

rank(W::ComplexReflectionGroup)

returns the rank of W, which is the dimension of the space where it acts.

julia> rank(complex_reflection_group(31))
4
source
Chevie.PermRoot.semisimplerankFunction

semisimpleRank(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
source
Chevie.PermRoot.coxeter_numberFunction

coxeter_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.

source

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.

source
Chevie.PermRoot.simplerootsFunction

simpleroots(W::ComplexReflectionGroup) the simple roots of W (those corresponding to gens(W)) as a matrix (each root is a row)

source
Chevie.PermRoot.simplecorootsFunction

simplecoroots(W::ComplexReflectionGroup) the simple coroots of W (those corresponding to gens(W)) as a matrix (each coroot is a row)

source
Chevie.PermRoot.cartanMethod

cartan(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
source
Chevie.PermRoot.cartanMethod

cartan(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

source
Chevie.PermRoot.reflsFunction

refls(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.

source

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)

source
Chevie.PermRoot.unique_reflsFunction

unique_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.

source
Chevie.ComplexR.ReflectionType

Reflection 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
source
Chevie.ComplexR.reflectionsFunction

reflections(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,ζ₃²)
source
PermGroups.Perms.reflection_lengthMethod

reflection_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
source
Chevie.PermRoot.simple_repsFunction

simple_reps(W)

for each root, the index of the first simple root conjugate to it (it is the index of a generator of W).

source

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).

source
Chevie.PermRoot.simple_conjugatingFunction

simple_conjugating(W::ComplexReflectionGroup)

For each index i of a root, an element w∈ W such that action(W,simple_reps(W,i),w)==i.

source

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).

source
Chevie.Diagrams.diagramFunction

diagram(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
source
Chevie.ComplexR.hyperplane_orbitsFunction

hyperplane_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])
source
Chevie.CoxGroups.braid_relationsFunction

braid_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.

source
Chevie.PermRoot.reflection_representationMethod

reflection_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 we get the action of 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  1
source
Chevie.PermRoot.reflection_characterFunction

reflection_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
source

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
source
Chevie.PermRoot.YMatrixFunction

YMatrix(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 we get the action of 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  1
source
Chevie.PermRoot.PermXFunction

PermX(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
source
Chevie.PermRoot.PermYFunction

PermY(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
source
Chevie.PermRoot.reflection_eigenvaluesFunction

reflection_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]
 [ζ₄³, ζ₄]
source

refleigen(W,i) faster than refleigen(W)[i]

source
Chevie.ComplexR.degreesMethod

degrees(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
source
Chevie.ComplexR.codegreesFunction

codegrees(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
source
Chevie.PermRoot.invariantsFunction

invariants(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}}}: 0
source
LaurentPolynomials.discriminantFunction

discriminant(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²
source
Chevie.PermRoot.invariant_formFunction

invariant_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
source
Chevie.PermRoot.bipartite_decompositionFunction

bipartite_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])
source
Combinat.catalanMethod

catalan(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
source
Chevie.PermRoot.generic_orderFunction

generic_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⁴
source
Chevie.PermRoot.torus_orderFunction

torus_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+ζ₃
source
Chevie.PermRoot.reflection_subgroupMethod

reflection_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₃₍₃₁₂₎Φ₁
source
Chevie.PermRoot.inclusionFunction

inclusion(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).

source
Chevie.PermRoot.restrictionFunction

restriction(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).

source
Chevie.Weyl.standard_parabolicMethod

standard_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).

source
Chevie.PermRoot.parabolic_repsFunction

parabolic_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]
source
Chevie.PermRoot.parabolic_closureFunction

parabolic_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
source
Chevie.PermRoot.isparabolicFunction

isparabolic(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
source