Quantum Groups Using GAP’s QuaGroup Package

AUTHORS:

  • Travis Scrimshaw (03-2017): initial version

The documentation for GAP’s QuaGroup package, originally authored by Willem Adriaan de Graaf, can be found at https://www.gap-system.org/Packages/quagroup.html.

class sage.algebras.quantum_groups.quantum_group_gap.CrystalGraphVertex(V, s)

Bases: sage.structure.sage_object.SageObject

Helper class used as the vertices of a crystal graph.

sage.algebras.quantum_groups.quantum_group_gap.HighestWeightModule

A highest weight module of a quantum group.

class sage.algebras.quantum_groups.quantum_group_gap.HighestWeightSubmodule(ambient, gen, weight)

Bases: sage.algebras.quantum_groups.quantum_group_gap.QuantumGroupModule

Initialize self.

EXAMPLES:

sage: Q = QuantumGroup(['A',2])  # optional - gap_packages
sage: V = Q.highest_weight_module([1,0])  # optional - gap_packages
sage: T = tensor([V,V])  # optional - gap_packages
sage: S = T.highest_weight_decomposition()[0]  # optional - gap_packages
sage: TestSuite(S).run()  # optional - gap_packages
Element

alias of QuaGroupRepresentationElement

ambient()

Return the ambient module of self.

EXAMPLES:

sage: Q = QuantumGroup(['A',2])                # optional - gap_packages
sage: V = Q.highest_weight_module([1,0])       # optional - gap_packages
sage: T = tensor([V,V])                        # optional - gap_packages
sage: S = T.highest_weight_decomposition()[0]  # optional - gap_packages
sage: S.ambient() is T                         # optional - gap_packages
True
an_element()

Return the highest weight vector of self.

EXAMPLES:

sage: Q = QuantumGroup(['A',2])                # optional - gap_packages
sage: V = Q.highest_weight_module([1,0])       # optional - gap_packages
sage: T = tensor([V,V])                        # optional - gap_packages
sage: S = T.highest_weight_decomposition()[1]  # optional - gap_packages
sage: u = S.highest_weight_vector(); u         # optional - gap_packages
(1)*e.1
sage: u.lift()                                 # optional - gap_packages
-q^-1*(1*v0<x>F[a1]*v0) + 1*(F[a1]*v0<x>1*v0)
crystal_graph(use_ambient=True)

Return the crystal graph of self.

INPUT:

  • use_ambient – boolean (default: True); if True, the vertices are given in terms of the ambient module

EXAMPLES:

sage: Q = QuantumGroup(['A',2])                # optional - gap_packages
sage: V = Q.highest_weight_module([1,0])       # optional - gap_packages
sage: T = tensor([V,V])                        # optional - gap_packages
sage: S = T.highest_weight_decomposition()[1]  # optional - gap_packages
sage: G = S.crystal_graph()                    # optional - gap_packages
sage: sorted(G.vertices(), key=str)            # optional - gap_packages
[<-q^-1*(1*v0<x>F[a1+a2]*v0) + 1*(F[a1+a2]*v0<x>1*v0)>,
 <-q^-1*(1*v0<x>F[a1]*v0) + 1*(F[a1]*v0<x>1*v0)>,
 <-q^-1*(F[a1]*v0<x>F[a1+a2]*v0) + 1*(F[a1+a2]*v0<x>F[a1]*v0)>]
sage: sorted(S.crystal_graph(False).vertices(), key=str)  # optional - gap_packages
[<(1)*e.1>, <(1)*e.2>, <(1)*e.3>]
highest_weight_vector()

Return the highest weight vector of self.

EXAMPLES:

sage: Q = QuantumGroup(['A',2])                # optional - gap_packages
sage: V = Q.highest_weight_module([1,0])       # optional - gap_packages
sage: T = tensor([V,V])                        # optional - gap_packages
sage: S = T.highest_weight_decomposition()[1]  # optional - gap_packages
sage: u = S.highest_weight_vector(); u         # optional - gap_packages
(1)*e.1
sage: u.lift()                                 # optional - gap_packages
-q^-1*(1*v0<x>F[a1]*v0) + 1*(F[a1]*v0<x>1*v0)
lift()

The lift morphism from self to the ambient space.

EXAMPLES:

sage: Q = QuantumGroup(['A',2])                # optional - gap_packages
sage: V = Q.highest_weight_module([1,0])       # optional - gap_packages
sage: T = tensor([V,V])                        # optional - gap_packages
sage: S = T.highest_weight_decomposition()[0]  # optional - gap_packages
sage: S.lift                                   # optional - gap_packages
Generic morphism:
  From: Highest weight submodule with weight 2*Lambda[1] generated by 1*(1*v0<x>1*v0)
  To:   Highest weight module ... # Highest weight module ...
