%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%W  unipot.tex          UNIPOT documentation                Sergei.Haller
%%
%H  $Id: unipot.tex,v 2.0 2000/05/31 12:23:30 gc1007 Exp $
%%
%%

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Chapter{The Share Package Unipot}

This chapter describes the share package `unipot'. This share package  
provides the ability to compute with elements of unipotent subgroups of 
Chevalley groups.

In this chapter we will refer to unipotent subgroups of Chevalley groups
as ``unipotent subgroups'' and to elements of unipotent subgroups as
``unipotent elements''. 


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{General functionality}

In this section we will describe the general functionality provided by
this package.

\>UnipotChevInfo() I

`UnipotChevInfo' is an `InfoClass' used in this package. `InfoLevel' of
this `InfoClass' is set to 1 by default.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Unipotent subgroups of Chevalley groups}

In this section we will describe the functionality for unipotent
subgroups provided by this package.

\>`IsUnipotChevSubGr'{IsUnipotChevSubGr}@{`IsUnipotChevSubGr'} C

Category for unipotent subgroups.

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

`UnipotChevSubGr' returns the unipotent subgroup $U$ of the Chevalley group
of type <type>, rank <n> over the ring <F>.

<type> must be one of ``A'', ``B'', ``C'', ``D'', ``E'', ``F'', ``G''

For the types A to D, <n> must be a positive integer.

For the type E, <n> must be one of 6, 7, 8.

For the type F, <n> must be 4.

For the type G, <n> must be 2.

\beginexample
gap> U_G2 := UnipotChevSubGr("G", 2, Rationals);
<Unipotent subgroup of a Chevalley group of type G2 over Rationals>
\endexample
\begintt
gap> U_E3 := UnipotChevSubGr("E", 3, Rationals);
Error <n> must be one of 6, 7, 8 for type E  at
Error( "<n> must be one of 6, 7, 8 for type E " );
UnipotChevFamily( type, n, F ) called from
<function>( <arguments> ) called from read-eval-loop
Entering break read-eval-print loop, you can 'quit;' to quit to outer loop,
or you can return to continue
brk>
\endtt

\>`PrintObj( <U> )'{PrintObj!SubGr}@{`PrintObj for UnipotChevSubGr'} M
\>`ViewObj( <U> )'{ViewObj!SubGr}@{`ViewObj for UnipotChevSubGr'} M

Special methods for unipotent subgroups.
(see {\GAP} Reference Manual, section "ref:View and Print" for general 
information on `View' and `Print')

\beginexample
gap> Print(U_G2);
UnipotChevSubGr( "G", 2, Rationals )gap> View(U_G2);
<Unipotent subgroup of a Chevalley group of type G2 over Rationals>
\endexample

\>`One( <U> )'{One!UnipotChevSubGr}@{`One' for `UnipotChevSubGr} M
\>`OneOp( <U> )'{OneOp!SubGr}@{`OneOp' for `UnipotChevSubGr} M

Special methods for unipotent subgroups. Return the identity of <U>.

\>`Size( <U> )'{Size!UnipotChevSubGr}@{`Size' for `UnipotChevSubGr} M

`Size' returns the size of a unipotent subgroup. This is a
special method for unipotent subgroups.

Size can be computed using the result in Carter \cite{Carter72}, Theorem
5.3.3 (ii).

\>`RootSystem( <U> )'{RootSystem!UnipotChevSubGr}@{`RootSystem' for `UnipotChevSubGr'} M

This method is similar to the method `RootSystem' for semisimple Lie
algebras (see {\GAP4.1} Reference Manual, section 58.7 for further
information). `RootSystem' calculates the root system of the unipotent
subgroup <U>. The output is a record with the following components:
\beginlist
\item{-} `fundroots'
  A set of fundamental roots
\item{-} `posroots'
  The set of positive roots of the root system.
  The positive roots are listed <according to increasing height>.
\endlist                                                                                                      

\beginexample
gap> RootSystem(U_G2);
rec( posroots := [ [ 2, -1 ], [ -3, 2 ], [ -1, 1 ], [ 1, 0 ], [ 3, -1 ], [ 0, 1 ] ], 
    fundroots := [ [ 2, -1 ], [ -3, 2 ] ] )
gap>
\endexample


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Elements of unipotent subgroups of Chevalley groups}

In this section we will describe the functionality for unipotent elements
provided by this package.

\>`IsUnipotChevElem'{IsUnipotChevElem}@{`IsUnipotChevElem'} C

Category for elements of a unipotent subgroup.

\>`IsUnipotChevRepByRootNumbers'{IsUnipotChevRepByRootNumbers}@{`IsUnipotChevRepByRootNumbers'} R
\>`IsUnipotChevRepByFundamentalCoeffs'{IsUnipotChevRepByFundamentalCoeffs}@{`IsUnipotChevRepByFundamentalCoeffs'} R
\>`IsUnipotChevRepByRoots'{IsUnipotChevRepByRoots}@{`IsUnipotChevRepByRoots'} R

