CreateHeckeBasis(basis, ops)
creates a new basis for Hecke algebras in  which to do computations. (The
design of this   function has  benefited  from conversation  with  Andrew
Mathas, the author of the package Specht).
The first argument basis must be a unique (different from that used for
other bases)  character string.  The   second argument ops is  a record
which should contain at least two fields, ops.T and ops.(basis)
which should contain :
ops.T:T basis.
ops.(basis):T basis
  and converts it to the basis basis.
After the call to CreateHeckeBasis, a new field (basis) is added to
HeckeAlgebraOps which contains  a function  to  create elements of  the
basis basis.   These  elements will have  the  standard operations  for
Hecke elements: +, -, *, ^, =, Print, Coefficient, plus
all  extra operations that  the user may  have specified in ops.  It is
thus  possible to create   a new basis  which   has extra operations.  In
addition, for any already created basis  y of the algebra, the function
(y)  will have  the added   capability to convert   elements from the
basis  basis  to  the y basis.    If the  user  has  provided a field
ops.(y) ,  the function found there will  be used.   Otherwise, the
function ops.T will be used to convert our basis element to the T
basis, followed by calling the function  (y) which was given in ops
at the time the y basis was created, to convert to  the y basis.  The
following  forms of the Basis  function will be accepted  (as for the T
basis):
Basis( H, basis )( perm )
Basis( H, basis )( perms, coeffs)
Basis( H, basis )( list )
Basis( H, basis )( s1, .. , sn )
One should note, however that for the last two forms only reduced expressions will be accepted in general.
Below is  an example where the  basis  t_w=q^{l(x)/2}T_w is created and
used.  Here we have set v=q^{1/2}.  As an example of an extra operation
in ops, we  have given a method  for BetaInvolution.   If methods for
one of  BetaInvolution,    AltInvolution  are given  they   will   be
automatically called  by the generic functions  with the same name.  Here
we have set BetaInvolution to use the same  method as used by T basis
elements.
In  order to  understand the  following code, one  has  to recall that an
arbitrary  Hecke element is a record;  the basis  elements are labeled by
the Coxeter  group elements in the  component elm and the corresponding
coefficients in the  component coeff.  For  efficiency  reasons, it  is
necessary to describe the  conversion  functions on such arbitrary  Hecke
elements and not just for one basis element T_w or t_w.
    gap> CreateHeckeBasis( "t", rec(
    > T := h->Basis( Hecke(h), "T" )( h.elm, List( [1 .. Length( h.elm )], 
    >  i->Hecke(h).sqrtParameter[1]^CoxeterLength( 
    >              CoxeterGroup( Hecke(h) ), h.elm[i] ) *  h.coeff[i] ) ),
    >
    > t := h->Basis( Hecke(h), "t" )( h.elm, List( [1 .. Length( h.elm )],
    >  i->Hecke(h).sqrtParameter[1]^-CoxeterLength( 
    >               CoxeterGroup( Hecke(h) ), h.elm[i] ) * h.coeff[i] ) ),
    >
    > BetaInvolution := h->Basis( Hecke( h ),"t")( 
    >                     HeckeAlgebraOps.T.BetaInvolution( 
    >                             Basis( Hecke( h ), "T" )( h ) ) ) ) );
    gap> v := X( Rationals );; v.name := "v";; 
    gap> H := Hecke( CoxeterGroup( "A", 3 ), v ^ 2, v );;
    gap> h := Basis( H, "t" )( 3, 1, 2 );
    t(1,3,2)
    gap> h1 := Basis( H, "T")( h );
    v^3T(1,3,2)
    gap> h2 := Basis( H, "t" )( h1 );
    t(1,3,2)
    gap> BetaInvolution( h2 );
    v^-12t(2,1,3) 
This function requires the package "chevie" (see RequirePackage).
GAP 3.4.4