The Poincare-Birkhoff-Witt Basis For A Universal Enveloping Algebra#

AUTHORS:

  • Travis Scrimshaw (2013-11-03): Initial version

  • Travis Scrimshaw (2024-01-02): Adding the center

class sage.algebras.lie_algebras.poincare_birkhoff_witt.PoincareBirkhoffWittBasis(g, basis_key, prefix, **kwds)[source]#

Bases: CombinatorialFreeModule

The Poincare-Birkhoff-Witt (PBW) basis of the universal enveloping algebra of a Lie algebra.

Consider a Lie algebra \(\mathfrak{g}\) with ordered basis \((b_1,\dots,b_n)\). Then the universal enveloping algebra \(U(\mathfrak{g})\) is generated by \(b_1,\dots,b_n\) and subject to the relations

\[[b_i, b_j] = \sum_{k = 1}^n c_{ij}^k b_k\]

where \(c_{ij}^k\) are the structure coefficients of \(\mathfrak{g}\). The Poincare-Birkhoff-Witt (PBW) basis is given by the monomials \(b_1^{e_1} b_2^{e_2} \cdots b_n^{e_n}\). Specifically, we can rewrite \(b_j b_i = b_i b_j + [b_j, b_i]\) where \(j > i\), and we can repeat this to sort any monomial into

\[b_{i_1} \cdots b_{i_k} = b_1^{e_1} \cdots b_n^{e_n} + LOT\]

where \(LOT\) are lower order terms. Thus the PBW basis is a filtered basis for \(U(\mathfrak{g})\).

EXAMPLES:

We construct the PBW basis of \(\mathfrak{sl}_2\):

sage: L = lie_algebras.three_dimensional_by_rank(QQ, 3, names=['E','F','H'])
sage: PBW = L.pbw_basis()
>>> from sage.all import *
>>> L = lie_algebras.three_dimensional_by_rank(QQ, Integer(3), names=['E','F','H'])
>>> PBW = L.pbw_basis()

We then do some computations; in particular, we check that \([E, F] = H\):

sage: E,F,H = PBW.algebra_generators()
sage: E*F
PBW['E']*PBW['F']
sage: F*E
PBW['E']*PBW['F'] - PBW['H']
sage: E*F - F*E
PBW['H']
>>> from sage.all import *
>>> E,F,H = PBW.algebra_generators()
>>> E*F
PBW['E']*PBW['F']
>>> F*E
PBW['E']*PBW['F'] - PBW['H']
>>> E*F - F*E
PBW['H']

Next we construct another instance of the PBW basis, but sorted in the reverse order:

sage: def neg_key(x):
....:     return -L.basis().keys().index(x)
sage: PBW2 = L.pbw_basis(prefix='PBW2', basis_key=neg_key)
>>> from sage.all import *
>>> def neg_key(x):
...     return -L.basis().keys().index(x)
>>> PBW2 = L.pbw_basis(prefix='PBW2', basis_key=neg_key)

We then check the multiplication is preserved:

sage: PBW2(E) * PBW2(F)
PBW2['F']*PBW2['E'] + PBW2['H']
sage: PBW2(E*F)
PBW2['F']*PBW2['E'] + PBW2['H']
sage: F * E + H
PBW['E']*PBW['F']
>>> from sage.all import *
>>> PBW2(E) * PBW2(F)
PBW2['F']*PBW2['E'] + PBW2['H']
>>> PBW2(E*F)
PBW2['F']*PBW2['E'] + PBW2['H']
>>> F * E + H
PBW['E']*PBW['F']

We now construct the PBW basis for Lie algebra of regular vector fields on \(\CC^{\times}\):

