Quantum Group Representations

AUTHORS:

  • Travis Scrimshaw (2018): initial version

class sage.algebras.quantum_groups.representations.AdjointRepresentation(R, C, q)[source]

Bases: CyclicRepresentation

An (generalized) adjoint representation of a quantum group.

We define an (generalized) adjoint representation \(V\) of a quantum group \(U_q\) to be a cyclic \(U_q\)-module with a weight space decomposition \(V = \bigoplus_{\mu} V_{\mu}\) such that \(\dim V_{\mu} \leq 1\) unless \(\mu = 0\). Moreover, we require that there exists a basis \(\{y_j | j \in J\}\) for \(V_0\) such that \(e_i y_j = 0\) for all \(j \neq i \in I\).

For a base ring \(R\), we construct an adjoint representation from its (combinatorial) crystal \(B\) by \(V = R \{v_b | b \in B\}\) with

\[\begin{split}\begin{aligned} e_i v_b & = \begin{cases} v_{e_i b} / [\varphi_i(e_i b)]_{q_i}, & \text{if } \operatorname{wt}(b) \neq 0, \\ v_{e_i b} + \sum_{j \neq i} [-A_{ij}]_{q_i} / [2]_{q_i} v_{y_j} & \text{otherwise} \end{cases} \\ f_i v_b & = \begin{cases} v_{f_i b} / [\varepsilon_i(f_i b)]_{q_i}, & \text{if } \operatorname{wt}(b) \neq 0, \\ v_{f_i b} + \sum_{j \neq i} [-A_{ij}]_{q_i} / [2]_{q_i} v_{y_j} & \text{otherwise} \end{cases} \\ K_i v_b & = q^{\langle h_i, \operatorname{wt}(b) \rangle} v_b, \end{aligned}\end{split}\]

where \((A_{ij})_{i,j \in I}\) is the Cartan matrix, and we consider \(v_0 := 0\).

INPUT:

  • C – the crystal corresponding to the representation

  • R – the base ring

  • q – (default: the generator of R) the parameter \(q\) of the quantum group

Warning

This assumes that \(q\) is generic.

EXAMPLES:

sage: from sage.algebras.quantum_groups.representations import AdjointRepresentation
sage: R = ZZ['q'].fraction_field()
sage: C = crystals.Tableaux(['D',4], shape=[1,1])
sage: V = AdjointRepresentation(R, C)
sage: V
V((1, 1, 0, 0))
sage: v = V.an_element(); v
2*B[[[1], [2]]] + 2*B[[[1], [3]]] + 3*B[[[2], [3]]]
sage: v.e(2)
2*B[[[1], [2]]]
sage: v.f(2)
2*B[[[1], [3]]]
sage: v.f(4)
2*B[[[1], [-4]]] + 3*B[[[2], [-4]]]
sage: v.K(3)
2*B[[[1], [2]]] + 2*q*B[[[1], [3]]] + 3*q*B[[[2], [3]]]
sage: v.K(2,-2)
2/q^2*B[[[1], [2]]] + 2*q^2*B[[[1], [3]]] + 3*B[[[2], [3]]]

sage: La = RootSystem(['F',4,1]).weight_space().fundamental_weights()
sage: K = crystals.ProjectedLevelZeroLSPaths(La[4])
sage: A = AdjointRepresentation(R, K)
sage: A
V(-Lambda[0] + Lambda[4])
>>> from sage.all import *
>>> from sage.algebras.quantum_groups.representations import AdjointRepresentation
>>> R = ZZ['q'].fraction_field()
>>> C = crystals.Tableaux(['D',Integer(4)], shape=[Integer(1),Integer(1)])
>>> V = AdjointRepresentation(R, C)
>>> V
V((1, 1, 0, 0))
>>> v = V.an_element(); v
2*B[[[1], [2]]] + 2*B[[[1], [3]]] + 3*B[[[2], [3]]]
>>> v.e(Integer(2))
2*B[[[1], [2]]]
>>> v.f(Integer(2))
2*B[[[1], [3]]]
>>> v.f(Integer(4))
2*B[[[1], [-4]]] + 3*B[[[2], [-4]]]
>>> v.K(Integer(3))
2*B[[[1], [2]]] + 2*q*B[[[1], [3]]] + 3*q*B[[[2], [3]]]
>>> v.K(Integer(2),-Integer(2))
2/q^2*B[[[1], [2]]] + 2*q^2*B[[[1], [3]]] + 3*B[[[2], [3]]]

