% This file was created automatically from alglie.msk.
% DO NOT EDIT!
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%A  alglie.msk                  GAP documentation             Willem de Graaf
%%
%A  @(#)$Id: alglie.msk,v 1.36 2002/04/15 10:02:26 sal Exp $
%%
%Y  (C) 1998 School Math and Comp. Sci., University of St.  Andrews, Scotland
%Y  Copyright (C) 2002 The GAP Group
%%
\Chapter{Lie Algebras}

A Lie algebra $L$ is an algebra such that 
$xx=0$ and $x(yz)+y(zx)+z(xy)=0$ for all $x,y,z\in L$. A common way of
creating a Lie algebra is by taking an associative
algebra together with the commutator as product. Therefore
the product of two elements $x,y$ of a Lie algebra is usually denoted by 
$[x,y]$, but in {\GAP} this denotes the list of the elements $x$ and $y$;
hence the product of elements is made by the usual `*'.
This gives no problems when dealing with Lie algebras given by a 
table of structure constants. However, for matrix Lie algebras 
the situation is not so easy as `*' denotes the ordinary (associative)
matrix multiplication. In \GAP this problem is solved by wrapping 
elements of a matrix Lie algebra up as LieObjects, and then define 
the `*' for LieObjects to be the commutator (see "ref:lie objects");


%%  The algorithms for Lie algebras are due to Willem de Graaf.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Lie objects}

Let $x$ be a ring element, then `LieObject(x)' wraps $x$ up into an
object that contains the same data (namely $x$). The multiplication
`*' for Lie objects is formed by taking the commutator. More exactly,
if $l_1$ and $l_2$ are the Lie objects corresponding to
the ring elements $r_1$ and $r_2$, then $l_1 * l_2$ is equal to the
Lie object corresponding to $r_1 * r_2 - r_2 * r_2$. Two rules
for Lie objects are worth noting:
\beginlist%unordered
\item{--}
  An element is *not* equal to its Lie element.

\item{--}
  If we take the Lie object of an ordinary (associative) matrix
  then this is again a matrix;
  it is therefore a collection (of its rows) and a list.
  But it is *not* a collection of collections of its entries,
  and its family is *not* a collections family.
\endlist


\>LieObject( <obj> ) A

Let <obj> be a ring element. Then `LieObject( <obj> )' is the
corresponding Lie object. If <obj> lies in the family <F>,
then `LieObject( <obj> )' lies in the family LieFamily( <F> )
(see~"LieFamily").



\beginexample 
gap> m:= [ [ 1, 0 ], [ 0, 1 ] ];;
gap> lo:= LieObject( m );
LieObject( [ [ 1, 0 ], [ 0, 1 ] ] )
gap> m*m;
[ [ 1, 0 ], [ 0, 1 ] ]
gap> lo*lo;
LieObject( [ [ 0, 0 ], [ 0, 0 ] ] )
\endexample

\>IsLieObject( <obj> ) C
\>IsLieObjectCollection( <obj> ) C

An object lies in `IsLieObject' if and only if it lies in a family
constructed by `LieFamily'.



\beginexample 
gap> m:= [ [ 1, 0 ], [ 0, 1 ] ];;
gap> lo:= LieObject( m );
LieObject( [ [ 1, 0 ], [ 0, 1 ] ] )
gap> IsLieObject( m );
false
gap> IsLieObject( lo );
true
\endexample

\>LieFamily( <Fam> ) A

is a family $F$ in bijection with the family <Fam>,
but with the Lie bracket as infix multiplication.
That is, for $x$, $y$ in <Fam>, the product of the images in $F$ will be
the image of $x \* y - y \* x$.

The standard type of objects in a Lie family <F> is `<F>!.packedType'.

\indextt{Embedding!for Lie algebras}
The bijection from <Fam> to $F$ is given by `Embedding( <Fam>, $F$ )';
this bijection respects addition and additive inverses.



\>UnderlyingFamily( <Fam> ) A

If <Fam> is a Lie family then `UnderlyingFamily( <Fam> )'
is a family $F$ such that `<Fam> = LieFamily( $F$ )'.




%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Constructing Lie algebras}

In this section we describe functions that create Lie algebras. Creating
and working with subalgebras goes exactly in the same way as for general
algebras; so for that we refer to Chapter "ref:algebras".

\>LieAlgebraByStructureConstants( <R>, <sctable> ) F
\>LieAlgebraByStructureConstants( <R>, <sctable>, <name> ) F
\>LieAlgebraByStructureConstants( <R>, <sctable>, <name1>, <name2>, ... ) F

`LieAlgebraByStructureConstants' does the same as
`AlgebraByStructureConstants', except that the result is assumed to be
a Lie algebra. Note that the function does not check whether
<sctable> satisfies the Jacobi identity. (So if one creates a Lie
algebra this way with a table that does not satisfy the Jacobi identity,
errors may occur later on.)



\beginexample 
gap> T:= EmptySCTable( 2, 0, "antisymmetric" );;
gap> SetEntrySCTable( T, 1, 2, [ 1/2, 1 ] );
gap> L:= LieAlgebraByStructureConstants( Rationals, T );
<Lie algebra of dimension 2 over Rationals>
\endexample

\>LieAlgebra( <L> ) F
\>LieAlgebra( <F>, <gens> ) F
\>LieAlgebra( <F>, <gens>, <zero> ) F
\>LieAlgebra( <F>, <gens>, "basis" ) F
\>LieAlgebra( <F>, <gens>, <zero>, "basis" ) F

For an associative algebra <L>, `LieAlgebra( <L> )' is the Lie algebra
isomorphic to <L> as a vector space but with the Lie bracket as product.

`LieAlgebra( <F>, <gens> )' is the Lie algebra over the division ring
<F>, generated *as Lie algebra* by the Lie objects corresponding to the
vectors in the list <gens>.

*Note* that the algebra returned by `LieAlgebra' does not contain the
vectors in <gens>. The elements in <gens> are wrapped up as Lie objects
(see "ref:lie objects").
This allows one to create Lie algebras from ring elements with respect to
the Lie bracket as product.  But of course the product in the Lie
algebra is the usual `\*'.

If there are three arguments, a division ring <F> and a list <gens>
and an element <zero>,
then `LieAlgebra( <F>, <gens>, <zero> )' is the corresponding <F>-Lie
algebra with zero element the Lie object corresponding to <zero>.

If the last argument is the string `\"basis\"' then the vectors in
<gens> are known to form a basis of the algebra (as an <F>-vector space).

*Note* that even if each element in <gens> is already a Lie element,
i.e., is of the form `LieElement( <elm> )' for an object <elm>,
the elements of the result lie in the Lie family of the family that
contains <gens> as a subset.



\beginexample 
gap> A:= FullMatrixAlgebra( GF( 7 ), 4 );;
gap> L:= LieAlgebra( A );
<Lie algebra of dimension 16 over GF(7)>
gap> mats:= [  [[ 1, 0 ], [ 0, -1 ]], [[ 0, 1 ], [ 0, 0 ]], [[ 0, 0 ], [ 1, 0]] ];;
gap> L:= LieAlgebra( Rationals, mats );
<Lie algebra over Rationals, with 3 generators>
\endexample

\>FreeLieAlgebra( <R>, <rank> ) F
\>FreeLieAlgebra( <R>, <rank>, <name> ) F
\>FreeLieAlgebra( <R>, <name1>, <name2>, ... ) F

Returns a free Lie algebra of rank <rank> over the ring <R>. 
`FreeLieAlgebra( <R>, <name1>, <name2>,...)' returns a free Lie algebra
over <R> with generators named <name1>, <name2>, and so on.
The elements of a free Lie algebra are written on the Hall-Lyndon
basis.



\beginexample 
gap> L:= FreeLieAlgebra( Rationals, "x", "y", "z" );
<Lie algebra over Rationals, with 3 generators>
gap> g:= GeneratorsOfAlgebra( L );; x:= g[1];; y:=g[2];; z:= g[3];;
gap> z*(y*(x*(z*y)));
(-1)*((x*(y*z))*(y*z))+(-1)*((x*((y*z)*z))*y)+(-1)*(((x*z)*(y*z))*y)
\endexample

\>FullMatrixLieAlgebra( <R>, <n> ) F
\>MatrixLieAlgebra( <R>, <n> ) F
\>MatLieAlgebra( <R>, <n> ) F

is the full matrix Lie algebra $<R>^{<n>\times <n>}$, for a ring <R> and a 
nonnegative integer <n>.



\beginexample 
gap> FullMatrixLieAlgebra( GF(9), 10 );
<Lie algebra over GF(3^2), with 19 generators>
\endexample

\>RightDerivations( <B> ) A
\>LeftDerivations( <B> ) A
\>Derivations( <B> ) A

These functions all return
the matrix Lie algebra of derivations of the algebra $A$ with basis
<B>.

`RightDerivations( <B> )' returns the algebra of derivations represented
by their right action on the algebra $A$. This means that
with respect to the basis $B$ of $A$, the derivation $D$ is described
by the matrix $[ d_{i,j} ]$
which means that $D$ maps the $i$-th basis element $b_i$ to 
$\sum_{j=1}^n d_{ij} b_j$.

`LeftDerivations( <B> )' returns the Lie algebra of derivations represented
by theor left action on the algebra $A$. So the matrices contained in the
algebra output by `LeftDerivations( <B> )' are the transposes of the 
matrices contained in the output of `RightDerivations( <B> )'.

`Derivations' is just a synonym for `RightDerivations'.



\beginexample 
gap> A:= OctaveAlgebra( Rationals );
<algebra of dimension 8 over Rationals>
gap> L:= Derivations( Basis( A ) );
<Lie algebra of dimension 14 over Rationals>
\endexample

\>SimpleLieAlgebra( <type>, <n>, <F> ) F


This function constructs the simple Lie algebra of type <type> and
of rank <n> over the field <F>.

<type> must be one of A, B, C, D, E, F, G,
H, K, S, W. For the types A to G, <n> must be a positive integer.
The last four types only exist over fields of characteristic $p>0$.
If the type is H, then <n> must be a list of positive integers of 
even length.
If the type is K, then <n> must be a list of positive integers of odd 
length.
For the other types, S and W, <n> must be a list of positive integers
of any length. In some cases the Lie algebra returned by this function
is not simple. Examples are the Lie algebras of type $A_n$ over a field
of characteristic $p>0$ where $p$ divides $n+1$, and the Lie algebras
of type $K_n$ where $n$ is a list of length 1.



\beginexample 
gap> SimpleLieAlgebra( "E", 6, Rationals );
<Lie algebra of dimension 78 over Rationals>
gap> SimpleLieAlgebra( "A", 6, GF(5) );
<Lie algebra of dimension 48 over GF(5)>
gap> SimpleLieAlgebra( "W", [1,2], GF(5) );
<Lie algebra of dimension 250 over GF(5)>
gap> SimpleLieAlgebra( "H", [1,2], GF(5) );
<Lie algebra of dimension 123 over GF(5)>
\endexample


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Distinguished Subalgebras}

