Root system data for dual Cartan types#

class sage.combinat.root_system.type_dual.AmbientSpace(root_system, base_ring, index_set=None)[source]#

Bases: AmbientSpace

Ambient space for a dual finite Cartan type.

It is constructed in the canonical way from the ambient space of the original Cartan type by switching the roles of simple roots, fundamental weights, etc.

Note

Recall that, for any finite Cartan type, and in particular the a simply laced one, the dual Cartan type is constructed as another preexisting Cartan type. Furthermore the ambient space for an affine type is constructed from the ambient space for its classical type. Thus this code is not actually currently used.

It is kept for cross-checking and for reference in case it could become useful, e.g., for dual of general Kac-Moody types.

For the doctests, we need to explicitly create a dual type. Subsequently, since reconstruction of the dual of type \(F_4\) is the relabelled Cartan type, pickling fails on the TestSuite run.

EXAMPLES:

sage: ct = sage.combinat.root_system.type_dual.CartanType(CartanType(['F',4]))
sage: L = ct.root_system().ambient_space(); L
Ambient space of the Root system of type ['F', 4]^*
sage: TestSuite(L).run(skip=["_test_elements","_test_pickling"])                # needs sage.graphs
>>> from sage.all import *
>>> ct = sage.combinat.root_system.type_dual.CartanType(CartanType(['F',Integer(4)]))
>>> L = ct.root_system().ambient_space(); L
Ambient space of the Root system of type ['F', 4]^*
>>> TestSuite(L).run(skip=["_test_elements","_test_pickling"])                # needs sage.graphs
dimension()[source]#

Return the dimension of this ambient space.

EXAMPLES:

sage: ct = sage.combinat.root_system.type_dual.CartanType(CartanType(['F',4]))
sage: L = ct.root_system().ambient_space()
sage: L.dimension()
4
>>> from sage.all import *
>>> ct = sage.combinat.root_system.type_dual.CartanType(CartanType(['F',Integer(4)]))
>>> L = ct.root_system().ambient_space()
>>> L.dimension()
4
fundamental_weights()[source]#

Return the fundamental weights.

They are computed from the simple roots by inverting the Cartan matrix. This is acceptable since this is only about ambient spaces for finite Cartan types. Also, we do not have to worry about the usual \(GL_n\) vs \(SL_n\) catch because type \(A\) is self dual.

An alternative would have been to start from the fundamental coweights in the dual ambient space, but those are not yet implemented.

EXAMPLES:

sage: ct = sage.combinat.root_system.type_dual.CartanType(CartanType(['F',4]))
sage: L = ct.root_system().ambient_space()
sage: L.fundamental_weights()                                               # needs sage.graphs
Finite family {1: (1, 1, 0, 0), 2: (2, 1, 1, 0), 3: (3, 1, 1, 1), 4: (2, 0, 0, 0)}
>>> from sage.all import *
>>> ct = sage.combinat.root_system.type_dual.CartanType(CartanType(['F',Integer(4)]))
>>> L = ct.root_system().ambient_space()
>>> L.fundamental_weights()                                               # needs sage.graphs
Finite family {1: (1, 1, 0, 0), 2: (2, 1, 1, 0), 3: (3, 1, 1, 1), 4: (2, 0, 0, 0)}

Note that this ambient space is isomorphic, but not equal, to that obtained by constructing \(F_4\) dual by relabelling:

sage: ct = CartanType(['F',4]).dual(); ct
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
sage: ct.root_system().ambient_space().fundamental_weights()
Finite family {1: (1, 0, 0, 0), 2: (3/2, 1/2, 1/2, 1/2), 3: (2, 1, 1, 0), 4: (1, 1, 0, 0)}
>>> from sage.all import *
>>> ct = CartanType(['F',Integer(4)]).dual(); ct
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
>>> ct.root_system().ambient_space().fundamental_weights()
Finite family {1: (1, 0, 0, 0), 2: (3/2, 1/2, 1/2, 1/2), 3: (2, 1, 1, 0), 4: (1, 1, 0, 0)}
simple_root(i)[source]#

Return the i-th simple root.

It is constructed by looking up the corresponding simple coroot in the ambient space for the dual Cartan type.

EXAMPLES:

sage: ct = sage.combinat.root_system.type_dual.CartanType(CartanType(['F',4]))
sage: ct.root_system().ambient_space().simple_root(1)
(0, 1, -1, 0)

sage: ct.root_system().ambient_space().simple_roots()
Finite family {1: (0, 1, -1, 0), 2: (0, 0, 1, -1), 3: (0, 0, 0, 2), 4: (1, -1, -1, -1)}