>>> La = RootSystem(['F',Integer(4),Integer(1)]).weight_space().fundamental_weights()
>>> K = crystals.ProjectedLevelZeroLSPaths(La[Integer(4)])
>>> A = AdjointRepresentation(R, K)
>>> A
V(-Lambda[0] + Lambda[4])

Sort the summands uniformly in Python 2 and Python 3:

sage: A.print_options(sorting_key=lambda x: str(x))
sage: v = A.an_element(); v
2*B[(-Lambda[0] + Lambda[3] - Lambda[4],)]
 + 2*B[(-Lambda[0] + Lambda[4],)]
 + 3*B[(Lambda[0] - Lambda[1] + Lambda[4],)]
sage: v.e(0)
2*B[(Lambda[0] - Lambda[1] + Lambda[3] - Lambda[4],)]
 + 2*B[(Lambda[0] - Lambda[1] + Lambda[4],)]
sage: v.f(0)
3*B[(-Lambda[0] + Lambda[4],)]
>>> from sage.all import *
>>> A.print_options(sorting_key=lambda x: str(x))
>>> v = A.an_element(); v
2*B[(-Lambda[0] + Lambda[3] - Lambda[4],)]
 + 2*B[(-Lambda[0] + Lambda[4],)]
 + 3*B[(Lambda[0] - Lambda[1] + Lambda[4],)]
>>> v.e(Integer(0))
2*B[(Lambda[0] - Lambda[1] + Lambda[3] - Lambda[4],)]
 + 2*B[(Lambda[0] - Lambda[1] + Lambda[4],)]
>>> v.f(Integer(0))
3*B[(-Lambda[0] + Lambda[4],)]

REFERENCES:

e_on_basis(i, b)[source]

Return the action of \(e_i\) on the basis element indexed by b.

INPUT:

  • i – an element of the index set

  • b – an element of basis keys

EXAMPLES:

sage: from sage.algebras.quantum_groups.representations import AdjointRepresentation
sage: K = crystals.KirillovReshetikhin(['D',3,2], 1,1)
sage: R = ZZ['q'].fraction_field()
sage: V = AdjointRepresentation(R, K)
sage: mg0 = K.module_generators[0]; mg0
[]
sage: mg1 = K.module_generators[1]; mg1
[[1]]
sage: V.e_on_basis(0, mg0)
((q^2+1)/q)*B[[[-1]]]
sage: V.e_on_basis(0, mg1)
B[[]]
sage: V.e_on_basis(1, mg0)
0
sage: V.e_on_basis(1, mg1)
0
sage: V.e_on_basis(2, mg0)
0
sage: V.e_on_basis(2, mg1)
0

sage: K = crystals.KirillovReshetikhin(['D',4,3], 1,1)
sage: V = AdjointRepresentation(R, K)
sage: V.e_on_basis(0, K.module_generator())
B[[]] + (q/(q^2+1))*B[[[0]]]
>>> from sage.all import *
>>> from sage.algebras.quantum_groups.representations import AdjointRepresentation
>>> K = crystals.KirillovReshetikhin(['D',Integer(3),Integer(2)], Integer(1),Integer(1))
>>> R = ZZ['q'].fraction_field()
>>> V = AdjointRepresentation(R, K)
>>> mg0 = K.module_generators[Integer(0)]; mg0
[]
>>> mg1 = K.module_generators[Integer(1)]; mg1
[[1]]
>>> V.e_on_basis(Integer(0), mg0)
((q^2+1)/q)*B[[[-1]]]
>>> V.e_on_basis(Integer(0), mg1)
B[[]]
>>> V.e_on_basis(Integer(1), mg0)
0
>>> V.e_on_basis(Integer(1), mg1)
0
>>> V.e_on_basis(Integer(2), mg0)
0
>>> V.e_on_basis(Integer(2), mg1)
0

