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:

  • RootSystem for the root system itself,
  • RootSpaceElem for elements in the root space, i.e. roots and linear combinations thereof,
  • DualRootSpaceElem for elements in the dual root space, i.e. coroots and linear combinations thereof.
Warning

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.

Note

See Cartan types for our conventions on Cartan types and ordering of simple roots.

Table of contents

Constructing root systems

root_systemMethod
root_system(cartan_matrix::ZZMatrix; check::Bool=true, detect_type::Bool=true) -> RootSystem
root_system(cartan_matrix::Matrix{<:Integer}; check::Bool=true, detect_type::Bool=true) -> RootSystem

Construct 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)
source
root_systemMethod
root_system(fam::Symbol, rk::Int) -> RootSystem

Construct 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 A2
source
root_systemMethod
root_system(type::Vector{Tuple{Symbol,Int}}) -> RootSystem
root_system(type::Tuple{Symbol,Int}...) -> RootSystem

Construct 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 []
source

Properties of root systems

is_simpleMethod
is_simple(R::RootSystem) -> Bool

Check if R is a simple root system.

Warning

Currently only root systems of finite type are supported.

source

Cartan matrix and Weyl group

cartan_matrixMethod
cartan_matrix(R::RootSystem) -> ZZMatrix

Return the Cartan matrix defining R.

source
weight_latticeMethod
weight_lattice(R::RootSystem) -> WeightLattice

Return 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)
source
weyl_groupMethod
weyl_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)
source

Root system type

root_system_type_with_orderingMethod
root_system_type_with_ordering(R::RootSystem) -> Vector{Tuple{Symbol,Int}}, Vector{Int}

Return the Cartan type of R, together with the 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).

Warning

This function will error if the type is not known yet and the Weyl group is infinite.

source

Root getters

The following functions return roots, see Root space elements for more information.

rootMethod
root(R::RootSystem, i::Int) -> RootSpaceElem

Return the i-th root of R.

This is a more efficient version for roots(R)[i].

See also: roots(::RootSystem).

Note

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.

source
simple_rootMethod
simple_root(R::RootSystem, i::Int) -> RootSpaceElem

Return the i-th simple root of R.

This is a more efficient version for simple_roots(R)[i].

See also: simple_roots(::RootSystem).

Note

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.

source
simple_rootsMethod
simple_roots(R::RootSystem) -> Vector{RootSpaceElem}

Return the simple roots of R.

See also: simple_root(::RootSystem, ::Int).

Note

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.

source
positive_rootMethod
positive_root(R::RootSystem, i::Int) -> RootSpaceElem

Return the i-th positive root of R.

This is a more efficient version for positive_roots(R)[i].

See also: positive_roots(::RootSystem).

Note

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.

source
positive_rootsMethod
positive_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).

Note

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_2
source
negative_rootMethod
negative_root(R::RootSystem, i::Int) -> RootSpaceElem

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

Note

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.

source
negative_rootsMethod
negative_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).

Note

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

Coroot getters

The following functions return coroots, see Dual root space elements for more information.

corootMethod
coroot(R::RootSystem, i::Int) -> DualRootSpaceElem

Return the coroot of the i-th root of R.

This is a more efficient version for coroots(R)[i].

See also: coroots(::RootSystem).

Note

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.

source
corootsMethod
coroots(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).

Note

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.

source
simple_corootMethod
simple_coroot(R::RootSystem, i::Int) -> DualRootSpaceElem

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

Note

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.

source
positive_corootMethod
positive_coroot(R::RootSystem, i::Int) -> DualRootSpaceElem

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

Note

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.

source
positive_corootsMethod
positive_coroots(R::RootSystem) -> DualRootSpaceElem

Return the coroots corresponding to the positive roots of R, in the order of positive_roots(::RootSystem).

See also: positive_coroot(::RootSystem, ::Int).