Here we describe functions that calculate well-known subalgebras
and ideals of a Lie algebra (such as the centre, the centralizer of a
subalgebra, etc.).

\>LieCentre( <L> ) A
\>LieCenter( <L> ) A

The *Lie* centre of the Lie algebra <L> is the kernel of the adjoint
mapping, that is, the set $\{ a \in L; \forall x\in L:a x = 0 \}$.

In characteristic 2 this may differ from the usual centre (that is
the set of all $a\in L$ such that $ax=xa$ for all $x\in L$). 
Therefore, this operation is named `LieCentre' and not `Centre'. 




\beginexample 
gap> L:= FullMatrixLieAlgebra( GF(3), 3 );
<Lie algebra over GF(3), with 5 generators>
gap> LieCentre( L );
<two-sided ideal in <Lie algebra of dimension 9 over GF(3)>, (dimension 1)>
\endexample


\>LieCentralizer( <L>, <S> ) O

is the annihilator of <S> in the Lie algebra <L>, that is, the set
$\{ a \in L; \forall s\in S:a\*s = 0\}$.
Here <S> may be a subspace or a subalgebra of <L>.



\beginexample 
gap> L:= SimpleLieAlgebra( "G", 2, Rationals );
<Lie algebra of dimension 14 over Rationals>
gap> b:= BasisVectors( Basis( L ) );;
gap> LieCentralizer( L, Subalgebra( L, [ b[1], b[2] ] ) );
<Lie algebra of dimension 1 over Rationals>
\endexample



\>LieNormalizer( <L>, <U> ) O

is the normalizer of the subspace <U> in the Lie algebra <L>,
that is, the set $N_L(U) = \{ x \in L; [x,U] \subset U \}$.



\beginexample 
gap> L:= SimpleLieAlgebra( "G", 2, Rationals );
<Lie algebra of dimension 14 over Rationals>
gap> b:= BasisVectors( Basis( L ) );;
gap> LieNormalizer( L, Subalgebra( L, [ b[1], b[2] ] ) );
<Lie algebra of dimension 8 over Rationals>
\endexample

\>LieDerivedSubalgebra( <L> ) A

is the (Lie) derived subalgebra of the Lie algebra <L>.  



\beginexample 
gap>  L:= FullMatrixLieAlgebra( GF( 3 ), 3 );
<Lie algebra over GF(3), with 5 generators>
gap> LieDerivedSubalgebra( L );
<Lie algebra of dimension 8 over GF(3)>
\endexample


\>LieNilRadical( <L> ) A

This function calculates the (Lie) nil radical of the Lie algebra
<L>.



In the following two examples we temporarily increase the line length limit
from its default value 80 to 81 in order to make the long output expressions
fit each into one line.

\beginexample 
gap> mats:= [ [[1,0],[0,0]], [[0,1],[0,0]], [[0,0],[0,1]] ];;
gap> L:= LieAlgebra( Rationals, mats );;
gap> SizeScreen([ 81, ]);;
gap> LieNilRadical( L );
<two-sided ideal in <Lie algebra of dimension 3 over Rationals>, (dimension 2)>
gap> SizeScreen([ 80, ]);;
\endexample



\>LieSolvableRadical( <L> ) A

Returns the (Lie) solvable radical of the Lie algebra <L>.



\beginexample 
gap> L:= FullMatrixLieAlgebra( Rationals, 3 );;
gap> SizeScreen([ 81, ]);;
gap> LieSolvableRadical( L );
<two-sided ideal in <Lie algebra of dimension 9 over Rationals>, (dimension 1)>
gap> SizeScreen([ 80, ]);;
\endexample


\>CartanSubalgebra( <L> ) A

A Cartan subalgebra of a Lie algebra <L> is defined as a nilpotent
subalgebra of <L> equal to its own Lie normalizer in <L>.



\beginexample 
gap> L:= SimpleLieAlgebra( "G", 2, Rationals );;
gap> CartanSubalgebra( L );
<Lie algebra of dimension 2 over Rationals>
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Series of Ideals}


\>LieDerivedSeries( <L> ) A

is the (Lie) derived series of the Lie algebra <L>.  



\beginexample 
gap> mats:= [ [[1,0],[0,0]], [[0,1],[0,0]], [[0,0],[0,1]] ];;
gap> L:= LieAlgebra( Rationals, mats );;
gap> LieDerivedSeries( L );
[ <Lie algebra of dimension 3 over Rationals>, 
  <Lie algebra of dimension 1 over Rationals>, 
  <Lie algebra of dimension 0 over Rationals> ]
\endexample

\>LieLowerCentralSeries( <L> ) A

is the (Lie) lower central series of the Lie algebra <L>.  



\beginexample 
gap> mats:= [  [[ 1, 0 ], [ 0, 0 ]], [[0,1],[0,0]], [[0,0],[0,1]] ];;
gap> L:=LieAlgebra( Rationals, mats );;
gap> LieLowerCentralSeries( L );
[ <Lie algebra of dimension 3 over Rationals>, 
  <Lie algebra of dimension 1 over Rationals> ]
\endexample


\>LieUpperCentralSeries( <L> ) A

is the (Lie) upper central series of the Lie algebra <L>.



\beginexample 
gap> mats:= [  [[ 1, 0 ], [ 0, 0 ]], [[0,1],[0,0]], [[0,0],[0,1]] ];;
gap> L:=LieAlgebra( Rationals, mats );;
gap> LieUpperCentralSeries( L );
[ <two-sided ideal in <Lie algebra of dimension 3 over Rationals>, 
      (dimension 1)>, <Lie algebra over Rationals, with 0 generators> ]
\endexample


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Properties of a Lie Algebra}


\>IsLieAbelian( <L> ) P

is `true' if <L> is a Lie algebra such that each product of elements in
<L> is zero, and `false' otherwise.



\beginexample 
gap>  T:= EmptySCTable( 5, 0, "antisymmetric" );;
gap>  L:= LieAlgebraByStructureConstants( Rationals, T );
<Lie algebra of dimension 5 over Rationals>
gap> IsLieAbelian( L );
true
\endexample



\>IsLieNilpotent( <L> ) P