>>> K = crystals.KirillovReshetikhin(['D',Integer(4),Integer(3)], Integer(1),Integer(1))
>>> V = AdjointRepresentation(R, K)
>>> V.e_on_basis(Integer(0), K.module_generator())
B[[]] + (q/(q^2+1))*B[[[0]]]
f_on_basis(i, b)[source]

Return the action of \(f_i\) on the basis element indexed by b.

INPUT:

  • i – an element of the index set

  • b – an element of basis keys

EXAMPLES:

sage: from sage.algebras.quantum_groups.representations import AdjointRepresentation
sage: K = crystals.KirillovReshetikhin(['D',3,2], 1,1)
sage: R = ZZ['q'].fraction_field()
sage: V = AdjointRepresentation(R, K)
sage: mg0 = K.module_generators[0]; mg0
[]
sage: mg1 = K.module_generators[1]; mg1
[[1]]
sage: V.f_on_basis(0, mg0)
((q^2+1)/q)*B[[[1]]]
sage: V.f_on_basis(0, mg1)
0
sage: V.f_on_basis(1, mg0)
0
sage: V.f_on_basis(1, mg1)
B[[[2]]]
sage: V.f_on_basis(2, mg0)
0
sage: V.f_on_basis(2, mg1)
0

sage: K = crystals.KirillovReshetikhin(['D',4,3], 1,1)
sage: V = AdjointRepresentation(R, K)
sage: lw = K.module_generator().to_lowest_weight([1,2])[0]
sage: V.f_on_basis(0, lw)
B[[]] + (q/(q^2+1))*B[[[0]]]
>>> from sage.all import *
>>> from sage.algebras.quantum_groups.representations import AdjointRepresentation
>>> K = crystals.KirillovReshetikhin(['D',Integer(3),Integer(2)], Integer(1),Integer(1))
>>> R = ZZ['q'].fraction_field()
>>> V = AdjointRepresentation(R, K)
>>> mg0 = K.module_generators[Integer(0)]; mg0
[]
>>> mg1 = K.module_generators[Integer(1)]; mg1
[[1]]
>>> V.f_on_basis(Integer(0), mg0)
((q^2+1)/q)*B[[[1]]]
>>> V.f_on_basis(Integer(0), mg1)
0
>>> V.f_on_basis(Integer(1), mg0)
0
>>> V.f_on_basis(Integer(1), mg1)
B[[[2]]]
>>> V.f_on_basis(Integer(2), mg0)
0
>>> V.f_on_basis(Integer(2), mg1)
0

>>> K = crystals.KirillovReshetikhin(['D',Integer(4),Integer(3)], Integer(1),Integer(1))
>>> V = AdjointRepresentation(R, K)
>>> lw = K.module_generator().to_lowest_weight([Integer(1),Integer(2)])[Integer(0)]
>>> V.f_on_basis(Integer(0), lw)
B[[]] + (q/(q^2+1))*B[[[0]]]
class sage.algebras.quantum_groups.representations.CyclicRepresentation(R, C, q)[source]

Bases: QuantumGroupRepresentation

A cyclic quantum group representation that is indexed by either a highest weight crystal or Kirillov-Reshetikhin crystal.

The crystal C must either allow C.module_generator(), otherwise it is assumed to be generated by C.module_generators[0].

This is meant as an abstract base class for AdjointRepresentation and MinusculeRepresentation.

module_generator()[source]

Return the module generator of self.

EXAMPLES:

sage: from sage.algebras.quantum_groups.representations import AdjointRepresentation
sage: C = crystals.Tableaux(['G',2], shape=[1,1])
sage: R = ZZ['q'].fraction_field()
sage: V = AdjointRepresentation(R, C)
sage: V.module_generator()
B[[[1], [2]]]

sage: K = crystals.KirillovReshetikhin(['D',4,2], 1,1)
sage: A = AdjointRepresentation(R, K)
sage: A.module_generator()
B[[[1]]]
>>> from sage.all import *
>>> from sage.algebras.quantum_groups.representations import AdjointRepresentation
>>> C = crystals.Tableaux(['G',Integer(2)], shape=[Integer(1),Integer(1)])
>>> R = ZZ['q'].fraction_field()
>>> V = AdjointRepresentation(R, C)
>>> V.module_generator()
B[[[1], [2]]]