sage: x = sum(S.basis())                       # optional - gap_packages
sage: x.lift()                                 # optional - gap_packages
1*(1*v0<x>1*v0) + 1*(1*v0<x>F[a1]*v0) + 1*(1*v0<x>F[a1+a2]*v0)
 + q^-1*(F[a1]*v0<x>1*v0) + 1*(F[a1]*v0<x>F[a1]*v0)
 + 1*(F[a1]*v0<x>F[a1+a2]*v0) + q^-1*(F[a1+a2]*v0<x>1*v0)
 + q^-1*(F[a1+a2]*v0<x>F[a1]*v0) + 1*(F[a1+a2]*v0<x>F[a1+a2]*v0)
retract(elt)

The retract map from the ambient space to self.

EXAMPLES:

sage: Q = QuantumGroup(['A',2])           # optional - gap_packages
sage: V = Q.highest_weight_module([1,0])  # optional - gap_packages
sage: T = tensor([V,V])                   # optional - gap_packages
sage: all(S.retract(S.lift(x)) == x       # optional - gap_packages
....:     for S in T.highest_weight_decomposition()
....:     for x in S.basis())
True
sage.algebras.quantum_groups.quantum_group_gap.LowerHalfQuantumGroup

The lower half of the quantum group.

class sage.algebras.quantum_groups.quantum_group_gap.QuaGroupModuleElement(parent, libgap_elt)

Bases: sage.structure.element.Element

Base class for elements created using QuaGroup.

e_tilde(i)

Return the action of the Kashiwara operator \(\widetilde{e}_i\) on self.

INPUT:

  • i – an element of the index set or a list to perform a string of operators

EXAMPLES:

sage: Q = QuantumGroup(['B',2])           # optional - gap_packages
sage: x = Q.one().f_tilde([1,2,1,1,2,2])  # optional - gap_packages
sage: x.e_tilde([2,2,1,2])                # optional - gap_packages
F[a1]^(2)
f_tilde(i)

Return the action of the Kashiwara operator \(\widetilde{f}_i\) on self.

INPUT:

  • i – an element of the index set or a list to perform a string of operators

EXAMPLES:

sage: Q = QuantumGroup(['B',2])     # optional - gap_packages
sage: Q.one().f_tilde(1)            # optional - gap_packages
F[a1]
sage: Q.one().f_tilde(2)            # optional - gap_packages
F[a2]
sage: Q.one().f_tilde([1,2,1,1,2])  # optional - gap_packages
F[a1]*F[a1+a2]^(2)
gap()

Return the gap representation of self.

EXAMPLES:

sage: Q = QuantumGroup(['B',3])  # optional - gap_packages
sage: x = Q.an_element()         # optional - gap_packages
sage: x.gap()                    # optional - gap_packages
1+(q)*F1+E1+(q^4-1-q^-4+q^-8)*[ K1 ; 2 ]+K1+(-q^-2+q^-6)*K1[ K1 ; 1 ]
class sage.algebras.quantum_groups.quantum_group_gap.QuaGroupRepresentationElement(parent, libgap_elt)

Bases: sage.algebras.quantum_groups.quantum_group_gap.QuaGroupModuleElement

Element of a quantum group representation.

monomial_coefficients(copy=True)

Return the dictionary of self whose keys are the basis indices and the values are coefficients.

EXAMPLES:

sage: Q = QuantumGroup(['A',2])           # optional - gap_packages
sage: V = Q.highest_weight_module([1,1])  # optional - gap_packages
sage: v = V.highest_weight_vector()       # optional - gap_packages
sage: F1, F2 = Q.F_simple()               # optional - gap_packages
sage: q = Q.q()                           # optional - gap_packages
sage: x = v + F1*v + q*F2*F1*v; x         # optional - gap_packages
1*v0 + F[a1]*v0 + (q^2)*F[a1]*F[a2]*v0 + (q)*F[a1+a2]*v0
sage: sorted(x.monomial_coefficients().items(), key=str)  # optional - gap_packages
[(0, 1), (1, 1), (3, q^2), (4, q)]
sage.algebras.quantum_groups.quantum_group_gap.QuantumGroup

A Drinfel’d-Jimbo quantum group (implemented using the optional GAP package QuaGroup).

EXAMPLES:

We check the quantum Serre relations. We first we import the \(q\)-binomial using the \(q\)-int for quantum groups:

sage: from sage.algebras.quantum_groups.q_numbers import q_binomial

We verify the Serre relations for type \(A_2\):

sage: Q = algebras.QuantumGroup(['A',2])      # optional - gap_packages
sage: F1,F12,F2 = Q.F()                       # optional - gap_packages
sage: q = Q.q()                               # optional - gap_packages
sage: F1^2*F2 - q_binomial(2,1,q) * F1*F2*F1 + F2*F1^2  # optional - gap_packages
0

We verify the Serre relations for type \(B_2\):

