Root system data for relabelled Cartan types

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

Bases: AmbientSpace

Ambient space for a relabelled finite Cartan type.

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

EXAMPLES:

sage: cycle = {1:2, 2:3, 3:4, 4:1}
sage: L = CartanType(["F",4]).relabel(cycle).root_system().ambient_space(); L
Ambient space of the Root system of type ['F', 4] relabelled by {1: 2, 2: 3, 3: 4, 4: 1}
sage: TestSuite(L).run()                                                        # needs sage.graphs
>>> from sage.all import *
>>> cycle = {Integer(1):Integer(2), Integer(2):Integer(3), Integer(3):Integer(4), Integer(4):Integer(1)}
>>> L = CartanType(["F",Integer(4)]).relabel(cycle).root_system().ambient_space(); L
Ambient space of the Root system of type ['F', 4] relabelled by {1: 2, 2: 3, 3: 4, 4: 1}
>>> TestSuite(L).run()                                                        # needs sage.graphs
dimension()[source]

Return the dimension of this ambient space.

EXAMPLES:

sage: cycle = {1:2, 2:3, 3:4, 4:1}
sage: L = CartanType(["F",4]).relabel(cycle).root_system().ambient_space()
sage: L.dimension()
4
>>> from sage.all import *
>>> cycle = {Integer(1):Integer(2), Integer(2):Integer(3), Integer(3):Integer(4), Integer(4):Integer(1)}
>>> L = CartanType(["F",Integer(4)]).relabel(cycle).root_system().ambient_space()
>>> L.dimension()
4
fundamental_weight(i)[source]

Return the i-th fundamental weight.

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

EXAMPLES:

sage: cycle = {1:2, 2:3, 3:4, 4:1}
sage: L = CartanType(["F",4]).relabel(cycle).root_system().ambient_space()
sage: K = CartanType(["F",4]).root_system().ambient_space()
sage: K.fundamental_weights()
Finite family {1: (1, 1, 0, 0), 2: (2, 1, 1, 0), 3: (3/2, 1/2, 1/2, 1/2), 4: (1, 0, 0, 0)}
sage: L.fundamental_weight(1)
(1, 0, 0, 0)
sage: L.fundamental_weights()
Finite family {1: (1, 0, 0, 0), 2: (1, 1, 0, 0), 3: (2, 1, 1, 0), 4: (3/2, 1/2, 1/2, 1/2)}
>>> from sage.all import *
>>> cycle = {Integer(1):Integer(2), Integer(2):Integer(3), Integer(3):Integer(4), Integer(4):Integer(1)}
>>> L = CartanType(["F",Integer(4)]).relabel(cycle).root_system().ambient_space()
>>> K = CartanType(["F",Integer(4)]).root_system().ambient_space()
>>> K.fundamental_weights()
Finite family {1: (1, 1, 0, 0), 2: (2, 1, 1, 0), 3: (3/2, 1/2, 1/2, 1/2), 4: (1, 0, 0, 0)}
>>> L.fundamental_weight(Integer(1))
(1, 0, 0, 0)
>>> L.fundamental_weights()
Finite family {1: (1, 0, 0, 0), 2: (1, 1, 0, 0), 3: (2, 1, 1, 0), 4: (3/2, 1/2, 1/2, 1/2)}
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 original Cartan type.

EXAMPLES:

sage: cycle = {1:2, 2:3, 3:4, 4:1}
sage: L = CartanType(["F",4]).relabel(cycle).root_system().ambient_space()
sage: K = CartanType(["F",4]).root_system().ambient_space()
sage: K.simple_roots()
Finite family {1: (0, 1, -1, 0), 2: (0, 0, 1, -1), 3: (0, 0, 0, 1), 4: (1/2, -1/2, -1/2, -1/2)}
sage: K.simple_coroots()
Finite family {1: (0, 1, -1, 0), 2: (0, 0, 1, -1), 3: (0, 0, 0, 2), 4: (1, -1, -1, -1)}
sage: L.simple_root(1)
(1/2, -1/2, -1/2, -1/2)

sage: L.simple_roots()
Finite family {1: (1/2, -1/2, -1/2, -1/2), 2: (0, 1, -1, 0), 3: (0, 0, 1, -1), 4: (0, 0, 0, 1)}

sage: L.simple_coroots()
Finite family {1: (1, -1, -1, -1), 2: (0, 1, -1, 0), 3: (0, 0, 1, -1), 4: (0, 0, 0, 2)}
>>> from sage.all import *
>>> cycle = {Integer(1):Integer(2), Integer(2):Integer(3), Integer(3):Integer(4), Integer(4):Integer(1)}
>>> L = CartanType(["F",Integer(4)]).relabel(cycle).root_system().ambient_space()
>>> K = CartanType(["F",Integer(4)]).root_system().ambient_space()
>>> K.simple_roots()
Finite family {1: (0, 1, -1, 0), 2: (0, 0, 1, -1), 3: (0, 0, 0, 1), 4: (1/2, -1/2, -1/2, -1/2)}
>>> K.simple_coroots()
Finite family {1: (0, 1, -1, 0), 2: (0, 0, 1, -1), 3: (0, 0, 0, 2), 4: (1, -1, -1, -1)}
>>> L.simple_root(Integer(1))
(1/2, -1/2, -1/2, -1/2)