>>> K = crystals.KirillovReshetikhin(['D',Integer(4),Integer(2)], Integer(1),Integer(1))
>>> A = AdjointRepresentation(R, K)
>>> A.module_generator()
B[[[1]]]
class sage.algebras.quantum_groups.representations.MinusculeRepresentation(R, C, q)[source]

Bases: CyclicRepresentation

A minuscule representation of a quantum group.

A quantum group representation \(V\) is minuscule if it is cyclic, there is a weight space decomposition \(V = \bigoplus_{\mu} V_{\mu}\) with \(\dim V_{\mu} \leq 1\), and \(e_i^2 V = 0\) and \(f_i^2 V = 0\).

For a base ring \(R\), we construct a minuscule representation from its (combinatorial) crystal \(B\) by \(V = R \{v_b | b \in B\}\) with \(e_i v_b = v_{e_i b}\), \(f_i v_b = v_{f_i b}\), and \(K_i v_b = q^{\langle h_i, \operatorname{wt}(b) \rangle} v_b\), where we consider \(v_0 := 0\).

INPUT:

  • C – the crystal corresponding to the representation

  • R – the base ring

  • q – (default: the generator of R) the parameter \(q\) of the quantum group

Warning

This assumes that \(q\) is generic.

EXAMPLES:

sage: from sage.algebras.quantum_groups.representations import MinusculeRepresentation
sage: R = ZZ['q'].fraction_field()
sage: C = crystals.Tableaux(['B',3], shape=[1/2,1/2,1/2])
sage: V = MinusculeRepresentation(R, C)
sage: V
V((1/2, 1/2, 1/2))
sage: v = V.an_element(); v
2*B[[+++, []]] + 2*B[[++-, []]] + 3*B[[+-+, []]]
sage: v.e(3)
2*B[[+++, []]]
sage: v.f(1)
3*B[[-++, []]]
sage: v.f(3)
2*B[[++-, []]] + 3*B[[+--, []]]
sage: v.K(2)
2*B[[+++, []]] + 2*q^2*B[[++-, []]] + 3/q^2*B[[+-+, []]]
sage: v.K(3, -2)
2/q^2*B[[+++, []]] + 2*q^2*B[[++-, []]] + 3/q^2*B[[+-+, []]]

sage: K = crystals.KirillovReshetikhin(['D',4,2], 3,1)
sage: A = MinusculeRepresentation(R, K)
sage: A
V(-Lambda[0] + Lambda[3])
sage: v = A.an_element(); v
2*B[[+++, []]] + 2*B[[++-, []]] + 3*B[[+-+, []]]
sage: v.f(0)
0
sage: v.e(0)
2*B[[-++, []]] + 2*B[[-+-, []]] + 3*B[[--+, []]]
>>> from sage.all import *
>>> from sage.algebras.quantum_groups.representations import MinusculeRepresentation
>>> R = ZZ['q'].fraction_field()
>>> C = crystals.Tableaux(['B',Integer(3)], shape=[Integer(1)/Integer(2),Integer(1)/Integer(2),Integer(1)/Integer(2)])
>>> V = MinusculeRepresentation(R, C)
>>> V
V((1/2, 1/2, 1/2))
>>> v = V.an_element(); v
2*B[[+++, []]] + 2*B[[++-, []]] + 3*B[[+-+, []]]
>>> v.e(Integer(3))
2*B[[+++, []]]
>>> v.f(Integer(1))
3*B[[-++, []]]
>>> v.f(Integer(3))
2*B[[++-, []]] + 3*B[[+--, []]]
>>> v.K(Integer(2))
2*B[[+++, []]] + 2*q^2*B[[++-, []]] + 3/q^2*B[[+-+, []]]
>>> v.K(Integer(3), -Integer(2))
2/q^2*B[[+++, []]] + 2*q^2*B[[++-, []]] + 3/q^2*B[[+-+, []]]

>>> K = crystals.KirillovReshetikhin(['D',Integer(4),Integer(2)], Integer(3),Integer(1))
>>> A = MinusculeRepresentation(R, K)
>>> A
V(-Lambda[0] + Lambda[3])
>>> v = A.an_element(); v
2*B[[+++, []]] + 2*B[[++-, []]] + 3*B[[+-+, []]]
>>> v.f(Integer(0))
0
>>> v.e(Integer(0))
2*B[[-++, []]] + 2*B[[-+-, []]] + 3*B[[--+, []]]

