Root systems¶
See Root Systems for an overview.
-
sage.combinat.root_system.root_system.
RootSystem
¶ A class for root systems.
EXAMPLES:
We construct the root system for type \(B_3\):
sage: R=RootSystem(['B',3]); R Root system of type ['B', 3]
R
models the root system abstractly. It comes equipped with various realizations of the root and weight lattices, where all computations take place. Let us play first with the root lattice:sage: space = R.root_lattice() sage: space Root lattice of the Root system of type ['B', 3]
This is the free \(\ZZ\)-module \(\bigoplus_i \ZZ.\alpha_i\) spanned by the simple roots:
sage: space.base_ring() Integer Ring sage: list(space.basis()) [alpha[1], alpha[2], alpha[3]]
Let us do some computations with the simple roots:
sage: alpha = space.simple_roots() sage: alpha[1] + alpha[2] alpha[1] + alpha[2]
There is a canonical pairing between the root lattice and the coroot lattice:
sage: R.coroot_lattice() Coroot lattice of the Root system of type ['B', 3]
We construct the simple coroots, and do some computations (see comments about duality below for some caveat):
sage: alphacheck = space.simple_coroots() sage: list(alphacheck) [alphacheck[1], alphacheck[2], alphacheck[3]]
We can carry over the same computations in any of the other realizations of the root lattice, like the root space \(\bigoplus_i \QQ.\alpha_i\), the weight lattice \(\bigoplus_i \ZZ.\Lambda_i\), the weight space \(\bigoplus_i \QQ.\Lambda_i\). For example:
sage: space = R.weight_space() sage: space Weight space over the Rational Field of the Root system of type ['B', 3]
sage: space.base_ring() Rational Field sage: list(space.basis()) [Lambda[1], Lambda[2], Lambda[3]]
sage: alpha = space.simple_roots() sage: alpha[1] + alpha[2] Lambda[1] + Lambda[2] - 2*Lambda[3]
The fundamental weights are the dual basis of the coroots:
sage: Lambda = space.fundamental_weights() sage: Lambda[1] Lambda[1]
sage: alphacheck = space.simple_coroots() sage: list(alphacheck) [alphacheck[1], alphacheck[2], alphacheck[3]]
sage: [Lambda[i].scalar(alphacheck[1]) for i in space.index_set()] [1, 0, 0] sage: [Lambda[i].scalar(alphacheck[2]) for i in space.index_set()] [0, 1, 0] sage: [Lambda[i].scalar(alphacheck[3]) for i in space.index_set()] [0, 0, 1]
Let us use the simple reflections. In the weight space, they work as in the number game: firing the node \(i\) on an element \(x\) adds \(c\) times the simple root \(\alpha_i\), where \(c\) is the coefficient of \(i\) in \(x\):
sage: s = space.simple_reflections() sage: Lambda[1].simple_reflection(1) -Lambda[1] + Lambda[2] sage: Lambda[2].simple_reflection(1) Lambda[2] sage: Lambda[3].simple_reflection(1) Lambda[3] sage: (-2*Lambda[1] + Lambda[2] + Lambda[3]).simple_reflection(1) 2*Lambda[1] - Lambda[2] + Lambda[3]
It can be convenient to manipulate the simple reflections themselves:
sage: s = space.simple_reflections() sage: s[1](Lambda[1]) -Lambda[1] + Lambda[2] sage: s[1](Lambda[2]) Lambda[2] sage: s[1](Lambda[3]) Lambda[3]
Ambient spaces
The root system may also come equipped with an ambient space. This is a \(\QQ\)-module, endowed with its canonical Euclidean scalar product, which admits simultaneous embeddings of the (extended) weight and the (extended) coweight lattice, and therefore the root and the coroot lattice. This is implemented on a type by type basis for the finite crystallographic root systems following Bourbaki’s conventions and is extended to the affine cases. Coefficients permitting, this is also available as an ambient lattice.
See also
ambient_space()
andambient_lattice()
for detailsIn finite type \(A\), we recover the natural representation of the symmetric group as group of permutation matrices:
sage: RootSystem(["A",2]).ambient_space().weyl_group().simple_reflections() Finite family {1: [0 1 0] [1 0 0] [0 0 1], 2: [1 0 0] [0 0 1] [0 1 0]}
In type \(B\), \(C\), and \(D\), we recover the natural representation of the Weyl group as groups of signed permutation matrices:
sage: RootSystem(["B",3]).ambient_space().weyl_group().simple_reflections() Finite family {1: [0 1 0] [1 0 0] [0 0 1], 2: [1 0 0] [0 0 1] [0 1 0], 3: [ 1 0 0] [ 0 1 0] [ 0 0 -1]}
In (untwisted) affine types \(A\), …, \(D\), one can recover from the ambient space the affine permutation representation, in window notation. Let us consider the ambient space for affine type \(A\):
sage: L = RootSystem(["A",2,1]).ambient_space(); L Ambient space of the Root system of type ['A', 2, 1]
Define the “identity” by an appropriate vector at level \(-3\):
sage: e = L.basis(); Lambda = L.fundamental_weights() sage: id = e[0] + 2*e[1] + 3*e[2] - 3*Lambda[0]
The corresponding permutation is obtained by projecting it onto the classical ambient space:
sage: L.classical() Ambient space of the Root system of type ['A', 2] sage: L.classical()(id) (1, 2, 3)
Here is the orbit of the identity under the action of the finite group:
sage: W = L.weyl_group() sage: S3 = [ w.action(id) for w in W.classical() ] sage: [L.classical()(x) for x in S3] [(1, 2, 3), (3, 1, 2), (2, 3, 1), (2, 1, 3), (1, 3, 2), (3, 2, 1)]
And the action of \(s_0\) on these yields:
sage: s = W.simple_reflections() sage: [L.classical()(s[0].action(x)) for x in S3] [(0, 2, 4), (-1, 1, 6), (-2, 3, 5), (0, 1, 5), (-1, 3, 4), (-2, 2, 6)]
We can also plot various components of the ambient spaces:
sage: L = RootSystem(['A',2]).ambient_space() sage: L.plot() Graphics object consisting of 13 graphics primitives
For more on plotting, see Tutorial: visualizing root systems.
Dual root systems
The root system is aware of its dual root system:
sage: R.dual Dual of root system of type ['B', 3]
R.dual
is really the root system of type \(C_3\):sage: R.dual.cartan_type() ['C', 3]
And the coroot lattice that we have been manipulating before is really implemented as the root lattice of the dual root system:
sage: R.dual.root_lattice() Coroot lattice of the Root system of type ['B', 3]
In particular, the coroots for the root lattice are in fact the roots of the coroot lattice:
sage: list(R.root_lattice().simple_coroots()) [alphacheck[1], alphacheck[2], alphacheck[3]] sage: list(R.coroot_lattice().simple_roots()) [alphacheck[1], alphacheck[2], alphacheck[3]] sage: list(R.dual.root_lattice().simple_roots()) [alphacheck[1], alphacheck[2], alphacheck[3]]
The coweight lattice and space are defined similarly. Note that, to limit confusion, all the output have been tweaked appropriately.
See also
sage.combinat.root_system
RootSpace
WeightSpace
AmbientSpace
RootLatticeRealizations
WeightLatticeRealizations
sage: for T in CartanType.samples(crystallographic=True): # long time (13s on sage.math, 2012) ....: TestSuite(RootSystem(T)).run()
Some checks for equality:
sage: r1 = RootSystem(['A',3]) sage: r2 = RootSystem(['B',3]) sage: r1 == r1 True sage: r1 == r2 False sage: r1 != r1 False
Check that root systems inherit a hash method from
UniqueRepresentation
:sage: hash(r1) # random 42
-
sage.combinat.root_system.root_system.
WeylDim
(ct, coeffs)¶ The Weyl Dimension Formula.
INPUT:
type
- a Cartan typecoeffs
- a list of nonnegative integers
The length of the list must equal the rank type[1]. A dominant weight hwv is constructed by summing the fundamental weights with coefficients from this list. The dimension of the irreducible representation of the semisimple complex Lie algebra with highest weight vector hwv is returned.
EXAMPLES:
For \(SO(7)\), the Cartan type is \(B_3\), so:
sage: WeylDim(['B',3],[1,0,0]) # standard representation of SO(7) 7 sage: WeylDim(['B',3],[0,1,0]) # exterior square 21 sage: WeylDim(['B',3],[0,0,1]) # spin representation of spin(7) 8 sage: WeylDim(['B',3],[1,0,1]) # sum of the first and third fundamental weights 48 sage: [WeylDim(['F',4],x) for x in ([1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,1])] [52, 1274, 273, 26] sage: [WeylDim(['E', 6], x) for x in ([0, 0, 0, 0, 0, 0], [0, 1, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 2], [0, 0, 0, 0, 1, 0], [0, 0, 1, 0, 0, 0], [1, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 1], [2, 0, 0, 0, 0, 0])] [1, 78, 27, 351, 351, 351, 27, 650, 351]