sage: ct.dual().root_system().ambient_space().simple_coroots()
Finite family {1: (0, 1, -1, 0), 2: (0, 0, 1, -1), 3: (0, 0, 0, 2), 4: (1, -1, -1, -1)}
>>> from sage.all import *
>>> ct = sage.combinat.root_system.type_dual.CartanType(CartanType(['F',Integer(4)]))
>>> ct.root_system().ambient_space().simple_root(Integer(1))
(0, 1, -1, 0)

>>> ct.root_system().ambient_space().simple_roots()
Finite family {1: (0, 1, -1, 0), 2: (0, 0, 1, -1), 3: (0, 0, 0, 2), 4: (1, -1, -1, -1)}

>>> ct.dual().root_system().ambient_space().simple_coroots()
Finite family {1: (0, 1, -1, 0), 2: (0, 0, 1, -1), 3: (0, 0, 0, 2), 4: (1, -1, -1, -1)}

Note that this ambient space is isomorphic, but not equal, to that obtained by constructing \(F_4\) dual by relabelling:

sage: ct = CartanType(['F',4]).dual(); ct
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
sage: ct.root_system().ambient_space().simple_roots()
Finite family {1: (1/2, -1/2, -1/2, -1/2), 2: (0, 0, 0, 1), 3: (0, 0, 1, -1), 4: (0, 1, -1, 0)}
>>> from sage.all import *
>>> ct = CartanType(['F',Integer(4)]).dual(); ct
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
>>> ct.root_system().ambient_space().simple_roots()
Finite family {1: (1/2, -1/2, -1/2, -1/2), 2: (0, 0, 0, 1), 3: (0, 0, 1, -1), 4: (0, 1, -1, 0)}
class sage.combinat.root_system.type_dual.CartanType(type)[source]#

Bases: CartanType_decorator, CartanType_crystallographic

A class for dual Cartan types.

The dual of a (crystallographic) Cartan type is a Cartan type with the same index set, but all arrows reversed in the Dynkin diagram (otherwise said, the Cartan matrix is transposed). It shares a lot of properties in common with its dual. In particular, the Weyl group is isomorphic to that of the dual as a Coxeter group.

EXAMPLES:

For all finite Cartan types, and in particular the simply laced ones, the dual Cartan type is given by another preexisting Cartan type:

sage: CartanType(['A',4]).dual()
['A', 4]
sage: CartanType(['B',4]).dual()
['C', 4]
sage: CartanType(['C',4]).dual()
['B', 4]
sage: CartanType(['F',4]).dual()
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
>>> from sage.all import *
>>> CartanType(['A',Integer(4)]).dual()
['A', 4]
>>> CartanType(['B',Integer(4)]).dual()
['C', 4]
>>> CartanType(['C',Integer(4)]).dual()
['B', 4]
>>> CartanType(['F',Integer(4)]).dual()
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}

So to exercise this class we consider some non simply laced affine Cartan types and also create explicitly \(F_4^*\) as a dual cartan type:

sage: from sage.combinat.root_system.type_dual import CartanType as CartanTypeDual
sage: F4d = CartanTypeDual(CartanType(['F',4])); F4d
['F', 4]^*
sage: G21d = CartanType(['G',2,1]).dual(); G21d
['G', 2, 1]^*
>>> from sage.all import *
>>> from sage.combinat.root_system.type_dual import CartanType as CartanTypeDual
>>> F4d = CartanTypeDual(CartanType(['F',Integer(4)])); F4d
['F', 4]^*
>>> G21d = CartanType(['G',Integer(2),Integer(1)]).dual(); G21d
['G', 2, 1]^*

They share many properties with their original Cartan types:

sage: F4d.is_irreducible()
True
sage: F4d.is_crystallographic()
True
sage: F4d.is_simply_laced()
False
sage: F4d.is_finite()
True
sage: G21d.is_finite()
False
sage: F4d.is_affine()
False
sage: G21d.is_affine()
True
>>> from sage.all import *
>>> F4d.is_irreducible()
True
>>> F4d.is_crystallographic()
True
>>> F4d.is_simply_laced()
False
>>> F4d.is_finite()
True
>>> G21d.is_finite()
False
>>> F4d.is_affine()
False
>>> G21d.is_affine()
True

Note

F4d is pickled by construction as F4.dual() hence the above failure.

ascii_art(label=None, node=None)[source]#

Return an ascii art representation of this Cartan type

(by hacking the ascii art representation of the dual Cartan type)

EXAMPLES:

sage: print(CartanType(["B", 3, 1]).dual().ascii_art())
    O 0
    |
    |
O---O=<=O
1   2   3
sage: print(CartanType(["C", 4, 1]).dual().ascii_art())
O=<=O---O---O=>=O
0   1   2   3   4
sage: print(CartanType(["G", 2, 1]).dual().ascii_art())
  3