A Lie algebra <L> is defined to be (Lie) {\it nilpotent} when its
(Lie) lower central
series reaches the trivial subalgebra.



\beginexample 
gap> T:= EmptySCTable( 5, 0, "antisymmetric" );;
gap> L:= LieAlgebraByStructureConstants( Rationals, T );
<Lie algebra of dimension 5 over Rationals>
gap> IsLieNilpotent( L );
true
\endexample



\>IsLieSolvable( <L> ) P

A Lie algebra <L> is defined to be (Lie) {\it solvable} when its
(Lie) derived series reaches the trivial subalgebra.



\beginexample 
gap> T:= EmptySCTable( 5, 0, "antisymmetric" );;
gap> L:= LieAlgebraByStructureConstants( Rationals, T );
<Lie algebra of dimension 5 over Rationals>
gap> IsLieSolvable( L );
true
\endexample


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Direct Sum Decompositions}

In this section we describe two functions that calculate a direct sum
decomposition of a Lie algebra; the so-called Levi decomposition
and the decomposition into a direct sum of ideals. 

\>LeviMalcevDecomposition( <L> )!{for Lie algebras} A

A Levi-Malcev subalgebra of the algebra <L> is a semisimple subalgebra
complementary to the radical of <L>. This function returns
a list with two components. The first component is a Levi-Malcev 
subalgebra, the second the radical. This function is implemented for 
associative and Lie algebras. 



\beginexample 
gap> L:= FullMatrixLieAlgebra( Rationals, 5 );;
gap> LeviMalcevDecomposition( L );
[ <Lie algebra of dimension 24 over Rationals>, 
  <two-sided ideal in <Lie algebra of dimension 25 over Rationals>, 
      (dimension 1)> ]
\endexample


\>DirectSumDecomposition( <L> )!{for Lie algebras} A

This function calculates a list of ideals of the algebra <L> such
that <L> is equal to their direct sum. Currently this is only implemented
for semisimple associative algebras, and Lie algebras (semisimple or not).



\beginexample 
gap> L:= FullMatrixLieAlgebra( Rationals, 5 );;
gap> DirectSumDecomposition( L );
[ <two-sided ideal in 
      <two-sided ideal in <Lie algebra of dimension 25 over Rationals>, 
          (dimension 1)>, (dimension 1)>, 
  <two-sided ideal in <two-sided ideal in 
          <Lie algebra of dimension 25 over Rationals>, (dimension 24)>, 
      (dimension 24)> ]
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\Section{Semisimple Lie Algebras and Root Systems}

This section contains some functions for dealing with
semisimple Lie algebras and their root systems.

\>SemiSimpleType( <L> ) A

Let <L> be a semisimple Lie algebra, i.e., a direct sum of simple
Lie algebras. Then `SemiSimpleType' returns the type of <L>, i.e.,
a string containing the types of the simple summands of <L>.




\beginexample 
gap> L:= SimpleLieAlgebra( "E", 8, Rationals );;
gap> b:= BasisVectors( Basis( L ) );;
gap> K:= LieCentralizer( L, Subalgebra( L, [ b[61]+b[79]+b[101]+b[102] ] ) );
<Lie algebra of dimension 102 over Rationals>
gap> lev:= LeviMalcevDecomposition(K);;
gap> SemiSimpleType( lev[1] );
"B3 A1"
\endexample

\>ChevalleyBasis( <L> ) A

Here <L> must be a semisimple Lie algebra with a split Cartan subalgebra.
Then `ChevalleyBasis( <L> )' returns a list consisting of three sublists.
Together these sublists form a Chevalley basis of <L>. The first
list contains the positive root vectors, the second list contains the
negative root vectors, and the third list the Cartan elements of the
Chevalley basis.



\beginexample 
gap> L:= SimpleLieAlgebra( "G", 2, Rationals );
<Lie algebra of dimension 14 over Rationals>
gap> ChevalleyBasis( L );
[ [ v.1, v.2, v.3, v.4, v.5, v.6 ], [ v.7, v.8, v.9, v.10, v.11, v.12 ], 
  [ v.13, v.14 ] ]
\endexample


\>IsRootSystem( <obj> ) C

Category of root systems.


\>IsRootSystemFromLieAlgebra( <obj> ) C

Category of root systems that come from (semisimple) Lie algebras.
They often have special attributes such as `UnderlyingLieAlgebra',
`PositiveRootVectors', `NegativeRootVectors', `CanonicalGenerators'.


\>RootSystem( <L> ) A

`RootSystem' calculates the root system of the semisimple Lie algebra
<L> with a split Cartan subalgebra.



\beginexample 
gap> L:= SimpleLieAlgebra( "G", 2, Rationals );
<Lie algebra of dimension 14 over Rationals>
gap> R:= RootSystem( L );
<root system of rank 2>
gap> IsRootSystem( R );
true
gap> IsRootSystemFromLieAlgebra( R );
true
\endexample

\>UnderlyingLieAlgebra( <R> ) A

Here <R> is a root system coming from a semisimple Lie algebra <L>.
This function returns <L>.




\>PositiveRoots( <R> ) A

The list of positive roots of the root system <R>.


\>NegativeRoots( <R> ) A

The list of negative roots of the root system <R>.


\>PositiveRootVectors( <R> ) A

A list of positive root vectors of the root system <R> that comes
from a Lie algebra <L>. This is a list in bijection with the list
`PositiveRoots( <L> )'. The root vector is a non-zero element of the
root space (in <L>) of the corresponding root.


\>NegativeRootVectors( <R> ) A

A list of negative root vectors of the root system <R> that comes
from a Lie algebra <L>. This is a list in bijection with the list
`NegativeRoots( <L> )'. The root vector is a non-zero element of the
root space (in <L>) of the corresponding root.


\>SimpleSystem( <R> ) A

A list of simple roots of the root system <R>.


\>CartanMatrix( <R> ) A

The Cartan matrix of the root system <R>, relative to the simple 
roots in `SimpleSystem( <R> )'.


\>BilinearFormMat( <R> ) A

The matrix of the bilinear form of the root system <R>. If we denote this
matrix by $B$, then we have $B(i,j)= (\alpha_i,\alpha_j)$, where
the $\alpha_i$ are the simple roots of <R>.


\>CanonicalGenerators( <R> ) A

Here <R> must be a root system coming from a semisimple Lie algebra <L>.
This function returns $3l$ generators of <L>, $x_1, \ldots, x_l,y_1,
\ldots, y_l,h_1,\ldots, h_l$, where $x_i$ lies in the root space 
corresponding to the $i$-th simple root of the root system of <L>,
$y_i$ lies in the root space corresponding to $-$ the $i$-th simple root,
and the $h_i$ are elements of the Cartan subalgebra. These elements
satisfy the relations $h_i*h_j=0$, $x_i*y_j=\delta_{ij}h_i$,
$h_j*x_i = c_{ij} x_i$,  $h_j*y_i= -c_{ij} y_i$, where $c_{ij}$
is the entry of the Cartan matrix on position $ij$.

Also if $a$ is a root of the root system <R> (so $a$ is a list of 
numbers), then we have the relation $h_i*x = a[i] x$, where $x$ is
a root vector corresponding to $a$.



\beginexample 
gap> L:= SimpleLieAlgebra( "G", 2, Rationals );;
gap> R:= RootSystem( L );;
gap> UnderlyingLieAlgebra( R );
<Lie algebra of dimension 14 over Rationals>
gap> PositiveRoots( R );
[ [ 2, -1 ], [ -3, 2 ], [ -1, 1 ], [ 1, 0 ], [ 3, -1 ], [ 0, 1 ] ]
gap> x:= PositiveRootVectors( R );
[ v.1, v.2, v.3, v.4, v.5, v.6 ]
gap> g:=CanonicalGenerators( R );
[ [ v.1, v.2 ], [ v.7, v.8 ], [ v.13, v.14 ] ]
gap> g[3][1]*x[1];
(2)*v.1
gap> g[3][2]*x[1];
(-1)*v.1   # i.e., x[1] is the root vector belonging to the root [ 2, -1 ]
gap> BilinearFormMat( R );
[ [ 1/12, -1/8 ], [ -1/8, 1/4 ] ]
\endexample

The next few sections deal with the Weyl group of a root system. 
A Weyl group is represented by its action on the weight lattice. 
A *weight* is by definition a linear function $\lambda : H\to F$
(where $F$ is the ground field), such that the values $\lambda(h_i)$ are
all integers (where the $h_i$ are the Cartan elements of the 
`CanonicalGenerators'). On the other hand each weight is determined by
these values. Therefore we represent a weight by a vector of integers;
the $i$-th entry of this vector is the value $\lambda(h_i)$.
Now the elements of the Weyl group are represented by matrices, and
if `g' is an element of a Weyl group and `w' a weight, then `w*g'
gives the result of applying `g' to `w'.  Another way of applying the
$i$-th simple reflection to a weight is by using the function
`ApplySimpleReflection' (see below).

A Weyl group is generated by the simple reflections. So 
`GeneratorsOfGroup( W )' for a Weyl group `W' gives a list of matrices
and the $i$-th entry of this list is the simple reflection corresponding
to the $i$-th simple root of the corresponding root system.