sage: L = lie_algebras.regular_vector_fields(QQ)
sage: PBW = L.pbw_basis()
sage: G = PBW.algebra_generators()
sage: G[2] * G[3]
PBW[2]*PBW[3]
sage: G[3] * G[2]
PBW[2]*PBW[3] + PBW[5]
sage: G[-2] * G[3] * G[2]
PBW[-2]*PBW[2]*PBW[3] + PBW[-2]*PBW[5]
>>> from sage.all import *
>>> L = lie_algebras.regular_vector_fields(QQ)
>>> PBW = L.pbw_basis()
>>> G = PBW.algebra_generators()
>>> G[Integer(2)] * G[Integer(3)]
PBW[2]*PBW[3]
>>> G[Integer(3)] * G[Integer(2)]
PBW[2]*PBW[3] + PBW[5]
>>> G[-Integer(2)] * G[Integer(3)] * G[Integer(2)]
PBW[-2]*PBW[2]*PBW[3] + PBW[-2]*PBW[5]

Todo

When the Lie algebra is finite dimensional, set the ordering of the basis elements, translate the structure coefficients, and work with fixed-length lists as the exponent vectors. This way we only will run any nontrivial sorting only once and avoid other potentially expensive comparisons between keys.

class Element[source]#

Bases: IndexedFreeModuleElement

algebra_generators()[source]#

Return the algebra generators of self.

EXAMPLES:

sage: L = lie_algebras.sl(QQ, 2)
sage: PBW = L.pbw_basis()
sage: PBW.algebra_generators()
Finite family {alpha[1]: PBW[alpha[1]], alphacheck[1]: PBW[alphacheck[1]], -alpha[1]: PBW[-alpha[1]]}
>>> from sage.all import *
>>> L = lie_algebras.sl(QQ, Integer(2))
>>> PBW = L.pbw_basis()
>>> PBW.algebra_generators()
Finite family {alpha[1]: PBW[alpha[1]], alphacheck[1]: PBW[alphacheck[1]], -alpha[1]: PBW[-alpha[1]]}
casimir_element(order=2, *args, **kwds)[source]#

Return the Casimir element of self.

INPUT:

  • order – (default: 2) the order of the Casimir element

EXAMPLES:

sage: L = LieAlgebra(QQ, cartan_type=['G', 2])
sage: U = L.pbw_basis()
sage: C = U.casimir_element(); C
1/4*PBW[alpha[2]]*PBW[-alpha[2]] + 1/12*PBW[alpha[1]]*PBW[-alpha[1]]
 + 1/12*PBW[alpha[1] + alpha[2]]*PBW[-alpha[1] - alpha[2]] + 1/12*PBW[2*alpha[1] + alpha[2]]*PBW[-2*alpha[1] - alpha[2]]
 + 1/4*PBW[3*alpha[1] + alpha[2]]*PBW[-3*alpha[1] - alpha[2]]
 + 1/4*PBW[3*alpha[1] + 2*alpha[2]]*PBW[-3*alpha[1] - 2*alpha[2]]
 + 1/12*PBW[alphacheck[1]]^2 + 1/4*PBW[alphacheck[1]]*PBW[alphacheck[2]]
 + 1/4*PBW[alphacheck[2]]^2 - 5/12*PBW[alphacheck[1]] - 3/4*PBW[alphacheck[2]]
sage: all(g * C == C * g for g in U.algebra_generators())
True
>>> from sage.all import *
>>> L = LieAlgebra(QQ, cartan_type=['G', Integer(2)])
>>> U = L.pbw_basis()
>>> C = U.casimir_element(); C
1/4*PBW[alpha[2]]*PBW[-alpha[2]] + 1/12*PBW[alpha[1]]*PBW[-alpha[1]]
 + 1/12*PBW[alpha[1] + alpha[2]]*PBW[-alpha[1] - alpha[2]] + 1/12*PBW[2*alpha[1] + alpha[2]]*PBW[-2*alpha[1] - alpha[2]]
 + 1/4*PBW[3*alpha[1] + alpha[2]]*PBW[-3*alpha[1] - alpha[2]]
 + 1/4*PBW[3*alpha[1] + 2*alpha[2]]*PBW[-3*alpha[1] - 2*alpha[2]]
 + 1/12*PBW[alphacheck[1]]^2 + 1/4*PBW[alphacheck[1]]*PBW[alphacheck[2]]
 + 1/4*PBW[alphacheck[2]]^2 - 5/12*PBW[alphacheck[1]] - 3/4*PBW[alphacheck[2]]
