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,
  • WeightLatticeElem for elements in the weight lattice, i.e. weights 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.

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

This function is part of the experimental code in Oscar. Please read here for more details.

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
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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 []
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
rankMethod
rank(R::RootSystem) -> Int

Return the rank of R, i.e., the number of simple roots.

See also: number_of_simple_roots(::RootSystem).

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Cartan matrix and Weyl group

cartan_matrixMethod
cartan_matrix(R::RootSystem) -> ZZMatrix

Return the Cartan matrix defining R.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

This function is part of the experimental code in Oscar. Please read here for more details.

source

Root system type

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

Warning

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Root getters

number_of_rootsMethod
number_of_roots(R::RootSystem) -> Int

Return the number of roots of R.

See also: roots(::RootSystem).

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
number_of_simple_rootsMethod
number_of_simple_roots(R::RootSystem) -> Int

Return the number of simple roots of R.

See also: simple_roots(::RootSystem).

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
rootsMethod
roots(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).

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
simple_corootsMethod
simple_coroots(R::RootSystem) -> DualRootSpaceElem

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

See also: simple_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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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
Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Weight getters

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

fundamental_weightMethod
fundamental_weight(R::RootSystem, i::Int) -> WeightLatticeElem

Return the i-th fundamental weight of R.

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

See also: fundamental_weight(::RootSystem).

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

Return the root system r belongs to.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Root testing

is_root_with_indexMethod
is_root_with_index(r::RootSpaceElem) -> Bool, Int

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Reflections

reflectMethod
reflect(r::RootSpaceElem, s::Int) -> RootSpaceElem

Return the reflection of r in the hyperplane orthogonal to the s-th simple root.

See also: reflect!(::RootSpaceElem, ::Int).

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
reflect!Method
reflect!(r::RootSpaceElem, s::Int) -> RootSpaceElem

Reflect r in the hyperplane orthogonal to the s-th simple root, and return it.

This is a mutating version of reflect(::RootSpaceElem, ::Int).

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

Return the root system r belongs to.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Coroot testing

is_coroot_with_indexMethod
is_coroot_with_index(r::DualRootSpaceElem) -> Bool, Int

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Weight lattice elements

WeightLatticeElemMethod
WeightLatticeElem(R::RootSystem, vec::Vector{<:IntegerUnion}) -> WeightLatticeElem

Construct a weight lattice element in the root system R with the given coefficients w.r.t. the fundamental weights of R.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
WeightLatticeElemMethod
WeightLatticeElem(R::RootSystem, vec::ZZMatrix) -> WeightLatticeElem

Construct a weight lattice element in the root system R with the given coefficient vector w.r.t. the fundamental weights of R.

vec must be a row vector of the same length as the rank of R.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
WeightLatticeElemMethod
WeightLatticeElem(r::RootSpaceElem) -> WeightLatticeElem

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

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

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

Return the neutral additive element in the weight lattice of R.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
root_systemMethod
root_system(w::WeightLatticeElem) -> RootSystem

Return the root system w belongs to.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

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

coeffMethod
coeff(w::WeightLatticeElem, i::Int) -> ZZRingElem

Return the coefficient of the i-th fundamental weight in w.

This can be also accessed via w[i].

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
coefficientsMethod
coefficients(w::WeightLatticeElem) -> ZZMatrix

Return the coefficients of the weight lattice element w w.r.t. the fundamental weights 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 ZZRingElem that can be indexed with integers.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
iszeroMethod
iszero(w::WeightLatticeElem) -> Bool

Return whether w is zero.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
is_dominantMethod
is_dominant(w::WeightLatticeElem) -> Bool

Check if w is a dominant weight, i.e. if all coefficients are non-negative.

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Reflections

reflectMethod
reflect(w::WeightLatticeElem, s::Int) -> WeightLatticeElem

Return the reflection of w in the hyperplane orthogonal to the s-th simple root.

See also: reflect!(::WeightLatticeElem, ::Int).

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source
reflect!Method
reflect!(w::WeightLatticeElem, s::Int) -> WeightLatticeElem

Reflect w in the hyperplane orthogonal to the s-th simple root, and return it.

This is a mutating version of reflect(::WeightLatticeElem, ::Int).

Experimental

This function is part of the experimental code in Oscar. Please read here for more details.

source

Conjugate dominant weight