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}
- 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}