`IsUnipotChevRepByRootNumbers', `IsUnipotChevRepByFundamentalCoeffs' and
`IsUnipotChevRepByRoots' are different representations for unipotent
elements.

Roots of elements with representation `IsUnipotChevRepByRootNumbers' are
represented by their numbers (positions) in `RootSystem(<U>).posroots'.

Roots of elements with representation `IsUnipotChevRepByFundamentalCoeffs' are
represented by coefficients of linear combinations of fundamental roots
`RootSystem(<U>).fundroots'.

Roots of elements with representation `IsUnipotChevRepByRoots' are
represented by roots themself.

(See "UnipotChevElemByRootNumbers", "UnipotChevElemByFundamentalCoeffs"
 and "UnipotChevElemByRoots" for examples)


\>UnipotChevElemByRootNumbers( <U>, <list> ) O
\>UnipotChevElemByRootNumbers( <U>, <r>, <x> ) O
\>UnipotChevElemByRN( <U>, <list> ) O
\>UnipotChevElemByRN( <U>, <r>, <x> ) O

`UnipotChevElemByRootNumbers' returns an element of a unipotent subgroup
<U> with representation `IsUnipot\-ChevRepByRootNumbers'
(see "IsUnipotChevRepByRootNumbers").

<list> should be a list of records with components <r> and <x>
representing the number of the root in `RootSystem(<U>).posroots' and a
ring element, respectively.

The second variant of `UnipotChevElemByRootNumbers' is an abbreviation
for the first one if <list> contains only one record.

`UnipotChevElemByRN' is a synonym for `UnipotChevElemByRootNumbers'.

\beginexample
gap> IsIdenticalObj( UnipotChevElemByRN, UnipotChevElemByRootNumbers );
true
gap> y := UnipotChevElemByRootNumbers(U_G2, [rec(r:=1, x:=2), rec(r:=5, x:=7)]);
x_{1}( 2 ) * x_{5}( 7 )
gap> x := UnipotChevElemByRootNumbers(U_G2, 1, 2);
x_{1}( 2 )
\endexample

In this example we create two elements: $x_{r_1}( 2 ) . x_{r_5}( 7 )$ and
$x_{r_1}( 2 )$, where $r_i, i = 1, \dots, 6$ are the positive roots in
`RootSystem(<U>).posroots' and $x_{r_i}(t), i = 1, \dots, 6$ the
corresponding root elements.

\>UnipotChevElemByFundamentalCoeffs( <U>, <list> ) O
\>UnipotChevElemByFundamentalCoeffs( <U>, <coeffs>, <x> ) O
\>UnipotChevElemByFC( <U>, <list> ) O
\>UnipotChevElemByFC( <U>, <coeffs>, <x> ) O

`UnipotChevElemByFundamentalCoeffs' returns an element of a unipotent
subgroup <U> with representation `IsUnipotChevRepByFundamentalCoeffs'
(see "IsUnipotChevRepByFundamentalCoeffs").

<list> should be a list of records with components <coeffs> and <x>
representing a root in `RootSystem(<U>).posroots' as coefficients of a
linear combination of fundamental roots `RootSystem(<U>).fundroots' and
a ring element, respectively.

The second variant of `UnipotChevElemByFundamentalCoeffs' is an
abbreviation for the first one if <list> contains only one record.

`UnipotChevElemByFC' is a synonym for `UnipotChevElemByFundamentalCoeffs'.

\beginexample
gap> y1 := UnipotChevElemByFundamentalCoeffs( U_G2,
>      [ rec( coeffs := [ 1, 0 ], x := 2 ),
>        rec( coeffs := [ 3, 1 ], x := 7 ) ] );
x_{[ 1, 0 ]}( 2 ) * x_{[ 3, 1 ]}( 7 )
gap> x1 := UnipotChevElemByFundamentalCoeffs( U_G2, [ 1, 0 ], 2 );
x_{[ 1, 0 ]}( 2 )
\endexample

In this example we create the same two elements as in
"UnipotChevElemByRootNumbers": 
$x_{[ 1, 0 ]}( 2 ) . x_{[ 3, 1 ]}( 7 )$ and $x_{[ 1, 0 ]}( 2 )$,
where $[ 1, 0 ] = 1r_1 + 0r_2 = r_1$ and $[ 3, 1 ] = 3r_1 + 1r_2=r_5$
are the first and the fifth positive roots of `RootSystem(<U>).posroots'
respectively.

\>UnipotChevElemByRoots( <U>, <list> ) O
\>UnipotChevElemByRoots( <U>, <r>, <x> ) O
\>UnipotChevElemByR( <U>, <list> ) O
\>UnipotChevElemByR( <U>, <r>, <x> ) O

`UnipotChevElemByRoots' returns an element of a unipotent subgroup <U>
with representation `IsUnipotChev\-RepByRoots'
(see "IsUnipotChevRepByRoots").

<list> should be a list of records with components <r> and <x>
representing the root in `RootSystem(<U>).posroots' and a ring
element, respectively.

