Q-Systems¶
AUTHORS:
- Travis Scrimshaw (2013-10-08): Initial version 
- Travis Scrimshaw (2017-12-08): Added twisted Q-systems 
- class sage.algebras.q_system.QSystem(base_ring, cartan_type, level, twisted)[source]¶
- Bases: - CombinatorialFreeModule- 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 \[\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: \[(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 - >>> from sage.all import * >>> Q = QSystem(QQ, ['A', Integer(4)]) >>> Q.Q(Integer(3),Integer(1)) Q^(3)[1] >>> Q.Q(Integer(1),Integer(2)) Q^(1)[1]^2 - Q^(2)[1] >>> Q.Q(Integer(3),Integer(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 >>> x = Q.Q(Integer(1),Integer(1)) + Q.Q(Integer(2),Integer(1)); x Q^(1)[1] + Q^(2)[1] >>> 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 - >>> from sage.all import * >>> Q = QSystem(QQ, ['C', Integer(4)]) >>> Q.Q(Integer(4),Integer(1)) Q^(4)[1] >>> Q.Q(Integer(1),Integer(2)) Q^(1)[1]^2 - Q^(2)[1] >>> Q.Q(Integer(2),Integer(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 >>> Q.Q(Integer(3),Integer(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 - >>> from sage.all import * >>> Q = QSystem(QQ, ['A',Integer(7),Integer(2)], twisted=True) >>> Q.Q(Integer(4),Integer(1)) Q^(4)[1] >>> Q.Q(Integer(1),Integer(2)) Q^(1)[1]^2 - Q^(2)[1] >>> Q.Q(Integer(2),Integer(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 >>> Q.Q(Integer(3),Integer(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: - class Element[source]¶
- Bases: - IndexedFreeModuleElement- An element of a Q-system. 
 - Q(a, m)[source]¶
- 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 - >>> from sage.all import * >>> Q = QSystem(QQ, ['A', Integer(8)]) >>> Q.Q(Integer(2), Integer(1)) Q^(2)[1] >>> Q.Q(Integer(6), Integer(2)) -Q^(5)[1]*Q^(7)[1] + Q^(6)[1]^2 >>> Q.Q(Integer(7), Integer(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 >>> Q.Q(Integer(1), Integer(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 - >>> from sage.all import * >>> Q = QSystem(QQ, ['D',Integer(4),Integer(3)], twisted=True) >>> Q.Q(Integer(1),Integer(2)) Q^(1)[1]^2 - Q^(2)[1] >>> Q.Q(Integer(2),Integer(2)) -Q^(1)[1]^3 + Q^(2)[1]^2 >>> Q.Q(Integer(2),Integer(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 >>> Q.Q(Integer(1),Integer(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 
 - algebra_generators()[source]¶
- 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]} - >>> from sage.all import * >>> Q = QSystem(QQ, ['A',Integer(4)]) >>> Q.algebra_generators() Finite family {1: Q^(1)[1], 2: Q^(2)[1], 3: Q^(3)[1], 4: Q^(4)[1]} >>> Q = QSystem(QQ, ['D',Integer(4),Integer(3)], twisted=True) >>> Q.algebra_generators() Finite family {1: Q^(1)[1], 2: Q^(2)[1]} 
 - cartan_type()[source]¶
- 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} - >>> from sage.all import * >>> Q = QSystem(QQ, ['A',Integer(4)]) >>> Q.cartan_type() ['A', 4] >>> Q = QSystem(QQ, ['D',Integer(4),Integer(3)], twisted=True) >>> Q.cartan_type() ['G', 2, 1]^* relabelled by {0: 0, 1: 2, 2: 1} 
 - dimension()[source]¶
- Return the dimension of - self, which is \(\infty\).- EXAMPLES: - sage: F = QSystem(QQ, ['A',4]) sage: F.dimension() +Infinity - >>> from sage.all import * >>> F = QSystem(QQ, ['A',Integer(4)]) >>> F.dimension() +Infinity 
 - gens()[source]¶
- 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]) - >>> from sage.all import * >>> Q = QSystem(QQ, ['A',Integer(4)]) >>> Q.gens() (Q^(1)[1], Q^(2)[1], Q^(3)[1], Q^(4)[1]) 
 - index_set()[source]¶
- 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) - >>> from sage.all import * >>> Q = QSystem(QQ, ['A',Integer(4)]) >>> Q.index_set() (1, 2, 3, 4) >>> Q = QSystem(QQ, ['D',Integer(4),Integer(3)], twisted=True) >>> Q.index_set() (1, 2) 
 - level()[source]¶
- Return the restriction level of - selfor- Noneif 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 - >>> from sage.all import * >>> Q = QSystem(QQ, ['A',Integer(4)]) >>> Q.level() >>> Q = QSystem(QQ, ['A',Integer(4)], Integer(5)) >>> Q.level() 5 
 - one_basis()[source]¶
- 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 - >>> from sage.all import * >>> Q = QSystem(QQ, ['A',Integer(4)]) >>> Q.one_basis() 1 >>> Q.one_basis().parent() is Q._indices True 
 
- sage.algebras.q_system.is_tamely_laced(ct)[source]¶
- Check if the Cartan type - ctis 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 - >>> from sage.all import * >>> from sage.algebras.q_system import is_tamely_laced >>> all(is_tamely_laced(ct) ... for ct in CartanType.samples(crystallographic=True, finite=True)) True >>> 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]^* >>> cm = CartanMatrix([[Integer(2),-Integer(1),Integer(0),Integer(0)],[-Integer(3),Integer(2),-Integer(2),-Integer(2)],[Integer(0),-Integer(1),Integer(2),-Integer(1)],[Integer(0),-Integer(1),-Integer(1),Integer(2)]]) >>> is_tamely_laced(cm) True