Note

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^v
source
negative_corootMethod
negative_coroot(R::RootSystem, i::Int) -> DualRootSpaceElem

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

Note

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.

source
negative_corootsMethod
negative_coroots(R::RootSystem) -> DualRootSpaceElem

Return the coroots corresponding to the negative roots of R, in the order of negative_roots(::RootSystem).

See also: negative_coroot(::RootSystem, ::Int).

Note

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^v
source

Weight getters

The following functions return weights, see Weight lattice elements for more information.

weyl_vectorMethod
weyl_vector(R::RootSystem) -> WeightLatticeElem

Return the Weyl vector $\rho$ of R, that is the sum of all fundamental weights or, equivalently, half the sum of all positive roots.

source

Root space elements

RootSpaceElemMethod
RootSpaceElem(R::RootSystem, vec::Vector{<:RationalUnion}) -> RootSpaceElem

Construct a root space element in the root system R with the given coefficients w.r.t. the simple roots of R.

source
RootSpaceElemMethod
RootSpaceElem(R::RootSystem, vec::QQMatrix) -> RootSpaceElem

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

source
RootSpaceElemMethod
RootSpaceElem(w::WeightLatticeElem) -> RootSpaceElem

Construct a root space element from the weight lattice element w.

source
zeroMethod
zero(::Type{RootSpaceElem}, R::RootSystem) -> RootSpaceElem

Return the neutral additive element in the root space of R.

source
root_systemMethod
root_system(r::RootSpaceElem) -> RootSystem

Return the root system r belongs to.

source

Basic arithmetic operations like zero, +, -, * (with rational scalars), and == are supported.

coeffMethod
coeff(r::RootSpaceElem, i::Int) -> QQFieldElem

Return the coefficient of the i-th simple root in r.

This can be also accessed via r[i].

source
coefficientsMethod
coefficients(r::RootSpaceElem) -> QQMatrix

Return the coefficients of the root space element r w.r.t. the simple roots as a row vector.

Note

The return type may not be relied on; we only guarantee that it is a one-dimensional iterable with eltype QQFieldElem that can be indexed with integers.

source
heightMethod
height(r::RootSpaceElem) -> QQFieldElem

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

source
iszeroMethod
iszero(r::RootSpaceElem) -> Bool

Check if r is the neutral additive element in the root space of its root system.

source

Root testing

Reflections

Dual root space elements

DualRootSpaceElemMethod
DualRootSpaceElem(R::RootSystem, vec::Vector{<:RationalUnion}) -> DualRootSpaceElem

Construct a dual root space element in the root system R with the given coefficients w.r.t. the simple coroots of R.

source
DualRootSpaceElemMethod
DualRootSpaceElem(R::RootSystem, vec::QQMatrix) -> DualRootSpaceElem

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

source
zeroMethod
zero(::Type{DualRootSpaceElem}, R::RootSystem) -> DualRootSpaceElem

Return the neutral additive element in the dual root space of R.

source
root_systemMethod
root_system(r::DualRootSpaceElem) -> RootSystem

Return the root system r belongs to.

source

Basic arithmetic operations like zero, +, -, * (with rational scalars), and == are supported.

coeffMethod
coeff(r::DualRootSpaceElem, i::Int) -> QQFieldElem

Returns the coefficient of the i-th simple coroot in r.

This can be also accessed via r[i].

source
coefficientsMethod
coefficients(r::DualRootSpaceElem) -> QQMatrix

Return the coefficients of the dual root space element r w.r.t. the simple coroots as a row vector.

Note

The return type may not be relied on; we only guarantee that it is a one-dimensional iterable with eltype QQFieldElem that can be indexed with integers.

source
heightMethod
height(r::DualRootSpaceElem) -> QQFieldElem

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

source
iszeroMethod
iszero(r::DualRootSpaceElem) -> Bool

Check if r is the neutral additive element in the dual root space of its root system.

source

Coroot testing