\>IsWeylGroup( <G> ) P

A Weyl group is a group generated by reflections, with the attribute
`SparseCartanMatrix' set.


\>SparseCartanMatrix( <W> ) A

This is a sparse form of the Cartan matrix of the
corresponding root system. If we denote the Cartan matrix by `C',
then the sparse Cartan matrix of <W> is a list (of length equal to the
length of the Cartan matrix), where the `i'-th entry is a list
consisting of elements `[ j, C[i][j] ]', where `j' is such that
`C[i][j]' is non-zero.



\>WeylGroup( <R> ) A

The Weyl group of the root system <R>. It is generated by the simple
reflections. A simple reflection is represented by a matrix, and the
result of letting a simple reflection `m' act on a weight `w' is obtained
by `w*m'.




\beginexample 
gap> L:= SimpleLieAlgebra( "F", 4, Rationals );;
gap> R:= RootSystem( L );;
gap> W:= WeylGroup( R );
<matrix group with 4 generators>
gap> IsWeylGroup( W );
true
gap> SparseCartanMatrix( W );
[ [ [ 1, 2 ], [ 3, -1 ] ], [ [ 2, 2 ], [ 4, -1 ] ], 
  [ [ 1, -1 ], [ 3, 2 ], [ 4, -1 ] ], [ [ 2, -1 ], [ 3, -2 ], [ 4, 2 ] ] ]
gap> g:= GeneratorsOfGroup( W );;
gap> [ 1, 1, 1, 1 ]*g[2];
[ 1, -1, 1, 2 ]
\endexample

\>ApplySimpleReflection( <SC>, <i>, <wt> ) O

Here <SC> is the sparse Cartan matrix of a Weyl group. This
function applies the <i>-th simple reflection to the weight
<wt>, thus changing <wt>.



\beginexample 
gap> L:= SimpleLieAlgebra( "F", 4, Rationals );;
gap> W:= WeylGroup( RootSystem( L ) );;
gap> C:= SparseCartanMatrix( W );;
gap> w:= [ 1, 1, 1, 1 ];;
gap> ApplySimpleReflection( C, 2, w );
gap> w;
[ 1, -1, 1, 2 ]
\endexample

\>LongestWeylWordPerm( <W> ) A

Let $g_0$ be the longest element in the Weyl group <W>, and let
$\{\alpha_1,\ldots, \alpha_l\}$ be a simple system of the corresponding
root system. Then $g_0$ maps $\alpha_i$ to $-\alpha_{\sigma(i)}$, where
$\sigma$ is a permutation of $(1,\ldots ,l)$. This function returns
that permutation.



\beginexample 
gap> L:= SimpleLieAlgebra( "E", 6, Rationals );;
gap> W:= WeylGroup( RootSystem( L ) );;
gap> LongestWeylWordPerm( W );
(1,6)(3,5)
\endexample

\>ConjugateDominantWeight( <W>, <wt> ) O
\>ConjugateDominantWeightWithWord( <W>, <wt> ) O

Here <W> is a Weyl group and <wt> a weight (i.e., a list of integers).
This function returns the unique dominant weight conjugate to <wt>
under <W>.

`ConjugateDominantWegihtWithWord( <W>, <wt> )' returns a list of two
elements. The first of these is the dominant weight conjugate do <wt>.
The second element is a list of indices of simple reflections that
have to be applied to <wt> in order to get the dominant weight conjugate
to it.



\beginexample 
gap> L:= SimpleLieAlgebra( "E", 6, Rationals );;
gap> W:= WeylGroup( RootSystem( L ) );;
gap> C:= SparseCartanMatrix( W );;
gap> w:= [ 1, -1, 2, -2, 3, -3 ];;
gap> ConjugateDominantWeight( W, w );
[ 2, 1, 0, 0, 0, 0 ]
gap> c:= ConjugateDominantWeightWithWord( W, w );
[ [ 2, 1, 0, 0, 0, 0 ], [ 2, 4, 2, 3, 6, 5, 4, 2, 3, 1 ] ]
gap> for i in [1..Length(c[2])] do
> ApplySimpleReflection( C, c[2][i], w );
> od;
gap> w;
[ 2, 1, 0, 0, 0, 0 ]
\endexample


\>WeylOrbitIterator( <W>, <wt> ) O

Returns an iterator for the orbit of the weight <wt> under the
action of the Weyl group <W>.



\beginexample 
gap> L:= SimpleLieAlgebra( "E", 6, Rationals );;
gap> W:= WeylGroup( RootSystem( L ) );;
gap> orb:= WeylOrbitIterator( W, [ 1, 1, 1, 1, 1, 1 ] );
<iterator>
gap> NextIterator( orb );
[ 1, 1, 1, 1, 1, 1 ]
gap> NextIterator( orb );
[ -1, -1, -1, -1, -1, -1 ]
gap> orb:= WeylOrbitIterator( W, [ 1, 1, 1, 1, 1, 1 ] );
<iterator>
gap> k:= 0;
0
gap> while not IsDoneIterator( orb ) do
> w:= NextIterator( orb ); k:= k+1;
> od;
gap> k;
51840    # i.e., the size of the Weyl group of E6.
\endexample



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Restricted Lie algebras}

A Lie algebra $L$ over a field of characteristic $p>0$ is called
restricted if there is a map $x\mapsto x^p$ from $L$ into $L$ 
(called a $p$-map) such that
${\rm ad} x^p=({\rm ad} x)^p$, $(\alpha x)^p=\alpha^p x^p$ and
$(x+y)^p=x^p+y^p+\sum_{i=1}^{p-1} s_i(x,y)$, where $s_i: L\times L\to L$
are certain Lie polynomials in two variables. Using these relations
we can calculate $y^p$ for all $y\in L$, once we know $x^p$ for $x$ in a
basis of $L$. Therefore a $p$-map is represented in \GAP~ by a list 
containing the images of the basis vectors of a basis $B$ of $L$. For this
reason this list is an attribute of the basis $B$. 

\>IsRestrictedLieAlgebra( <L> ) P

Test whether <L> is restricted.



\beginexample 
gap> L:= SimpleLieAlgebra( "W", [2], GF(5));
<Lie algebra of dimension 25 over GF(5)>
gap> IsRestrictedLieAlgebra( L );
false
gap> L:= SimpleLieAlgebra( "W", [1], GF(5));
<Lie algebra of dimension 5 over GF(5)>
gap> IsRestrictedLieAlgebra( L );
true
\endexample

\>PthPowerImages( <B> ) A

Here `B' is a basis of a restricted Lie algebra. This function returns
the list of the images of the basis vectors of `B' under the $p$-map.



\beginexample 
gap> L:= SimpleLieAlgebra( "W", [1], GF(11) );
<Lie algebra of dimension 11 over GF(11)>
gap> B:= Basis( L );
CanonicalBasis( <Lie algebra of dimension 11 over GF(11)> )
gap> PthPowerImages( B );
[ 0*v.1, v.2, 0*v.1, 0*v.1, 0*v.1, 0*v.1, 0*v.1, 0*v.1, 0*v.1, 0*v.1, 0*v.1 ]
\endexample

\>PthPowerImage( <B>, <x> ) O

<B> is a basis of a restricted Lie algebra $L$.
This function calculates for an element <x> of $L$ the image of <x>
under the $p$-map.



\beginexample 
gap> L:= SimpleLieAlgebra( "W", [1], GF(11) );;
gap> B:= Basis( L );;
gap> x:= B[1]+B[11];
v.1+v.11
gap> PthPowerImage( B, x );
v.1+v.11
\endexample

\>JenningsLieAlgebra( <G> ) A

