def __classcall_private__(cls, arg0, cartan_type=None, kac_moody=True): """ Parse input to ensure a unique representation. INPUT: - ``arg0`` -- a simple Lie algebra or a base ring - ``cartan_type`` -- a Cartan type EXAMPLES:: sage: L1 = lie_algebras.Affine(QQ, ['A',4,1]) sage: cl = lie_algebras.sl(QQ, 5) sage: L2 = lie_algebras.Affine(cl) sage: L1 is L2 True sage: cl.affine() is L1 True """ if isinstance(arg0, LieAlgebra): ct = arg0.cartan_type() if not ct.is_finite(): raise ValueError("the base Lie algebra is not simple") cartan_type = ct.affine() g = arg0 else: # arg0 is the base ring cartan_type = CartanType(cartan_type) if not cartan_type.is_affine(): raise ValueError("the Cartan type must be affine") g = LieAlgebra(arg0, cartan_type=cartan_type.classical()) if not cartan_type.is_untwisted_affine(): raise NotImplementedError("only currently implemented for untwisted affine types") return super(AffineLieAlgebra, cls).__classcall__(cls, g, kac_moody)
def __classcall_private__(cls, cartan_type, r, s): """ Normalize the input arguments to ensure unique representation. EXAMPLES:: sage: KRT1 = KirillovReshetikhinTableaux(CartanType(['A',3,1]), 2, 3) sage: KRT2 = KirillovReshetikhinTableaux(['A',3,1], 2, 3) sage: KRT1 is KRT2 True """ ct = CartanType(cartan_type) assert ct.is_affine() if ct.is_untwisted_affine(): if ct.letter == 'D': if r == ct.n or r == ct.n - 1: return KRTableauxSpin(ct, r, s) return KRTableauxTypeVertical(ct, r, s) if ct.letter == 'B': if r == ct.n: return KRTableauxBn(ct, r, s) return KRTypeVertical(ct, r, s) if ct.letter == 'A' or (ct.letter == 'C' and r == ct.n): return KRTableauxRectangle(ct, r, s) else: if ct.dual().letter == 'B': return KRTableauxTypeVertical(ct, r, s) raise NotImplementedError
def __classcall__(cls, base_ring, cartan_type, level=None, twisted=False): """ Normalize arguments to ensure a unique representation. EXAMPLES:: sage: Q1 = QSystem(QQ, ['A',4]) sage: Q2 = QSystem(QQ, 'A4') sage: Q1 is Q2 True Twisted Q-systems are different from untwisted Q-systems:: sage: Q1 = QSystem(QQ, ['E',6,2], twisted=True) sage: Q2 = QSystem(QQ, ['E',6,2]) sage: Q1 is Q2 False """ cartan_type = CartanType(cartan_type) if not is_tamely_laced(cartan_type): raise ValueError("the Cartan type is not tamely-laced") if twisted and not cartan_type.is_affine( ) and not cartan_type.is_untwisted_affine(): raise ValueError("the Cartan type must be of twisted type") return super(QSystem, cls).__classcall__(cls, base_ring, cartan_type, level, twisted)
def __classcall_private__(cls, cartan_type, r, s): """ Normalize the input arguments to ensure unique representation. EXAMPLES:: sage: KRT1 = KirillovReshetikhinTableaux(CartanType(['A',3,1]), 2, 3) sage: KRT2 = KirillovReshetikhinTableaux(['A',3,1], 2, 3) sage: KRT1 is KRT2 True """ ct = CartanType(cartan_type) assert ct.is_affine() if ct.is_untwisted_affine(): if ct.letter == 'D': if r == ct.n or r == ct.n - 1: return KRTableauxSpin(ct, r, s) return KRTableauxTypeVertical(ct, r, s) if ct.letter == 'B': if r == ct.n: return KRTableauxBn(ct, r, s) return KRTypeVertical(ct, r, s) if ct.letter == 'A' or (ct.letter == 'C' and r == ct.n): return KRTableauxRectangle(ct, r, s) else: if ct.dual().letter == 'B': return KRTableauxTypeVertical(ct, r, s) raise NotImplementedError
def __classcall_private__(cls, arg0, cartan_type=None, kac_moody=True): """ Parse input to ensure a unique representation. INPUT: - ``arg0`` -- a simple Lie algebra or a base ring - ``cartan_type`` -- a Cartan type EXAMPLES:: sage: L1 = lie_algebras.Affine(QQ, ['A',4,1]) sage: cl = lie_algebras.sl(QQ, 5) sage: L2 = lie_algebras.Affine(cl) sage: L1 is L2 True sage: cl.affine() is L1 True """ if isinstance(arg0, LieAlgebra): ct = arg0.cartan_type() if not ct.is_finite(): raise ValueError("the base Lie algebra is not simple") cartan_type = ct.affine() g = arg0 else: # arg0 is the base ring cartan_type = CartanType(cartan_type) if not cartan_type.is_affine(): raise ValueError("the Cartan type must be affine") g = LieAlgebra(arg0, cartan_type=cartan_type.classical()) if not cartan_type.is_untwisted_affine(): raise NotImplementedError("only currently implemented for untwisted affine types") return super(AffineLieAlgebra, cls).__classcall__(cls, g, kac_moody)
def __classcall__(cls, base_ring, cartan_type, level=None, twisted=False): """ Normalize arguments to ensure a unique representation. EXAMPLES:: sage: Q1 = QSystem(QQ, ['A',4]) sage: Q2 = QSystem(QQ, 'A4') sage: Q1 is Q2 True Twisted Q-systems are different from untwisted Q-systems:: sage: Q1 = QSystem(QQ, ['E',6,2], twisted=True) sage: Q2 = QSystem(QQ, ['E',6,2]) sage: Q1 is Q2 False """ cartan_type = CartanType(cartan_type) if not is_tamely_laced(cartan_type): raise ValueError("the Cartan type is not tamely-laced") if twisted and not cartan_type.is_affine() and not cartan_type.is_untwisted_affine(): raise ValueError("the Cartan type must be of twisted type") return super(QSystem, cls).__classcall__(cls, base_ring, cartan_type, level, twisted)
def FundamentalGroupOfExtendedAffineWeylGroup(cartan_type, prefix='pi', general_linear=None): r""" Factory for the fundamental group of an extended affine Weyl group. INPUT: - ``cartan_type`` -- a Cartan type that is either affine or finite, with the latter being a shorthand for the untwisted affinization - ``prefix`` (default: 'pi') -- string that labels the elements of the group - ``general_linear`` -- (default: None, meaning False) In untwisted type A, if True, use the universal central extension .. RUBRIC:: Fundamental group Associated to each affine Cartan type `\tilde{X}` is an extended affine Weyl group `E`. Its subgroup of length-zero elements is called the fundamental group `F`. The group `F` can be identified with a subgroup of the group of automorphisms of the affine Dynkin diagram. As such, every element of `F` can be viewed as a permutation of the set `I` of affine Dynkin nodes. Let `0 \in I` be the distinguished affine node; it is the one whose removal produces the associated finite Cartan type (call it `X`). A node `i \in I` is called *special* if some automorphism of the affine Dynkin diagram, sends `0` to `i`. The node `0` is always special due to the identity automorphism. There is a bijection of the set of special nodes with the fundamental group. We denote the image of `i` by `\pi_i`. The structure of `F` is determined as follows. - `\tilde{X}` is untwisted -- `F` is isomorphic to `P^\vee/Q^\vee` where `P^\vee` and `Q^\vee` are the coweight and coroot lattices of type `X`. The group `P^\vee/Q^\vee` consists of the cosets `\omega_i^\vee + Q^\vee` for special nodes `i`, where `\omega_0^\vee = 0` by convention. In this case the special nodes `i` are the *cominuscule* nodes, the ones such that `\omega_i^\vee(\alpha_j)` is `0` or `1` for all `j\in I_0 = I \setminus \{0\}`. For `i` special, addition by `\omega_i^\vee+Q^\vee` permutes `P^\vee/Q^\vee` and therefore permutes the set of special nodes. This permutation extends uniquely to an automorphism of the affine Dynkin diagram. - `\tilde{X}` is dual untwisted -- (that is, the dual of `\tilde{X}` is untwisted) `F` is isomorphic to `P/Q` where `P` and `Q` are the weight and root lattices of type `X`. The group `P/Q` consists of the cosets `\omega_i + Q` for special nodes `i`, where `\omega_0 = 0` by convention. In this case the special nodes `i` are the *minuscule* nodes, the ones such that `\alpha_j^\vee(\omega_i)` is `0` or `1` for all `j \in I_0`. For `i` special, addition by `\omega_i+Q` permutes `P/Q` and therefore permutes the set of special nodes. This permutation extends uniquely to an automorphism of the affine Dynkin diagram. - `\tilde{X}` is mixed -- (that is, not of the above two types) `F` is the trivial group. EXAMPLES:: sage: from sage.combinat.root_system.fundamental_group import FundamentalGroupOfExtendedAffineWeylGroup sage: F = FundamentalGroupOfExtendedAffineWeylGroup(['A',3,1]); F Fundamental group of type ['A', 3, 1] sage: F.cartan_type().dynkin_diagram() 0 O-------+ | | | | O---O---O 1 2 3 A3~ sage: F.special_nodes() (0, 1, 2, 3) sage: F(1)^2 pi[2] sage: F(1)*F(2) pi[3] sage: F(3)^(-1) pi[1] sage: F = FundamentalGroupOfExtendedAffineWeylGroup("B3"); F Fundamental group of type ['B', 3, 1] sage: F.cartan_type().dynkin_diagram() O 0 | | O---O=>=O 1 2 3 B3~ sage: F.special_nodes() (0, 1) sage: F = FundamentalGroupOfExtendedAffineWeylGroup("C2"); F Fundamental group of type ['C', 2, 1] sage: F.cartan_type().dynkin_diagram() O=>=O=<=O 0 1 2 C2~ sage: F.special_nodes() (0, 2) sage: F = FundamentalGroupOfExtendedAffineWeylGroup("D4"); F Fundamental group of type ['D', 4, 1] sage: F.cartan_type().dynkin_diagram() O 4 | | O---O---O 1 |2 3 | O 0 D4~ sage: F.special_nodes() (0, 1, 3, 4) sage: (F(4), F(4)^2) (pi[4], pi[0]) sage: F = FundamentalGroupOfExtendedAffineWeylGroup("D5"); F Fundamental group of type ['D', 5, 1] sage: F.cartan_type().dynkin_diagram() 0 O O 5 | | | | O---O---O---O 1 2 3 4 D5~ sage: F.special_nodes() (0, 1, 4, 5) sage: (F(5), F(5)^2, F(5)^3, F(5)^4) (pi[5], pi[1], pi[4], pi[0]) sage: F = FundamentalGroupOfExtendedAffineWeylGroup("E6"); F Fundamental group of type ['E', 6, 1] sage: F.cartan_type().dynkin_diagram() O 0 | | O 2 | | O---O---O---O---O 1 3 4 5 6 E6~ sage: F.special_nodes() (0, 1, 6) sage: F(1)^2 pi[6] sage: F = FundamentalGroupOfExtendedAffineWeylGroup(['D',4,2]); F Fundamental group of type ['C', 3, 1]^* sage: F.cartan_type().dynkin_diagram() O=<=O---O=>=O 0 1 2 3 C3~* sage: F.special_nodes() (0, 3) We also implement a fundamental group for `GL_n`. It is defined to be the group of integers, which is the covering group of the fundamental group Z/nZ for affine `SL_n`:: sage: F = FundamentalGroupOfExtendedAffineWeylGroup(['A',2,1], general_linear=True); F Fundamental group of GL(3) sage: x = F.an_element(); x pi[5] sage: x*x pi[10] sage: x.inverse() pi[-5] sage: wt = F.cartan_type().classical().root_system().ambient_space().an_element(); wt (2, 2, 3) sage: x.act_on_classical_ambient(wt) (2, 3, 2) sage: w = WeylGroup(F.cartan_type(),prefix="s").an_element(); w s0*s1*s2 sage: x.act_on_affine_weyl(w) s2*s0*s1 """ cartan_type = CartanType(cartan_type) if cartan_type.is_finite(): cartan_type = cartan_type.affine() if not cartan_type.is_affine(): raise NotImplementedError("Cartan type is not affine") if general_linear is True: if cartan_type.is_untwisted_affine() and cartan_type.type() == "A": return FundamentalGroupGL(cartan_type, prefix) else: raise ValueError( "General Linear Fundamental group is untwisted type A") return FundamentalGroupOfExtendedAffineWeylGroup_Class(cartan_type, prefix, finite=True)
def FundamentalGroupOfExtendedAffineWeylGroup(cartan_type, prefix='pi', general_linear=None): r""" Factory for the fundamental group of an extended affine Weyl group. INPUT: - ``cartan_type`` -- a Cartan type that is either affine or finite, with the latter being a shorthand for the untwisted affinization - ``prefix`` (default: 'pi') -- string that labels the elements of the group - ``general_linear`` -- (default: None, meaning False) In untwisted type A, if True, use the universal central extension .. RUBRIC:: Fundamental group Associated to each affine Cartan type `\tilde{X}` is an extended affine Weyl group `E`. Its subgroup of length-zero elements is called the fundamental group `F`. The group `F` can be identified with a subgroup of the group of automorphisms of the affine Dynkin diagram. As such, every element of `F` can be viewed as a permutation of the set `I` of affine Dynkin nodes. Let `0 \in I` be the distinguished affine node; it is the one whose removal produces the associated finite Cartan type (call it `X`). A node `i \in I` is called *special* if some automorphism of the affine Dynkin diagram, sends `0` to `i`. The node `0` is always special due to the identity automorphism. There is a bijection of the set of special nodes with the fundamental group. We denote the image of `i` by `\pi_i`. The structure of `F` is determined as follows. - `\tilde{X}` is untwisted -- `F` is isomorphic to `P^\vee/Q^\vee` where `P^\vee` and `Q^\vee` are the coweight and coroot lattices of type `X`. The group `P^\vee/Q^\vee` consists of the cosets `\omega_i^\vee + Q^\vee` for special nodes `i`, where `\omega_0^\vee = 0` by convention. In this case the special nodes `i` are the *cominuscule* nodes, the ones such that `\omega_i^\vee(\alpha_j)` is `0` or `1` for all `j\in I_0 = I \setminus \{0\}`. For `i` special, addition by `\omega_i^\vee+Q^\vee` permutes `P^\vee/Q^\vee` and therefore permutes the set of special nodes. This permutation extends uniquely to an automorphism of the affine Dynkin diagram. - `\tilde{X}` is dual untwisted -- (that is, the dual of `\tilde{X}` is untwisted) `F` is isomorphic to `P/Q` where `P` and `Q` are the weight and root lattices of type `X`. The group `P/Q` consists of the cosets `\omega_i + Q` for special nodes `i`, where `\omega_0 = 0` by convention. In this case the special nodes `i` are the *minuscule* nodes, the ones such that `\alpha_j^\vee(\omega_i)` is `0` or `1` for all `j \in I_0`. For `i` special, addition by `\omega_i+Q` permutes `P/Q` and therefore permutes the set of special nodes. This permutation extends uniquely to an automorphism of the affine Dynkin diagram. - `\tilde{X}` is mixed -- (that is, not of the above two types) `F` is the trivial group. EXAMPLES:: sage: from sage.combinat.root_system.fundamental_group import FundamentalGroupOfExtendedAffineWeylGroup sage: F = FundamentalGroupOfExtendedAffineWeylGroup(['A',3,1]); F Fundamental group of type ['A', 3, 1] sage: F.cartan_type().dynkin_diagram() 0 O-------+ | | | | O---O---O 1 2 3 A3~ sage: F.special_nodes() (0, 1, 2, 3) sage: F(1)^2 pi[2] sage: F(1)*F(2) pi[3] sage: F(3)^(-1) pi[1] sage: F = FundamentalGroupOfExtendedAffineWeylGroup("B3"); F Fundamental group of type ['B', 3, 1] sage: F.cartan_type().dynkin_diagram() O 0 | | O---O=>=O 1 2 3 B3~ sage: F.special_nodes() (0, 1) sage: F = FundamentalGroupOfExtendedAffineWeylGroup("C2"); F Fundamental group of type ['C', 2, 1] sage: F.cartan_type().dynkin_diagram() O=>=O=<=O 0 1 2 C2~ sage: F.special_nodes() (0, 2) sage: F = FundamentalGroupOfExtendedAffineWeylGroup("D4"); F Fundamental group of type ['D', 4, 1] sage: F.cartan_type().dynkin_diagram() O 4 | | O---O---O 1 |2 3 | O 0 D4~ sage: F.special_nodes() (0, 1, 3, 4) sage: (F(4), F(4)^2) (pi[4], pi[0]) sage: F = FundamentalGroupOfExtendedAffineWeylGroup("D5"); F Fundamental group of type ['D', 5, 1] sage: F.cartan_type().dynkin_diagram() 0 O O 5 | | | | O---O---O---O 1 2 3 4 D5~ sage: F.special_nodes() (0, 1, 4, 5) sage: (F(5), F(5)^2, F(5)^3, F(5)^4) (pi[5], pi[1], pi[4], pi[0]) sage: F = FundamentalGroupOfExtendedAffineWeylGroup("E6"); F Fundamental group of type ['E', 6, 1] sage: F.cartan_type().dynkin_diagram() O 0 | | O 2 | | O---O---O---O---O 1 3 4 5 6 E6~ sage: F.special_nodes() (0, 1, 6) sage: F(1)^2 pi[6] sage: F = FundamentalGroupOfExtendedAffineWeylGroup(['D',4,2]); F Fundamental group of type ['C', 3, 1]^* sage: F.cartan_type().dynkin_diagram() O=<=O---O=>=O 0 1 2 3 C3~* sage: F.special_nodes() (0, 3) We also implement a fundamental group for `GL_n`. It is defined to be the group of integers, which is the covering group of the fundamental group Z/nZ for affine `SL_n`:: sage: F = FundamentalGroupOfExtendedAffineWeylGroup(['A',2,1], general_linear=True); F Fundamental group of GL(3) sage: x = F.an_element(); x pi[5] sage: x*x pi[10] sage: x.inverse() pi[-5] sage: wt = F.cartan_type().classical().root_system().ambient_space().an_element(); wt (2, 2, 3) sage: x.act_on_classical_ambient(wt) (2, 3, 2) sage: w = WeylGroup(F.cartan_type(),prefix="s").an_element(); w s0*s1*s2 sage: x.act_on_affine_weyl(w) s2*s0*s1 """ cartan_type = CartanType(cartan_type) if cartan_type.is_finite(): cartan_type = cartan_type.affine() if not cartan_type.is_affine(): raise NotImplementedError("Cartan type is not affine") if general_linear is True: if cartan_type.is_untwisted_affine() and cartan_type.type() == "A": return FundamentalGroupGL(cartan_type, prefix) else: raise ValueError("General Linear Fundamental group is untwisted type A") return FundamentalGroupOfExtendedAffineWeylGroup_Class(cartan_type,prefix,finite=True)