REFERENCES:

e_on_basis(i, b)[source]

Return the action of \(e_i\) on the basis element indexed by b.

INPUT:

  • i – an element of the index set

  • b – an element of basis keys

EXAMPLES:

sage: from sage.algebras.quantum_groups.representations import MinusculeRepresentation
sage: C = crystals.Tableaux(['A',3], shape=[1,1])
sage: R = ZZ['q'].fraction_field()
sage: V = MinusculeRepresentation(R, C)
sage: lw = C.lowest_weight_vectors()[0]
sage: V.e_on_basis(1, lw)
0
sage: V.e_on_basis(2, lw)
B[[[2], [4]]]
sage: V.e_on_basis(3, lw)
0
sage: hw = C.highest_weight_vectors()[0]
sage: all(V.e_on_basis(i, hw) == V.zero() for i in V.index_set())
True
>>> from sage.all import *
>>> from sage.algebras.quantum_groups.representations import MinusculeRepresentation
>>> C = crystals.Tableaux(['A',Integer(3)], shape=[Integer(1),Integer(1)])
>>> R = ZZ['q'].fraction_field()
>>> V = MinusculeRepresentation(R, C)
>>> lw = C.lowest_weight_vectors()[Integer(0)]
>>> V.e_on_basis(Integer(1), lw)
0
>>> V.e_on_basis(Integer(2), lw)
B[[[2], [4]]]
>>> V.e_on_basis(Integer(3), lw)
0
>>> hw = C.highest_weight_vectors()[Integer(0)]
>>> all(V.e_on_basis(i, hw) == V.zero() for i in V.index_set())
True
f_on_basis(i, b)[source]

Return the action of \(f_i\) on the basis element indexed by b.

INPUT:

  • i – an element of the index set

  • b – an element of basis keys

EXAMPLES:

sage: from sage.algebras.quantum_groups.representations import MinusculeRepresentation
sage: C = crystals.Tableaux(['A',3], shape=[1,1])
sage: R = ZZ['q'].fraction_field()
sage: V = MinusculeRepresentation(R, C)
sage: hw = C.highest_weight_vectors()[0]
sage: V.f_on_basis(1, hw)
0
sage: V.f_on_basis(2, hw)
B[[[1], [3]]]
sage: V.f_on_basis(3, hw)
0
sage: lw = C.lowest_weight_vectors()[0]
sage: all(V.f_on_basis(i, lw) == V.zero() for i in V.index_set())
True
>>> from sage.all import *
>>> from sage.algebras.quantum_groups.representations import MinusculeRepresentation
>>> C = crystals.Tableaux(['A',Integer(3)], shape=[Integer(1),Integer(1)])
>>> R = ZZ['q'].fraction_field()
>>> V = MinusculeRepresentation(R, C)
>>> hw = C.highest_weight_vectors()[Integer(0)]
>>> V.f_on_basis(Integer(1), hw)
0
>>> V.f_on_basis(Integer(2), hw)
B[[[1], [3]]]
>>> V.f_on_basis(Integer(3), hw)
0
>>> lw = C.lowest_weight_vectors()[Integer(0)]
>>> all(V.f_on_basis(i, lw) == V.zero() for i in V.index_set())
True
class sage.algebras.quantum_groups.representations.QuantumGroupRepresentation(R, C, q)[source]

Bases: CombinatorialFreeModule

A representation of a quantum group whose basis is indexed by the corresponding (combinatorial) crystal.

INPUT:

  • C – the crystal corresponding to the representation

  • R – the base ring

  • q – (default: the generator of R) the parameter \(q\) of the quantum group

K_on_basis(i, b, power=1)[source]

Return the action of \(K_i\) on the basis element indexed by b to the power power.

INPUT:

  • i – an element of the index set

  • b – an element of basis keys

  • power – (default: 1) the power of \(K_i\)

EXAMPLES:

sage: from sage.algebras.quantum_groups.representations import MinusculeRepresentation
sage: C = crystals.Tableaux(['A',3], shape=[1,1])
sage: R = ZZ['q'].fraction_field()
sage: V = MinusculeRepresentation(R, C)
sage: [[V.K_on_basis(i, b) for i in V.index_set()] for b in C]
[[B[[[1], [2]]], q*B[[[1], [2]]], B[[[1], [2]]]],
 [q*B[[[1], [3]]], 1/q*B[[[1], [3]]], q*B[[[1], [3]]]],
 [1/q*B[[[2], [3]]], B[[[2], [3]]], q*B[[[2], [3]]]],
 [q*B[[[1], [4]]], B[[[1], [4]]], 1/q*B[[[1], [4]]]],
 [1/q*B[[[2], [4]]], q*B[[[2], [4]]], 1/q*B[[[2], [4]]]],
 [B[[[3], [4]]], 1/q*B[[[3], [4]]], B[[[3], [4]]]]]
sage: [[V.K_on_basis(i, b, -1) for i in V.index_set()] for b in C]
[[B[[[1], [2]]], 1/q*B[[[1], [2]]], B[[[1], [2]]]],
 [1/q*B[[[1], [3]]], q*B[[[1], [3]]], 1/q*B[[[1], [3]]]],
 [q*B[[[2], [3]]], B[[[2], [3]]], 1/q*B[[[2], [3]]]],
 [1/q*B[[[1], [4]]], B[[[1], [4]]], q*B[[[1], [4]]]],
 [q*B[[[2], [4]]], 1/q*B[[[2], [4]]], q*B[[[2], [4]]]],
 [B[[[3], [4]]], q*B[[[3], [4]]], B[[[3], [4]]]]]
>>> from sage.all import *
>>> from sage.algebras.quantum_groups.representations import MinusculeRepresentation
>>> C = crystals.Tableaux(['A',Integer(3)], shape=[Integer(1),Integer(1)])
>>> R = ZZ['q'].fraction_field()
>>> V = MinusculeRepresentation(R, C)
>>> [[V.K_on_basis(i, b) for i in V.index_set()] for b in C]
[[B[[[1], [2]]], q*B[[[1], [2]]], B[[[1], [2]]]],
 [q*B[[[1], [3]]], 1/q*B[[[1], [3]]], q*B[[[1], [3]]]],
 [1/q*B[[[2], [3]]], B[[[2], [3]]], q*B[[[2], [3]]]],
 [q*B[[[1], [4]]], B[[[1], [4]]], 1/q*B[[[1], [4]]]],
 [1/q*B[[[2], [4]]], q*B[[[2], [4]]], 1/q*B[[[2], [4]]]],
 [B[[[3], [4]]], 1/q*B[[[3], [4]]], B[[[3], [4]]]]]
>>> [[V.K_on_basis(i, b, -Integer(1)) for i in V.index_set()] for b in C]
[[B[[[1], [2]]], 1/q*B[[[1], [2]]], B[[[1], [2]]]],
 [1/q*B[[[1], [3]]], q*B[[[1], [3]]], 1/q*B[[[1], [3]]]],
 [q*B[[[2], [3]]], B[[[2], [3]]], 1/q*B[[[2], [3]]]],
 [1/q*B[[[1], [4]]], B[[[1], [4]]], q*B[[[1], [4]]]],
 [q*B[[[2], [4]]], 1/q*B[[[2], [4]]], q*B[[[2], [4]]]],
 [B[[[3], [4]]], q*B[[[3], [4]]], B[[[3], [4]]]]]
cartan_type()[source]

Return the Cartan type of self.

EXAMPLES:

sage: from sage.algebras.quantum_groups.representations import AdjointRepresentation
sage: C = crystals.Tableaux(['C',3], shape=[1])
sage: R = ZZ['q'].fraction_field()
sage: V = AdjointRepresentation(R, C)
sage: V.cartan_type()
['C', 3]
>>> from sage.all import *
>>> from sage.algebras.quantum_groups.representations import AdjointRepresentation
>>> C = crystals.Tableaux(['C',Integer(3)], shape=[Integer(1)])
>>> R = ZZ['q'].fraction_field()
>>> V = AdjointRepresentation(R, C)
>>> V.cartan_type()
['C', 3]