Let <G> be a nontrivial $p$-group,
and let $<G> = G_1\supset G_2\supset \cdots \supset G_m=1$
be its Jennings series (see~"JenningsSeries").
Then the quotients $G_i/G_{i+1}$ are elementary abelian $p$-groups,
i.e., they can be viewed as vector spaces over $`GF'(p)$.
Now the Jennings-Lie algebra $L$ of <G> is the direct sum of those vector
spaces. The Lie bracket on $L$ is induced by the commutator in <G>. 
Furthermore, the map $g\mapsto g^p$ in <G> induces a $p$-map in $L$
making $L$ into a restricted Lie algebra. In the canonical basis of $L$
this $p$-map is added as an attribute. A Lie algebra created by
`JenningsLieAlgebra' is naturally graded. The attribute
`Grading' is set.


\>PCentralLieAlgebra( <G> ) A

Here <G> is a nontrivial $p$-group. `PCentralLieAlgebra( <G> )'
does the same as `JenningsLieAlgebra( <G> )' except that the
$p$-central series is used instead of the Jennings series
(see~"PCentralSeries"). This function also returns a graded
Lie algebra. However, it is not necessarily restricted.



\beginexample 
gap> G:= SmallGroup( 3^6, 123 );
<pc group of size 729 with 6 generators>
gap> L:= JenningsLieAlgebra( G );
<Lie algebra of dimension 6 over GF(3)>
gap> HasPthPowerImages( Basis( L ) );
true
gap> PthPowerImages( Basis( L ) );
[ v.6, 0*v.1, 0*v.1, 0*v.1, 0*v.1, 0*v.1 ]
gap> g:= Grading( L );
rec( min_degree := 1, max_degree := 3, source := Integers, 
  hom_components := function( d ) ... end )
gap> List( [1,2,3], g.hom_components );
[ <vector space over GF(3), with 3 generators>, 
  <vector space over GF(3), with 2 generators>, 
  <vector space over GF(3), with 1 generators> ]
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{The Adjoint Representation}

In this section we show functions for calculating with the adjoint
representation of a Lie algebra (and the corresponding trace form,
called the Killing form) (see also "ref:adjointbasis" and 
"ref:indicesofadjointbasis").

\>AdjointMatrix( <B>, <x> ) O

is the matrix of the adjoint representation of the element <x> w.r.t.
the basis <B>. The adjoint map is the left multiplication by <x>.
The $i$-th column of the resulting matrix represents the image of the
the $i$-th basis vector of <B> under left multiplication by <x>. 



\beginexample 
gap> L:= SimpleLieAlgebra( "A", 1, Rationals );;
gap> AdjointMatrix( Basis( L ), Basis( L )[1] );
[ [ 0, 0, -2 ], [ 0, 0, 0 ], [ 0, 1, 0 ] ]
\endexample


\>AdjointAssociativeAlgebra( <L>, <K> ) A

is the associative matrix algebra (with 1) generated by the 
matrices of the adjoint representation of the subalgebra <K> on the Lie 
algebra <L>.



\beginexample 
gap> L:= SimpleLieAlgebra( "A", 1, Rationals );;
gap> AdjointAssociativeAlgebra( L, L );
<algebra of dimension 9 over Rationals>
gap> AdjointAssociativeAlgebra( L, CartanSubalgebra( L ) );
<algebra of dimension 3 over Rationals>
\endexample


\>KillingMatrix( <B> ) A

is the matrix of the Killing form $\kappa$ with respect to the basis <B>,
i.e., the matrix $(\kappa(b_i,b_j))$ where $b_1,b_2\ldots $ are the
basis vectors of <B>.



\beginexample 
gap> L:= SimpleLieAlgebra( "A", 1, Rationals );;
gap> KillingMatrix( Basis( L ) );
[ [ 0, 4, 0 ], [ 4, 0, 0 ], [ 0, 0, 8 ] ]
\endexample

\>KappaPerp( <L>, <U> ) O

is the orthogonal complement of the subspace <U> of the Lie algebra <L>
with respect to the Killing form $\kappa$, that is,
the set $U^{\perp} = \{ x \in L; \kappa (x,y)=0 \hbox{ for all } 
y\in L \}$.

$U^{\perp}$ is a subspace of <L>, and if <U> is an ideal of <L> then
$U^{\perp}$ is a subalgebra of <L>.



\beginexample 
gap> L:= SimpleLieAlgebra( "A", 1, Rationals );;
gap> b:= BasisVectors( Basis( L ) );;
gap> V:= VectorSpace( Rationals, [b[1],b[2]] );;
gap> KappaPerp( L, V );
<vector space of dimension 1 over Rationals>
\endexample


\>IsNilpotentElement( <L>, <x> ) O

<x> is nilpotent in <L> if its adjoint matrix is a nilpotent matrix.




\beginexample 
gap> L:= SimpleLieAlgebra( "A", 1, Rationals );;
gap> IsNilpotentElement( L, Basis( L )[1] );
true
\endexample

\>NonNilpotentElement( <L> ) A

A non-nilpotent element of a Lie algebra <L> is an element $x$ such that
$ad x$ is not nilpotent.
If <L> is not nilpotent, then by Engel's theorem non nilpotent elements
exist in <L>.
In this case this function returns a non nilpotent element of <L>,
otherwise (if <L> is nilpotent) `fail' is returned.



\beginexample 
gap> L:= SimpleLieAlgebra( "G", 2, Rationals );;
gap> NonNilpotentElement( L );
v.13
gap> IsNilpotentElement( L, last );
false
\endexample


\>FindSl2( <L>, <x> ) O

