Center of a Universal Enveloping Algebra - Algebras

Skip to content
Back to top
View this page
Edit this page

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

  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)

    Return the degre of `m` in `self`.

    EXAMPLES:

    Sage

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

    Python

        >>> 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)

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

    EXAMPLES:

    Sage

        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

    Python

        >>> 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()

    Return some elements of `self`.

    EXAMPLES:

    Sage

        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]

    Python

        >>> 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)

  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.,

  - Theorem 5.12 of [Motsak2006]

  - http://www.math.kobe-u.ac.jp/icms2006/icms2006-video/slides/059.pdf

  EXAMPLES:

  Sage

      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

  Python

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

      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

  [Python]

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

      sage: L = LieAlgebra(QQ, 2, step=4); L
      Free Nilpotent Lie algebra of rank 2 and step 4 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

  Python

      >>> from sage.all import *
      >>> L = LieAlgebra(QQ, Integer(2), step=Integer(4)); L
      Free Nilpotent Lie algebra of rank 2 and step 4 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

      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

  [Python]

      >>> 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()

    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

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

    Python

        >>> 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()

    Return the ambient algebra of `self`.

    EXAMPLES:

    Sage

        sage: g = LieAlgebra(GF(5), cartan_type=['A', 2])
        sage: U = g.pbw_basis()
        sage: Z = U.center()
        sage: Z.ambient() is U
        True

    Python

        >>> 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)

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

    EXAMPLES:

    Sage

        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]

    Python

        >>> 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()

    The lift map from `self` to the universal enveloping algebra.

    EXAMPLES:

    Sage

        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

    Python

        >>> 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()

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

    EXAMPLES:

    Sage

        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

    Python

        >>> 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)

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

    EXAMPLES:

    Sage

        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

    Python

        >>> 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)

    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

        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

    Python

        >>> 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)

  Bases: `CenterIndices`

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

  For more information, see `CenterIndices`.