Center of a Universal Enveloping Algebra

AUTHORS:

  • Travis Scrimshaw (2024-01-02): Initial version

class sage.algebras.lie_algebras.center_uea.CenterIndices(center, indices=None)[source]

Bases: IndexedFreeAbelianMonoid

Set of basis indices for the center of a universal enveloping algebra.

This also constructs the lift from the center to the universal enveloping algebra as part of computing the generators and basis elements. The basic algorithm is to construct the centralizer of each filtered component in increasing order (as each is a finite dimensional vector space). For more precise details, see [Motsak2006].

degree(m)[source]

Return the degre of m in self.

EXAMPLES:

sage: g = LieAlgebra(QQ, cartan_type=['E', 6])
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: I = Z.indices()
sage: [I.degree(g) for g in I.monoid_generators()]
[2, 5, 6, 8, 9, 12]
sage: [(elt, I.degree(elt)) for elt in I.some_elements()]
[(1, 0), (Z[0], 2), (Z[0]^2, 4), (Z[1], 5), (Z[0]^3*Z[1], 11),
 (Z[0]^10, 20), (Z[0]*Z[1]^4, 22)]
>>> from sage.all import *
>>> g = LieAlgebra(QQ, cartan_type=['E', Integer(6)])
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> I = Z.indices()
>>> [I.degree(g) for g in I.monoid_generators()]
[2, 5, 6, 8, 9, 12]
>>> [(elt, I.degree(elt)) for elt in I.some_elements()]
[(1, 0), (Z[0], 2), (Z[0]^2, 4), (Z[1], 5), (Z[0]^3*Z[1], 11),
 (Z[0]^10, 20), (Z[0]*Z[1]^4, 22)]
lift_on_basis(m)[source]

Return the image of the basis element indexed by m in the universal enveloping algebra.

EXAMPLES:

sage: g = lie_algebras.Heisenberg(QQ, 3)
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: I = Z.indices()
sage: z0 = I.monoid_generators()[0]
sage: I._lift_map
{0: {1: 1}}
sage: I.lift_on_basis(z0)
PBW['z']
sage: I._lift_map
{0: {1: 1}, 1: {PBW['z']: PBW['z']}}
sage: I.lift_on_basis(z0^3)
PBW['z']^3
sage: I._lift_map
{0: {1: 1}, 1: {PBW['z']: PBW['z']}}
sage: I._construct_next_degree()
sage: I._construct_next_degree()
sage: I._lift_map
{0: {1: 1},
 1: {PBW['z']: PBW['z']},
 2: {PBW['z']^2: PBW['z']^2},
 3: {PBW['z']^3: PBW['z']^3}}
sage: I.lift_on_basis(z0^3)
PBW['z']^3
>>> from sage.all import *
>>> g = lie_algebras.Heisenberg(QQ, Integer(3))
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> I = Z.indices()
>>> z0 = I.monoid_generators()[Integer(0)]
>>> I._lift_map
{0: {1: 1}}
>>> I.lift_on_basis(z0)
PBW['z']
>>> I._lift_map
{0: {1: 1}, 1: {PBW['z']: PBW['z']}}
>>> I.lift_on_basis(z0**Integer(3))
PBW['z']^3
>>> I._lift_map
{0: {1: 1}, 1: {PBW['z']: PBW['z']}}
>>> I._construct_next_degree()
>>> I._construct_next_degree()
>>> I._lift_map
{0: {1: 1},
 1: {PBW['z']: PBW['z']},
 2: {PBW['z']^2: PBW['z']^2},
 3: {PBW['z']^3: PBW['z']^3}}
>>> I.lift_on_basis(z0**Integer(3))
PBW['z']^3
some_elements()[source]

Return some elements of self.

EXAMPLES:

sage: g = lie_algebras.pwitt(GF(3), 3)
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: I = Z.indices()
sage: I.some_elements()
[1, Z[0], Z[1], Z[2], Z[0]*Z[1]*Z[2], Z[0]*Z[2]^4, Z[0]^4*Z[1]^3]
>>> from sage.all import *
>>> g = lie_algebras.pwitt(GF(Integer(3)), Integer(3))
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> I = Z.indices()
>>> I.some_elements()
[1, Z[0], Z[1], Z[2], Z[0]*Z[1]*Z[2], Z[0]*Z[2]^4, Z[0]^4*Z[1]^3]
class sage.algebras.lie_algebras.center_uea.CenterUEA(g, UEA)[source]

Bases: CombinatorialFreeModule

The center of a universal enveloping algebra.

Todo

Generalize this to be the centralizer of any set of the UEA.

Todo

For characteristic \(p > 0\), implement the \(p\)-center of a simple Lie algebra. See, e.g.,

EXAMPLES:

sage: g = LieAlgebra(QQ, cartan_type=['A', 2])
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: B = Z.basis()
sage: it = iter(B)
sage: center_elts = [next(it) for _ in range(6)]; center_elts
[1, Z[0], Z[1], Z[0]^2, Z[0]*Z[1], Z[1]^2]
sage: elts = [U(v) for v in center_elts]  # long time
sage: all(v * g == g * v for g in U.algebra_generators() for v in elts)  # long time
True
>>> from sage.all import *
>>> g = LieAlgebra(QQ, cartan_type=['A', Integer(2)])
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> B = Z.basis()
>>> it = iter(B)
>>> center_elts = [next(it) for _ in range(Integer(6))]; center_elts
[1, Z[0], Z[1], Z[0]^2, Z[0]*Z[1], Z[1]^2]
>>> elts = [U(v) for v in center_elts]  # long time
>>> all(v * g == g * v for g in U.algebra_generators() for v in elts)  # long time
True

The Heisenberg Lie algebra \(H_4\) over a finite field; note the basis elements \(b^p \in Z(U(H_4))\) for the basis elements \(b \in H_4\):

sage: g = lie_algebras.Heisenberg(GF(3), 4)
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: B = Z.basis()
sage: it = iter(B)
sage: center_elts = [next(it) for _ in range(12)]; center_elts
[1, Z[0], Z[0]^2, Z[0]^3, Z[1], Z[2], Z[3], Z[4], Z[5], Z[6], Z[7], Z[8]]
sage: elts = [U(v) for v in center_elts]; elts
[1, PBW['z'], PBW['z']^2, PBW['z']^3, PBW['p1']^3, PBW['p2']^3, PBW['p3']^3,
 PBW['p4']^3, PBW['q1']^3, PBW['q2']^3, PBW['q3']^3, PBW['q4']^3]
sage: all(v * g == g * v for g in U.algebra_generators() for v in elts)
True
>>> from sage.all import *
>>> g = lie_algebras.Heisenberg(GF(Integer(3)), Integer(4))
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> B = Z.basis()
>>> it = iter(B)
>>> center_elts = [next(it) for _ in range(Integer(12))]; center_elts
[1, Z[0], Z[0]^2, Z[0]^3, Z[1], Z[2], Z[3], Z[4], Z[5], Z[6], Z[7], Z[8]]
>>> elts = [U(v) for v in center_elts]; elts
[1, PBW['z'], PBW['z']^2, PBW['z']^3, PBW['p1']^3, PBW['p2']^3, PBW['p3']^3,
 PBW['p4']^3, PBW['q1']^3, PBW['q2']^3, PBW['q3']^3, PBW['q4']^3]
>>> all(v * g == g * v for g in U.algebra_generators() for v in elts)
True

An example with a free 4-step nilpotent Lie algebras on 2 generators:

sage: L = LieAlgebra(QQ, 2, step=4); L
Free Nilpotent Lie algebra on 8 generators
 (X_1, X_2, X_12, X_112, X_122, X_1112, X_1122, X_1222) over Rational Field
sage: U = L.pbw_basis()
sage: Z = U.center()
sage: it = iter(Z.basis())
sage: center_elts = [next(it) for _ in range(10)]; center_elts
[1, Z[0], Z[1], Z[2], Z[0]^2, Z[0]*Z[1], Z[0]*Z[2], Z[1]^2, Z[1]*Z[2], Z[2]^2]
sage: elts = [U(v) for v in center_elts]; elts
[1, PBW[(1, 1, 1, 2)], PBW[(1, 1, 2, 2)], PBW[(1, 2, 2, 2)], PBW[(1, 1, 1, 2)]^2,
 PBW[(1, 1, 1, 2)]*PBW[(1, 1, 2, 2)], PBW[(1, 1, 1, 2)]*PBW[(1, 2, 2, 2)],
 PBW[(1, 1, 2, 2)]^2, PBW[(1, 1, 2, 2)]*PBW[(1, 2, 2, 2)], PBW[(1, 2, 2, 2)]^2]
sage: all(v * g == g * v for g in U.algebra_generators() for v in elts)
True
>>> from sage.all import *
>>> L = LieAlgebra(QQ, Integer(2), step=Integer(4)); L
Free Nilpotent Lie algebra on 8 generators
 (X_1, X_2, X_12, X_112, X_122, X_1112, X_1122, X_1222) over Rational Field
>>> U = L.pbw_basis()
>>> Z = U.center()
>>> it = iter(Z.basis())
>>> center_elts = [next(it) for _ in range(Integer(10))]; center_elts
[1, Z[0], Z[1], Z[2], Z[0]^2, Z[0]*Z[1], Z[0]*Z[2], Z[1]^2, Z[1]*Z[2], Z[2]^2]
>>> elts = [U(v) for v in center_elts]; elts
[1, PBW[(1, 1, 1, 2)], PBW[(1, 1, 2, 2)], PBW[(1, 2, 2, 2)], PBW[(1, 1, 1, 2)]^2,
 PBW[(1, 1, 1, 2)]*PBW[(1, 1, 2, 2)], PBW[(1, 1, 1, 2)]*PBW[(1, 2, 2, 2)],
 PBW[(1, 1, 2, 2)]^2, PBW[(1, 1, 2, 2)]*PBW[(1, 2, 2, 2)], PBW[(1, 2, 2, 2)]^2]