This function tries to find a subalgebra $S$ of the Lie algebra <L> with
$S$ isomorphic to $sl_2$ and such that the nilpotent element <x> of <L>
is contained in $S$.
If such an algebra exists then it is returned,
otherwise `fail' is returned.



\beginexample 
gap> L:= SimpleLieAlgebra( "G", 2, Rationals );;
gap> b:= BasisVectors( Basis( L ) );;
gap> IsNilpotentElement( L, b[1] );
true
gap> FindSl2( L, b[1] );
<Lie algebra of dimension 3 over Rationals>
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Universal Enveloping Algebras}

\>UniversalEnvelopingAlgebra( <L> ) A
\>UniversalEnvelopingAlgebra( <L>, <B> ) O

Returns the universal enveloping algebra of the Lie algebra <L>.
The elements of this algebra are written on a Poincare-Birkhoff-Witt
basis.

In the second form <B> must be a basis of <L>. If this second argument
is given, then an isomorphic copy of the universal enveloping algebra
is returned, generated by the images (in the universal enveloping
algebra) of the elements of <B>.



\beginexample 
gap> L:= SimpleLieAlgebra( "A", 1, Rationals );;
gap> UL:= UniversalEnvelopingAlgebra( L );
<algebra-with-one of dimension infinity over Rationals>
gap> g:= GeneratorsOfAlgebraWithOne( UL );
[ [(1)*x.1], [(1)*x.2], [(1)*x.3] ]
gap> g[3]^2*g[2]^2*g[1]^2;
[(-4)*x.1*x.2*x.3^3+(1)*x.1^2*x.2^2*x.3^2+(2)*x.3^3+(2)*x.3^4]
\endexample


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Finitely Presented Lie Algebras}

Finitely presented Lie algebras can be constructed from free Lie algebras
by using the `/' constructor, i.e., `FL/[r1...rk]' is the quotient of
the free Lie algebra `FL' by the ideal generated by the elements
`r1...rk' of `FL'. If the finitely presented Lie algebra `K' happens to be
finite dimensional then an isomorphic structure constants Lie algebra
can be constructed by `NiceAlgebraMonomorphism(K)', which returns a surjective
homomorphism. The structure constants Lie algebra can then be accessed by 
calling `Range' for this map. Also limited computations with elements of the 
finitely presented Lie algebra are possible.

\beginexample 
gap> L:= FreeLieAlgebra( Rationals, "s", "t" );
<Lie algebra over Rationals, with 2 generators>
gap> gL:= GeneratorsOfAlgebra( L );; s:= gL[1];; t:= gL[2];;
gap> K:= L/[ s*(s*t), t*(t*(s*t)), s*(t*(s*t))-t*(s*t) ];
<Lie algebra over Rationals, with 2 generators>
gap> h:= NiceAlgebraMonomorphism( K );
[ [(1)*s], [(1)*t] ] -> [ v.1, v.2 ]
gap> U:= Range( h );
<Lie algebra of dimension 3 over Rationals>
gap> IsLieNilpotent( U );
true
gap> gK:= GeneratorsOfAlgebra( K );
[ [(1)*s], [(1)*t] ]
gap> gK[1]*(gK[2]*gK[1]) = Zero( K );
true
\endexample

\>FpLieAlgebraByCartanMatrix( C ) F


Here <C> must be a Cartan matrix. The function returns the 
finitely-presented Lie algebra over the field of rational numbers 
defined by this Cartan matrix. By Serre's theorem, this Lie algebra is a 
semisimple Lie algebra, and its root system has Cartan matrix <C>.




\beginexample 
gap> C:= [ [ 2, -1 ], [ -3, 2 ] ];;
gap> K:= FpLieAlgebraByCartanMatrix( C );
<Lie algebra over Rationals, with 6 generators>
gap> h:= NiceAlgebraMonomorphism( K );
[ [(1)*x1], [(1)*x2], [(1)*x3], [(1)*x4], [(1)*x5], [(1)*x6] ] -> 
[ v.1, v.2, v.3, v.4, v.5, v.6 ]
gap> SemiSimpleType( Range( h ) );
"G2"
\endexample

\>NilpotentQuotientOfFpLieAlgebra( <FpL>, <max> ) F
\>NilpotentQuotientOfFpLieAlgebra( <FpL>, <max>, <weights> ) F


Here <FpL> is a finitely presented Lie algebra. Let $K$ be the
quotient of <FpL> by the <max>+1-th term of its lower central series.
This function calculates a surjective homomorphism of <FpL> onto $K$.
When called with the third argument <weights>, the $k$-th generator of
<FpL> gets assigned the $k$-th element of the list <weights>. In that
case a quotient is calculated of <FpL> by the ideal generated by all 
elements of weight <max>+1. If the list <weights> only consists of
$1$'s then the two calls are equivalent. The default value of 
<weights> is a list (of length equal to the number of generators of
<FpL>) consisting of $1$'s.

If the relators of <FpL> are homogeneous, then the resulting 
algebra is naturally graded. 



\beginexample 
gap> L:= FreeLieAlgebra( Rationals, "x", "y" );;
gap> g:= GeneratorsOfAlgebra(L);; x:= g[1]; y:= g[2];
(1)*x
(1)*y
gap> rr:=[((y*x)*x)*x-6*(y*x)*y, 3*((((y*x)*x)*x)*x)*x-20*(((y*x)*x)*x)*y ];
[ (-1)*(x*(x*(x*y)))+(6)*((x*y)*y), 
  (-3)*(x*(x*(x*(x*(x*y)))))+(20)*(x*(x*((x*y)*y)))+(-20)*((x*(x*y))*(x*y)) ]
gap> K:= L/rr;
<Lie algebra over Rationals, with 2 generators>
gap> h:=NilpotentQuotientOfFpLieAlgebra(K, 50, [1,2] );
[ [(1)*x], [(1)*y] ] -> [ v.1, v.2 ]
gap> L:= Range( h );
<Lie algebra of dimension 50 over Rationals>
gap> Grading( L );
rec( min_degree := 1, max_degree := 50, source := Integers, 
  hom_components := function( d ) ... end )
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Modules over Lie Algebras and Their Cohomology}

Representations of Lie algebras are dealt with in the same way as 
representations of ordinary algebras (see "Representations of Algebras").
In this section we mainly deal with modules over general Lie algebras
and their cohomology. The next section is devoted to modules over
semisimple Lie algebras.

\>FaithfulModule( <A> )!{for Lie algebras} A

returns a faithful finite-dimensional left-module over the algebra <A>.
This is only implemented for associative algebras, and for Lie algebras
of characteristic $0$. (It may also work for certain Lie algebras
of characteristic $p>0$.)



\beginexample 
gap> T:= EmptySCTable( 3, 0, "antisymmetric" );;
gap> SetEntrySCTable( T, 1, 2, [ 1, 3 ]);
gap> L:= LieAlgebraByStructureConstants( Rationals, T );
<Lie algebra of dimension 3 over Rationals>
gap> V:= FaithfulModule( L );
<3-dimensional left-module over <Lie algebra of dimension 3 over Rationals>>
gap> vv:= BasisVectors( Basis( V ) );
[ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ]
gap> x:= Basis( L )[3];
v.3
gap> List( vv, v -> x^v );
[ [ 0, 0, 0 ], [ 1, 0, 0 ], [ 0, 0, 0 ] ]
\endexample


An $s$-cochain of a module $V$ over a Lie algebra $L$, is an $s$-linear
map
$$
c: L\times\cdots\times L \to V  \hbox{ ($s$ factors $L$)}
$$
that is skew-symmetric (meaning that if any of the arguments are
interchanged, $c$ changes to $-c$).

Let $\{x_1,\ldots,x_n\}$ be a basis of $L$. Then any $s$-cochain is 
determined by the values $c( x_{i_1},\ldots, x_{i_s} )$, where
$1\le i_1 \< i_2 \< \cdots \< i_s \le \dim L$.
Now this value again is a linear combination of basis elements of $V$:
$c( x_{i_1},\ldots, x_{i_s} ) = \sum \lambda^k_{i_1,\ldots, i_s} v_k$.
Denote the dimension of $V$ by $r$.
Then we represent an $s$-cocycle by a list of $r$ lists.
The $j$-th of those lists consists of entries of the form
$$
[  [i_1,i_2,\ldots,i_s], \lambda^j_{i_1,\ldots, i_s} ]
$$
where the coefficient on the second position is non-zero.
(We only store those entries for which this coefficient is non-zero.)
It follows that every $s$-tuple $(i_1,\ldots,i_s)$ gives rise to $r$ 
basis elements.

So the zero cochain is represented by a list of the form
$[ [ ], [ ], \ldots , [ ] ]$. Furthermore, if $V$ is, e.g., 
$4$-dimensional, then the $2$-cochain represented by

\begintt
[  [ [ [1,2], 2] ], [ ], [ [ [1,2], 1/2 ] ], [ ] ]
\endtt

maps the pair $(x_1,x_2)$ to $2v_1+1/2 v_3$ (where $v_1$ is the first
basis element of $V$, and $v_3$ the third), and all other pairs to zero.

By definition, $0$-cochains are constant maps $c( x ) = v_c\in V$ for all
$x \in L$. So $0$-cochains have a different representation: they are just
represented by the list $[ v_c ]$.

Cochains are constructed using the function `Cochain' (see~"Cochain"),
if <c> is a cochain, then its corresponding list is returned by
`ExtRepOfObj( <c> )'.



\>IsCochain( <obj> ) C
\>IsCochainCollection( <obj> ) C

Categories of cochains and of collections of cochains.



\>Cochain( <V>, <s>, <obj> ) O

Constructs a <s>-cochain given by the data in <obj>, with respect to
the Lie algebra module <V>. If <s> is non-zero, then <obj> must be
a list.



\beginexample 
gap> L:= SimpleLieAlgebra( "A", 1, Rationals );;
gap> V:= AdjointModule( L );
<3-dimensional left-module over <Lie algebra of dimension 3 over Rationals>>
gap> c1:= Cochain( V, 2, [ [ [ [ 1, 3 ], -1 ] ], [ ], [ [ [ 2, 3 ], 1/2 ] ] ]);
<2-cochain>
gap> ExtRepOfObj( c1 );
[ [ [ [ 1, 3 ], -1 ] ], [  ], [ [ [ 2, 3 ], 1/2 ] ] ]
gap> c2:= Cochain( V, 0, Basis( V )[1] );
<0-cochain>
gap> ExtRepOfObj( c2 );
v.1
gap> IsCochain( c2 );
true
\endexample

\>CochainSpace( <V>, <s> ) O

Returns the space of all <s>-cochains with respect to <V>.



\beginexample 
gap> L:= SimpleLieAlgebra( "A", 1, Rationals );;
gap> V:= AdjointModule( L );;
gap> C:=CochainSpace( V, 2 );
<vector space of dimension 9 over Rationals>
gap> BasisVectors( Basis( C ) );
[ <2-cochain>, <2-cochain>, <2-cochain>, <2-cochain>, <2-cochain>, 
  <2-cochain>, <2-cochain>, <2-cochain>, <2-cochain> ]
gap> ExtRepOfObj( last[1] );
[ [ [ [ 1, 2 ], 1 ] ], [  ], [  ] ]
\endexample

\>ValueCochain( <c>, <y1>, <y2>, ..., <ys> ) F

Here <c> is an <s>-cochain. This function returns the value of
<c> when applied to the <s> elements <y1> to <ys> (that lie in the
Lie algebra acting on the module corresponding to <c>). It is also
possible to call this function with two arguments: first <c> and then
the list containing `<y1>,...,<ys>'.



\beginexample 
gap> L:= SimpleLieAlgebra( "A", 1, Rationals );;
gap> V:= AdjointModule( L );;
gap> C:= CochainSpace( V, 2 );;
gap> c:= Basis( C )[1];
<2-cochain>
gap>  ValueCochain( c, Basis(L)[2], Basis(L)[1] );
(-1)*v.1
\endexample