The second variant of `UnipotChevElemByRoots' is an abbreviation for the
first one if <list> contains only one record.

`UnipotChevElemByR' is a synonym for `UnipotChevElemByRoots'.

\beginexample
gap> y2 := UnipotChevElemByRoots( U_G2,
>      [ rec( r := [ 2, -1 ], x := 2 ),
>        rec( r := [ 3, -1 ], x := 7 ) ] );
x_{[ 2, -1 ]}( 2 ) * x_{[ 3, -1 ]}( 7 )
gap> x2 := UnipotChevElemByRoots( U_G2, [ 2, -1 ], 2 );
x_{[ 2, -1 ]}( 2 )
\endexample

In this example we create again the two elements as in previous examples: 
$x_{[ 2, -1 ]}( 2 ) . x_{[ 3, -1 ]}( 7 )$ and $x_{[ 2, -1 ]}( 2 )$,
where $[ 2, -1 ] = r_1$ and $[ 3, -1 ] = r_5$
are the first and the fifth positive roots of `RootSystem(<U>).posroots'
respectively.



\>`UnipotChevElemByRootNumbers( <x> )'{UnipotChevElemByRootNumbers!conv}@{`UnipotChevElemByRootNumbers'} O
\>`UnipotChevElemByFundamentalCoeffs( <x> )'{UnipotChevElemByFundamentalCoeffs!conv}@{`UnipotChevElemByFundamentalCoeffs'} O
\>`UnipotChevElemByRoots( <x> )'{UnipotChevElemByRoots!conv}@{`UnipotChevElemByRoots'} O

`UnipotChevElemByRootNumbers' is provided for converting elements to the
representation `IsUnipotChev\-RepByRootNumbers'. If <x> has already the
representation `IsUnipotChevRepByRootNumbers', then <x> itself is
returned. Otherwise a *new* element with representation
`IsUnipotChevRepByRootNumbers' is generated.

`UnipotChevElemByFundamentalCoeffs' and `UnipotChevElemByRoots' do the
same for the representations `IsUnipotChevRepByFundamentalCoeffs' and
`IsUnipotChevRepByRoots', respectively. 

\beginexample
gap> x;
x_{1}( 2 )
gap> x1 := UnipotChevElemByFundamentalCoeffs( x );
x_{[ 1, 0 ]}( 2 )
gap> IsIdenticalObj(x, x1); x = x1;
false
true
gap> x2 := UnipotChevElemByFundamentalCoeffs( x1 );;
gap> IsIdenticalObj(x1, x2);
true
\endexample

*Note:* If some attributes of <x> are known (e.g `Inverse' (see
"Inverse!UnipotChevElem"), `CanonicalForm' (see "CanonicalForm")),
then they are ``converted'' to the new representation, too.

\>CanonicalForm( <x> ) A

`CanonicalForm' returns the canonical form of <x>. 
For more information on the canonical form see Carter \cite{Carter72},
Theorem 5.3.3 (ii). It says:

   Each element of a unipotent subgroup $U$ of a Chevalley group with
   root system $\Phi$ is uniquely expressible in the form 
           $$\prod_{r_i\in\Phi^+} x_{r_i}(t_i),$$
   where the product is taken over all positive roots in increasing order.
   

\beginexample
gap> z := UnipotChevElemByFC( U_G2,
>      [ rec( coeffs := [0,1], x := 3 ),
>        rec( coeffs := [1,0], x := 2 ) ] );
x_{[ 0, 1 ]}( 3 ) * x_{[ 1, 0 ]}( 2 )
gap> CanonicalForm(z);
x_{[ 1, 0 ]}( 2 ) * x_{[ 0, 1 ]}( 3 ) * x_{[ 1, 1 ]}( 6 ) * 
x_{[ 2, 1 ]}( 12 ) * x_{[ 3, 1 ]}( 24 ) * x_{[ 3, 2 ]}( -72 ) 
\endexample


\>`PrintObj( <x> )'{PrintObj!UnipotChevElem}@{`PrintObj' for `UnipotChevElem'} M
\>`ViewObj( <x> )'{ViewObj!UnipotChevElem}@{`ViewObj' for `UnipotChevElem'} M

Special methods for unipotent elements.
(see {\GAP} Reference Manual, section "ref:View and Print" for general 
information on `View' and `Print')

