# bracket -- compute the Lie bracket of vector fields

## Synopsis

• Usage:
M=bracket(M1,M2)
M=bracket(M1,M2,L)
V=bracket(V1,V2)
m=bracket(m1,m2)
• Inputs:
• M1, , of vector fields
• M2, , of vector fields
• L, a list, of 2-element lists, giving indices of columns of M1 and of M2
• V1, , vector from a matrix of vector fields
• V2, , vector from a matrix of vector fields
• m1, , of vector fields
• m2, , of vector fields
• Outputs:
• M, ,
• V, ,
• m, , where the output type matches the input type

## Description

This computes the Lie bracket of pairs of vector fields from the first and second parameters. If $D_1$ and $D_2$ are vector fields, then the Lie bracket of $D_1$ and $D_2$, denoted $[D_1,D_2]$, is the vector field $F$ such that $F(g)=D_1(D_2(g))-D_2(D_1(g))$ for all $g$, where $V(f)$ denotes the operation of applying a vector field to a function (see applyVectorField).

When the first two parameters are matrices M1 and M2, this function returns a Matrix of (numColumns(M1))*(numColumns(M2)) columns, consisting of all possible brackets of a column from M1 with a column from M2. If a specific ordering (or subset) of the brackets is desired, then a List of column index pairs should also be provided.

When the first two parameters are Vectors, this returns the Vector formed by the Lie bracket of the two vector fields.

When the parameters are Modules m1 and m2, then we compute the module generated by $[X,Y]$, for $X$ in m1 and $Y$ in m2. This is a superset of the module generated by the brackets of the generators! (A calculation shows that bracket(m1,m2) is generated by image bracket(gens m1,gens m2), I1*m2, and I2*m1, where I1 is the ideal generated by the coefficients of the generators of m1, and similarly I2.)

See differences between certain bracketing functions for more details on the differences.

 i1 : R=QQ[x,y]; i2 : A=matrix {{0},{x}}; 2 1 o2 : Matrix R <--- R i3 : B=matrix {{x^2},{y}}; 2 1 o3 : Matrix R <--- R i4 : C=matrix {{1},{x}}; 2 1 o4 : Matrix R <--- R i5 : bracket(A,B) o5 = | 0 | | -x2+x | 2 1 o5 : Matrix R <--- R i6 : bracket(B,A)==-bracket(A,B) o6 = true i7 : bracket(A,C) o7 = | 0 | | -1 | 2 1 o7 : Matrix R <--- R i8 : bracket(A_0,C_0) o8 = | 0 | | -1 | 2 o8 : R i9 : bracket(A,B|C) o9 = | 0 0 | | -x2+x -1 | 2 2 o9 : Matrix R <--- R i10 : bracket(A|C,B|C,{(0,0),(1,1)})===bracket(A,B)|bracket(C,C) o10 = true i11 : bracket(A|C,B|C,{{0,1}})===bracket(A,C) o11 = true

Providing Modules computes something much different:

 i12 : trim bracket(image(A),image(B)) o12 = image | 0 0 0 x3 | | x xy x2-x 0 | 2 o12 : R-module, submodule of R

because, for example,

 i13 : (2*x+1)*bracket(A,B)-bracket(x*A,B) o13 = | 0 | | x | 2 1 o13 : Matrix R <--- R

An action of SL_2 on GL_2 differentiates to the following vector fields:

 i14 : R=QQ[a,b,c,d]; i15 : e=matrix {{c},{d},{0},{0}}; 4 1 o15 : Matrix R <--- R i16 : f=matrix {{0},{0},{a},{b}}; 4 1 o16 : Matrix R <--- R i17 : h=matrix {{-a},{-b},{c},{d}}; 4 1 o17 : Matrix R <--- R i18 : L=e|f|h; 4 3 o18 : Matrix R <--- R

Verify that this is a representation of sl_2, where [e,f]=h, [h,f]=-2f, [h,e]=2e.

 i19 : bracket(e,f)-h==0 o19 = true i20 : bracket(h,f)+2*f==0 o20 = true i21 : bracket(h,e)-2*e==0 o21 = true

Of course we should have [L,L]=L:

 i22 : bracket(L,L) o22 = | 0 -a -2c a 0 0 2c 0 0 | | 0 -b -2d b 0 0 2d 0 0 | | 0 c 0 -c 0 2a 0 -2a 0 | | 0 d 0 -d 0 2b 0 -2b 0 | 4 9 o22 : Matrix R <--- R i23 : image bracket(L,L)==image L o23 = true

## Caveat

The Matrix and Module versions of this routine compute different things; see differences between certain bracketing functions.

## Ways to use bracket :

• "bracket(Matrix,Matrix)"
• "bracket(Matrix,Matrix,List)"
• "bracket(Module,Module)"
• "bracket(Vector,Vector)"

## For the programmer

The object bracket is .