Root systems
Root systems in this module are meant to be abstract root systems, i.e. they are represented by a set of roots (vectors in an euclidean space).
The relevant types around root systems are:
RootSystemfor the root system itself,RootSpaceElemfor elements in the root space, i.e. roots and linear combinations thereof,DualRootSpaceElemfor elements in the dual root space, i.e. coroots and linear combinations thereof.
Most functionality around root systems is currently only intended to be used with root systems of finite type. For root systems of affine type, some documentation may be ill-phrased or incorrect, and some functions may not work as intended.
See Cartan types for our conventions on Cartan types and ordering of simple roots.
Table of contents
- Table of contents
- Constructing root systems
- Properties of root systems
- Root space elements
- Dual root space elements
Constructing root systems
root_system — Methodroot_system(cartan_matrix::ZZMatrix; check::Bool=true, detect_type::Bool=true) -> RootSystem
root_system(cartan_matrix::Matrix{<:IntegerUnion}; check::Bool=true, detect_type::Bool=true) -> RootSystemConstruct the root system defined by the given (generalized) Cartan matrix.
If check=true the function will verify that cartan_matrix is indeed a generalized Cartan matrix. Passing detect_type=false will skip the detection of the root system type.
Examples
julia> root_system([2 -1; -1 2])
Root system of rank 2
of type A2
julia> root_system(matrix(ZZ, 2, 2, [2, -1, -1, 2]); detect_type=false)
Root system of rank 2
of unknown type
julia> root_system(matrix(ZZ, [2 -1 -2; -1 2 0; -1 0 2]))
Root system of rank 3
of type C3 (with non-canonical ordering of simple roots)root_system — Methodroot_system(fam::Symbol, rk::Int) -> RootSystemConstruct the root system of the given type.
The input must be a valid Cartan type, see is_cartan_type(::Symbol, ::Int).
Examples
julia> root_system(:A, 2)
Root system of rank 2
of type A2root_system — Methodroot_system(type::Vector{Tuple{Symbol,Int}}) -> RootSystem
root_system(type::Tuple{Symbol,Int}...) -> RootSystemConstruct the root system 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> root_system([(:A, 2), (:F, 4)])
Root system of rank 6
of type A2 x F4
julia> root_system(Tuple{Symbol,Int}[])
Root system of rank 0
of type []Properties of root systems
is_simple — Methodis_simple(R::RootSystem) -> BoolCheck if R is a simple root system.
rank — Methodrank(R::RootSystem) -> IntReturn the rank of R, i.e., the number of simple roots.
See also: number_of_simple_roots(::RootSystem).
Cartan matrix and Weyl group
cartan_matrix — Methodcartan_matrix(R::RootSystem) -> ZZMatrixReturn the Cartan matrix defining R.
weight_lattice — Methodweight_lattice(R::RootSystem) -> WeightLatticeReturn the weight lattice of R, i.e. the lattice spanned by the fundamental weights.
This is the parent of all weights of R.
Examples
julia> weight_lattice(root_system([2 -1; -1 2]))
Weight lattice
of root system of rank 2
of type A2
julia> weight_lattice(root_system(matrix(ZZ, 2, 2, [2, -1, -1, 2]); detect_type=false))
Weight lattice
of root system of rank 2
of unknown type
julia> weight_lattice(root_system(matrix(ZZ, [2 -1 -2; -1 2 0; -1 0 2])))
Weight lattice
of root system of rank 3
of type C3 (with non-canonical ordering of simple roots)weyl_group — Methodweyl_group(R::RootSystem) -> WeylGroupReturn 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)Root system type
has_root_system_type — Methodhas_root_system_type(R::RootSystem) -> BoolCheck if the root system R already knows its Cartan type.
The type can then be queried with root_system_type(::RootSystem) and root_system_type_with_ordering(::RootSystem).
root_system_type — Methodroot_system_type(R::RootSystem) -> Vector{Tuple{Symbol,Int}}Return the Cartan type of R.
If the type is already known, it is returned directly. This can be checked with has_root_system_type(::RootSystem).
If the type is not known, it is determined and stored in R.
See also: root_system_type_with_ordering(::RootSystem).
root_system_type_with_ordering — Methodroot_system_type_with_ordering(R::RootSystem) -> Vector{Tuple{Symbol,Int}}, Vector{Int}Return the Cartan type of R, together with a vector ordering such that simple_roots(R)[ordering] is a canonical ordering of the simple roots.
If the type is already known, it is returned directly. This can be checked with has_root_system_type(::RootSystem).
If the type is not known, it is determined and stored in R.
See also: root_system_type(::RootSystem), cartan_type_with_ordering(::ZZMatrix).
Root getters
number_of_roots — Methodnumber_of_positive_roots — Methodnumber_of_positive_roots(R::RootSystem) -> IntReturn the number of positive roots of R. This is the same as the number of negative roots.
See also: positive_roots(::RootSystem), negative_roots(::RootSystem).
number_of_simple_roots — Methodnumber_of_simple_roots(R::RootSystem) -> IntReturn the number of simple roots of R.
See also: simple_roots(::RootSystem).
The following functions return roots, see Root space elements for more information.
root — Methodroot(R::RootSystem, i::Int) -> RootSpaceElemReturn the i-th root of R.
This is a more efficient version for roots(R)[i].
See also: roots(::RootSystem).
roots — Methodroots(R::RootSystem) -> Vector{RootSpaceElem}Return the roots of R, starting with the positive roots and then the negative roots, in the order of positive_roots(::RootSystem) and negative_roots(::RootSystem).
See also: root(::RootSystem, ::Int).
simple_root — Methodsimple_root(R::RootSystem, i::Int) -> RootSpaceElemReturn the i-th simple root of R.
This is a more efficient version for simple_roots(R)[i].
See also: simple_roots(::RootSystem).
simple_roots — Methodsimple_roots(R::RootSystem) -> Vector{RootSpaceElem}Return the simple roots of R.
See also: simple_root(::RootSystem, ::Int).
positive_root — Methodpositive_root(R::RootSystem, i::Int) -> RootSpaceElemReturn the i-th positive root of R.
This is a more efficient version for positive_roots(R)[i].
See also: positive_roots(::RootSystem).
positive_roots — Methodpositive_roots(R::RootSystem) -> Vector{RootSpaceElem}Return the positive roots of R, starting with the simple roots in the order of simple_roots(::RootSystem), and then increasing in height.
See also: positive_root(::RootSystem, ::Int).
This function does not return a copy of the asked for object, but the internal field of the root system. Mutating the returned object will lead to undefined behavior.
Examples
julia> positive_roots(root_system(:A, 2))
3-element Vector{RootSpaceElem}:
a_1
a_2
a_1 + a_2negative_root — Methodnegative_root(R::RootSystem, i::Int) -> RootSpaceElemReturn the i-th negative root of R, i.e. the negative of the i-th positive root.
This is a more efficient version for negative_roots(R)[i].
See also: negative_roots(::RootSystem).
negative_roots — Methodnegative_roots(R::RootSystem) -> Vector{RootSpaceElem}Return the negative roots of R.
The $i$-th element of the returned vector is the negative root corresponding to the $i$-th positive root.
See also: positive_root(::RootSystem, ::Int).
This function does not return a copy of the asked for object, but the internal field of the root system. Mutating the returned object will lead to undefined behavior.
Examples
julia> negative_roots(root_system(:A, 2))
3-element Vector{RootSpaceElem}:
-a_1
-a_2
-a_1 - a_2highest_root — Methodhighest_root(R::RootSystem) -> RootSpaceElemReturn the highest root of R, where R is a simple root system of finite type.
This is equivalent to positive_root(R, number_of_positive_roots(R)).
See also: positive_root(::RootSystem, ::Int).
Examples
julia> highest_root(root_system(:F, 4))
2*a_1 + 3*a_2 + 4*a_3 + 2*a_4Coroot getters
The following functions return coroots, see Dual root space elements for more information.
coroot — Methodcoroot(R::RootSystem, i::Int) -> DualRootSpaceElemReturn the coroot of the i-th root of R.
This is a more efficient version for coroots(R)[i].
See also: coroots(::RootSystem).
coroots — Methodcoroots(R::RootSystem) -> Vector{DualRootSpaceElem}Return the coroots of R in the order of roots(::RootSystem), i.e. starting with the coroots of positive roots and then those of negative roots, each in the order of positive_coroots(::RootSystem) and negative_coroots(::RootSystem), respectively.
See also: coroot(::RootSystem, ::Int).
simple_coroot — Methodsimple_coroot(R::RootSystem, i::Int) -> DualRootSpaceElemReturn the coroot of the i-th simple root of R.
This is a more efficient version for simple_coroots(R)[i].
See also: simple_coroots(::RootSystem).
simple_coroots — Methodsimple_coroots(R::RootSystem) -> DualRootSpaceElemReturn the coroots corresponding to the simple roots of R, in the order of simple_roots(::RootSystem).
See also: simple_coroot(::RootSystem, ::Int).
positive_coroot — Methodpositive_coroot(R::RootSystem, i::Int) -> DualRootSpaceElemReturn the coroot of the i-th positive root of R.
This is a more efficient version for positive_coroots(R)[i].
See also: positive_coroots(::RootSystem).
positive_coroots — Methodpositive_coroots(R::RootSystem) -> DualRootSpaceElemReturn the coroots corresponding to the positive roots of R, in the order of positive_roots(::RootSystem).
See also: positive_coroot(::RootSystem, ::Int).
This function does not return a copy of the asked for object, but the internal field of the root system. Mutating the returned object will lead to undefined behavior.
Examples
julia> positive_coroots(root_system(:A, 2))
3-element Vector{DualRootSpaceElem}:
a_1^v
a_2^v
a_1^v + a_2^vnegative_coroot — Methodnegative_coroot(R::RootSystem, i::Int) -> DualRootSpaceElemReturn the coroot of the i-th negative root of R.
This is a more efficient version for negative_coroots(R)[i].
See also: negative_coroots(::RootSystem).
negative_coroots — Methodnegative_coroots(R::RootSystem) -> DualRootSpaceElemReturn the coroots corresponding to the negative roots of R, in the order of negative_roots(::RootSystem).
See also: negative_coroot(::RootSystem, ::Int).
This function does not return a copy of the asked for object, but the internal field of the root system. Mutating the returned object will lead to undefined behavior.
Examples
julia> negative_coroots(root_system(:A, 2))
3-element Vector{DualRootSpaceElem}:
-a_1^v
-a_2^v
-a_1^v - a_2^vWeight getters
The following functions return weights, see Weight lattice elements for more information.
fundamental_weight — Methodfundamental_weight(R::RootSystem, i::Int) -> WeightLatticeElemReturn the i-th fundamental weight of R.
This is a more efficient version for fundamental_weights(R)[i].
See also: fundamental_weight(::RootSystem).
fundamental_weights — Methodfundamental_weights(R::RootSystem) -> Vector{WeightLatticeElem}Return the fundamental weights corresponding to the simple roots of R, in the order of simple_roots(::RootSystem).
See also: fundamental_weight(::RootSystem, ::Int).
Examples
julia> fundamental_weights(root_system(:A, 2))
2-element Vector{WeightLatticeElem}:
w_1
w_2weyl_vector — Methodweyl_vector(R::RootSystem) -> WeightLatticeElemReturn the Weyl vector $\rho$ of R, that is the sum of all fundamental weights or, equivalently, half the sum of all positive roots.
Root space elements
RootSpaceElem — MethodRootSpaceElem(R::RootSystem, vec::Vector{<:RationalUnion}) -> RootSpaceElemConstruct a root space element in the root system R with the given coefficients w.r.t. the simple roots of R.
RootSpaceElem — MethodRootSpaceElem(R::RootSystem, vec::QQMatrix) -> RootSpaceElemConstruct a root space element in the root system R with the given coefficien vector w.r.t. the simple roots of R.
vec must be a row vector of the same length as the rank of R.
RootSpaceElem — MethodRootSpaceElem(w::WeightLatticeElem) -> RootSpaceElemConstruct a root space element from the weight lattice element w.
zero — Methodzero(::Type{RootSpaceElem}, R::RootSystem) -> RootSpaceElemReturn the neutral additive element in the root space of R.
root_system — Methodroot_system(r::RootSpaceElem) -> RootSystemReturn the root system r belongs to.
Basic arithmetic operations like zero, +, -, * (with rational scalars), and == are supported.
coeff — Methodcoeff(r::RootSpaceElem, i::Int) -> QQFieldElemReturn the coefficient of the i-th simple root in r.
This can be also accessed via r[i].
coefficients — Methodcoefficients(r::RootSpaceElem) -> QQMatrixReturn the coefficients of the root space element r w.r.t. the simple roots as a row vector.
height — Methodheight(r::RootSpaceElem) -> QQFieldElemFor a root r, returns the height of r, i.e. the sum of the coefficients of the simple roots. If r is not a root, the return value is arbitrary.
iszero — Methodiszero(r::RootSpaceElem) -> BoolCheck if r is the neutral additive element in the root space of its root system.
Root testing
is_root — Methodis_root(r::RootSpaceElem) -> BoolCheck if r is a root of its root system.
See also: is_root_with_index(::RootSpaceElem).
is_root_with_index — Methodis_root_with_index(r::RootSpaceElem) -> Bool, IntCheck if r is a root of its root system and return this together with the index of the root in roots(::RootSystem).
If r is not a root, the second return value is arbitrary.
See also: is_root(::RootSpaceElem).
is_simple_root — Methodis_simple_root(r::RootSpaceElem) -> BoolCheck if r is a simple root of its root system.
See also: is_simple_root_with_index(::RootSpaceElem).
is_simple_root_with_index — Methodis_simple_root_with_index(r::RootSpaceElem) -> Bool, IntCheck if r is a simple root of its root system and return this together with the index of the root in simple_roots(::RootSystem).
If r is not a simple root, the second return value is arbitrary.
See also: is_simple_root(::RootSpaceElem).
is_positive_root — Methodis_positive_root(r::RootSpaceElem) -> BoolCheck if r is a positive root of its root system.
See also: is_positive_root_with_index(::RootSpaceElem).
is_positive_root_with_index — Methodis_positive_root_with_index(r::RootSpaceElem) -> Bool, IntCheck if r is a positive root of its root system and return this together with the index of the root in positive_roots(::RootSystem).
If r is not a positive root, the second return value is arbitrary.
See also: is_positive_root(::RootSpaceElem).
is_negative_root — Methodis_negative_root(r::RootSpaceElem) -> BoolCheck if r is a negative root of its root system.
See also: is_negative_root_with_index(::RootSpaceElem).
is_negative_root_with_index — Methodis_negative_root_with_index(r::RootSpaceElem) -> Bool, IntCheck if r is a negative root of its root system and return this together with the index of the root in negative_roots(::RootSystem).
If r is not a negative root, the second return value is arbitrary.
See also: is_negative_root(::RootSpaceElem).
Reflections
reflect — Methodreflect(r::RootSpaceElem, s::Int) -> RootSpaceElemReturn the reflection of r in the hyperplane orthogonal to the s-th simple root.
See also: reflect!(::RootSpaceElem, ::Int).
reflect! — Methodreflect!(r::RootSpaceElem, s::Int) -> RootSpaceElemReflect r in the hyperplane orthogonal to the s-th simple root, and return it.
This is a mutating version of reflect(::RootSpaceElem, ::Int).
reflect — Methodreflect(r::RootSpaceElem, beta::RootSpaceElem) -> RootSpaceElemReturn the reflection of r in the hyperplane orthogonal to root beta.
See also: reflect!(::RootSpaceElem, ::RootSpaceElem).
reflect! — Methodreflect!(r::RootSpaceElem, beta::RootSpaceElem) -> RootSpaceElemReflect r in the hyperplane orthogonal to the root beta, and return it.
This is a mutating version of reflect(::RootSpaceElem, ::RootSpaceElem).
Dual root space elements
DualRootSpaceElem — MethodDualRootSpaceElem(R::RootSystem, vec::Vector{<:RationalUnion}) -> DualRootSpaceElemConstruct a dual root space element in the root system R with the given coefficients w.r.t. the simple coroots of R.
DualRootSpaceElem — MethodDualRootSpaceElem(R::RootSystem, vec::QQMatrix) -> DualRootSpaceElemConstruct a dual root space element in the root system R with the given coefficien vector w.r.t. the simple coroots of R.
vec must be a row vector of the same length as the rank of R.
zero — Methodzero(::Type{DualRootSpaceElem}, R::RootSystem) -> DualRootSpaceElemReturn the neutral additive element in the dual root space of R.
root_system — Methodroot_system(r::DualRootSpaceElem) -> RootSystemReturn the root system r belongs to.
Basic arithmetic operations like zero, +, -, * (with rational scalars), and == are supported.
coeff — Methodcoeff(r::DualRootSpaceElem, i::Int) -> QQFieldElemReturn the coefficient of the i-th simple coroot in r.
This can be also accessed via r[i].
coefficients — Methodcoefficients(r::DualRootSpaceElem) -> QQMatrixReturn the coefficients of the dual root space element r w.r.t. the simple coroots as a row vector.
height — Methodheight(r::DualRootSpaceElem) -> QQFieldElemFor a coroot r, returns the height of r, i.e. the sum of the coefficients of the simple coroots. If r is not a coroot, the return value is arbitrary.
iszero — Methodiszero(r::DualRootSpaceElem) -> BoolCheck if r is the neutral additive element in the dual root space of its root system.
Coroot testing
is_coroot — Methodis_coroot(r::DualRootSpaceElem) -> BoolCheck if r is a coroot of its root system.
See also: is_coroot_with_index(::DualRootSpaceElem).
is_coroot_with_index — Methodis_coroot_with_index(r::DualRootSpaceElem) -> Bool, IntCheck if r is a coroot of its root system and return this together with the index of the coroot in coroots(::RootSystem).
If r is not a coroot, the second return value is arbitrary.
See also: is_coroot(::DualRootSpaceElem).
is_simple_coroot — Methodis_simple_coroot(r::DualRootSpaceElem) -> BoolCheck if r is a simple coroot of its root system.
is_simple_coroot_with_index — Methodis_simple_coroot_with_index(r::DualRootSpaceElem) -> Bool, IntCheck if r is a simple coroot of its root system and return this together with the index of the coroot in simple_coroots(::RootSystem).
If r is not a simple coroot, the second return value is arbitrary.
See also: is_simple_coroot(::DualRootSpaceElem).
is_positive_coroot — Methodis_positive_coroot(r::DualRootSpaceElem) -> BoolCheck if r is a positive coroot of its root system.
See also: is_positive_coroot_with_index(::DualRootSpaceElem).
is_positive_coroot_with_index — Methodis_positive_coroot_with_index(r::DualRootSpaceElem) -> Bool, IntCheck if r is a positive coroot of its root system and return this together with the index of the coroot in positive_coroots(::RootSystem).
If r is not a positive coroot, the second return value is arbitrary.
See also: is_positive_coroot(::DualRootSpaceElem).
is_negative_coroot — Methodis_negative_coroot(r::DualRootSpaceElem) -> BoolCheck if r is a negative coroot of its root system.
See also: is_negative_coroot_with_index(::DualRootSpaceElem).
is_negative_coroot_with_index — Methodis_negative_coroot_with_index(r::DualRootSpaceElem) -> Bool, IntCheck if r is a negative coroot of its root system and return this together with the index of the coroot in negative_coroots(::RootSystem).
If r is not a negative coroot, the second return value is arbitrary.
See also: is_negative_coroot(::DualRootSpaceElem).