\>LieCoboundaryOperator( <c> ) V

This is a function that takes an <s>-cochain, and returns an <s+1>-cochain.
The coboundary operator is applied.



\beginexample 
gap> L:= SimpleLieAlgebra( "A", 1, Rationals );;
gap> V:= AdjointModule( L );;
gap> C:= CochainSpace( V, 2 );;
gap> c:= Basis( C )[1];;
gap> c1:= LieCoboundaryOperator( c );
<3-cochain>
gap> c2:= LieCoboundaryOperator( c1 );
<4-cochain>
\endexample

\>Cocycles( <V>, <s> ) O

is the space of all <s>-cocycles with respect to the Lie algebra module
<V>. That is the kernel of the coboundary operator when  restricted to
the space of <s>-cochains.



\>Coboundaries( <V>, <s> ) O

is the space of all <s>-coboundaries with respect to the Lie algebra
module <V>. That is the image of the coboundary operator, when applied
to the space of <s-1>-cochains. By definition the space of all
0-coboundaries is zero.



\beginexample 
gap> T:= EmptySCTable( 3, 0, "antisymmetric" );;
gap> SetEntrySCTable( T, 1, 2, [ 1, 3 ] );
gap> L:= LieAlgebraByStructureConstants( Rationals, T );;
gap> V:= FaithfulModule( L );
<3-dimensional left-module over <Lie algebra of dimension 3 over Rationals>>
gap> Cocycles( V, 2 );
<vector space of dimension 7 over Rationals>
gap> Coboundaries( V, 2 );
<vector space over Rationals, with 9 generators>
gap> Dimension( last );
5
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Modules over Semisimple Lie Algebras}

This section contains functions for calculating information on
representations of semisimple Lie algebras. First we have some functions
for calculating some combinatorial data (set of dominant weights, 
the dominant character, the decomposition of a tensor product, the dimension
of a highest-weight module). Then 
there is a function for creating an admissible lattice in the universal
enveloping algebra of a semisimple Lie algebra. Finally we have a function
for constructing a highest-weight module over a semisimple Lie algebra.

\>DominantWeights( <R>, <maxw> ) O

Returns a list consisting of two lists. The first of these contains
the dominant weights (written on the basis of fundamental weights)
of the irreducible highest-weight module over the Lie algebra with
root system <R>. The $i$-th element of the second list is the
level of the $i$-th dominant weight. (Where level is defined as follows.
For a weight $\mu$ we write $\mu=\lambda-\sum_i k_i \alpha_i$, where
the $\alpha_i$ are the simple roots, and $\lambda$ the highest weight.
Then the level of $\mu$ is $\sum_i k_i$.


\>DominantCharacter( <L>, <maxw> ) O
\>DominantCharacter( <R>, <maxw> ) O

For a highest weight <maxw> and a semisimple Lie algebra <L>, this
returns the dominant weights of the highest-weight module over <L>,
with highest weight <maxw>. The output is a list of two lists, the
first list contains the dominant weights; the second list contains
their multiplicities.

The first argument can also be a root system, in which case 
the dominant character of the highest-weight module over the
corresponding semisimple Lie algebra is returned. 


\>DecomposeTensorProduct( <L>, <w1>, <w2> ) O

Here <L> is a semisimple Lie algebra and <w1>, <w2> are dominant
weights. Let $V_i$ be the irreducible highest-weight module over <L>
with highest weight $w_i$ for $i=1,2$. Let $W=V_1\otimes V_2$. Then in
general $W$ is a reducible <L>-module. Now this function
returns a list of two lists. The first of these is the list of highest
weights of the irreducible modules occurring in the decomposition of
$W$ as a direct sum of irreducible modules. The second list contains
the multiplicities of these weights (i.e., the number of copies of
the irreducible module with the corresponding highest weight that occur
in $W$). The algorithm uses Klimyk's formula (see~\cite{Klimyk68} or
\cite{Klimyk66} for the original Russian version).


\>DimensionOfHighestWeightModule( <L>, <w> ) O

Here <L> is a semisimple Lie algebra, and <w> a dominant weight.
This function returns the dimension of the highest-weight module
over <L> with highest weight <w>. The algorithm
uses Weyl's dimension formula.



\beginexample 
gap> L:= SimpleLieAlgebra( "F", 4, Rationals );;
gap> R:= RootSystem( L );;
gap> DominantWeights( R, [ 1, 1, 0, 0 ] );
[ [ [ 1, 1, 0, 0 ], [ 2, 0, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], 
      [ 1, 0, 0, 0 ], [ 0, 0, 0, 0 ] ], [ 0, 3, 4, 8, 11, 19 ] ]
gap> DominantCharacter( L, [ 1, 1, 0, 0 ] );
[ [ [ 1, 1, 0, 0 ], [ 2, 0, 0, 0 ], [ 0, 0, 1, 0 ], [ 0, 1, 0, 0 ], 
      [ 1, 0, 0, 0 ], [ 0, 0, 0, 0 ] ], [ 1, 1, 4, 6, 14, 21 ] ]
gap> DecomposeTensorProduct( L, [ 1, 0, 0, 0 ], [ 0, 0, 1, 0 ] );
[ [ [ 1, 0, 1, 0 ], [ 1, 0, 0, 0 ], [ 0, 0, 0, 1 ], [ 0, 1, 0, 0 ], 
      [ 2, 0, 0, 0 ], [ 0, 0, 1, 0 ], [ 1, 1, 0, 0 ] ], 
  [ 1, 1, 1, 1, 1, 1, 1 ] ]
gap> DimensionOfHighestWeightModule( L, [ 1, 2, 3, 4 ] );
79316832731136
\endexample

Let $L$ be a semisimple Lie algebra over a field of characteristic $0$,
and let $R$ be its root system. For a positive root $\alpha$ we let
$x_{\alpha}$ and $y_{\alpha}$ be positive and negative root vectors
respectively, both from a fixed Chevalley basis of $L$. Furthermore,
$h_1,\ldots, h_l$ are the Cartan elements from the same Chevalley
basis. Also we set
$$
x_{\alpha}^{(n)} = {x_{\alpha}^n \over n!}, \qquad
y_{\alpha}^{(n)} = {y_{\alpha}^n \over n!}\.
$$
Furthermore, let $\alpha_1,\ldots, \alpha_s$ denote the positive roots
of $R$. For multi-indices $N=(n_1,\ldots, n_s)$, $M=(m_1,\ldots, m_s)$
and $K=(k_1,\ldots, k_s)$ (where $n_i,m_i,k_i\geq 0$) set
$$
\matrix{
x^N &=& x_{\alpha_1}^{(n_1)}\cdots x_{\alpha_s}^{(n_s)},\cr
y^M &=& y_{\alpha_1}^{(m_1)}\cdots y_{\alpha_s}^{(m_s)},\cr
h^K &=& {h_1\choose k_1}\cdots {h_l\choose k_l}\cr
}
$$
Then by a theorem of Kostant, the $x_{\alpha}^{(n)}$ and
$y_{\alpha}^{(n)}$ generate a subring of the universal enveloping algebra
$U(L)$ spanned (as a free $Z$-module) by the elements
$$
y^Mh^Kx^N
$$
(see, e.g., \cite{Hum72} or \cite{Hum78}, Section 26)
So by the Poincare-Birkhoff-Witt theorem
this subring is a lattice in $U(L)$. Furthermore, this lattice is
invariant under the $x_{\alpha}^{(n)}$ and $y_{\alpha}^{(n)}$.
Therefore, it is called an admissible lattice in $U(L)$.

The next functions enable us to construct the generators of such an
admissible lattice.


\>IsUEALatticeElement( <obj> ) C
\>IsUEALatticeElementCollection( <obj> ) C
\>IsUEALatticeElementFamily( <fam> ) C

is the category of elements of an admissible lattice in the universal
enveloping algebra of a semisimple Lie algebra `L'.


\>LatticeGeneratorsInUEA( <L> ) A

Here <L> must be a semisimple Lie algebra of characteristic $0$.
This function returns a list of generators of an admissible lattice
in the universal enveloping algebra of <L>, relative to
the Chevalley basis contained in `ChevalleyBasis( <L> )'.
First are listed the negative root vectors (denoted by $y_1,\ldots, y_s$),
then the positive root vectors (denoted by $x_1,\ldots, x_s$). At the
end of the list there are the Cartan elements. They are printed as
`( hi/1 )', which means
$$
{h_i\choose 1}\.
$$
In general the printed form `( hi/ k )' means 
$$
{h_i\choose k}\.
$$