sage: Q = algebras.QuantumGroup(['B',2])      # optional - gap_packages
sage: F1, F12, F122, F2 = Q.F()               # optional - gap_packages
sage: F1^2*F2 - q_binomial(2,1,q^2) * F1*F2*F1 + F2*F1^2  # optional - gap_packages
0
sage: (F2^3*F1 - q_binomial(3,1,q) * F2^2*F1*F2  # optional - gap_packages
....:  + q_binomial(3,2,q) * F2*F1*F2^2 - F1*F2^3)
0

REFERENCES:

class sage.algebras.quantum_groups.quantum_group_gap.QuantumGroupHomset(X, Y, category=None, check=True, base=None)

Bases: sage.categories.homset.HomsetWithBase

The homset whose domain is a quantum group.

sage.algebras.quantum_groups.quantum_group_gap.QuantumGroupModule

Abstract base class for quantum group representations.

class sage.algebras.quantum_groups.quantum_group_gap.QuantumGroupMorphism(parent, im_gens, check=True)

Bases: sage.categories.morphism.Morphism

A morphism whose domain is a quantum group.

im_gens()

Return the image of the generators under self.

EXAMPLES:

sage: Q = QuantumGroup(['A',1])   # optional - gap_packages
sage: F, K, Ki, E = Q.gens()      # optional - gap_packages
sage: phi = Q.hom([E, Ki, K, F])  # optional - gap_packages
sage: phi.im_gens()               # optional - gap_packages
(E[a1], (-q + q^-1)*[ K1 ; 1 ] + K1, K1, F[a1])
class sage.algebras.quantum_groups.quantum_group_gap.TensorProductOfHighestWeightModules(*modules, **options)

Bases: sage.algebras.quantum_groups.quantum_group_gap.QuantumGroupModule

Initialize self.

EXAMPLES:

sage: Q = QuantumGroup(['A',2])  # optional - gap_packages
sage: V = Q.highest_weight_module([1,1])  # optional - gap_packages
sage: T = tensor([V,V])  # optional - gap_packages
sage: TestSuite(T).run()  # optional - gap_packages
Element

alias of QuaGroupRepresentationElement

highest_weight_decomposition()

Return the highest weight decomposition of self.

EXAMPLES:

sage: Q = QuantumGroup(['A',2])           # optional - gap_packages
sage: V = Q.highest_weight_module([1,0])  # optional - gap_packages
sage: T = tensor([V,V])                   # optional - gap_packages
sage: T.highest_weight_decomposition()    # optional - gap_packages
[Highest weight submodule with weight 2*Lambda[1] generated by 1*(1*v0<x>1*v0),
 Highest weight submodule with weight Lambda[2] generated by -q^-1*(1*v0<x>F[a1]*v0) + 1*(F[a1]*v0<x>1*v0)]
highest_weight_vectors()

Return the highest weight vectors of self.

EXAMPLES:

sage: Q = QuantumGroup(['A',2])           # optional - gap_packages
sage: V = Q.highest_weight_module([1,0])  # optional - gap_packages
sage: T = tensor([V,V])                   # optional - gap_packages
sage: T.highest_weight_vectors()          # optional - gap_packages
[1*(1*v0<x>1*v0), -q^-1*(1*v0<x>F[a1]*v0) + 1*(F[a1]*v0<x>1*v0)]
some_elements()

Return the highest weight vectors of self.

EXAMPLES:

sage: Q = QuantumGroup(['A',2])           # optional - gap_packages
sage: V = Q.highest_weight_module([1,0])  # optional - gap_packages
sage: T = tensor([V,V])                   # optional - gap_packages
sage: T.highest_weight_vectors()          # optional - gap_packages
[1*(1*v0<x>1*v0), -q^-1*(1*v0<x>F[a1]*v0) + 1*(F[a1]*v0<x>1*v0)]
sage.algebras.quantum_groups.quantum_group_gap.projection_lower_half(Q)

Return the projection onto the lower half of the quantum group.

EXAMPLES:

sage: from sage.algebras.quantum_groups.quantum_group_gap import projection_lower_half
sage: Q = QuantumGroup(['G',2])               # optional - gap_packages
sage: phi = projection_lower_half(Q); phi     # optional - gap_packages
Quantum group homomorphism endomorphism of Quantum Group of type ['G', 2] with q=q
  Defn: F[a1] |--> F[a1]
        F[a2] |--> F[a2]
        K1 |--> 0
        K2 |--> 0
        (-q + q^-1)*[ K1 ; 1 ] + K1 |--> 0
        (-q^3 + q^-3)*[ K2 ; 1 ] + K2 |--> 0
        E[a1] |--> 0
        E[a2] |--> 0
sage: all(phi(f) == f for f in Q.F())         # optional - gap_packages
True
sage: all(phi(e) == Q.zero() for e in Q.E())  # optional - gap_packages
True
sage: all(phi(K) == Q.zero() for K in Q.K())  # optional - gap_packages
True