\beginexample
gap> Print(x);
UnipotChevElemByRootNumbers( UnipotChevSubGr( "G", 2, Rationals ), [ rec(
      r := 1,
      x := 2 ) ] )gap> View(x);
x_{1}( 2 )
\endexample
\beginexample
gap> Print(x1);
UnipotChevElemByFundamentalCoeffs( UnipotChevSubGr( "G", 2, Rationals ),
[ rec(
      coeffs := [ 1, 0 ],
      x := 2 ) ] )gap> View(x1);
x_{[ 1, 0 ]}( 2 )
\endexample

\>`ShallowCopy( <x> )'{ShallowCopy!UnipotChevElem}@{`ShallowCopy'} M

This is a special method for unipotent elements.

`ShallowCopy' creates a copy of <x>. The returned object is *not identical*
to <x> but it is *equal* to <x> w.r.t. the equality operator `='.
*Note* that `CanonicalForm' and `Inverse' of <x> (if known) are identical
to `CanonicalForm' and `Inverse' of the returned object.

(See {\GAP} Reference Manual, section "ref:Duplication of Objects" for
further information on copyability)

\>`<x> = <y>'{equality!UnipotChevElem}@{Equality for `UnipotChevElem'} M

Special method for unipotent elements.
If <x> and <y> are identical or are products of the *same* root elements then
`true' is returned. Otherwise `CanonicalForm' (see "CanonicalForm") of
both arguments must be computed (if not already known), which may be
expensive.

\beginexample
gap> y := UnipotChevElemByRootNumbers( U_G2, [ rec(
>        r := 1,
>        x := 2 ), rec(
>        r := 5,
>        x := 7 ) ] );
x_{1}( 2 ) * x_{5}( 7 )
gap>
gap> z := UnipotChevElemByRootNumbers( U_G2, [ rec(
>        r := 5,
>        x := 7 ), rec(
>        r := 1,
>        x := 2 ) ] );
x_{5}( 7 ) * x_{1}( 2 )
gap> y=z;
#I  CanonicalForm for the 1st argument is not known.
#I                    computing it may take a while.
#I  CanonicalForm for the 2nd argument is not known.
#I                    computing it may take a while.
true
gap>


\endexample

\>`<x> * <y>'{Multiplication!UnipotChevElem}@{Multiplication for `UnipotChevElem'} M

Special method for unipotent elements. The expressions in the form
$x_r(t)x_r(u)$ will be reduced to $x_r(t+u)$ whenever possible. 

\beginexample
gap> y;z;
x_{1}( 2 ) * x_{5}( 7 )
x_{5}( 7 ) * x_{1}( 2 )
gap> y*z;
x_{1}( 2 ) * x_{5}( 14 ) * x_{1}( 2 )
\endexample

*Note:* If both arguments have the same representation, the product will 
have it too. But if the representations are different, the representation
of the first argument will become the representation of the product.

\beginexample
gap> x; x1; x=x1;
x_{1}( 2 )
x_{[ 1, 0 ]}( 2 )
true
gap> x * x1;
x_{1}( 4 )
gap> x1 * x;
x_{[ 1, 0 ]}( 4 )
\endexample

\>`OneOp( <x> )'{OneOp!UnipotChevElem}@{`OneOp' for `UnipotChevElem'} M

Special method for unipotent elements. `OneOp' returns the 
multiplicative neutral element of <x>. This is equal to <x>^0.

\>`Inverse( <x> )'{Inverse!UnipotChevElem}@{`Inverse' for `UnipotChevElem'} M
\>`InverseOp( <x> )'{InverseOp!UnipotChevElem}@{`InverseOp' for `UnipotChevElem'} M

Special methods for unipotent elements. We are using the fact
$$   \Bigl( x_{r_1}(t_1) \cdots x_{r_m}(t_m) \Bigr)^{-1} =
     x_{r_m}(-t_m) \cdots x_{r_1}(-t_1)   \. $$


\>`Comm( <x>, <y> )'{Comm!UnipotChevElem}@{`Comm' for `UnipotChevElem'} M
\>`Comm( <x>, <y>, "canonical" )'{Comm!UnipotChevElem}@{`Comm' for `UnipotChevElem'} M

Special methods for unipotent elements.

`Comm' returns the commutator of <x> and <y>, i.e. $<x> ^{-1} . <y>^{-1}
. <x> . <y>$. The second variant returns the canonical form of the
commutator. In some cases it may be more efficient than `CanonicalForm(
Comm( <x>, <y> ) )'

\>IsRootElement( <x> ) P

`IsRootElement' returns `true' if and only if <x> is a <root element>,
i.e $<x>=x_{r}(t)$ for some root $r$.
We store this property just after creating objects.

*Note:* the canonical form of <x> may be a root element even if <x> isn't one.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%E  unipot.tex  . . . . . . . . . . . . . . . . . . . . . . . . ends here