>>> L.simple_roots()
Finite family {1: (1/2, -1/2, -1/2, -1/2), 2: (0, 1, -1, 0), 3: (0, 0, 1, -1), 4: (0, 0, 0, 1)}

>>> L.simple_coroots()
Finite family {1: (1, -1, -1, -1), 2: (0, 1, -1, 0), 3: (0, 0, 1, -1), 4: (0, 0, 0, 2)}
class sage.combinat.root_system.type_relabel.CartanType(type, relabelling)[source]

Bases: CartanType_decorator

A class for relabelled Cartan types.

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

Return an ascii art representation of this Cartan type.

EXAMPLES:

sage: print(CartanType(["G", 2]).relabel({1:2,2:1}).ascii_art())
  3
O=<=O
2   1
sage: print(CartanType(["B", 3, 1]).relabel([1,3,2,0]).ascii_art())
    O 1
    |
    |
O---O=>=O
3   2   0
sage: print(CartanType(["F", 4, 1]).relabel(lambda n: 4-n).ascii_art())
O---O---O=>=O---O
4   3   2   1   0
>>> from sage.all import *
>>> print(CartanType(["G", Integer(2)]).relabel({Integer(1):Integer(2),Integer(2):Integer(1)}).ascii_art())
  3
O=<=O
2   1
>>> print(CartanType(["B", Integer(3), Integer(1)]).relabel([Integer(1),Integer(3),Integer(2),Integer(0)]).ascii_art())
    O 1
    |
    |
O---O=>=O
3   2   0
>>> print(CartanType(["F", Integer(4), Integer(1)]).relabel(lambda n: Integer(4)-n).ascii_art())
O---O---O=>=O---O
4   3   2   1   0
coxeter_diagram()[source]

Return the Coxeter diagram for self.

EXAMPLES:

sage: ct = CartanType(['H', 3]).relabel({1:3,2:2,3:1})
sage: G = ct.coxeter_diagram(); G                                           # needs sage.graphs
Graph on 3 vertices
sage: G.edges(sort=True)                                                    # needs sage.graphs
[(1, 2, 5), (2, 3, 3)]
>>> from sage.all import *
>>> ct = CartanType(['H', Integer(3)]).relabel({Integer(1):Integer(3),Integer(2):Integer(2),Integer(3):Integer(1)})
>>> G = ct.coxeter_diagram(); G                                           # needs sage.graphs
Graph on 3 vertices
>>> G.edges(sort=True)                                                    # needs sage.graphs
[(1, 2, 5), (2, 3, 3)]
dual()[source]

Implement sage.combinat.root_system.cartan_type.CartanType_abstract.dual(), using that taking the dual and relabelling are commuting operations.

EXAMPLES:

sage: T = CartanType(["BC",3, 2])
sage: cycle = {1:2, 2:3, 3:0, 0:1}
sage: T.relabel(cycle).dual().dynkin_diagram()                              # needs sage.graphs
O=>=O---O=>=O
1   2   3   0
BC3~* relabelled by {0: 1, 1: 2, 2: 3, 3: 0}
sage: T.dual().relabel(cycle).dynkin_diagram()                              # needs sage.graphs
O=>=O---O=>=O
1   2   3   0
BC3~* relabelled by {0: 1, 1: 2, 2: 3, 3: 0}
>>> from sage.all import *
>>> T = CartanType(["BC",Integer(3), Integer(2)])
>>> cycle = {Integer(1):Integer(2), Integer(2):Integer(3), Integer(3):Integer(0), Integer(0):Integer(1)}
>>> T.relabel(cycle).dual().dynkin_diagram()                              # needs sage.graphs
O=>=O---O=>=O
1   2   3   0
BC3~* relabelled by {0: 1, 1: 2, 2: 3, 3: 0}
>>> T.dual().relabel(cycle).dynkin_diagram()                              # needs sage.graphs
O=>=O---O=>=O
1   2   3   0
BC3~* relabelled by {0: 1, 1: 2, 2: 3, 3: 0}
dynkin_diagram()[source]

Return the Dynkin diagram for this Cartan type.

EXAMPLES:

sage: CartanType(["G", 2]).relabel({1:2,2:1}).dynkin_diagram()              # needs sage.graphs
  3
