Design discussion about Hecke Algebras

Quite a few people expressed interest in (affine) Iwahori-Hecke algebras, including NicolasBorie, DanBump, BrantJones, VincentFeray, FlorentHivert, MikeHansen, AndrewMathas, AnneSchilling, NicolasThiéry.

There are pieces of code for it in many different places in MuPAD-Combinat, also a bit in Sage, etc. It is time for setting up where we want to go, and cleanup that mess!

Here is a first draft of user story describing how we would want to use this algebra. Please expand and comment!

We construct the `(q_1,q_2)`-(Iwahori-)Hecke algebra for the Weyl
group W of type B_3. This is the algebra generated by operators `T_1,
T_2, T_3` satisfying the same braid-like relations as the simple
reflections in W, but subject to the quadratic relation `(T_i -
q_1)(T_i - q_2) = 0`.  (i.e. `q_1`, and `q_2` are the eigenvalues of
the generators `T_i`).  Different mathematicians uses different
parametrizations. This one is the most generic, and can easily be
specialized to other ones.

Of course, we need to take a base ring which contains the
parameters `q_1` and `q_2`.

    sage: W = WeylGroup(["B",3])
    sage: R = QQ['q1,q2']
    sage: q1,q2 = R.gens()
    sage: HeckeAlgebra(R, W, q1, q2)
    The (q1,q2)-Hecke algebra of the Weyl group of type B_3

AM The most general Hecke algebra of type B has three parameters. In general, you can two generators for each (conjugacy class of) simple reflections. I also prefer the syntax  WeylGroup("B",3) .

The default value for the parameters give the usual normalization q1=q and q2=-1:

    sage: HeckeAlgebra(QQ['q'], W)
    The q-Hecke algebra of the Weyl group of type B_3

(note: do we want to automatically extend the field with the parameter 'q'???)

The parameters can also be specialized to numbers, like roots of
unity, ... Here we construct the algebra of the symmetric group, the
zero-Hecke algebra, and the nil-Hecke algebra::

    sage: HeckeAlgebra(QQ['q'], W, q1=1)
    The 0-Hecke algebra of the Weyl group of type B_3

    sage: HeckeAlgebra(QQ['q'], W, q1=0)
    The 0-Hecke algebra of the Weyl group of type B_3

    sage: HeckeAlgebra(QQ['q'], W, q1=0,q2=0)
    The nil-Hecke algebra of the Weyl group of type B_3

Let us get back to the default::
    sage: H = HeckeAlgebra(QQ['q'], W)
    The q-Hecke algebra of the Weyl group of type B_3
So far, all we have been doing is constructing the abstract Hecke
algebra. To actually compute within it, one need to choose a concrete
basis where the elements will be expanded. The first basis is the T
basis: `(T_w = \prod_{i \in red(w)} T_i)_{w \in W}`::

    sage: H.T()
    The q-Hecke algebra of the Weyl group of type B_3, with elements expresses in the T basis
    sage: T = H.T().basis()
    This basis is indexed by elements of the WeylGroup:
    sage: s = W.simple_reflections(); w = s[1]*s[2]
    sage: T[w] + 3 * T[s[1]]^2

Do we want to provide the following slight abuse of notation, as a
convenience for the reader?

    sage: T[1] + 2*T[3,2,3,1]
which would be equivalent to:

    sage: T[s[1]] + 2 * T[s[3]+s[2]+s[3]+s[1]]

AM I like the general syntax. My vote is to allow T[1,2,3] -- or instead T(1,2,3)? Is the .basis() really necessary in  T.H.T().basis() ? I would prefer to use  H.T(1)  rather than  H.T().basis[1]  etc.
There is also a question of how much we overload these basis functions. Do we accept integer sequences, simple root sequences, group elements, elements of algebra written with respect to another basis:  H.T( H.C(w) )? Chevie allows all of these, and that would be my vote.

Another option is to express elements in the Yang Baxter basis, which
depends on a set of spectral parameters (aka an element of the torus
of the Lie group, or character of the root lattice).

    sage: YB = H.yang_baxter(spectral_parameters).basis()
    sage: YB[s[2]*s[1]]

One can switch back and forth between those two bases by:

    sage: H.T()( YB[3,2,3,1] + 3 )

TODO: find the appropriate shortcut syntax, and use them consistently
with symmetric functions.

There is also the dual Yang Baxter basis, the Kazhdan-Lusztig basis, ...:

    sage: YB = H.yang_baxter(spectral_parameters, dual = True).basis()
    sage: H.kazhdan_lusztig()

Here are some other common features:
The Jucis-Murphy elements:
    sage: jm = H.jucis_murphy()
    sage: jm[2] * jm[3]

The commutative algebra generated by those:
    sage: H.jucis_murphy_algebra()

Let us now consider the affine Hecke algebra
    sage: W = WeylGroup(["A", 3, 1])
    sage: H = HeckeAlgebra(QQ, W)
    The q-Hecke algebra of the Weyl group of type [A,3,1]

As in the classical case, there is the T basis:
    sage: B = H.T()

But one can also consider the affine hecke algebra as the skew tensor
product `\mathbb{Q}[q][X] \otimes H(\circle W)` of the commutative
group algebra of the (co)root lattice, and the hecke algebra of type

    sage: B = H.XT()

Which ever basis B we take, we define:

    sage: X = B.X()
    sage: T = B.T()

and then, for t some translation in the weyl group, or element of the
(co)root lattice, do:

    sage: X[t] * T[1] - T[1] * X[t]

Note: would we want exponential notation X^t ???

Note: the combinatorics for expressing X[t] in the T basis is readilly
implemented in the root system code. See the signs_of_alcove_walk
method in It should be in

We can also define the intertwining operators:
    sage: tau = X.tau()
    sage: tau[2] * ...

Note: X, tau, ... could be defined in a category
WithEmbeddingOfQuotientOfAffineHeckeAlgebra (better name???) so that
quotients of the affine hecke algebra (like the Hecke group algebra)
could beneficiate from it. See:

Other features:

* calibrated representations / calibrated graphs

* double affine hecke algebra

* non symmetric Macdonald polynomials through intertwining operators

* AM complex reflection groups: at some point I would hope to add functionality at least for the Hecke algebras of type  G(r,1,n) 

* ...

HeckeAlgebras (last edited 2009-03-13 12:47:55 by andrew.mathas)