Nilpotent Lie groups

AUTHORS:

  • Eero Hakavuori (2018-09-25): initial version of nilpotent Lie groups
sage.groups.lie_gps.nilpotent_lie_group.NilpotentLieGroup

A nilpotent Lie group.

INPUT:

  • L – the Lie algebra of the Lie group; must be a finite dimensional nilpotent Lie algebra with basis over a topological field, e.g. \(\QQ\) or \(\RR\)
  • name – a string; name (symbol) given to the Lie group

Two types of exponential coordinates are defined on any nilpotent Lie group using the basis of the Lie algebra, see chart_exp1() and chart_exp2().

EXAMPLES:

Creation of a nilpotent Lie group:

sage: L = lie_algebras.Heisenberg(QQ, 1)
sage: G = L.lie_group(); G
Lie group G of Heisenberg algebra of rank 1 over Rational Field

Giving a different name to the group:

sage: L.lie_group('H')
Lie group H of Heisenberg algebra of rank 1 over Rational Field

Elements can be created using the exponential map:

sage: p,q,z = L.basis()
sage: g = G.exp(p); g
exp(p1)
sage: h = G.exp(q); h
exp(q1)

Lie group multiplication has the usual product syntax:

sage: k = g*h; k
exp(p1 + q1 + 1/2*z)

The identity element is given by one():

sage: e = G.one(); e
exp(0)
sage: e*k == k and k*e == k
True

The default coordinate system is exponential coordinates of the first kind:

sage: G.default_chart() == G.chart_exp1()
True
sage: G.chart_exp1()
Chart (G, (x_0, x_1, x_2))

Changing the default coordinates to exponential coordinates of the second kind will change how elements are printed:

sage: G.set_default_chart(G.chart_exp2())
sage: k
exp(z)exp(q1)exp(p1)
sage: G.set_default_chart(G.chart_exp1())
sage: k
exp(p1 + q1 + 1/2*z)

The frames of left- or right-invariant vector fields are created using left_invariant_frame() and right_invariant_frame():

sage: X = G.left_invariant_frame(); X
Vector frame (G, (X_0,X_1,X_2))
sage: X[0]
Vector field X_0 on the Lie group G of Heisenberg algebra of rank 1 over Rational Field

A vector field can be displayed with respect to a coordinate frame:

sage: exp1_frame = G.chart_exp1().frame()
sage: exp2_frame = G.chart_exp2().frame()
sage: X[0].display(exp1_frame)
X_0 = d/dx_0 - 1/2*x_1 d/dx_2
sage: X[0].display(exp2_frame)
X_0 = d/dy_0
sage: X[1].display(exp1_frame)
X_1 = d/dx_1 + 1/2*x_0 d/dx_2
sage: X[1].display(exp2_frame)
X_1 = d/dy_1 + x_0 d/dy_2

Defining a left translation by a generic point:

sage: g = G.point([var('a'), var('b'), var('c')]); g
exp(a*p1 + b*q1 + c*z)
sage: L_g = G.left_translation(g); L_g
Diffeomorphism of the Lie group G of Heisenberg algebra of rank 1 over Rational Field
sage: L_g.display()
G --> G
    (x_0, x_1, x_2) |--> (a + x_0, b + x_1, -1/2*b*x_0 + 1/2*a*x_1 + c + x_2)
    (x_0, x_1, x_2) |--> (y_0, y_1, y_2) = (a + x_0, b + x_1, 1/2*a*b + 1/2*(2*a + x_0)*x_1 + c + x_2)
    (y_0, y_1, y_2) |--> (x_0, x_1, x_2) = (a + y_0, b + y_1, -1/2*b*y_0 + 1/2*(a - y_0)*y_1 + c + y_2)
    (y_0, y_1, y_2) |--> (a + y_0, b + y_1, 1/2*a*b + a*y_1 + c + y_2)

Verifying the left-invariance of the left-invariant frame:

sage: x = G(G.chart_exp1()[:])
sage: L_g.differential(x)(X[0].at(x)) == X[0].at(L_g(x))
True
sage: L_g.differential(x)(X[1].at(x)) == X[1].at(L_g(x))
True
sage: L_g.differential(x)(X[2].at(x)) == X[2].at(L_g(x))
True

An element of the Lie algebra can be extended to a left or right invariant vector field:

sage: X_L = G.left_invariant_extension(p + 3*q); X_L
Vector field p1 + 3*q1 on the Lie group G of Heisenberg algebra of rank 1 over Rational Field
sage: X_L.display(exp1_frame)
p1 + 3*q1 = d/dx_0 + 3 d/dx_1  + (3/2*x_0 - 1/2*x_1) d/dx_2
sage: X_R = G.right_invariant_extension(p + 3*q)
sage: X_R.display(exp1_frame)
p1 + 3*q1 = d/dx_0 + 3 d/dx_1  + (-3/2*x_0 + 1/2*x_1) d/dx_2

The nilpotency step of the Lie group is the nilpotency step of its algebra. Nilpotency for Lie groups means that group commutators that are longer than the nilpotency step vanish:

sage: G.step()
2
sage: g = G.exp(p); h = G.exp(q)
sage: c = g*h*~g*~h; c
exp(z)
sage: g*c*~g*~c
exp(0)