# 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]#

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]#

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.