>>> all(v * g == g * v for g in U.algebra_generators() for v in elts)
True

Using the Engel Lie algebra:

sage: L.<X,Y,Z> = LieAlgebra(QQ, {('X','Y'): {'Z': 1}}, nilpotent=True)
sage: U = L.pbw_basis()
sage: Z = U.center()
sage: it = iter(Z.basis())
sage: center_elts = [next(it) for _ in range(6)]; center_elts
[1, Z[0], Z[0]^2, Z[0]^3, Z[0]^4, Z[0]^5]
sage: elts = [U(v) for v in center_elts]; elts
[1, PBW['Z'], PBW['Z']^2, PBW['Z']^3, PBW['Z']^4, PBW['Z']^5]
sage: all(v * g == g * v for g in U.algebra_generators() for v in elts)
True
>>> from sage.all import *
>>> L = LieAlgebra(QQ, {('X','Y'): {'Z': Integer(1)}}, nilpotent=True, names=('X', 'Y', 'Z',)); (X, Y, Z,) = L._first_ngens(3)
>>> U = L.pbw_basis()
>>> Z = U.center()
>>> it = iter(Z.basis())
>>> center_elts = [next(it) for _ in range(Integer(6))]; center_elts
[1, Z[0], Z[0]^2, Z[0]^3, Z[0]^4, Z[0]^5]
>>> elts = [U(v) for v in center_elts]; elts
[1, PBW['Z'], PBW['Z']^2, PBW['Z']^3, PBW['Z']^4, PBW['Z']^5]
>>> all(v * g == g * v for g in U.algebra_generators() for v in elts)
True
algebra_generators()[source]

Return the algebra generators of self.

Warning

When the universal enveloping algebra is not known to have a finite generating set, the generating set will be the basis of self in a degree (weakly) increasing order indexed by \(\ZZ_{\geq 0}\). In particular, the \(0\)-th generator will be the multiplicative identity \(1\).

EXAMPLES:

sage: g = lie_algebras.Heisenberg(QQ, 3)
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: Z.algebra_generators()[0]
1
sage: Z.algebra_generators()[1]
Z[0]

sage: g = LieAlgebra(QQ, cartan_type=['G', 2])
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: Z.algebra_generators()
Finite family {0: Z[0], 1: Z[1]}
>>> from sage.all import *
>>> g = lie_algebras.Heisenberg(QQ, Integer(3))
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> Z.algebra_generators()[Integer(0)]
1
>>> Z.algebra_generators()[Integer(1)]
Z[0]

>>> g = LieAlgebra(QQ, cartan_type=['G', Integer(2)])
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> Z.algebra_generators()
Finite family {0: Z[0], 1: Z[1]}
ambient()[source]

Return the ambient algebra of self.

EXAMPLES:

sage: g = LieAlgebra(GF(5), cartan_type=['A', 2])
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: Z.ambient() is U
True
>>> from sage.all import *
>>> g = LieAlgebra(GF(Integer(5)), cartan_type=['A', Integer(2)])
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> Z.ambient() is U
True
degree_on_basis(m)[source]

Return the degree of the basis element indexed by m in self.

EXAMPLES:

sage: g = LieAlgebra(QQ, cartan_type=['E', 6])
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: I = Z.indices()
sage: it = iter(I)
sage: supports = [next(it) for _ in range(10)]; supports
[1, Z[0], Z[0]^2, Z[1], Z[2], Z[0]^3, Z[0]*Z[1], Z[3], Z[0]*Z[2], Z[0]^4]
sage: [Z.degree_on_basis(m) for m in supports]
[0, 2, 4, 5, 6, 6, 7, 8, 8, 8]
>>> from sage.all import *
>>> g = LieAlgebra(QQ, cartan_type=['E', Integer(6)])
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> I = Z.indices()
>>> it = iter(I)
>>> supports = [next(it) for _ in range(Integer(10))]; supports
[1, Z[0], Z[0]^2, Z[1], Z[2], Z[0]^3, Z[0]*Z[1], Z[3], Z[0]*Z[2], Z[0]^4]
>>> [Z.degree_on_basis(m) for m in supports]
[0, 2, 4, 5, 6, 6, 7, 8, 8, 8]
lift()[source]

The lift map from self to the universal enveloping algebra.

EXAMPLES:

sage: g = LieAlgebra(QQ, cartan_type=['A', 1])
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: gens = Z.algebra_generators()
sage: U(gens[0]^2 + gens[0])
4*PBW[alpha[1]]^2*PBW[-alpha[1]]^2
 + 2*PBW[alpha[1]]*PBW[alphacheck[1]]^2*PBW[-alpha[1]]
 + 1/4*PBW[alphacheck[1]]^4 - PBW[alphacheck[1]]^3
 - 2*PBW[alpha[1]]*PBW[-alpha[1]] + 1/2*PBW[alphacheck[1]]^2
 + PBW[alphacheck[1]]
sage: U(-1/4*gens[0]) == U.casimir_element()
True
>>> from sage.all import *
>>> g = LieAlgebra(QQ, cartan_type=['A', Integer(1)])
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> gens = Z.algebra_generators()
>>> U(gens[Integer(0)]**Integer(2) + gens[Integer(0)])
4*PBW[alpha[1]]^2*PBW[-alpha[1]]^2
 + 2*PBW[alpha[1]]*PBW[alphacheck[1]]^2*PBW[-alpha[1]]
 + 1/4*PBW[alphacheck[1]]^4 - PBW[alphacheck[1]]^3
 - 2*PBW[alpha[1]]*PBW[-alpha[1]] + 1/2*PBW[alphacheck[1]]^2
 + PBW[alphacheck[1]]
>>> U(-Integer(1)/Integer(4)*gens[Integer(0)]) == U.casimir_element()
True
one_basis()[source]

Return the basis index of \(1\) in self.

EXAMPLES:

sage: g = LieAlgebra(QQ['t'].fraction_field(), cartan_type=['B', 5])
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: ob = Z.one_basis(); ob
1
sage: ob.parent() is Z.indices()
True
>>> from sage.all import *
>>> g = LieAlgebra(QQ['t'].fraction_field(), cartan_type=['B', Integer(5)])
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> ob = Z.one_basis(); ob
1
>>> ob.parent() is Z.indices()
True
product_on_basis(left, right)[source]

Return the product of basis elements indexed by left and right.

EXAMPLES:

sage: g = LieAlgebra(QQ, cartan_type=['E', 6])
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: mg = Z.indices().monoid_generators()
sage: Z.product_on_basis(mg[1]*mg[2], mg[0]*mg[1]^3*mg[2]*mg[3]^3)
Z[0]*Z[1]^4*Z[2]^2*Z[3]^3
>>> from sage.all import *
>>> g = LieAlgebra(QQ, cartan_type=['E', Integer(6)])
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> mg = Z.indices().monoid_generators()
>>> Z.product_on_basis(mg[Integer(1)]*mg[Integer(2)], mg[Integer(0)]*mg[Integer(1)]**Integer(3)*mg[Integer(2)]*mg[Integer(3)]**Integer(3))
Z[0]*Z[1]^4*Z[2]^2*Z[3]^3
retract(elt)[source]

The retraction map to self from the universal enveloping algebra.

Todo

Implement a version of this that checks if the leading term of elt is divisible by a product of all of the currently known generators in order to avoid constructing the full centralizer of larger degrees than needed.

EXAMPLES:

sage: g = lie_algebras.Heisenberg(QQ, 3)
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: z0 = Z.algebra_generators()[1]; z0
Z[0]
sage: Z.retract(U(z0^2) - U(3*z0))
Z[0]^2 - 3*Z[0]

sage: g = LieAlgebra(QQ, cartan_type=['A', 2])
sage: U = g.pbw_basis()
sage: Z = U.center()
sage: z0, z1 = Z.algebra_generators()
sage: Z.retract(U(z0*z0) - U(z1))  # long time
Z[0]^2 - Z[1]
sage: zc = Z.retract(U.casimir_element()); zc
-1/3*Z[0]
sage: U(zc) == U.casimir_element()
True
>>> from sage.all import *
>>> g = lie_algebras.Heisenberg(QQ, Integer(3))
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> z0 = Z.algebra_generators()[Integer(1)]; z0
Z[0]
>>> Z.retract(U(z0**Integer(2)) - U(Integer(3)*z0))
Z[0]^2 - 3*Z[0]

>>> g = LieAlgebra(QQ, cartan_type=['A', Integer(2)])
>>> U = g.pbw_basis()
>>> Z = U.center()
>>> z0, z1 = Z.algebra_generators()
>>> Z.retract(U(z0*z0) - U(z1))  # long time
Z[0]^2 - Z[1]
>>> zc = Z.retract(U.casimir_element()); zc
-1/3*Z[0]
>>> U(zc) == U.casimir_element()
True
class sage.algebras.lie_algebras.center_uea.SimpleLieCenterIndices(center)[source]

Bases: CenterIndices

Set of basis indices for the center of a universal enveloping algebra of a simple Lie algebra.

For more information, see CenterIndices.