O=<=O
2   1
G2 relabelled by {1: 2, 2: 1}
>>> from sage.all import *
>>> CartanType(["G", Integer(2)]).relabel({Integer(1):Integer(2),Integer(2):Integer(1)}).dynkin_diagram()              # needs sage.graphs
  3
O=<=O
2   1
G2 relabelled by {1: 2, 2: 1}
index_set()[source]

EXAMPLES:

sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
sage: ct.index_set()
(1, 2)
>>> from sage.all import *
>>> ct = CartanType(['G', Integer(2)]).relabel({Integer(1):Integer(2),Integer(2):Integer(1)})
>>> ct.index_set()
(1, 2)
type()[source]

Return the type of self or None if unknown.

EXAMPLES:

sage: ct = CartanType(['G', 2]).relabel({1:2,2:1})
sage: ct.type()
'G'
>>> from sage.all import *
>>> ct = CartanType(['G', Integer(2)]).relabel({Integer(1):Integer(2),Integer(2):Integer(1)})
>>> ct.type()
'G'
class sage.combinat.root_system.type_relabel.CartanType_affine(type, relabelling)[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: ct = CartanType(['A', 5, 2]).relabel({0:1, 1:0, 2:2, 3:3})
sage: ct.basic_untwisted()
['A', 5]
>>> from sage.all import *
>>> ct = CartanType(['A', Integer(5), Integer(2)]).relabel({Integer(0):Integer(1), Integer(1):Integer(0), Integer(2):Integer(2), Integer(3):Integer(3)})
>>> ct.basic_untwisted()
['A', 5]
classical()[source]

Return the classical Cartan type associated with self.

EXAMPLES:

sage: A41 = CartanType(['A',4,1])
sage: A41.dynkin_diagram()                                                  # needs sage.graphs
0
O-----------+
|           |
|           |
O---O---O---O
1   2   3   4
A4~

sage: T = A41.relabel({0:1, 1:2, 2:3, 3:4, 4:0})
sage: T
['A', 4, 1] relabelled by {0: 1, 1: 2, 2: 3, 3: 4, 4: 0}
sage: T.dynkin_diagram()                                                    # needs sage.graphs
1
O-----------+
|           |
|           |
O---O---O---O
2   3   4   0
A4~ relabelled by {0: 1, 1: 2, 2: 3, 3: 4, 4: 0}

sage: T0 = T.classical()
sage: T0
['A', 4] relabelled by {1: 2, 2: 3, 3: 4, 4: 0}
sage: T0.dynkin_diagram()                                                   # needs sage.graphs
O---O---O---O
2   3   4   0
A4 relabelled by {1: 2, 2: 3, 3: 4, 4: 0}
>>> from sage.all import *
>>> A41 = CartanType(['A',Integer(4),Integer(1)])
>>> A41.dynkin_diagram()                                                  # needs sage.graphs
0
O-----------+
|           |
|           |
O---O---O---O
1   2   3   4
A4~

>>> T = A41.relabel({Integer(0):Integer(1), Integer(1):Integer(2), Integer(2):Integer(3), Integer(3):Integer(4), Integer(4):Integer(0)})
>>> T
['A', 4, 1] relabelled by {0: 1, 1: 2, 2: 3, 3: 4, 4: 0}
>>> T.dynkin_diagram()                                                    # needs sage.graphs
1
O-----------+
|           |
|           |
O---O---O---O
2   3   4   0
A4~ relabelled by {0: 1, 1: 2, 2: 3, 3: 4, 4: 0}

>>> T0 = T.classical()
>>> T0
['A', 4] relabelled by {1: 2, 2: 3, 3: 4, 4: 0}
>>> T0.dynkin_diagram()                                                   # needs sage.graphs
O---O---O---O
2   3   4   0
A4 relabelled by {1: 2, 2: 3, 3: 4, 4: 0}
is_untwisted_affine()[source]

Implement CartanType_affine.is_untwisted_affine().

A relabelled Cartan type is untwisted affine if the original is.

EXAMPLES:

sage: CartanType(['B', 3, 1]).relabel({1:2, 2:3, 3:0, 0:1}).is_untwisted_affine()
True
>>> from sage.all import *
>>> CartanType(['B', Integer(3), Integer(1)]).relabel({Integer(1):Integer(2), Integer(2):Integer(3), Integer(3):Integer(0), Integer(0):Integer(1)}).is_untwisted_affine()
True
special_node()[source]

Return a special node of the Dynkin diagram.

See also

special_node()

It is obtained by relabelling of the special node of the non relabelled Dynkin diagram.

EXAMPLES:

sage: CartanType(['B', 3, 1]).special_node()
0
sage: CartanType(['B', 3, 1]).relabel({1:2, 2:3, 3:0, 0:1}).special_node()
1
>>> from sage.all import *
>>> CartanType(['B', Integer(3), Integer(1)]).special_node()
0
>>> CartanType(['B', Integer(3), Integer(1)]).relabel({Integer(1):Integer(2), Integer(2):Integer(3), Integer(3):Integer(0), Integer(0):Integer(1)}).special_node()
1
class sage.combinat.root_system.type_relabel.CartanType_finite(type, relabelling)[source]

Bases: CartanType, CartanType_finite

AmbientSpace[source]

alias of AmbientSpace

affine()[source]

Return the affine Cartan type associated with self.

EXAMPLES:

sage: B4 = CartanType(['B',4])
sage: B4.dynkin_diagram()                                                   # needs sage.graphs
O---O---O=>=O
1   2   3   4
B4
sage: B4.affine().dynkin_diagram()                                          # needs sage.graphs
    O 0
    |
    |
O---O---O=>=O
1   2   3   4
B4~
>>> from sage.all import *
>>> B4 = CartanType(['B',Integer(4)])
>>> B4.dynkin_diagram()                                                   # needs sage.graphs
O---O---O=>=O
1   2   3   4
B4
>>> B4.affine().dynkin_diagram()                                          # needs sage.graphs
    O 0
    |
    |
O---O---O=>=O
1   2   3   4
B4~

If possible, this reuses the original label for the special node:

sage: T = B4.relabel({1:2, 2:3, 3:4, 4:1}); T.dynkin_diagram()              # needs sage.graphs
O---O---O=>=O
2   3   4   1
B4 relabelled by {1: 2, 2: 3, 3: 4, 4: 1}
sage: T.affine().dynkin_diagram()                                           # needs sage.graphs
    O 0
    |
    |
O---O---O=>=O
2   3   4   1
B4~ relabelled by {0: 0, 1: 2, 2: 3, 3: 4, 4: 1}
>>> from sage.all import *
>>> T = B4.relabel({Integer(1):Integer(2), Integer(2):Integer(3), Integer(3):Integer(4), Integer(4):Integer(1)}); T.dynkin_diagram()              # needs sage.graphs
O---O---O=>=O
2   3   4   1
B4 relabelled by {1: 2, 2: 3, 3: 4, 4: 1}
>>> T.affine().dynkin_diagram()                                           # needs sage.graphs
    O 0
    |
    |
O---O---O=>=O
2   3   4   1
B4~ relabelled by {0: 0, 1: 2, 2: 3, 3: 4, 4: 1}

Otherwise, it chooses a label for the special_node in \(0,1,...\):

sage: T = B4.relabel({1:0, 2:1, 3:2, 4:3}); T.dynkin_diagram()              # needs sage.graphs
O---O---O=>=O
0   1   2   3
B4 relabelled by {1: 0, 2: 1, 3: 2, 4: 3}
sage: T.affine().dynkin_diagram()                                           # needs sage.graphs
    O 4
    |
    |
O---O---O=>=O
0   1   2   3
B4~ relabelled by {0: 4, 1: 0, 2: 1, 3: 2, 4: 3}
>>> from sage.all import *
>>> T = B4.relabel({Integer(1):Integer(0), Integer(2):Integer(1), Integer(3):Integer(2), Integer(4):Integer(3)}); T.dynkin_diagram()              # needs sage.graphs
O---O---O=>=O
0   1   2   3
B4 relabelled by {1: 0, 2: 1, 3: 2, 4: 3}
>>> T.affine().dynkin_diagram()                                           # needs sage.graphs
    O 4
    |
    |
O---O---O=>=O
0   1   2   3
B4~ relabelled by {0: 4, 1: 0, 2: 1, 3: 2, 4: 3}

This failed before Issue #13724:

sage: ct = CartanType(["G",2]).dual(); ct
['G', 2] relabelled by {1: 2, 2: 1}
sage: ct.affine()
['G', 2, 1] relabelled by {0: 0, 1: 2, 2: 1}

sage: ct = CartanType(["F",4]).dual(); ct
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
sage: ct.affine()
['F', 4, 1] relabelled by {0: 0, 1: 4, 2: 3, 3: 2, 4: 1}
>>> from sage.all import *
>>> ct = CartanType(["G",Integer(2)]).dual(); ct
['G', 2] relabelled by {1: 2, 2: 1}
>>> ct.affine()
['G', 2, 1] relabelled by {0: 0, 1: 2, 2: 1}

>>> ct = CartanType(["F",Integer(4)]).dual(); ct
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
>>> ct.affine()
['F', 4, 1] relabelled by {0: 0, 1: 4, 2: 3, 3: 2, 4: 1}

Check that we don’t inadvertently change the internal relabelling of ct:

sage: ct
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}
>>> from sage.all import *
>>> ct
['F', 4] relabelled by {1: 4, 2: 3, 3: 2, 4: 1}