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
# -*- coding: utf-8 -*- Q-Systems
AUTHORS:
- Travis Scrimshaw (2013-10-08): Initial version - Travis Scrimshaw (2017-12-08): Added twisted Q-systems """
#***************************************************************************** # Copyright (C) 2013,2017 Travis Scrimshaw <tcscrims at gmail.com> # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # http://www.gnu.org/licenses/ #*****************************************************************************
r""" A Q-system.
Let `\mathfrak{g}` be a tamely-laced symmetrizable Kac-Moody algebra with index set `I` and Cartan matrix `(C_{ab})_{a,b \in I}` over a field `k`. Follow the presentation given in [HKOTY1999]_, an unrestricted Q-system is a `k`-algebra in infinitely many variables `Q^{(a)}_m`, where `a \in I` and `m \in \ZZ_{>0}`, that satisfies the relations
.. MATH::
\left(Q^{(a)}_m\right)^2 = Q^{(a)}_{m+1} Q^{(a)}_{m-1} + \prod_{b \sim a} \prod_{k=0}^{-C_{ab} - 1} Q^{(b)}_{\left\lfloor \frac{m C_{ba} - k}{C_{ab}} \right\rfloor},
with `Q^{(a)}_0 := 1`. Q-systems can be considered as T-systems where we forget the spectral parameter `u` and for `\mathfrak{g}` of finite type, have a solution given by the characters of Kirillov-Reshetikhin modules (again without the spectral parameter) for an affine Kac-Moody algebra `\widehat{\mathfrak{g}}` with `\mathfrak{g}` as its classical subalgebra. See [KNS2011]_ for more information.
Q-systems have a natural bases given by polynomials of the fundamental representations `Q^{(a)}_1`, for `a \in I`. As such, we consider the Q-system as generated by `\{ Q^{(a)}_1 \}_{a \in I}`.
There is also a level `\ell` restricted Q-system (with unit boundary condition) given by setting `Q_{d_a \ell}^{(a)} = 1`, where `d_a` are the entries of the symmetrizing matrix for the dual type of `\mathfrak{g}`.
Similarly, for twisted affine types (we omit type `A_{2n}^{(2)}`), we can define the *twisted Q-system* by using the relation:
.. MATH::
(Q^{(a)}_{m})^2 = Q^{(a)}_{m+1} Q^{(a)}_{m-1} + \prod_{b \neq a} (Q^{(b)}_{m})^{-C_{ba}}.
See [Wil2013]_ for more information.
EXAMPLES:
We begin by constructing a Q-system and doing some basic computations in type `A_4`::
sage: Q = QSystem(QQ, ['A', 4]) sage: Q.Q(3,1) Q^(3)[1] sage: Q.Q(1,2) Q^(1)[1]^2 - Q^(2)[1] sage: Q.Q(3,3) -Q^(1)[1]*Q^(3)[1] + Q^(1)[1]*Q^(4)[1]^2 + Q^(2)[1]^2 - 2*Q^(2)[1]*Q^(3)[1]*Q^(4)[1] + Q^(3)[1]^3 sage: x = Q.Q(1,1) + Q.Q(2,1); x Q^(1)[1] + Q^(2)[1] sage: x * x Q^(1)[1]^2 + 2*Q^(1)[1]*Q^(2)[1] + Q^(2)[1]^2
Next we do some basic computations in type `C_4`::
sage: Q = QSystem(QQ, ['C', 4]) sage: Q.Q(4,1) Q^(4)[1] sage: Q.Q(1,2) Q^(1)[1]^2 - Q^(2)[1] sage: Q.Q(2,3) Q^(1)[1]^2*Q^(4)[1] - 2*Q^(1)[1]*Q^(2)[1]*Q^(3)[1] + Q^(2)[1]^3 - Q^(2)[1]*Q^(4)[1] + Q^(3)[1]^2 sage: Q.Q(3,3) Q^(1)[1]*Q^(4)[1]^2 - 2*Q^(2)[1]*Q^(3)[1]*Q^(4)[1] + Q^(3)[1]^3
We compare that with the twisted Q-system of type `A_7^{(2)}`::
sage: Q = QSystem(QQ, ['A',7,2], twisted=True) sage: Q.Q(4,1) Q^(4)[1] sage: Q.Q(1,2) Q^(1)[1]^2 - Q^(2)[1] sage: Q.Q(2,3) Q^(1)[1]^2*Q^(4)[1] - 2*Q^(1)[1]*Q^(2)[1]*Q^(3)[1] + Q^(2)[1]^3 - Q^(2)[1]*Q^(4)[1] + Q^(3)[1]^2 sage: Q.Q(3,3) -Q^(1)[1]*Q^(3)[1]^2 + Q^(1)[1]*Q^(4)[1]^2 + Q^(2)[1]^2*Q^(3)[1] - 2*Q^(2)[1]*Q^(3)[1]*Q^(4)[1] + Q^(3)[1]^3
REFERENCES:
- [HKOTY1999]_ - [KNS2011]_ """ """ 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 """ raise ValueError("the Cartan type is not tamely-laced") raise ValueError("the Cartan type must be of twisted type")
""" Initialize ``self``.
EXAMPLES::
sage: Q = QSystem(QQ, ['A',2]) sage: TestSuite(Q).run()
sage: Q = QSystem(QQ, ['E',6,2], twisted=True) sage: TestSuite(Q).run() """ # This is used to do the reductions else:
prefix='Q', category=category)
r""" Return a string representation of ``self``.
EXAMPLES::
sage: QSystem(QQ, ['A',4]) Q-system of type ['A', 4] over Rational Field
sage: QSystem(QQ, ['A',7,2], twisted=True) Twisted Q-system of type ['B', 4, 1]^* over Rational Field """ res = "Restricted level {} ".format(self._level) else:
""" Return a string representation of the basis element indexed by ``t``.
EXAMPLES::
sage: Q = QSystem(QQ, ['A',4]) sage: I = Q._indices sage: Q._repr_term( I.gen((1,1)) * I.gen((4,1)) ) 'Q^(1)[1]*Q^(4)[1]' """
r""" Return a `\LaTeX` representation of the basis element indexed by ``t``.
EXAMPLES::
sage: Q = QSystem(QQ, ['A',4]) sage: I = Q._indices sage: Q._latex_term( I.gen((3,1)) * I.gen((4,1)) ) 'Q^{(3)}_{1} Q^{(4)}_{1}' """ return '1' ret = '\\bigl(' + ret + '\\bigr)^{{{}}}'.format(x[1])
""" Return an ascii art representation of the term indexed by ``t``.
TESTS::
sage: Q = QSystem(QQ, ['A',4]) sage: ascii_art(Q.an_element()) 2 2 3 (1) ( (1)) ( (2)) ( (3)) (2) 1 + 2*Q1 + (Q1 ) *(Q1 ) *(Q1 ) + 3*Q1 """ else: "Q{}".format(m)], baseline=0) #print var #print " "*(len(str(m))+1) + "({})".format(a) + '\n' + "Q{}".format(m) + AsciiArt([')', ')'], baseline=0))
r""" Return a unicode art representation of the term indexed by ``t``.
TESTS::
sage: Q = QSystem(QQ, ['A',4]) sage: unicode_art(Q.an_element()) 1 + 2*Q₁⁽¹⁾ + (Q₁⁽¹⁾)²(Q₁⁽²⁾)²(Q₁⁽³⁾)³ + 3*Q₁⁽²⁾ """
'5': u'₅', '6': u'₆', '7': u'₇', '8': u'₈', '9': u'₉'} '5': u'⁵', '6': u'⁶', '7': u'⁷', '8': u'⁸', '9': u'⁹'}
+ UnicodeArt([u')' + to_super(exp)], baseline=0))
""" Return the Cartan type of ``self``.
EXAMPLES::
sage: Q = QSystem(QQ, ['A',4]) sage: Q.cartan_type() ['A', 4]
sage: Q = QSystem(QQ, ['D',4,3], twisted=True) sage: Q.cartan_type() ['G', 2, 1]^* relabelled by {0: 0, 1: 2, 2: 1} """
""" Return the index set of ``self``.
EXAMPLES::
sage: Q = QSystem(QQ, ['A',4]) sage: Q.index_set() (1, 2, 3, 4)
sage: Q = QSystem(QQ, ['D',4,3], twisted=True) sage: Q.index_set() (1, 2) """
""" Return the restriction level of ``self`` or ``None`` if the system is unrestricted.
EXAMPLES::
sage: Q = QSystem(QQ, ['A',4]) sage: Q.level()
sage: Q = QSystem(QQ, ['A',4], 5) sage: Q.level() 5 """
def one_basis(self): """ Return the basis element indexing `1`.
EXAMPLES::
sage: Q = QSystem(QQ, ['A',4]) sage: Q.one_basis() 1 sage: Q.one_basis().parent() is Q._indices True """
def algebra_generators(self): """ Return the algebra generators of ``self``.
EXAMPLES::
sage: Q = QSystem(QQ, ['A',4]) sage: Q.algebra_generators() Finite family {1: Q^(1)[1], 2: Q^(2)[1], 3: Q^(3)[1], 4: Q^(4)[1]}
sage: Q = QSystem(QQ, ['D',4,3], twisted=True) sage: Q.algebra_generators() Finite family {1: Q^(1)[1], 2: Q^(2)[1]} """
""" Return the generators of ``self``.
EXAMPLES::
sage: Q = QSystem(QQ, ['A',4]) sage: Q.gens() (Q^(1)[1], Q^(2)[1], Q^(3)[1], Q^(4)[1]) """
""" Return the dimension of ``self``, which is `\infty`.
EXAMPLES::
sage: F = QSystem(QQ, ['A',4]) sage: F.dimension() +Infinity """
r""" Return the generator `Q^{(a)}_m` of ``self``.
EXAMPLES::
sage: Q = QSystem(QQ, ['A', 8]) sage: Q.Q(2, 1) Q^(2)[1] sage: Q.Q(6, 2) -Q^(5)[1]*Q^(7)[1] + Q^(6)[1]^2 sage: Q.Q(7, 3) -Q^(5)[1]*Q^(7)[1] + Q^(5)[1]*Q^(8)[1]^2 + Q^(6)[1]^2 - 2*Q^(6)[1]*Q^(7)[1]*Q^(8)[1] + Q^(7)[1]^3 sage: Q.Q(1, 0) 1
Twisted Q-system::
sage: Q = QSystem(QQ, ['D',4,3], twisted=True) sage: Q.Q(1,2) Q^(1)[1]^2 - Q^(2)[1] sage: Q.Q(2,2) -Q^(1)[1]^3 + Q^(2)[1]^2 sage: Q.Q(2,3) 3*Q^(1)[1]^4 - 2*Q^(1)[1]^3*Q^(2)[1] - 3*Q^(1)[1]^2*Q^(2)[1] + Q^(2)[1]^2 + Q^(2)[1]^3 sage: Q.Q(1,4) -2*Q^(1)[1]^2 + 2*Q^(1)[1]^3 + Q^(1)[1]^4 - 3*Q^(1)[1]^2*Q^(2)[1] + Q^(2)[1] + Q^(2)[1]^2 """ raise ValueError("a is not in the index set") t = self._cartan_type.dual().cartan_matrix().symmetrizer() if m == t[a] * self._level: return self.one() #if self._cartan_type.type() == 'A' and self._level is None: # return self._jacobi_trudy(a, m)
def _Q_poly(self, a, m): r""" Return the element `Q^{(a)}_m` as a polynomial.
We start with the relation
.. MATH::
(Q^{(a)}_{m-1})^2 = Q^{(a)}_m Q^{(a)}_{m-2} + \mathcal{Q}_{a,m-1},
which implies
.. MATH::
Q^{(a)}_m = \frac{Q^{(a)}_{m-1}^2 - \mathcal{Q}_{a,m-1}}{ Q^{(a)}_{m-2}}.
This becomes our relation used for reducing the Q-system to the fundamental representations.
For twisted Q-systems, we use
.. MATH::
(Q^{(a)}_{m-1})^2 = Q^{(a)}_m Q^{(a)}_{m-2} + \prod_{b \neq a} (Q^{(b)}_{m-1})^{-A_{ba}}.
.. NOTE::
This helper method is defined in order to use the division implemented in polynomial rings.
EXAMPLES::
sage: Q = QSystem(QQ, ['A',8]) sage: Q._Q_poly(1, 2) q1^2 - q2 sage: Q._Q_poly(3, 2) q3^2 - q2*q4 sage: Q._Q_poly(6, 3) q6^3 - 2*q5*q6*q7 + q4*q7^2 + q5^2*q8 - q4*q6*q8
Twisted types::
sage: Q = QSystem(QQ, ['E',6,2], twisted=True) sage: Q._Q_poly(1,2) q1^2 - q2 sage: Q._Q_poly(2,2) q2^2 - q1*q3 sage: Q._Q_poly(3,2) -q2^2*q4 + q3^2 sage: Q._Q_poly(4,2) q4^2 - q3 sage: Q._Q_poly(3,3) 2*q1*q2^2*q4^2 - q1^2*q3*q4^2 + q2^4 - 2*q1*q2^2*q3 + q1^2*q3^2 - 2*q2^2*q3*q4 + q3^3
sage: Q = QSystem(QQ, ['D',4,3], twisted=True) sage: Q._Q_poly(1,2) q1^2 - q2 sage: Q._Q_poly(2,2) -q1^3 + q2^2 sage: Q._Q_poly(1,3) q1^3 + q1^2 - 2*q1*q2 sage: Q._Q_poly(2,3) 3*q1^4 - 2*q1^3*q2 - 3*q1^2*q2 + q2^3 + q2^2 """
for b in self._cm.dynkin_diagram().neighbors(a)) else:
""" An element of a Q-system. """ """ Return the product of ``self`` and ``x``.
EXAMPLES::
sage: Q = QSystem(QQ, ['A',8]) sage: x = Q.Q(1, 2) sage: y = Q.Q(3, 2) sage: x * y -Q^(1)[1]^2*Q^(2)[1]*Q^(4)[1] + Q^(1)[1]^2*Q^(3)[1]^2 + Q^(2)[1]^2*Q^(4)[1] - Q^(2)[1]*Q^(3)[1]^2 """ for tl,cl in self for tr,cr in x)
r""" Check if the Cartan type ``ct`` is tamely-laced.
A (symmetrizable) Cartan type with index set `I` is *tamely-laced* if `A_{ij} < -1` implies `d_i = -A_{ji} = 1` for all `i,j \in I`, where `(d_i)_{i \in I}` is the diagonal matrix symmetrizing the Cartan matrix `(A_{ij})_{i,j \in I}`.
EXAMPLES::
sage: from sage.algebras.q_system import is_tamely_laced sage: all(is_tamely_laced(ct) ....: for ct in CartanType.samples(crystallographic=True, finite=True)) True sage: for ct in CartanType.samples(crystallographic=True, affine=True): ....: if not is_tamely_laced(ct): ....: print(ct) ['A', 1, 1] ['BC', 1, 2] ['BC', 5, 2] ['BC', 1, 2]^* ['BC', 5, 2]^* sage: cm = CartanMatrix([[2,-1,0,0],[-3,2,-2,-2],[0,-1,2,-1],[0,-1,-1,2]]) sage: is_tamely_laced(cm) True """
(ct.type() == 'BC' or ct.dual().type() == 'BC'))
for i in I for j in I if cm[i,j] < -1)
|