>>> all(g * C == C * g for g in U.algebra_generators())
True
center()[source]#

Return the center of self.

See also

CenterUEA

EXAMPLES:

sage: g = LieAlgebra(QQ, cartan_type=['A', 2])
sage: U = g.pbw_basis()
sage: U.center()
Center of Universal enveloping algebra of Lie algebra of ['A', 2]
 in the Chevalley basis in the Poincare-Birkhoff-Witt basis

sage: g = lie_algebras.Heisenberg(GF(3), 4)
sage: U = g.pbw_basis()
sage: U.center()
Center of Universal enveloping algebra of Heisenberg algebra of rank 4
 over Finite Field of size 3 in the Poincare-Birkhoff-Witt basis
>>> from sage.all import *
>>> g = LieAlgebra(QQ, cartan_type=['A', Integer(2)])
>>> U = g.pbw_basis()
>>> U.center()
Center of Universal enveloping algebra of Lie algebra of ['A', 2]
 in the Chevalley basis in the Poincare-Birkhoff-Witt basis

>>> g = lie_algebras.Heisenberg(GF(Integer(3)), Integer(4))
>>> U = g.pbw_basis()
>>> U.center()
Center of Universal enveloping algebra of Heisenberg algebra of rank 4
 over Finite Field of size 3 in the Poincare-Birkhoff-Witt basis
degree_on_basis(m)[source]#

Return the degree of the basis element indexed by m.

EXAMPLES:

sage: L = lie_algebras.sl(QQ, 2)
sage: PBW = L.pbw_basis()
sage: E,H,F = PBW.algebra_generators()
sage: PBW.degree_on_basis(E.leading_support())
1
sage: m = ((H*F)^10).trailing_support(key=PBW._monomial_key)  # long time
sage: PBW.degree_on_basis(m)  # long time
20
sage: ((H*F*E)^4).maximal_degree()  # long time
12
>>> from sage.all import *
>>> L = lie_algebras.sl(QQ, Integer(2))
>>> PBW = L.pbw_basis()
>>> E,H,F = PBW.algebra_generators()
>>> PBW.degree_on_basis(E.leading_support())
1
>>> m = ((H*F)**Integer(10)).trailing_support(key=PBW._monomial_key)  # long time
>>> PBW.degree_on_basis(m)  # long time
20
>>> ((H*F*E)**Integer(4)).maximal_degree()  # long time
12
gens()[source]#

Return the algebra generators of self.

EXAMPLES:

sage: L = lie_algebras.sl(QQ, 2)
sage: PBW = L.pbw_basis()
sage: PBW.algebra_generators()
Finite family {alpha[1]: PBW[alpha[1]], alphacheck[1]: PBW[alphacheck[1]], -alpha[1]: PBW[-alpha[1]]}
>>> from sage.all import *
>>> L = lie_algebras.sl(QQ, Integer(2))
>>> PBW = L.pbw_basis()
>>> PBW.algebra_generators()
Finite family {alpha[1]: PBW[alpha[1]], alphacheck[1]: PBW[alphacheck[1]], -alpha[1]: PBW[-alpha[1]]}
lie_algebra()[source]#

Return the underlying Lie algebra of self.

EXAMPLES:

sage: L = lie_algebras.sl(QQ, 2)
sage: PBW = L.pbw_basis()
sage: PBW.lie_algebra() is L
True
>>> from sage.all import *
>>> L = lie_algebras.sl(QQ, Integer(2))
>>> PBW = L.pbw_basis()
>>> PBW.lie_algebra() is L
True
one_basis()[source]#

Return the basis element indexing \(1\).

EXAMPLES:

