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]¶
- 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- Iif not given
- names– (optional) string or list of strings; names for the basis elements of the quotient. If- namesis 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 - namesparameter:- 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 - selfcorresponding 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 - Xunder 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 - Xunder 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