Quotients of Lie algebras - Algebras

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

# Quotients of Lie algebras

AUTHORS:

- Eero Hakavuori (2018-09-02): initial version

class sage.algebras.lie_algebras.quotient.LieQuotient_finite_dimensional_with_basis(L, I, names, index_set, index_set_mapping, category=None)

  Bases: `LieAlgebraWithStructureCoefficients`

  A quotient Lie algebra.

  INPUT:

  - `I` – an ideal or a list of generators of the ideal

  - `ambient` – (optional) the Lie algebra to be quotiented; will be deduced from `I` if not given

  - `names` – (optional) string or list of strings; names for the basis elements of the quotient. If `names` is a string, the basis will be named `names_1`,…,``names_n``.

  EXAMPLES:

  The Engel Lie algebra as a quotient of the free nilpotent Lie algebra of step 3 with 2 generators:

  Sage

      sage: L = LieAlgebra(QQ, 2, step=3)
      sage: L.inject_variables()
      Defining X_1, X_2, X_12, X_112, X_122
      sage: I = L.ideal(X_122)
      sage: E = L.quotient(I); E
      Lie algebra quotient L/I of dimension 4 over Rational Field where
      L: Free Nilpotent Lie algebra of rank 2 and step 3 over Rational Field
      I: Ideal (X_122)
      sage: E.category()
      Join of Category of finite dimensional nilpotent Lie algebras with basis
       over Rational Field and Category of subquotients of sets
      sage: E.basis().list()
      [X_1, X_2, X_12, X_112]
      sage: E.inject_variables()
      Defining X_1, X_2, X_12, X_112
      sage: X_1.bracket(X_2)
      X_12
      sage: X_1.bracket(X_12)
      X_112
      sage: X_2.bracket(X_12)
      0

  Python

      >>> from sage.all import *
      >>> L = LieAlgebra(QQ, Integer(2), step=Integer(3))
      >>> L.inject_variables()
      Defining X_1, X_2, X_12, X_112, X_122
      >>> I = L.ideal(X_122)
      >>> E = L.quotient(I); E
      Lie algebra quotient L/I of dimension 4 over Rational Field where
      L: Free Nilpotent Lie algebra of rank 2 and step 3 over Rational Field
      I: Ideal (X_122)
      >>> E.category()
      Join of Category of finite dimensional nilpotent Lie algebras with basis
       over Rational Field and Category of subquotients of sets
      >>> E.basis().list()
      [X_1, X_2, X_12, X_112]
      >>> E.inject_variables()
      Defining X_1, X_2, X_12, X_112
      >>> X_1.bracket(X_2)
      X_12
      >>> X_1.bracket(X_12)
      X_112
      >>> X_2.bracket(X_12)
      0

  Shorthand for taking a quotient without creating an ideal first:

  Sage

      sage: E2 = L.quotient(X_122); E2
      Lie algebra quotient L/I of dimension 4 over Rational Field where
      L: Free Nilpotent Lie algebra of rank 2 and step 3 over Rational Field
      I: Ideal (X_122)
      sage: E is E2
      True

  [Python]

      >>> from sage.all import *
      >>> E2 = L.quotient(X_122); E2
      Lie algebra quotient L/I of dimension 4 over Rational Field where
      L: Free Nilpotent Lie algebra of rank 2 and step 3 over Rational Field
      I: Ideal (X_122)
      >>> E is E2
      True

  Custom names for the basis can be given:

  Sage

      sage: E.<X,Y,Z,W> = L.quotient(X_122)
      sage: E.basis().list()
      [X, Y, Z, W]
      sage: X.bracket(Z)
      W
      sage: Y.bracket(Z)
      0

  Python

      >>> from sage.all import *
      >>> E = L.quotient(X_122, names=('X', 'Y', 'Z', 'W',)); (X, Y, Z, W,) = E._first_ngens(4)
      >>> E.basis().list()
      [X, Y, Z, W]
      >>> X.bracket(Z)
      W
      >>> Y.bracket(Z)
      0

  The elements can be relabeled linearly by passing a string to the `names` parameter:

  Sage

      sage: E = L.quotient(X_122, names='Y')
      sage: E.basis().list()
      [Y_1, Y_2, Y_3, Y_4]
      sage: E.inject_variables()
      Defining Y_1, Y_2, Y_3, Y_4
      sage: Y_1.bracket(Y_3)
      Y_4
      sage: Y_2.bracket(Y_3)
      0

  [Python]

      >>> from sage.all import *
      >>> E = L.quotient(X_122, names='Y')
      >>> E.basis().list()
      [Y_1, Y_2, Y_3, Y_4]
      >>> E.inject_variables()
      Defining Y_1, Y_2, Y_3, Y_4
      >>> Y_1.bracket(Y_3)
      Y_4
      >>> Y_2.bracket(Y_3)
      0

  Conversion from the ambient Lie algebra uses the quotient projection:

  Sage

      sage: L = LieAlgebra(QQ, 2, step=3)
      sage: L.inject_variables()
      Defining X_1, X_2, X_12, X_112, X_122
      sage: E = L.quotient(X_122, names='Y')
      sage: E(X_1), E(X_2), E(X_12), E(X_112), E(X_122)
      (Y_1, Y_2, Y_3, Y_4, 0)

  Python

      >>> from sage.all import *
      >>> L = LieAlgebra(QQ, Integer(2), step=Integer(3))
      >>> L.inject_variables()
      Defining X_1, X_2, X_12, X_112, X_122
      >>> E = L.quotient(X_122, names='Y')
      >>> E(X_1), E(X_2), E(X_12), E(X_112), E(X_122)
      (Y_1, Y_2, Y_3, Y_4, 0)

  A non-stratifiable Lie algebra as a quotient of the free nilpotent Lie algebra of step 4 on 2 generators by the relation \([X_2, [X_1, X_2]] = [X_1, [X_1, [X_1, X_2]]]\):

  Sage

      sage: L = LieAlgebra(QQ, 2, step=4)
      sage: X_1, X_2 = L.homogeneous_component_basis(1)
      sage: rel = L[X_2, [X_1, X_2]] - L[X_1, [X_1, [X_1, X_2]]]
      sage: Q = L.quotient(rel, names='Y')
      sage: Q.dimension()
      5
      sage: Q.inject_variables()
      Defining Y_1, Y_2, Y_3, Y_4, Y_5
      sage: lcs = Q.lower_central_series()
      sage: [I.basis().list() for I in lcs]
      [[Y_1, Y_2, Y_3, Y_4, Y_5], [Y_3, Y_4, Y_5], [Y_4, Y_5], [Y_5], []]
      sage: Y_2.bracket(Y_3)
      -Y_5

  [Python]

      >>> from sage.all import *
      >>> L = LieAlgebra(QQ, Integer(2), step=Integer(4))
      >>> X_1, X_2 = L.homogeneous_component_basis(Integer(1))
      >>> rel = L[X_2, [X_1, X_2]] - L[X_1, [X_1, [X_1, X_2]]]
      >>> Q = L.quotient(rel, names='Y')
      >>> Q.dimension()
      5
      >>> Q.inject_variables()
      Defining Y_1, Y_2, Y_3, Y_4, Y_5
      >>> lcs = Q.lower_central_series()
      >>> [I.basis().list() for I in lcs]
      [[Y_1, Y_2, Y_3, Y_4, Y_5], [Y_3, Y_4, Y_5], [Y_4, Y_5], [Y_5], []]
      >>> Y_2.bracket(Y_3)
      -Y_5

  Quotients when the base ring is not a field are not implemented:

  Sage

      sage: L = lie_algebras.Heisenberg(ZZ, 1)
      sage: L.quotient(L.an_element())
      Traceback (most recent call last):
      ...
      NotImplementedError: quotients over non-fields not implemented

  Python

      >>> from sage.all import *
      >>> L = lie_algebras.Heisenberg(ZZ, Integer(1))
      >>> L.quotient(L.an_element())
      Traceback (most recent call last):
      ...
      NotImplementedError: quotients over non-fields not implemented

  ambient()

    Return the ambient Lie algebra of `self`.

    EXAMPLES:

    Sage

        sage: L.<x,y,z> = LieAlgebra(QQ, 2, step=2)
        sage: Q = L.quotient(z)
        sage: Q.ambient() == L
        True

    Python

        >>> from sage.all import *
        >>> L = LieAlgebra(QQ, Integer(2), step=Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = L._first_ngens(3)
        >>> Q = L.quotient(z)
        >>> Q.ambient() == L
        True

  defining_ideal()

    Return the ideal generating this quotient Lie algebra.

    EXAMPLES:

    Sage

        sage: L = lie_algebras.Heisenberg(QQ, 1)
        sage: p,q,z = L.basis()
        sage: Q = L.quotient(p)
        sage: Q.defining_ideal()
        Ideal (p1) of Heisenberg algebra of rank 1 over Rational Field

    Python

        >>> from sage.all import *
        >>> L = lie_algebras.Heisenberg(QQ, Integer(1))
        >>> p,q,z = L.basis()
        >>> Q = L.quotient(p)
        >>> Q.defining_ideal()
        Ideal (p1) of Heisenberg algebra of rank 1 over Rational Field

  from_vector(v, order=None, coerce=False)

    Return the element of `self` corresponding to the vector `v`.

    INPUT:

    - `v` – a vector in `self.module()` or `self.ambient().module()`

    EXAMPLES:

    An element from a vector of the intrinsic module:

    Sage

        sage: L.<X,Y,Z> = LieAlgebra(QQ, 3, abelian=True)
        sage: Q = L.quotient(X + Y + Z)
        sage: Q.dimension()
        2
        sage: el = Q.from_vector([1, 2]); el
        X + 2*Y
        sage: el.parent() == Q
        True

    Python

        >>> from sage.all import *
        >>> L = LieAlgebra(QQ, Integer(3), abelian=True, names=('X', 'Y', 'Z',)); (X, Y, Z,) = L._first_ngens(3)
        >>> Q = L.quotient(X + Y + Z)
        >>> Q.dimension()
        2
        >>> el = Q.from_vector([Integer(1), Integer(2)]); el
        X + 2*Y
        >>> el.parent() == Q
        True

    An element from a vector of the ambient module:

    Sage

        sage: el = Q.from_vector([1, 2, 3]); el
        -2*X - Y
        sage: el.parent() == Q
        True

    [Python]

        >>> from sage.all import *
        >>> el = Q.from_vector([Integer(1), Integer(2), Integer(3)]); el
        -2*X - Y
        >>> el.parent() == Q
        True

    Check for the trivial ideal:

    Sage

        sage: L.<x,y,z> = LieAlgebra(GF(3), {('x','z'): {'x':1, 'y':1}, ('y','z'): {'y':1}})
        sage: I = L.ideal([])
        sage: Q = L.quotient(I)
        sage: v = Q.an_element().to_vector()
        sage: Q.from_vector(v)
        x + y + z

    Python

        >>> from sage.all import *
        >>> L = LieAlgebra(GF(Integer(3)), {('x','z'): {'x':Integer(1), 'y':Integer(1)}, ('y','z'): {'y':Integer(1)}}, names=('x', 'y', 'z',)); (x, y, z,) = L._first_ngens(3)
        >>> I = L.ideal([])
        >>> Q = L.quotient(I)
        >>> v = Q.an_element().to_vector()
        >>> Q.from_vector(v)
        x + y + z

  lift(X)

    Return some preimage of `X` under the quotient projection into `self`.

    INPUT:

    - `X` – an element of `self`

    EXAMPLES:

    Sage

        sage: L.<x,y,z> = LieAlgebra(QQ, 2, step=2)
        sage: Q = L.quotient(x + y)
        sage: Q(y)
        -x
        sage: el = Q.lift(Q(y)); el
        -x
        sage: el.parent()
        Free Nilpotent Lie algebra of rank 2 and step 2 over Rational Field

    Python

        >>> from sage.all import *
        >>> L = LieAlgebra(QQ, Integer(2), step=Integer(2), names=('x', 'y', 'z',)); (x, y, z,) = L._first_ngens(3)
        >>> Q = L.quotient(x + y)
        >>> Q(y)
        -x
        >>> el = Q.lift(Q(y)); el
        -x
        >>> el.parent()
        Free Nilpotent Lie algebra of rank 2 and step 2 over Rational Field

  retract(X)

    Map `X` under the quotient projection to `self`.

    INPUT:

    - `X` – an element of the ambient Lie algebra

    EXAMPLES:

    Sage

        sage: L = LieAlgebra(QQ, 3, step=2)
        sage: L.inject_variables()
        Defining X_1, X_2, X_3, X_12, X_13, X_23
        sage: Q = L.quotient(X_1 + X_2 + X_3)
        sage: Q.retract(X_1), Q.retract(X_2), Q.retract(X_3)
        (X_1, X_2, -X_1 - X_2)
        sage: all(Q.retract(Q.lift(X)) == X for X in Q.basis())
        True

    Python

        >>> from sage.all import *
        >>> L = LieAlgebra(QQ, Integer(3), step=Integer(2))
        >>> L.inject_variables()
        Defining X_1, X_2, X_3, X_12, X_13, X_23
        >>> Q = L.quotient(X_1 + X_2 + X_3)
        >>> Q.retract(X_1), Q.retract(X_2), Q.retract(X_3)
        (X_1, X_2, -X_1 - X_2)
        >>> all(Q.retract(Q.lift(X)) == X for X in Q.basis())
        True