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
inself
.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
inself
.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
andright
.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
.