sage: L = lie_algebras.three_dimensional_by_rank(QQ, 3, names=['E','F','H'])
sage: PBW = L.pbw_basis()
sage: ob = PBW.one_basis(); ob
1
sage: ob.parent()
Free abelian monoid indexed by {'E', 'F', 'H'}
>>> from sage.all import *
>>> L = lie_algebras.three_dimensional_by_rank(QQ, Integer(3), names=['E','F','H'])
>>> PBW = L.pbw_basis()
>>> ob = PBW.one_basis(); ob
1
>>> ob.parent()
Free abelian monoid indexed by {'E', 'F', 'H'}
product_on_basis(lhs, rhs)[source]#

Return the product of the two basis elements lhs and rhs.

EXAMPLES:

sage: L = lie_algebras.three_dimensional_by_rank(QQ, 3, names=['E','F','H'])
sage: PBW = L.pbw_basis()
sage: I = PBW.indices()
sage: PBW.product_on_basis(I.gen('E'), I.gen('F'))
PBW['E']*PBW['F']
sage: PBW.product_on_basis(I.gen('E'), I.gen('H'))
PBW['E']*PBW['H']
sage: PBW.product_on_basis(I.gen('H'), I.gen('E'))
PBW['E']*PBW['H'] + 2*PBW['E']
sage: PBW.product_on_basis(I.gen('F'), I.gen('E'))
PBW['E']*PBW['F'] - PBW['H']
sage: PBW.product_on_basis(I.gen('F'), I.gen('H'))
PBW['F']*PBW['H']
sage: PBW.product_on_basis(I.gen('H'), I.gen('F'))
PBW['F']*PBW['H'] - 2*PBW['F']
sage: PBW.product_on_basis(I.gen('H')**2, I.gen('F')**2)
PBW['F']^2*PBW['H']^2 - 8*PBW['F']^2*PBW['H'] + 16*PBW['F']^2

sage: E,F,H = PBW.algebra_generators()
sage: E*F - F*E
PBW['H']
sage: H * F * E
PBW['E']*PBW['F']*PBW['H'] - PBW['H']^2
sage: E * F * H * E
PBW['E']^2*PBW['F']*PBW['H'] + 2*PBW['E']^2*PBW['F']
 - PBW['E']*PBW['H']^2 - 2*PBW['E']*PBW['H']
>>> from sage.all import *
>>> L = lie_algebras.three_dimensional_by_rank(QQ, Integer(3), names=['E','F','H'])
>>> PBW = L.pbw_basis()
>>> I = PBW.indices()
>>> PBW.product_on_basis(I.gen('E'), I.gen('F'))
PBW['E']*PBW['F']
>>> PBW.product_on_basis(I.gen('E'), I.gen('H'))
PBW['E']*PBW['H']
>>> PBW.product_on_basis(I.gen('H'), I.gen('E'))
PBW['E']*PBW['H'] + 2*PBW['E']
>>> PBW.product_on_basis(I.gen('F'), I.gen('E'))
PBW['E']*PBW['F'] - PBW['H']
>>> PBW.product_on_basis(I.gen('F'), I.gen('H'))
PBW['F']*PBW['H']
>>> PBW.product_on_basis(I.gen('H'), I.gen('F'))
PBW['F']*PBW['H'] - 2*PBW['F']
>>> PBW.product_on_basis(I.gen('H')**Integer(2), I.gen('F')**Integer(2))
PBW['F']^2*PBW['H']^2 - 8*PBW['F']^2*PBW['H'] + 16*PBW['F']^2

>>> E,F,H = PBW.algebra_generators()
>>> E*F - F*E
PBW['H']
>>> H * F * E
PBW['E']*PBW['F']*PBW['H'] - PBW['H']^2
>>> E * F * H * E
PBW['E']^2*PBW['F']*PBW['H'] + 2*PBW['E']^2*PBW['F']
 - PBW['E']*PBW['H']^2 - 2*PBW['E']*PBW['H']