%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
%W  unipot.tex          UNIPOT documentation                Sergei.Haller
%%
%H  $Id: unipot.tex,v 2.6 2002/07/25 08:39:33 gc1007 Exp $
%%
%Y  Copyright (C) 2000-2002, Sergei Haller
%Y  Arbeitsgruppe Algebra, Justus-Liebig-Universitaet Giessen
%%
%%

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

This  chapter  describes  the  package  {\Unipot}.  Mainly,  the  package
provides the ability to compute  with  elements of unipotent subgroups of
Chevalley groups, but also some properties of this 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''.  Specifically,   we  only  consider   unipotent
subgroups generated by all positive root elements.


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

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

\>`UnipotChevInfo'  V

`UnipotChevInfo'  is an `InfoClass' used  in this package. `InfoLevel' of
this `InfoClass' is set to  1 by default and can be changed to  any level
by `SetInfoLevel( UnipotChevInfo, <n> )'.

Following levels are used throughout the package:
\beginlist
\itemitem{1.}%ordered{1}
    ---
\itemitem{2.}
    When calculating the order of a finite unipotent subgroup,  the power
    presentation of this number is printed.
    (See "Size!for `UnipotChevSubGr'" for an example)
\itemitem{3.}
    When  comparing  unipotent  elements,  output,  for which of them the
    canonical form must be computed.
    (See "Equality!for UnipotChevElem" for an example)
\itemitem{4.}
    ---
\itemitem{5.}
    While calculating the canonical form, output the different steps.
\itemitem{6.}
    The  process  of  calculating  the  Chevalley commutator constants is
    printed on the screen
\endlist





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

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

\>IsUnipotChevSubGr( <grp> ) 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 type  `"A"', <n> must be a positive integer.

For the types `"B"' and `"C"', <n> must be a positive integer $\geq 2$.

For the type  `"D"', <n> must be a positive integer $\geq 4$.

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>
gap> IsUnipotChevSubGr(U_G2);
true
\endexample
\begintt
gap> UnipotChevSubGr("E", 3, Rationals);
Error, <n> must be one of 6, 7, 8 for type E  called from
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> )!{for `UnipotChevSubGr'} M
\>ViewObj( <U> )!{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>gap>
\endexample

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

Special  methods  for unipotent  subgroups. Return the  identity
element   of   the   group  <U>.   The   returned   element  has
representation `UNIPOT_DEFAULT_REP' (see "UNIPOT_DEFAULT_REP").


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

`Size' returns  the order  of a unipotent subgroup.  This  is  a
special  method for  unipotent  subgroups  using the  result  in
Carter \cite{Carter72}, Theorem 5.3.3 (ii).

\beginexample
gap> SetInfoLevel( UnipotChevInfo, 2 );
gap> Size( UnipotChevSubGr("E", 8, GF(7)) );
#I  The order of this group is 7^120 which is
25808621098934927604791781741317238363169114027609954791128059842592785343731\
7437263620645695945672001
gap> SetInfoLevel( UnipotChevInfo, 1 );
\endexample


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

This  method is similar  to the  method `RootSystem'  for semisimple  Lie
algebras (see Section "ref:Semisimple  Lie Algebras and Root  Systems" in
the {\GAP} Reference Manual for further information).

`RootSystem' returns the underlying root system of the unipotent subgroup
<U>. The returned object is from the category `IsRootSystem':

\beginexample
gap> R_G2 := RootSystem(U_G2);
<root system of rank 2>
gap> IsRootSystem(last);
true
gap> SimpleSystem(R_G2);
[ [ 2, -1 ], [ -3, 2 ] ]
gap>
\endexample

Additionally to the properties and attributes described in the  Reference
Manual, following attributes  are installed for the  Root  Systems by the
package {\Unipot}:

\>PositiveRootsFC( <R> ) A
\>NegativeRootsFC( <R> ) A

The list of positive resp. negative  roots of the root system <R>.  Every
root is  represented as a list of coefficients  of the linear combination
in fundamental  roots. E.g.  let  $r=\sum_{i=1}^l  k_ir_i$,  where  $r_1,
\dots, r_l$ are the  fundamental roots,  then  $r$ is represented as  the
list $[k_1, \dots, k_l]$.

\beginexample
gap> U_E6 := UnipotChevSubGr("E",6,GF(2));
<Unipotent subgroup of a Chevalley group of type E6 over GF(2)>
gap> R_E6 := RootSystem(U_E6);
<root system of rank 6>
gap> PositiveRoots(R_E6){[1..6]};
[ [ 2,  0, -1, 0,  0, 0 ], [ 0, 2, 0, -1, 0,  0 ], [ -1, 0, 2, -1,  0, 0 ],
  [ 0, -1, -1, 2, -1, 0 ], [ 0, 0, 0, -1, 2, -1 ], [  0, 0, 0,  0, -1, 2 ] ]
gap> PositiveRootsFC(R_E6){[1..6]};
[ [ 1, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, 0 ],
  [ 0, 0, 0, 1, 0, 0 ], [ 0, 0, 0, 0, 1, 0 ], [ 0, 0, 0, 0, 0, 1 ] ]
gap>
gap> PositiveRootsFC(R)[Length(PositiveRootsFC(R_E6))]; # the highest root
[ 1, 2, 2, 3, 2, 1 ]
\endexample

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

This  is a special Method  for unipotent  subgroups of  finite  Chevalley
groups.

\>Representative( <U> ) M

This method  returns  an  element  of  the  unipotent  subgroup  <U> with
indeterminates  instead of ring elements. Such  an element could be  used
for  symbolic  computations (see  "Symbolic Computation").  The  returned
element      has       representation      `UNIPOT_DEFAULT_REP'      (see
"UNIPOT_DEFAULT_REP").

