# Quotients of Lie algebras#

AUTHORS:

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

class sage.algebras.lie_algebras.quotient.LieQuotient_finite_dimensional_with_basis(I, L, names, index_set, category=None)[source]#

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) a string or a 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: 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 on 5 generators (X_1, X_2, X_12, X_112, X_122) 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

>>> 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 on 5 generators (X_1, X_2, X_12, X_112, X_122) 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: E2 = L.quotient(X_122); E2
Lie algebra quotient L/I of dimension 4 over Rational Field where
L: Free Nilpotent Lie algebra on 5 generators (X_1, X_2, X_12, X_112, X_122) over Rational Field
I: Ideal (X_122)
sage: E is E2
True

>>> 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 on 5 generators (X_1, X_2, X_12, X_112, X_122) over Rational Field
I: Ideal (X_122)
>>> E is E2
True


Custom names for the basis can be given:

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

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

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

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

>>> 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: L = lie_algebras.Heisenberg(ZZ, 1)
sage: L.quotient(L.an_element())
Traceback (most recent call last):
...
NotImplementedError: quotients over non-fields not implemented

>>> 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()[source]#

Return the ambient Lie algebra of self.

EXAMPLES:

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

>>> 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()[source]#

Return the ideal generating this quotient Lie algebra.

EXAMPLES:

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

>>> 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)[source]#

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

>>> 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: el = Q.from_vector([1, 2, 3]); el
-2*X - Y
sage: el.parent() == Q
True

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

>>> 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)[source]#

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

INPUT:

• X – an element of self

EXAMPLES:

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 on 3 generators (x, y, z) over Rational Field

>>> 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 on 3 generators (x, y, z) over Rational Field

retract(X)[source]#

Map X under the quotient projection to self.

INPUT:

• X – an element of the ambient Lie algebra

EXAMPLES:

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

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