O=>=O---O
1   2   0
sage: print(CartanType(["F", 4, 1]).dual().ascii_art())
O---O---O=<=O---O
0   1   2   3   4
sage: print(CartanType(["BC", 4, 2]).dual().ascii_art())
O=>=O---O---O=>=O
0   1   2   3   4
>>> from sage.all import *
>>> print(CartanType(["B", Integer(3), Integer(1)]).dual().ascii_art())
    O 0
    |
    |
O---O=<=O
1   2   3
>>> print(CartanType(["C", Integer(4), Integer(1)]).dual().ascii_art())
O=<=O---O---O=>=O
0   1   2   3   4
>>> print(CartanType(["G", Integer(2), Integer(1)]).dual().ascii_art())
  3
O=>=O---O
1   2   0
>>> print(CartanType(["F", Integer(4), Integer(1)]).dual().ascii_art())
O---O---O=<=O---O
0   1   2   3   4
>>> print(CartanType(["BC", Integer(4), Integer(2)]).dual().ascii_art())
O=>=O---O---O=>=O
0   1   2   3   4
dual()[source]#

EXAMPLES:

sage: ct = CartanType(['F', 4, 1]).dual()
sage: ct.dual()
['F', 4, 1]
>>> from sage.all import *
>>> ct = CartanType(['F', Integer(4), Integer(1)]).dual()
>>> ct.dual()
['F', 4, 1]
dynkin_diagram()[source]#

EXAMPLES:

sage: ct = CartanType(['F', 4, 1]).dual()
sage: ct.dynkin_diagram()                                                   # needs sage.graphs
O---O---O=<=O---O
0   1   2   3   4
F4~*
>>> from sage.all import *
>>> ct = CartanType(['F', Integer(4), Integer(1)]).dual()
>>> ct.dynkin_diagram()                                                   # needs sage.graphs
O---O---O=<=O---O
0   1   2   3   4
F4~*
class sage.combinat.root_system.type_dual.CartanType_affine(type)[source]#

Bases: CartanType, CartanType_affine

basic_untwisted()[source]#

Return the basic untwisted Cartan type associated with this affine Cartan type.

Given an affine type \(X_n^{(r)}\), the basic untwisted type is \(X_n\). In other words, it is the classical Cartan type that is twisted to obtain self.

EXAMPLES:

sage: CartanType(['A', 7, 2]).basic_untwisted()
['A', 7]
sage: CartanType(['E', 6, 2]).basic_untwisted()
['E', 6]
sage: CartanType(['D', 4, 3]).basic_untwisted()
['D', 4]
>>> from sage.all import *
>>> CartanType(['A', Integer(7), Integer(2)]).basic_untwisted()
['A', 7]
>>> CartanType(['E', Integer(6), Integer(2)]).basic_untwisted()
['E', 6]
>>> CartanType(['D', Integer(4), Integer(3)]).basic_untwisted()
['D', 4]
classical()[source]#

Return the classical Cartan type associated with self (which should be affine).

EXAMPLES:

sage: CartanType(['A',3,1]).dual().classical()
['A', 3]
sage: CartanType(['B',3,1]).dual().classical()
['C', 3]
sage: CartanType(['F',4,1]).dual().classical()
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
sage: CartanType(['BC',4,2]).dual().classical()
['B', 4]
>>> from sage.all import *
>>> CartanType(['A',Integer(3),Integer(1)]).dual().classical()
['A', 3]
>>> CartanType(['B',Integer(3),Integer(1)]).dual().classical()
['C', 3]
>>> CartanType(['F',Integer(4),Integer(1)]).dual().classical()
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
>>> CartanType(['BC',Integer(4),Integer(2)]).dual().classical()
['B', 4]
special_node()[source]#

Implement CartanType_affine.special_node()

The special node of the dual of an affine type \(T\) is the special node of \(T\).

EXAMPLES:

sage: CartanType(['A',3,1]).dual().special_node()
0
sage: CartanType(['B',3,1]).dual().special_node()
0
sage: CartanType(['F',4,1]).dual().special_node()
0
sage: CartanType(['BC',4,2]).dual().special_node()
0
>>> from sage.all import *
>>> CartanType(['A',Integer(3),Integer(1)]).dual().special_node()
0
>>> CartanType(['B',Integer(3),Integer(1)]).dual().special_node()
0
>>> CartanType(['F',Integer(4),Integer(1)]).dual().special_node()
0
>>> CartanType(['BC',Integer(4),Integer(2)]).dual().special_node()
0
class sage.combinat.root_system.type_dual.CartanType_finite(type)[source]#

Bases: CartanType, CartanType_finite

AmbientSpace[source]#

alias of AmbientSpace