Also $y_i^{(m)}$ is printed as `yi^(m)', which means that entering
`yi^m' at the {\GAP} prompt results in the output `m!*yi^(m)'.

Products of lattice generators are collected using the following order:
first come the $y_i^{(m_i)}$ (in the same order as the positive roots),
then
the ${h_i\choose k_i},$ and then the $x_i^{(n_i)}$ (in the same order as
the positive roots).


\>ObjByExtRep( <F>, <descr> ) O

creates an object in the family <F> which has the external
representation <descr>.


 
  An UEALattice element is represented by a list of the form

      [ m1, c1, m2, c2,.....]

  where the c1,c2 etc. are coefficients, and the m1, m2 etc. monomials.
  A monomial is a list of the form [ ind1, e1, ind2, e2, ....]
  where ind1, ind2 are indices, and e1, e2 etc. are exponents. Let
  N be the number of positive roots of the underlying Lie algebra. The
  indices lie between 1 and $\dim L$. If an index lies between 1 and N,
  then it represents a negative root vector (corresponding to the root
  `NegativeRoots( R )[ind]', where R is the root system of L). This leads
  to a factor `yind1^(e1)' in the printed form of the monomial (which equals
  z^e1/e1!, where z is a basis element of L). If an index
  lies between N+1 and 2N, then it represents a positive root vector.
  Finally, if ind lies between 2N+1 and 2N+rank, then it represents
  an element of the Cartan subalgebra. This is printed as ( h_1/ e_1 ),
  meaning h_1 choose e_1 (h_1,...,h_rank are the canonical Cartan
  generators).

  The zero element is represented by the empty list, the identity
  element by the list [ [  ], 1 ].

\beginexample 
gap> L:= SimpleLieAlgebra( "G", 2, Rationals );;
gap> g:=LatticeGeneratorsInUEA( L );
[ y1, y2, y3, y4, y5, y6, x1, x2, x3, x4, x5, x6, ( h13/1 ), ( h14/1 ) ]
gap> IsUEALatticeElement( g[1] );
true
gap> g[1]^3;
6*y1^(3)
gap> q:= g[7]*g[1]^2;
-2*y1+2*y1*( h13/1 )+2*y1^(2)*x1
gap> ExtRepOfObj( q );
[ [ 1, 1 ], -2, [ 1, 1, 13, 1 ], 2, [ 1, 2, 7, 1 ], 2 ]
\endexample

\>IsWeightRepElement( <obj> ) C
\>IsWeightRepElementCollection( <obj> ) C
\>IsWeightRepElementFamily( <fam> ) C

Is a category of vectors, that is used to construct elements of
highest-weight modules (by `HighestWeightModule').

WeightRepElements are represented by a list of the form
`[ v1, c1, v2, c2, ....]', where the `v<i>' are basis vectors, and
the `c<i>' coefficients. Furthermore a basis vector `v' is a weight vector.
It is represented by a list of
form `[ <k>, <mon>, <wt> ]', where <k> is an integer (the basis vectors
are numbered from $1$ to $\dim V$, where $V$ is the highest weight
module), <mon> is an UEALatticeElement (which means that the result of
applying <mon> to a highest weight vector is `v') and <wt> is the weight
of <v>. A WeightRepElement is printed as `<mon>*v0', where `v0'
denotes a fixed highest weight vector.

If <v> is a WeightRepElement, then `ExtRepOfObj( <v> )' returns
the corresponding list, and if <list> is such a list and <fam> a
WeightRepElementFamily, then `ObjByExtRep( <list>, <fam> )' returns
the corresponding WeightRepElement.


\>HighestWeightModule( <L>, <wt> ) F

returns the highest weight module with highest weight <wt> of the
semisimple Lie algebra <L> of characteristic $0$.

Note that the elements of such a module lie in the category
`IsLeftAlgebraModuleElement' (and in particular they do not lie
in the category `IsWeightRepElement'). However, if `v' is an element
of such a module, then `ExtRepOfObj( v )' is a WeightRepElement.



Note that for the following examples of this chapter we increase the line
length limit from its default value 80 to 81 in order to make some long
output expressions fit into the lines.

\beginexample 
gap> SizeScreen([ 81, ]);;
gap> K1:= SimpleLieAlgebra( "G", 2, Rationals );;
gap> K2:= SimpleLieAlgebra( "B", 2, Rationals );;
gap> L:= DirectSumOfAlgebras( K1, K2 );
<Lie algebra of dimension 24 over Rationals>
gap> V:= HighestWeightModule( L, [ 0, 1, 1, 1 ] );
<224-dimensional left-module over <Lie algebra of dimension 24 over Rationals>>
gap> vv:= GeneratorsOfLeftModule( V );;
gap> vv[100];
y5*y7*y10*v0
gap> e:= ExtRepOfObj( vv[100] );
y5*y7*y10*v0
gap> ExtRepOfObj( e );
[ [ 100, y5*y7*y10, [ -3, 2, -1, 1 ] ], 1 ]
gap> Basis(L)[17]^vv[100];
-1*y5*y7*y8*v0-1*y5*y9*v0
\endexample

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Tensor Products and Exterior and Symmetric Powers}

\>TensorProductOfAlgebraModules( <list> ) O
\>TensorProductOfAlgebraModules( <V>, <W> ) O

Here the elements of <list> must be algebra modules. 
The tensor product is returned as an algebra module. 



\beginexample 
gap> L:= SimpleLieAlgebra("G",2,Rationals);;
gap> V:= HighestWeightModule( L, [ 1, 0 ] );;
gap> W:= TensorProductOfAlgebraModules( [ V, V, V ] );
<343-dimensional left-module over <Lie algebra of dimension 14 over Rationals>>
gap> w:= Basis(W)[1];
1*(1*v0<x>1*v0<x>1*v0)
gap> Basis(L)[1]^w;
<0-tensor>
gap> Basis(L)[7]^w;
1*(1*v0<x>1*v0<x>y1*v0)+1*(1*v0<x>y1*v0<x>1*v0)+1*(y1*v0<x>1*v0<x>1*v0)
\endexample

\>ExteriorPowerOfAlgebraModule( <V>, <k> ) O

Here <V> must be an algebra module, defined over a Lie algebra. 
This function returns the <k>-th exterior power of <V> as an 
algebra module.




\beginexample 
gap> L:= SimpleLieAlgebra("G",2,Rationals);;
gap> V:= HighestWeightModule( L, [ 1, 0 ] );;
gap> W:= ExteriorPowerOfAlgebraModule( V, 3 );
<35-dimensional left-module over <Lie algebra of dimension 14 over Rationals>>
gap> w:= Basis(W)[1];
1*(1*v0/\y1*v0/\y3*v0)
gap> Basis(L)[10]^w;
1*(1*v0/\y1*v0/\y6*v0)+1*(1*v0/\y3*v0/\y5*v0)+1*(y1*v0/\y3*v0/\y4*v0)
\endexample

\>SymmetricPowerOfAlgebraModule( <V>, <k> ) O

Here <V> must be an algebra module. This function returns the <k>-th
symmetric power of <V> (as an algebra module).



\beginexample 
gap> L:= SimpleLieAlgebra("G",2,Rationals);;
gap> V:= HighestWeightModule( L, [ 1, 0 ] );;
gap> W:= SymmetricPowerOfAlgebraModule( V, 3 );
<84-dimensional left-module over <Lie algebra of dimension 14 over Rationals>>
gap> w:= Basis(W)[1];
1*(1*v0.1*v0.1*v0)
gap> Basis(L)[2]^w;
<0-symmetric element>
gap> Basis(L)[7]^w;
3*(1*v0.1*v0.y1*v0)
\endexample

\>DirectSumOfAlgebraModules( <list> )!{for Lie algebras} O
\>DirectSumOfAlgebraModules( <V>, <W> )!{for Lie algebras} O

Here <list> must be a list of algebra modules. This function returns the
direct sum of the elements in the list (as an algebra module).
The modules must be defined over the same algebras.

In the second form is short for `DirectSumOfAlgebraModules( [ <V>, <W> ] )'



\beginexample 
gap> L:= SimpleLieAlgebra( "C", 3, Rationals );;
gap> V:= HighestWeightModule( L, [ 1, 1, 0 ] );
<64-dimensional left-module over <Lie algebra of dimension 21 over Rationals>>
gap> W:= HighestWeightModule( L, [ 0, 0, 2 ] );
<84-dimensional left-module over <Lie algebra of dimension 21 over Rationals>>
gap> U:= DirectSumOfAlgebraModules( V, W );
<148-dimensional left-module over <Lie algebra of dimension 21 over Rationals>>
gap> SizeScreen([ 80, ]);;
\endexample
