Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
""" Root system data for reducible Cartan types """ #***************************************************************************** # Copyright (C) 2008-2009 Daniel Bump # Copyright (C) 2008-2009 Justin Walker # Copyright (C) 2008-2009 Nicolas M. Thiery <nthiery at users.sf.net>, # # Distributed under the terms of the GNU General Public License (GPL) # http://www.gnu.org/licenses/ #*****************************************************************************
r""" A class for reducible Cartan types.
Reducible root systems are ones that can be factored as direct products. Strictly speaking type `D_2` (corresponding to orthogonal groups of degree 4) is reducible since it is isomorphic to `A_1\times A_1`. However type `D_2` is not built using this class for our purposes.
INPUT:
- ``types`` - a list of simple Cartan types
EXAMPLES::
sage: [t1,t2]=[CartanType(x) for x in ['A',1],['B',2]] sage: CartanType([t1,t2]) A1xB2 sage: t = CartanType("A2xB2")
A reducible Cartan type is finite (resp. crystallographic, simply laced) if all its components are::
sage: t.is_finite() True sage: t.is_crystallographic() True sage: t.is_simply_laced() False
This is implemented by inserting the appropriate abstract super classes (see :meth:`~sage.combinat.root_system.cartan_type.CartanType_abstract._add_abstract_superclass`)::
sage: t.__class__.mro() [<class 'sage.combinat.root_system.type_reducible.CartanType_with_superclass'>, <class 'sage.combinat.root_system.type_reducible.CartanType'>, <... 'sage.structure.sage_object.SageObject'>, <class 'sage.combinat.root_system.cartan_type.CartanType_finite'>, <class 'sage.combinat.root_system.cartan_type.CartanType_crystallographic'>, <class 'sage.combinat.root_system.cartan_type.CartanType_abstract'>, <... 'object'>]
The index set of the reducible Cartan type is obtained by relabelling successively the nodes of the Dynkin diagrams of the components by 1,2,...::
sage: t = CartanType(["A",4], ["BC",5,2], ["C",3]) sage: t.index_set() (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13)
sage: t.dynkin_diagram() O---O---O---O 1 2 3 4 O=<=O---O---O---O=<=O 5 6 7 8 9 10 O---O=<=O 11 12 13 A4xBC5~xC3 """ """ Initialize ``self``.
TESTS:
Internally, this relabelling is stored as a dictionary::
sage: t = CartanType(["A",4], ["BC",5,2], ["C",3]) sage: sorted(t._index_relabelling.items()) [((0, 1), 1), ((0, 2), 2), ((0, 3), 3), ((0, 4), 4), ((1, 0), 5), ((1, 1), 6), ((1, 2), 7), ((1, 3), 8), ((1, 4), 9), ((1, 5), 10), ((2, 1), 11), ((2, 2), 12), ((2, 3), 13)]
Similarly, the attribute `_shifts` specifies by how much the indices of the bases of the ambient spaces of the components are shifted in the ambient space of this Cartan type::
sage: t = CartanType("A2xB2") sage: t._shifts [0, 3, 5] sage: A = t.root_system().ambient_space(); A Ambient space of the Root system of type A2xB2 sage: A.ambient_spaces() [Ambient space of the Root system of type ['A', 2], Ambient space of the Root system of type ['B', 2]] sage: x = A.ambient_spaces()[0]([2,1,0]); x (2, 1, 0) sage: A.inject_weights(0,x) (2, 1, 0, 0, 0) sage: x = A.ambient_spaces()[1]([1,0]); x (1, 0) sage: A.inject_weights(1,x) (0, 0, 0, 1, 0)
More tests::
sage: TestSuite(t).run() """ for i in range(len(types)) for j in types[i].index_set() )
for k in range(len(types)+1)]
# a direct product of finite Cartan types is again finite; # idem for simply laced and crystallographic. for cls in (CartanType_finite, CartanType_simply_laced, CartanType_crystallographic) if all(isinstance(t, cls) for t in types) )
""" EXAMPLES::
sage: CartanType("A2","B2") # indirect doctest A2xB2
sage: CartanType("A2",CartanType("F4~").dual()) A2xF4~* """
r""" Return a latex representation of ``self``.
EXAMPLES::
sage: latex(CartanType("A4","B2","D8")) A_{4} \times B_{2} \times D_{8} """
r""" EXAMPLES::
sage: hash(CartanType(['A',1],['B',2])) 1110723648 # 32-bit -6896789355307447232 # 64-bit """
""" Rich comparison.
EXAMPLES::
sage: ct1 = CartanType(['A',1],['B',2]) sage: ct2 = CartanType(['B',2],['A',1]) sage: ct3 = CartanType(['A',4]) sage: ct1 == ct1 True sage: ct1 == ct2 False sage: ct1 == ct3 False
TESTS:
Check that :trac:`20418` is fixed::
sage: ct = CartanType(["A2", "B2"]) sage: ct == (1, 2, 1) False """
""" A list of Cartan types making up the reducible type.
EXAMPLES::
sage: CartanType(['A',2],['B',2]).component_types() [['A', 2], ['B', 2]] """
""" Returns "reducible" since the type is reducible.
EXAMPLES::
sage: CartanType(['A',2],['B',2]).type() 'reducible' """
""" Returns the rank of self.
EXAMPLES::
sage: CartanType("A2","A1").rank() 3 """
def index_set(self): """ Implements :meth:`CartanType_abstract.index_set`.
For the moment, the index set is always of the form `\{1, \ldots, n\}`.
EXAMPLES::
sage: CartanType("A2","A1").index_set() (1, 2, 3) """
""" Return the Cartan matrix associated with ``self``. By default the Cartan matrix is a subdivided block matrix showing the reducibility but the subdivision can be suppressed with the option ``subdivide = False``.
EXAMPLES::
sage: ct = CartanType("A2","B2") sage: ct.cartan_matrix() [ 2 -1| 0 0] [-1 2| 0 0] [-----+-----] [ 0 0| 2 -1] [ 0 0|-2 2] sage: ct.cartan_matrix(subdivide=False) [ 2 -1 0 0] [-1 2 0 0] [ 0 0 2 -1] [ 0 0 -2 2] """ cartan_type=self)
""" Returns a Dynkin diagram for type reducible.
EXAMPLES::
sage: dd = CartanType("A2xB2xF4").dynkin_diagram() sage: dd O---O 1 2 O=>=O 3 4 O---O=>=O---O 5 6 7 8 A2xB2xF4 sage: dd.edges() [(1, 2, 1), (2, 1, 1), (3, 4, 2), (4, 3, 1), (5, 6, 1), (6, 5, 1), (6, 7, 2), (7, 6, 1), (7, 8, 1), (8, 7, 1)]
sage: CartanType("F4xA2").dynkin_diagram() O---O=>=O---O 1 2 3 4 O---O 5 6 F4xA2
"""
r""" Return a latex representation of the Dynkin diagram.
.. NOTE::
The arguments ``label`` and ``dual`` is ignored.
EXAMPLES::
sage: print(CartanType("A2","B2")._latex_dynkin_diagram()) { \draw (0 cm,0) -- (2 cm,0); \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$1$}; \draw[fill=white] (2 cm, 0 cm) circle (.25cm) node[below=4pt]{$2$}; \pgftransformyshift{-3 cm} \draw (0 cm,0) -- (0 cm,0); \draw (0 cm, 0.1 cm) -- +(2 cm,0); \draw (0 cm, -0.1 cm) -- +(2 cm,0); \draw[shift={(1.2, 0)}, rotate=0] (135 : 0.45cm) -- (0,0) -- (-135 : 0.45cm); \draw[fill=white] (0 cm, 0 cm) circle (.25cm) node[below=4pt]{$3$}; \draw[fill=white] (2 cm, 0 cm) circle (.25cm) node[below=4pt]{$4$}; } """ lambda x: label(relabelling[i,x]), node, node_dist=node_dist) for i in range(len(types)))
""" Return an ascii art representation of this reducible Cartan type.
EXAMPLES::
sage: print(CartanType("F4xA2").ascii_art(label = lambda x: x+2)) O---O=>=O---O 3 4 5 6 O---O 7 8
sage: print(CartanType(["BC",5,2], ["A",4]).ascii_art()) O=<=O---O---O---O=<=O 1 2 3 4 5 6 O---O---O---O 7 8 9 10
sage: print(CartanType(["A",4], ["BC",5,2], ["C",3]).ascii_art()) O---O---O---O 1 2 3 4 O=<=O---O---O---O=<=O 5 6 7 8 9 10 O---O=<=O 11 12 13 """ for i in range(len(types)))
def is_finite(self): """ EXAMPLES::
sage: ct1 = CartanType(['A',2],['B',2]) sage: ct1.is_finite() True sage: ct2 = CartanType(['A',2],['B',2,1]) sage: ct2.is_finite() False
TESTS::
sage: isinstance(ct1, sage.combinat.root_system.cartan_type.CartanType_finite) True sage: isinstance(ct2, sage.combinat.root_system.cartan_type.CartanType_finite) False """
""" Report that this Cartan type is not irreducible.
EXAMPLES::
sage: ct = CartanType(['A',2],['B',2]) sage: ct.is_irreducible() False """
""" EXAMPLES::
sage: CartanType("A2xB2").dual() A2xC2 """
""" Report that this reducible Cartan type is not affine
EXAMPLES::
sage: CartanType(['A',2],['B',2]).is_affine() False """
def coxeter_diagram(self): """ Return the Coxeter diagram for ``self``.
EXAMPLES::
sage: cd = CartanType("A2xB2xF4").coxeter_diagram() sage: cd Graph on 8 vertices sage: cd.edges() [(1, 2, 3), (3, 4, 4), (5, 6, 3), (6, 7, 4), (7, 8, 3)]
sage: CartanType("F4xA2").coxeter_diagram().edges() [(1, 2, 3), (2, 3, 4), (3, 4, 3), (5, 6, 3)]
sage: cd = CartanType("A1xH3").coxeter_diagram(); cd Graph on 4 vertices sage: cd.edges() [(2, 3, 3), (3, 4, 5)] """
""" EXAMPLES::
sage: RootSystem("A2xB2").ambient_space() Ambient space of the Root system of type A2xB2
""" """ EXAMPLES::
sage: RootSystem("A2xB2").ambient_space().cartan_type() A2xB2 """
""" EXAMPLES::
sage: RootSystem("A2xB2").ambient_space().component_types() [['A', 2], ['B', 2]] """
""" EXAMPLES::
sage: RootSystem("A2xB2").ambient_space().dimension() 5 """
""" Returns a list of the irreducible Cartan types of which the given reducible Cartan type is a product.
EXAMPLES::
sage: RootSystem("A2xB2").ambient_space().ambient_spaces() [Ambient space of the Root system of type ['A', 2], Ambient space of the Root system of type ['B', 2]] """
""" Produces the corresponding element of the lattice.
INPUT:
- ``i`` - an integer in range(self.components)
- ``v`` - a vector in the i-th component weight lattice
EXAMPLES::
sage: V = RootSystem("A2xB2").ambient_space() sage: [V.inject_weights(i,V.ambient_spaces()[i].fundamental_weights()[1]) for i in range(2)] [(1, 0, 0, 0, 0), (0, 0, 0, 1, 0)] sage: [V.inject_weights(i,V.ambient_spaces()[i].fundamental_weights()[2]) for i in range(2)] [(1, 1, 0, 0, 0), (0, 0, 0, 1/2, 1/2)] """
def simple_root(self, i): """ EXAMPLES::
sage: A = RootSystem("A1xB2").ambient_space() sage: A.simple_root(2) (0, 0, 1, -1) sage: A.simple_roots() Finite family {1: (1, -1, 0, 0), 2: (0, 0, 1, -1), 3: (0, 0, 0, 1)} """ raise ValueError("{} is not in the index set".format(i))
def simple_coroot(self, i): """ EXAMPLES::
sage: A = RootSystem("A1xB2").ambient_space() sage: A.simple_coroot(2) (0, 0, 1, -1) sage: A.simple_coroots() Finite family {1: (1, -1, 0, 0), 2: (0, 0, 1, -1), 3: (0, 0, 0, 2)} """ raise ValueError("{} is not in the index set".format(i))
""" EXAMPLES::
sage: RootSystem("A1xA2").ambient_space().positive_roots() [(1, -1, 0, 0, 0), (0, 0, 1, -1, 0), (0, 0, 1, 0, -1), (0, 0, 0, 1, -1)] """
""" EXAMPLES::
sage: RootSystem("A1xA2").ambient_space().negative_roots() [(-1, 1, 0, 0, 0), (0, 0, -1, 1, 0), (0, 0, -1, 0, 1), (0, 0, 0, -1, 1)] """
""" EXAMPLES::
sage: RootSystem("A2xB2").ambient_space().fundamental_weights() Finite family {1: (1, 0, 0, 0, 0), 2: (1, 1, 0, 0, 0), 3: (0, 0, 0, 1, 0), 4: (0, 0, 0, 1/2, 1/2)} """
|