Finite Coxeter groups, Weyl groups, crystallographic root systems

Chevie.WeylModule

Finite Coxeter groups are the finite complex reflection groups which can be defined on a real vector space V.

Weyl groups are the finite Coxeter groups which can be defined over a rational vector space V (thus over the integers).

Like finite complex reflection groups, finite Coxeter groups are implemented as groups of permutations of a set of roots. The particular crystallographic root systems for Weyl groups play an important role in mathematics as they classify semi-simple Lie algebras and algebraic groups.

Let us give precise definitions. Let V be a real vector space and Vⱽ its dual. A root system is a finite set of vectors R⊂ V (the roots), together with a map r↦ rⱽ from R to a subset Rⱽ of Vⱽ (the coroots) such that:

  • For any r∈ R, we have rⱽ(r)=2, so that the formula x↦ x-rⱽ(x)r defines a reflection sᵣ:V→ V with root r and coroot rⱽ.
  • The reflection sᵣ stabilizes R.

The subgroup W=W(R) of GL(V) generated by the reflections sᵣ for r∈ R is a finite Coxeter group. We require reduced root systems, that is such that the only elements of R colinear with r∈ R are r and -r; for Weyl groups, we also require that the root system be crystallographic, that is rⱽ(s) is an integer, for any s∈ R,rⱽ∈ Rⱽ.

If we identify V with Vⱽ by choosing a W-invariant bilinear form (.;.), then we have rⱽ=2r/(r;r). A root system R is irreducible if R is not the union of two orthogonal subsets; equivalently the representation of W on the subspace generated by R is irreducible. If R is reducible then the corresponding Coxeter group is the direct product of the Coxeter groups associated with the irreducible components of R.

Let us now describe how a root system R and a presentation of the corresponding W are encoded in a Cartan matrix or a Dynkin diagram. We can choose a linear form on V which does not vanish on any element of R. Depending on the sign of the value of this linear form on a root r ∈ R we call r positive or negative. Then there exists a unique subset Π of the positive roots, the simple roots, such that any positive root is a linear combination with non-negative coefficients of the roots in Π. Any two sets of simple roots (corresponding to different choices of linear forms) can be transformed into each other by a unique element of W(R). If S is the set of reflections with respect to the simple roots, then (W,S) is a Coxeter system. These generating reflections are called Coxeter generators or simple reflections.

