Weyl groups
Weyl groups are represented by objects of type WeylGroup <: Group
, and their elements by WeylGroupElem <: GroupElement
.
Weyl groups in OSCAR only afford right actions on roots and weights. Note however, that this may differ from the literature, but is to stay consistent with the conventions in the rest of OSCAR.
See Cartan types for our conventions on Cartan types and ordering of simple roots.
Table of contents
- Table of contents
- Constructing Weyl groups
- Basic properties
- Reduced expressions
- Action on roots and weights
Constructing Weyl groups
weyl_group
— Methodweyl_group(R::RootSystem) -> WeylGroup
Return the Weyl group of R
.
Examples
julia> weyl_group(root_system([2 -1; -1 2]))
Weyl group
of root system of rank 2
of type A2
julia> weyl_group(root_system(matrix(ZZ, 2, 2, [2, -1, -1, 2]); detect_type=false))
Weyl group
of root system of rank 2
of unknown type
julia> weyl_group(root_system(matrix(ZZ, [2 -1 -2; -1 2 0; -1 0 2])))
Weyl group
of root system of rank 3
of type C3 (with non-canonical ordering of simple roots)
weyl_group
— Methodweyl_group(cartan_matrix::ZZMatrix) -> WeylGroup
Construct the Weyl group defined by the given (generalized) Cartan matrix.
weyl_group
— Methodweyl_group(fam::Symbol, rk::Int) -> WeylGroup
Construct the Weyl group of the given type.
The input must be a valid Cartan type, see is_cartan_type(::Symbol, ::Int)
.
Examples
julia> weyl_group(:A, 2)
Weyl group
of root system of rank 2
of type A2
weyl_group
— Methodweyl_group(type::Vector{Tuple{Symbol,Int}}) -> WeylGroup
weyl_group(type::Tuple{Symbol,Int}...) -> WeylGroup
Construct the Weyl group of the given type.
Each element of type
must be a valid Cartan type, see is_cartan_type(::Symbol, ::Int)
. The vararg version needs at least one element.
Examples
julia> weyl_group([(:G, 2), (:D, 4)])
Weyl group
of root system of rank 6
of type G2 x D4
Basic properties
Basic group arithmetic like *
, and inv
are defined for WeylGroupElem
objects.
Using (W::WeylGroup)(word::Vector{<:Integer})
, one can construct group elements from a word in the generators. Finite Weyl groups support iteration over all group elements (in an arbitrary order).
is_finite
— Methodis_finite(W::WeylGroup) -> Bool
Return whether W
is finite.
one
— Methodone(W::WeylGroup) -> WeylGroupElem
Return the identity element of W
.
isone
— Methodisone(x::WeylGroupElem) -> Bool
Return whether x
is the identity element of its parent.
gen
— Methodgen(W::WeylGroup, i::Int) -> WeylGroupElem
Return the i
-th simple reflection (with respect to the underlying root system) of W
.
This is a more efficient version for gens(W)[i]
.
gens
— Methodgens(W::WeylGroup) -> WeylGroupElem
Return the simple reflections (with respect to the underlying root system) of W
.
See also: gen(::WeylGroup, ::Int)
.
number_of_generators
— Methodnumber_of_generators(W::WeylGroup) -> Int
Return the number of generators of the W
, i.e. the rank of the underlying root system.
order
— Methodorder(W::WeylGroup) -> ZZRingELem
order(::Type{T}, W::WeylGroup) where {T} -> T
Return the order of W
.
If W
is infinite, an InfiniteOrderError
exception will be thrown.
root_system
— Methodroot_system(W::WeylGroup) -> RootSystem
Return the underlying root system of W
.
Words and length
word
— Methodword(x::WeylGroupElem) -> Vector{UInt8}
Return x
as a list of indices of simple reflections, in reduced form.
This function is right inverse to calling (W::WeylGroup)(word::Vector{<:Integer})
.
length
— Methodlength(x::WeylGroupElem) -> Int
Return the length of x
.
longest_element
— Methodlongest_element(W::WeylGroup) -> WeylGroupElem
Return the unique longest element of W
. This only exists if W
is finite.
Bruhat order
<
— Method<(x::WeylGroupElem, y::WeylGroupElem) -> Bool
Return whether x
is smaller than y
with respect to the Bruhat order, i.e., whether some (not necessarily connected) subexpression of a reduced decomposition of y
, is a reduced decomposition of x
.
Reduced expressions
reduced_expressions
— Methodreduced_expressions(x::WeylGroupElem; up_to_commutation::Bool=false)
Return an iterator over all reduced expressions of x
as Vector{UInt8}
.
If up_to_commutation
is true
, the iterator will not return an expression that only differs from a previous one by a swap of two adjacent commuting simple reflections.
The type of the iterator and the order of the elements are considered implementation details and should not be relied upon.
Examples
julia> W = weyl_group(:A, 3);
julia> x = W([1,2,3,1]);
julia> collect(reduced_expressions(x))
3-element Vector{Vector{UInt8}}:
[0x01, 0x02, 0x01, 0x03]
[0x01, 0x02, 0x03, 0x01]
[0x02, 0x01, 0x02, 0x03]
julia> collect(reduced_expressions(x; up_to_commutation=true))
2-element Vector{Vector{UInt8}}:
[0x01, 0x02, 0x01, 0x03]
[0x02, 0x01, 0x02, 0x03]
The second expression of the first iterator is not contained in the second iterator because it only differs from the first expression by a swap of two the two commuting simple reflections s1
and s3
.
Action on roots and weights
*
— Method*(r::RootSpaceElem, x::WeylGroupElem) -> RootSpaceElem
*(w::WeightLatticeElem, x::WeylGroupElem) -> WeightLatticeElem
Return the result of acting with x
from the right on r
or w
.
See also: *(::WeylGroupElem, ::Union{RootSpaceElem,WeightLatticeElem})
.
Orbits
weyl_orbit
— Methodweyl_orbit(wt::WeightLatticeElem)
Return an iterator over the Weyl group orbit at the weight wt
.
The type of the iterator and the order of the elements are considered implementation details and should not be relied upon.
This function currently only supports finite Weyl groups.