\beginexample
gap> Representative(U_G2);
x_{1}( t_1 ) * x_{2}( t_2 ) * x_{3}( t_3 ) * x_{4}( t_4 ) * 
x_{5}( t_5 ) * x_{6}( t_6 )
\endexample


\>CentralElement( <U> ) M

This  method  returns  the  representative of  the  center of <U> without
calculating the center.






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

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

\>IsUnipotChevElem( <elm> ) C

Category for elements of a unipotent subgroup.

\>IsUnipotChevRepByRootNumbers( <elm> ) R
\>IsUnipotChevRepByFundamentalCoeffs( <elm> ) R
\>IsUnipotChevRepByRoots( <elm> ) R

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

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

Roots          of          elements          with          representation
`IsUnipotChevRepByFundamentalCoeffs'  are  represented  by   elements  of
`PositiveRootsFC(RootSystem(<U>))'.

Roots  of   elements  with  representation  `IsUnipotChevRepByRoots'  are
represented     by     roots     themself,      i.e.      elements     of
`PositiveRoots(RootSystem(<U>))'.

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


\>`UNIPOT_DEFAULT_REP' V

This variable  contains  the  default representation  for  newly  created
elements, e.g. created by  `One' or `Random'. When  {\Unipot}  is loaded,
the  default representation is  `IsUnipotChevRepByRootNumbers' and can be
changed by assigning a new value to `UNIPOT_DEFAULT_REP'.

\beginexample
gap> UNIPOT_DEFAULT_REP := IsUnipotChevRepByFundamentalCoeffs;;
\endexample

*Note* that {\Unipot} doesn't check the type of this  value, i.e. you may
assign any value to `UNIPOT_DEFAULT_REP', which  may  result in errors in
following commands:

\begintt
gap> UNIPOT_DEFAULT_REP := 3;;
gap> One( U_G2 );
... Error message ...
\endtt

\>UnipotChevElemByRootNumbers( <U>, <roots>, <felems> ) O
\>UnipotChevElemByRootNumbers( <U>, <root>, <felem> ) O
\>UnipotChevElemByRN( <U>, <roots>, <felems> ) O
\>UnipotChevElemByRN( <U>, <root>, <felem> ) O

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

<roots> should be a list of root numbers, i.e. integers from the range 1,
...,  `Length(PositiveRoots(Root\-System(<U>)))'. And <felems> a list  of
corresponding ring elements or indeterminates over that ring  (see {\GAP}
Reference   Manual,   "ref:Indeterminate"  for  general   information  on
indeterminates  or  section  "Symbolic computation"  of  this  manual for
examples).

The second  variant of  `UnipotChevElemByRootNumbers'  is an abbreviation
for the first one if <roots> and <felems> contain only one element.

`UnipotChevElemByRN' is just a synonym for `UnipotChevElemByRootNumbers'.