Since the pairing between V and Vⱽ is W-invariant, if Π is a set of simple roots and if we define the Cartan matrix as being the n times n matrix C={rⱽ(r')} for r,r'∈Π, this matrix is independent of the chosen linear form up to simultaneous permutation of rows and columns. Since the action of sᵣ on r' for r,r'∈Π is given by sᵣ(r')=r'-C(r,r')r, the Cartan matrix determines the reflection representation of W.

For a crystallographic root system the Cartan matrix has integral entries, and in the basis Π (completed by a basis of the orthogonal), sᵣ has an integral matrix. All finite-dimensional (complex) representations of a finite Coxeter group can be realized over the field generated by the entries of the Cartan matrix.

The Cartan matrix is encoded in a Dynkin diagram, a tree with weighted edges and an orientation on edges of even weight >2, as follows. The vertices are indexed by the simple reflections; an edge is drawn between s and t if the order mₛₜ of st is greater than 2 and is given the weight mₛₜ. These weights are encoded by drawing the edge single for weight 3, double for weight 4 and triple for weight 6. The arrows indicate the relative root lengths (going from the longer to the shorter root) which may differ between different orbits of W on R. Alternately the Dynkin diagram can be obtained from the Cartan matrix as follows: if Cᵣₛ and Cₛᵣ are integers such that |Cₛᵣ|≥|Cᵣₛ|=1 there is an edge of weight |Cₛᵣ| from r to s with an arrow pointing to s if |Cₛᵣ|>1. Note that the Cartan matrices we consider here are not necessarily symmetric, contrary to the Cartan matrices we considered describing the reflection representation of a general Coxeter group; being symmetric corresponds to all roots being taken of the same length.

The irreducible crystallographic root systems are classified by the following list of Dynkin diagrams. The labeling of the nodes is the order of the generators and is shown by the function diagram.

Aₙ O—O—O—…—O   Bₙ O⇐ O—O—…—O  Cₙ O⇒ O—O—…—O  Dₙ O 2
   1 2 3 … n      1  2 3 … n     1  2 3 … n     │
                                              O—O—…—O
                                              1 3 … n

G₂ O⇛ O  F₄ O—O⇒O—O    E₆  O 2    E₇  O 2      E₈  O 2
   1  2     1 2 3 4        │          │            │
                       O—O—O—O—O  O—O—O—O—O—O  O—O—O—O—O—O—O
                       1 3 4 5 6  1 3 4 5 6 7  1 3 4 5 6 7 8

We get the Coxeter diagram, which describes the underlying Weyl group, if we ignore the arrows: we see that the root systems B_n and C_n correspond to the same Coxeter group (the Coxeter diagram is defined by the Coxeter matrix). Weyl groups can also be characterized as the finite Coxeter groups such that all off-diagonal entries of the Coxeter matrix are in {2,3,4,6}.

Here are the Coxeter diagrams for the finite Coxeter groups which are not crystallographic (I₂(e) is not crystallographic if e∉ {2,3,4,6}).

       e        5         5
I₂(e) O—O   H₃ O—O—O  H₄ O—O—O—O
      1 2      1 2 3     1 2 3 4

The function cartan gives the cartan matrix for an irreducible root system

julia> cartan(:D,4)
4×4 Matrix{Int64}:
  2   0  -1   0
  0   2  -1   0
 -1  -1   2  -1
  0   0  -1   2

julia> cartan(:I,2,5) # for type I₂(e) give e as 3rd argument
2×2 Matrix{Cyc{Int64}}:
       2  ζ₅²+ζ₅³
 ζ₅²+ζ₅³        2

Given two Cartan matrices c1 and c2, their matrix direct sum (corresponding to the orthogonal direct sum of the root systems) can be obtained by cat(c1,c2,dims=[1,2]).

The whole root system can be recovered from the simple roots and the corresponding coroots, since each root is in the orbit of a simple root. The restriction of the simple reflections to the span of R is determined by the Cartan matrix, so R is determined by the Cartan matrix and the set of simple roots.

The function rootdatum takes as arguments a matrix r whose lines represents the list of simple roots and another matrix cr whose lines are the corresponding coroots and produces a FiniteCoxeterGroup. Such an object is a permutation group containing in addition the description of a root system. cr*transpose(r) should be a Cartan matrix. Each element of the coxeter group is represented as the permutation it induces on the roots, coded as a permutation of 1:2N where we label the positive roots by 1:N, and the negative roots by N+1:2N.

If a single matrix argument is given to rootdatum it is taken as cr and r is taken to be the identity matrix; we get thus a particular root system where the roots are the canonical basis of V. For convenience, rootdatum(cartan(t...)) can be simplified to coxgroup(t...).

julia> W=coxgroup(:D,4) # same as rootdatum(cartan(:D,4))
D₄

julia> cartan(W)
4×4 Matrix{Int64}:
  2   0  -1   0
  0   2  -1   0
 -1  -1   2  -1
  0   0  -1   2

Also, the FiniteCoxeterGroup associated to a direct sum of irreducible root systems can be obtained as

julia> W=coxgroup(:A,2)*coxgroup(:B,2)
A₂×B₂

julia> cartan(W) # same as cat(cartan(:A,2), cartan(:B,2),dims=[1,2])
4×4 Matrix{Int64}:
  2  -1   0   0
 -1   2   0   0
  0   0   2  -2
  0   0  -1   2

The elements of a Weyl group are permutations of the roots:

julia> W=coxgroup(:D,4)
D₄

julia> p=W(1,3,2,1,3) # permutes the 24 roots
(1,14,13,2)(3,17,8,18)(4,12)(5,20,6,15)(7,10,11,9)(16,24)(19,22,23,21)

julia> word(W,p)
5-element Vector{Int64}:
 1
 3
 1
 2
 3

finally, a benchmark on julia 1.0.2

julia> @btime length(elements(coxgroup(:E,7)))
  531.385 ms (5945569 allocations: 1.08 GiB)

GAP3 for the same computation takes 2.2s

source
Chevie.PermRoot.cartanMethod

cartan(type, rank [,bond])

the Cartan matrix for a finite Coxeter group described by type and rank. The recognized types are :A, :B, :Bsym, :C, :D, :E, :F, :Fsym, :G, :Gsym, :I, :H. For type :I a third argument must be given describing the bond between the two generators. The sym types correspond to (non-crystallographic) root systems where all roots have the same length; they afford automorphisms that the crystallographic root system does not afford, which allow to define the "very twisted" Chevalley groups.

julia> cartan(:F,4)
4×4 Matrix{Int64}:
  2  -1   0   0
 -1   2  -1   0
  0  -2   2  -1
  0   0  -1   2

julia> cartan(:I,2,5)
2×2 Matrix{Cyc{Int64}}:
       2  ζ₅²+ζ₅³
 ζ₅²+ζ₅³        2

julia> cartan(:Bsym,2)
2×2 Matrix{Cyc{Int64}}:
   2  -√2
 -√2    2
source
Chevie.PermRoot.rootsMethod

roots(C::AbstractMatrix)

returns the set of positive roots defined by the Cartan matrix C, which should be the Cartan matrix of a finite Coxeter group.

For an integer Cartan matrix, the returned roots are sorted by height and reverse lexicographically for a given height.

source
Chevie.Weyl.two_treeFunction

two_tree(m)

Given a square matrix m with zeroes symmetric with respect to the diagonal, let G be the graph with vertices axes(m)[1] and an edge between i and j iff !iszero(m[i,j]).

If G is a line this function returns it as a Vector{Int}. If G is a tree with one vertex c of valence 3 the function returns (c,b1,b2,b3) where b1,b2,b3 are the branches from this vertex sorted by increasing length. Otherwise the function returns nothing.

This function is used when recognizing the type of a Cartan matrix.

julia> two_tree(cartan(:A,4))
4-element Vector{Int64}:
 1
 2
 3
 4

julia> two_tree(cartan(:E,8))
(4, [2], [3, 1], [5, 6, 7, 8])
source
Chevie.PermRoot.reflection_subgroupMethod

reflection_subgroup(W::FiniteCoxeterGroup,I)

For I⊆1:nref(W), the subgroup H of W generated by refls(W,I).

A theorem found independently by Deodhar1989 and Dyer1990 is that a subgroup H of a Coxeter system (W,S) generated by reflections has a canonical Coxeter generating set, formed of the t ∈ Ref(H) such length(W,tt')>length(W,t) for any t'∈ Ref(H) different from t. This is used by reflection_subgroup to determine the Coxeter system of H.

julia> W=coxgroup(:G,2)
G₂

julia> diagram(W)
O⇛ O G₂
1  2

julia> H=reflection_subgroup(W,[2,6])
G₂₍₂₆₎=Ã₁×A₁

julia> diagram(H)
O Ã₁
1
O A₁
2

The notation G₂₍₂₆₎ means that roots(W,[2,6]) is a system of simple roots for H.

If H is a standard parabolic subgroup of a Coxeter group W then the length function on H (with respect to its set of generators) is the restriction of the length function on W. This need not no longer be true for arbitrary reflection subgroups of W.

julia> elH=word.(Ref(H),elements(H))
4-element Vector{Vector{Int64}}:
 []
 [1]
 [2]
 [1, 2]

julia> elW=word.(Ref(W),elements(H))
4-element Vector{Vector{Int64}}:
 []
 [2]
 [1, 2, 1, 2, 1]
 [1, 2, 1, 2, 1, 2]

julia> map(w->H(w...),elH)==map(w->W(w...),elW)
true

We implement finite reflection groups as permutation groups on a set of roots. Consequently, a reflection subgroup H⊆ W is a permutation subgroup, thus its elements are represented as permutations of the roots of the parent group.

source
Chevie.CoxGroups.coxeter_groupFunction

coxeter_group(type,rank[,bond];sc=false) (or coxgroup)

If C=cartan(type,rank[,bond]), this is equivalent to rootdatum(C). If sc=true this is equivalent to rootdatum(permutedims(C),one(C)).

The resulting object W, a FiniteCoxeterGroup, has an additional entry compared to a PermRootGroup.

  • W.rootdec: the root vectors, given as linear combinations of simple roots. The first nref(W) roots are positive, the next nref(W) are the corresponding negative roots. Moreover, the first semisimplerank(W) roots are the simple roots. The positive roots are ordered by increasing height.

and roots(W) is ordered is the same way as W.rootdec.

For how to get various information on the root system and the Coxeter group, see the functions nref, coroots, rootlengths, simple_reps, simple_conjugating, reflrep, simpleroots, simplecoroots, PermX, cartan, inclusion, restriction, action, rank, semisimplerank

In terms of root data, this function returns the adjoint root datum of Weyl group W. If sc=true it returns the simply connected root datum.

julia> W=coxgroup(:G,2)
G₂

julia> cartan(W)
2×2 Matrix{Int64}:
  2  -1
 -3   2

julia> W.rootdec
12-element Vector{Vector{Int64}}:
 [1, 0]
 [0, 1]
 [1, 1]
 [1, 2]
 [1, 3]
 [2, 3]
 [-1, 0]
 [0, -1]
 [-1, -1]
 [-1, -2]
 [-1, -3]
 [-2, -3]

julia> reflrep(W)
2-element Vector{Matrix{Int64}}:
 [-1 0; 1 1]
 [1 3; 0 -1]
source
Chevie.Weyl.rootlengthsFunction

rootlengths(W::FiniteCoxeterGroup) the vector of the (squared) length of the roots of W. The shortest roots in an irreducible subsystem are given the length 1. In a Weyl group the others then have length 2 (or 3 in type G₂). The matrix of the W-invariant bilinear form is given by Diagonal(rootlengths(W)[1:ngens(W)])*cartan(W).

source
Chevie.Weyl.highest_short_rootFunction

highest_short_root(W)

It is an error if W is not an irreducible Coxeter group. Otherwise HighestShortRoot returns the index of the unique short root of maximal height of W. If all roots have the same length then this is the index of the unique root of maximal height, equal to nref(W).

julia> W=coxgroup(:G,2)
G₂

julia> highest_short_root(W)
4
source
Chevie.Weyl.rootdatumMethod

rootdatum(C::AbstractMatrix) adjoint root datum from Cartan matrix C. The adjoint group is also the default returned for coxeter_group(type,rank). The following methods all define pgl₃.

julia> rootdatum(cartan(:A,3))==coxgroup(:A,3)
true

julia> rootdatum(:pgl,3)
pgl₃
source
Chevie.Weyl.rootdatumMethod

rootdatum(R::AbstractMatrix,CR::AbstractMatrix)

root datum from R whose rows are the simple roots on a basis of X(T) and CR whose rows are the simple coroots on a basis of Y(T). The following methods all define gl₃.

julia> rootdatum(:gl,3)==rootdatum("gl",3)
true

julia> rootdatum([1 -1 0;0 1 -1],[1 -1 0;0 1 -1])
A₂Φ₁
source
Chevie.Weyl.torusMethod

torus(rank::Integer)

This function returns the object corresponding to the notion of a torus of dimension rank, a Coxeter group of semisimple rank 0 and given rank. This corresponds to a split torus; the extension to Coxeter cosets is more useful.

julia> torus(3)
Φ₁³
source
Chevie.PermRoot.radicalFunction

radical(G)

The radical datum of a root datum (X,Φ,Y,Φ^∨) is (X/(X∩ ℚ Φ),∅ ,Φ^⟂,∅), a toral datum. This function returns the torus corresponding to the radical of the root datum G.

source
Chevie.Weyl.derived_datumFunction

derived_datum(G)

The derived datum of (X,Φ,Y,Φ^∨) is (X/Φ^{∨⟂}, Φ, Y∩ ℚ Φ^∨, Φ^∨) where denotes the orthogonal. This function starts with a root datum object G and returns the root datum object corresponding to the derived datum.

source
Chevie.Weyl.describe_involutionFunction

describe_involution(W,w)

Given an involution w of a Coxeter group W, by a theorem of Richardson1982 there is a unique parabolic subgroup P of W such that P is finite and w is the longest element of P, and is central in P. The function returns I such that P==reflection_subgroup(W,I) and w==longest(reflection_subgroup(W,I)).

julia> W=coxgroup(:A,2)
A₂

julia> w=longest(W)
(1,5)(2,4)(3,6)

julia> describe_involution(W,w)
1-element Vector{Int64}:
 3

julia> w==longest(reflection_subgroup(W,[3]))
true

For now only works for finite Coxeter groups.

source
Chevie.Weyl.badprimesFunction

badprimes(W)

Let W be a Weyl group. A prime is bad for W if it divides a coefficient of some root on the simple roots. The function badprimes returns the list of primes which are bad for W.

julia> W=coxgroup(:E,8)
E₈

julia> badprimes(W)
3-element Vector{Int64}:
 2
 3
 5
source
Chevie.Weyl.standard_parabolicMethod

standard_parabolic(W,H)

Given a reflection subgroup H or the indices of its simple roots returns nothing if H is not parabolic, otherwise returns w such that H^w is a standard parabolic subgroup of W.

julia> W=coxgroup(:E,6)
E₆

julia> R=reflection_subgroup(W,[20,30,19,22])
E₆₍₁₉‚₁‚₉‚₂₀₎=A₄₍₃₁₂₄₎Φ₁²

julia> p=standard_parabolic(W,R)
(1,4,49,12,10)(2,54,62,3,19)(5,17,43,60,9)(6,21,34,36,20)(7,24,45,41,53)(8,65,50,15,22)(11,32,31,27,28)(13,48,46,37,40)(14,51,58,44,29)(16,23,35,33,30)(18,26,39,55,38)(42,57,70,72,56)(47,68,67,63,64)(52,59,71,69,66)

julia> p==standard_parabolic(W,[19,1,9,20]) # can give inclusiongens
true

julia> reflection_subgroup(W,[20,30,19,22].^p) # same as R^p
E₆₍₂₄₅₆₎=A₄Φ₁²

julia> R=reflection_subgroup(W,[1,2,3,5,6,35])
E₆₍₁‚₃‚₂‚₃₅‚₅‚₆₎=A₂₍₁₃₎×A₂₍₂₆₎×A₂₍₄₅₎

julia> standard_parabolic(W,R)
source
Chevie.CoxGroups.inversionsFunction

inversions(W,w)

Returns the inversions of the element w of the finite Coxeter group W, that is, the list of the indices of reflections r of W such that l(rw)<l(w) where l is the Coxeter length.

julia> W=coxgroup(:A,3)
A₃

julia> inversions(W,W(1,2,1))
3-element Vector{Int64}:
 1
 2
 4
source

inversions(W::FiniteCoxeterGroup, w::AbstractVector{<:Integer})

Given a word w=[s₁,…,sₙ] (a vector of integers) representing the element W(w...), returns the inversions of w, that is the list of indices of the reflections of W given by W(s₁), W(s₁,s₂,s₁), …, W(s₁,s₂,…,sₙ,sₙ₋₁,…,s₁).

julia> W=coxgroup(:A,3)
A₃

julia> inversions(W,[2,1,2])
3-element Vector{Int64}:
 2
 4
 1
source
Chevie.Weyl.with_inversionsFunction

with_inversions(W,N)

W should be a finite Coxeter group and N a subset of 1:nref(W). Returns the element w of W such that N==inversions(W,w). Returns nothing if no such element exists.

julia> W=coxgroup(:A,2)
A₂

julia> map(N->with_inversions(W,N),combinations(1:nref(W)))
8-element Vector{Union{Nothing, Perm{Int16}}}:
 ()
 (1,4)(2,3)(5,6)
 (1,3)(2,5)(4,6)
 nothing
 nothing
 (1,6,2)(3,5,4)
 (1,2,6)(3,4,5)
 (1,5)(2,4)(3,6)
source
Chevie.Weyl.relative_groupFunction

relative_group(W::FiniteCoxeterGroup,J)

J should be a if distinguished subset of S==eachindex(gens(W)), that is if for s∈ S-J we set $v(s,J)=w₀^{J∪ s}w₀ᴶ$ then J is stable by all v(s,J). Then $N_W(W_J)=W_J⋊ N₁$ where N₁ is the group generated by the v(s,J), which form a Coxeter system for N₁. Equivalently N₁ consists of the J-reduced elements of N_W(W_J). The quotient R=N_W(W_J)/W_J has a natural reflection representation on $X(ZL_J/ZG)$, using that by Lusztig1976, the images of the roots of W in $X(ZL_J)$ form a root system. The function returns R as a reflection group on $X(ZL_J/ZG)$, with some extra attributes reflecting its origin

  • R.relative_indices=setdiff(S,J) in a certain order
  • R.toparent= the list of v(s,J) corresponding to .relative_indices; defines an isomorphism R→ N₁.
  • R.fromparent is a function mapping elements of N₁ to R. The inverse mapping to .toparent.
source
Chevie.Semisimple.affineFunction

A generalized Cartan matrix C is a square integer matrix of size n such that cᵢᵢ=2, cᵢⱼ≤0 if i≠j, and cᵢⱼ==0 if and only if cⱼᵢ==0. We say that C is indecomposable if it does not admit any block decomposition.

Let C be a generalized Cartan matrix. For I a subset of {1,…,n} we denote by C_I the square submatrix with indices i,j taken in I. If v is a real vector of length n, we write v>0 if for all i∈ {1,…,n} we have vᵢ>0. It can be shown that C is a Cartan matrix if and only if for all sets I, we have det C_I>0; or equivalently, if and only if there exists v>0 such that C.v>0. C is called an affine Cartan matrix if for all proper subsets I we have det C_I>0, but det C==0; or equivalently if there exists v>0 such that C.v==0.

Given an irreducible Weyl group W with Cartan matrix C, we can construct a generalized Cartan matrix as follows. Let α₀ be the opposed of the highest root. Then the matrix $\left(\begin{array}{cc}C&C.α₀\\ α₀.C&2\end{array}\right)$ is an affine Cartan matrix. The affine Cartan matrices which can be obtained in this way are those we are interested in, which give rise to affine Weyl groups.

Let d=n-rank(C). A realization of a generalized Cartan matrix is a pair V,Vᵛ of vector spaces of dimension n+d together with vectors α₁,…,αₙ∈ V (the simple roots), αᵛ₁,…,αᵛₙ∈ Vᵛ (the simple coroots), such that (αᵛᵢ, αⱼ)=c_{i,j}. Up to isomorphism, a realization is obtained as follows: write $C=\left(\begin{array}{c}C_1\\C_2\end{array}\right)$ where C₁ is of same rank as C. Then take αᵢ to be the first n vectors in a basis of V, and take αᵛⱼ to be given in the dual basis by the rows of the matrix $\left(\begin{array}{cc}C₁&0\\ C_2&\hbox{Id}_d\\ \end{array}\right).$ To C we associate a reflection group in the space V, generated by the fundamental reflections rᵢ given by rᵢ(v)=v-(αᵛᵢ,v)αᵢ. This is a Coxeter group, called the affine Weyl group ilde W associated to W when we start with the affine Cartan matrix associated to a Weyl group W.

The affine Weyl group is infinite; it has one additional generator s₀ (the reflection with respect to α₀) compared to W. We can not use 0 as a label by default for a generator of a Coxeter group (because the default labels are used as indices, and indices start at 1 in Julia) so we label it as n+1 where n is the numbers of generators of W.

julia> W=affine(coxgroup(:A,4))
Ã₄

julia> diagram(W)
       ————5————
      /         \
Ã₄   1———2———3———4
source