\beginexample
gap> IsIdenticalObj( UnipotChevElemByRN, UnipotChevElemByRootNumbers );
true
gap> y := UnipotChevElemByRootNumbers(U_G2, [1,5], [2,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
`PositiveRoots(RootSystem(<U>))' and $x_{r_i}(t),  i  = 1, \dots, 6$  the
corresponding root elements.


\>UnipotChevElemByFundamentalCoeffs( <U>, <roots>, <felems> ) O
\>UnipotChevElemByFundamentalCoeffs( <U>, <root>, <felem> ) O
\>UnipotChevElemByFC( <U>, <roots>, <felems> ) O
\>UnipotChevElemByFC( <U>, <root>, <felem> ) O

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

<roots>      should      be      a     list      of      elements      of
`PositiveRootsFC(Root\-System(<U>))'.   And   <felems>    a    list    of
corresponding ring elements or indeterminates over that ring  (see {\GAP}
Reference   Manual,   "ref:Indeterminate"  for  general   information  on
indeterminates  or  section  "Symbolic computation"  of  this  manual for
examples).

The   second   variant  of   `UnipotChevElemByFundamentalCoeffs'   is  an
abbreviation for  the first one if <roots> and  <felems> contain only one
element.

`UnipotChevElemByFC'       is       just       a        synonym       for
`UnipotChevElemByFundamentalCoeffs'.

\beginexample
gap> PositiveRootsFC(RootSystem(U_G2));
[ [ 1, 0 ], [ 0, 1 ], [ 1, 1 ], [ 2, 1 ], [ 3, 1 ], [ 3, 2 ] ]
gap> y1 := UnipotChevElemByFundamentalCoeffs( U_G2, [[ 1, 0 ], [ 3, 1 ]], [2,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
`PositiveRootsFC(RootSystem(<U>))' respectively.


\>UnipotChevElemByRoots( <U>, <roots>, <felems> ) O
\>UnipotChevElemByRoots( <U>, <root>, <felem> ) O
\>UnipotChevElemByR( <U>, <roots>, <felems> ) O
\>UnipotChevElemByR( <U>, <root>, <felem> ) O

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

<roots>   should   be   a    list   of   elements   of   `PositiveRoots(%
Root\-System(<U>))'. And  <felems> a list of  corresponding ring elements
or  indeterminates  over   that   ring  (see   {\GAP}  Reference  Manual,
"ref:Indeterminate" for general information on indeterminates or  section
"Symbolic computation" of this manual for examples).


The second variant of `UnipotChevElemByRoots' is an abbreviation  for the
first one if <roots> and <felems> contain only one element.

`UnipotChevElemByR' is just a synonym for `UnipotChevElemByRoots'.

\beginexample
gap> PositiveRoots(RootSystem(U_G2));
[ [ 2, -1 ], [ -3, 2 ], [ -1, 1 ], [ 1, 0 ], [ 3, -1 ], [ 0, 1 ] ]
gap> y2 := UnipotChevElemByRoots( U_G2, [[ 2, -1 ], [ 3, -1 ]], [2,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 `PositiveRoots(RootSystem( <U>))' respectively.


\>UnipotChevElemByRootNumbers( <x> )!{element conversion} O
\>UnipotChevElemByFundamentalCoeffs( <x> )!{element conversion} O
\>UnipotChevElemByRoots( <x> )!{element conversion} O

These three methods are  provided  for converting a unipotent element  to
the respective representation.

If  <x>  has  already  the required representation,  then  <x>  itself is
returned. Otherwise  a *new* element  with the required representation is
generated.

\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!for     `UnipotChevElem'")      or     `CanonicalForm'      (see
"CanonicalForm")), then they are ``converted'' to the new representation,
too.


\){\fmark}UnipotChevElemByRootNumbers( <U>, <list> ) O
\){\fmark}UnipotChevElemByRoots( <U>, <list> ) O
\){\fmark}UnipotChevElemByFundamentalCoeffs( <U>, <list> ) O

*DEPRECATED*  These   are  old  versions  of  `UnipotChevElemByXX'  (from
{\Unipot}  1.0   and  1.1).  They  are  deprecated  now  and   exist  for
compatibility only. They may be removed at any time.



\>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, [[0,1], [1,0]], [3,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

So  if  we  call  the  positive  roots  $r_1,\dots,r_6$,  we  have  $ z =
x_{r_2}(3)x_{r_1}(2) = x_{r_1}( 2 ) x_{r_2}( 3 ) x_{r_3}( 6 ) x_{r_4}( 12
) x_{r_5}( 24 ) x_{r_6}( -72 )$.


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

Special  methods for  unipotent elements. (see {\GAP}  Reference  Manual,
section  "ref:View  and  Print"  for  general  information on  `View' and
`Print'). The output depends on the representation of <x>.


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

\>ShallowCopy( <x> )!{for `UnipotChevElem'} 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!for UnipotChevElem}@{Equality!for `UnipotChevElem'} M
\indextt{\\=}

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. If the canonical
form of one  of  the  elements  must be  calculated  and  `InfoLevel'  of
`UnipotChevInfo' is at least 3, the user is notified about this:


\beginexample
gap> y := UnipotChevElemByRN( U_G2, [1,5], [2,7] );
x_{1}( 2 ) * x_{5}( 7 )
gap> z := UnipotChevElemByRN( U_G2, [5,1], [7,2] );
x_{5}( 7 ) * x_{1}( 2 )
gap> SetInfoLevel( UnipotChevInfo, 3 );
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> SetInfoLevel( UnipotChevInfo, 1 );
\endexample

\>`<x> \< <y>'{Less than!for UnipotChevElem}@{Less than!for `UnipotChevElem'} M
\indextt{\\\<}

Special Method for `UnipotChevElem'

This is needed e.g. by `AsSSortetList'.

The ordering is computed in the following way:
Let    $x = x_{r_1}(s_1) ... x_{r_n}(s_n)$
and    $y = x_{r_1}(t_1) ... x_{r_n}(t_n)$, then

$$ x \< y \quad  \Leftrightarrow \quad [ s_1, \dots, s_n ] \< [ t_1, \dots, t_n ], $$

where the lists are compared lexicographically.
e.g. for $x = x_{r_1}(1)x_{r_2}(1) = x_{r_1}(1)x_{r_2}(1)x_{r_3}(0)$  (field elems: `[ 1, 1, 0 ]')
     and $y = x_{r_1}(1)x_{r_3}(1) = x_{r_1}(1)x_{r_2}(0)x_{r_3}(1)$  (field elems: `[ 1, 0, 1 ]')
we have $y \< x$ (above lists ordered lexicographically).

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

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:*  The   representation  of  the   product  will   be  always   the
representation of the first argument.

\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> )!{for `UnipotChevElem'} M

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


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

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

\>IsOne( <x> ) M

Special method for unipotent elements. Returns `true'  if and only if <x>
is equal to the identity element.

\>`<x> ^ <i>'{Powers!of UnipotChevElem}@{Powers!of `UnipotChevElem'} M

Integral powers of the unipotent elements are  calculated  by the default
methods installed in {\GAP}.  But  special (more efficient)  methods  are
instlled for root elements and for the identity.


\>`<x> ^ <y>'{Conjugation!of UnipotChevElem}@{Conjugation!of `UnipotChevElem'} M

Conjugation  of  two  unipotent elements,  i.e.  $x^y  =  y^{-1}xy$.  The
representation of  the result  will  be the representation  of <x>.

\>Comm( <x>, <y> )!{for `UnipotChevElem'} M
\>Comm( <x>, <y>, "canonical" )!{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 {\it  root
element}, i.e.\ $<x>=x_{r}(t)$ for some root $r$. We  store this property
immediately after creating objects.

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


\beginexample
gap> x := UnipotChevElemByRN( U_G2, [1,5,1], [2,7,-2] );
x_{1}( 2 ) * x_{5}( 7 ) * x_{1}( -2 )
gap> IsRootElement(x);
false
gap> CanonicalForm(x); IsRootElement(CanonicalForm(x));
x_{5}( 7 )
true
\endexample

\>IsCentral( <U>, <z> )

Special method for a unipotent subgroup and a unipotent element.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\Section{Symbolic computation}

In  some  cases,  calculation  with explicite  elements  is  not  enough.
{\Unipot}  povides a  way  to  do  symbolic calculations  with  unipotent
elements for this  purpose.  This is  done by using  indeterminates  (see
{\GAP} Reference Manual, "ref:Indeterminates" for  more information) over
the underlying field instead of the field elements.


\beginexample
gap> U_G2 := UnipotChevSubGr("G", 2, Rationals);;
gap> a := Indeterminate( Rationals, "a" );
a
gap> b := Indeterminate( Rationals, "b", [a] );
b
gap> c := Indeterminate( Rationals, "c", [a,b] );
c
gap> x := UnipotChevElemByFC(U_G2, [ [3,1], [1,0], [0,1] ], [a,b,c] );
x_{[ 3, 1 ]}( a ) * x_{[ 1, 0 ]}( b ) * x_{[ 0, 1 ]}( c )
gap> CanonicalForm(x);
x_{[ 1, 0 ]}( b ) * x_{[ 0, 1 ]}( c ) * x_{[ 3, 1 ]}( a ) *
x_{[ 3, 2 ]}( a*c )
gap> CanonicalForm(x^-1);
x_{[ 1, 0 ]}( -b ) * x_{[ 0, 1 ]}( -c ) * x_{[ 1, 1 ]}( b*c ) *
x_{[ 2, 1 ]}( -b^2*c ) * x_{[ 3, 1 ]}( -a+b^3*c ) * x_{[ 3, 2 ]}( b^3*c^2 )
\endexample



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