Path: blob/master/sage/algebras/iwahori_hecke_algebra.py
4156 views
"""1Iwahori Hecke Algebras2"""3#*****************************************************************************4# Copyright (C) 2010 Daniel Bump <bump at match.stanford.edu>5# Nicolas M. Thiery <nthiery at users.sf.net>6#7# Distributed under the terms of the GNU General Public License (GPL)8# http://www.gnu.org/licenses/9#*****************************************************************************10from sage.categories.all import AlgebrasWithBasis, FiniteDimensionalAlgebrasWithBasis, CoxeterGroups11import sage.combinat.root_system.cartan_type12from sage.combinat.root_system.weyl_group import WeylGroup13from sage.combinat.family import Family14from sage.combinat.free_module import CombinatorialFreeModule, CombinatorialFreeModuleElement15from sage.misc.cachefunc import cached_method1617class IwahoriHeckeAlgebraT(CombinatorialFreeModule):18r"""19INPUT:2021- ``W`` -- A CoxeterGroup or CartanType22- ``q1`` -- a parameter.2324OPTIONAL ARGUMENTS:2526- ``q2`` -- another parameter (default -1)27- ``base_ring`` -- A ring containing q1 and q2 (default q1.parent())28- ``prefix`` -- a label for the generators (default "T")2930The Iwahori Hecke algebra is defined in:3132Nagayoshi Iwahori, On the structure of a Hecke ring of a Chevalley group33over a finite field. J. Fac. Sci. Univ. Tokyo Sect. I 10 1964 215--23634(1964).3536The Iwahori Hecke algebra is a deformation of the group algebra of37the Weyl/Coxeter group. Taking the deformation parameter `q=1` as in the38following example gives a ring isomorphic to that group39algebra. The parameter `q` is a deformation parameter.4041EXAMPLES::4243sage: H = IwahoriHeckeAlgebraT("A3",1,prefix = "s")44sage: [s1,s2,s3] = H.algebra_generators()45sage: s1*s2*s3*s1*s2*s1 == s3*s2*s1*s3*s2*s346True47sage: w0 = H(H.coxeter_group().long_element())48sage: w049s1*s2*s3*s1*s2*s150sage: H.an_element()51s1*s2*s3 + 3*s1*s2 + 2*s1 + 15253Iwahori Hecke algebras have proved to be fundamental. See for example:5455Kazhdan and Lusztig, Representations of Coxeter groups and Hecke algebras.56Invent. Math. 53 (1979), no. 2, 165--184.5758Iwahori-Hecke Algebras: Thomas J. Haines, Robert E. Kottwitz,59Amritanshu Prasad, http://front.math.ucdavis.edu/0309.51686061V. Jones, Hecke algebra representations of braid groups and link62polynomials. Ann. of Math. (2) 126 (1987), no. 2, 335--388.6364For every simple reflection `s_i` of the Coxeter group, there is a65corresponding generator `T_i` of the Iwahori Hecke algebra. These66are subject to the relations6768`(T_i-q_1)*(T_i-q_2) == 0`6970together with the braid relations `T_i T_j T_i ... == T_j T_i T_j ...`,71where the number of terms on both sides is the order of `s_i s_j` in the72Coxeter group.7374Weyl group elements form a basis of the Iwahori Hecke algebra `H`75with the property that if `w1` and `w2` are Coxeter group elements76such that ``(w1*w2).length() == w1.length() + w2.length()`` then77``H(w1*w2) == H(w1)*H(w2)``.7879With the default value `q_2 = -1` and with `q_1 = q` the80generating relation may be written `T_i^2 = (q-1)*T_i + q*1` as in81Iwahori's paper.8283EXAMPLES::8485sage: R.<q>=PolynomialRing(ZZ)86sage: H=IwahoriHeckeAlgebraT("B3",q); H87The Iwahori Hecke Algebra of Type B3 in q,-1 over Univariate Polynomial Ring in q over Integer Ring and prefix T88sage: T1,T2,T3 = H.algebra_generators()89sage: T1*T190(q-1)*T1 + q9192It is useful to define ``T1,T2,T3 = H.algebra_generators()`` as above93so that H can parse its own output::9495sage: H(T1)96T19798The Iwahori Hecke algebra associated with an affine Weyl group is99called an affine Hecke algebra. These may be implemented as follows::100101sage: R.<q>=QQ[]102sage: H=IwahoriHeckeAlgebraT(['A',2,1],q)103sage: [T0,T1,T2]=H.algebra_generators()104sage: T1*T2*T1*T0*T1*T0105(q-1)*T1*T2*T0*T1*T0 + q*T1*T2*T0*T1106sage: T1*T2*T1*T0*T1*T1107q*T1*T2*T1*T0 + (q-1)*T1*T2*T0*T1*T0108sage: T1*T2*T1*T0*T1*T2109T1*T2*T0*T1*T0*T2110sage: (T1*T2*T0*T1*T0*T2).support_of_term() # get the underlying Weyl group element111[ 2 1 -2]112[ 3 1 -3]113[ 2 2 -3]114115sage: R = IwahoriHeckeAlgebraT("A3",0,0,prefix = "s")116sage: [s1,s2,s3] = R.algebra_generators()117sage: s1*s11180119120TESTS::121122sage: H1 = IwahoriHeckeAlgebraT("A2",1)123sage: H2 = IwahoriHeckeAlgebraT("A2",1)124sage: H3 = IwahoriHeckeAlgebraT("A2",-1)125sage: H1 == H1, H1 == H2, H1 is H2126(True, True, True)127sage: H1 == H3128False129130sage: R.<q>=PolynomialRing(QQ)131sage: IwahoriHeckeAlgebraT("A3",q).base_ring() == R132True133134sage: R.<q>=QQ[]; H=IwahoriHeckeAlgebraT("A2",q)135sage: 1+H(q)136(q+1)137138sage: R.<q>=QQ[]139sage: H = IwahoriHeckeAlgebraT("A2",q)140sage: T1,T2 = H.algebra_generators()141sage: H(T1+2*T2)142T1 + 2*T2143144.. rubric:: Design discussion145146This is a preliminary implementation. For work in progress, see:147http://wiki.sagemath.org/HeckeAlgebras.148149- Should we use q in QQ['q'] as default parameter for q_1?150151"""152153@staticmethod154def __classcall_private__(cls, W, q1, q2=-1, base_ring=None, prefix="T"):155"""156TESTS::157158sage: H = IwahoriHeckeAlgebraT("A2", 1)159sage: H.coxeter_group() == WeylGroup("A2")160True161sage: H.cartan_type() == CartanType("A2")162True163sage: H.base_ring() == ZZ164True165sage: H._q2 == -1166True167"""168if W not in CoxeterGroups():169W = WeylGroup(W)170if base_ring is None:171base_ring = q1.parent()172q2 = base_ring(q2)173return super(IwahoriHeckeAlgebraT, cls).__classcall__(cls, W, q1=q1, q2=q2, base_ring = base_ring, prefix=prefix)174175def __init__(self, W, q1, q2, base_ring, prefix):176"""177EXAMPLES::178179sage: R.<q1,q2>=QQ[]180sage: H = IwahoriHeckeAlgebraT("A2",q1,q2,base_ring=Frac(R),prefix="t"); H181The Iwahori Hecke Algebra of Type A2 in q1,q2 over Fraction Field of Multivariate Polynomial Ring in q1, q2 over Rational Field and prefix t182sage: TestSuite(H).run()183184"""185self._cartan_type = W.cartan_type()186self._prefix = prefix187self._index_set = W.index_set()188self._q1 = base_ring(q1)189self._q2 = base_ring(q2)190191if W.is_finite():192category = FiniteDimensionalAlgebrasWithBasis(base_ring)193else:194category = AlgebrasWithBasis(base_ring)195CombinatorialFreeModule.__init__(self, base_ring, W, category = category)196197def _element_constructor_(self, w):198"""199Construct a basis element from an element of the Weyl group200201EXAMPLES::202203sage: R.<q>=QQ[]204sage: H = IwahoriHeckeAlgebraT("A2",q)205sage: [H(x) for x in H.coxeter_group()] # indirect doctest206[1, T1, T1*T2, T1*T2*T1, T2, T2*T1]207208"""209assert w in self.basis().keys()210return self.monomial(w)211212@cached_method213def one_basis(self):214"""215Returns the unit of the underlying Coxeter group, which indexes216the one of this algebra, as per217:meth:`AlgebrasWithBasis.ParentMethods.one_basis`.218219EXAMPLES::220221sage: H = IwahoriHeckeAlgebraT("B3", 1)222sage: H.one_basis()223[1 0 0]224[0 1 0]225[0 0 1]226sage: H.one_basis() == H.coxeter_group().one()227True228sage: H.one()2291230"""231return self.coxeter_group().one()232233def _repr_(self):234"""235EXAMPLES::236237sage: R.<q1,q2>=QQ[]238sage: IwahoriHeckeAlgebraT("A2",q1,-q2,base_ring=Frac(R),prefix="Z") # indirect doctest239The Iwahori Hecke Algebra of Type A2 in q1,-q2 over Fraction Field of Multivariate Polynomial Ring in q1, q2 over Rational Field and prefix Z240241"""242return "The Iwahori Hecke Algebra of Type %s in %s,%s over %s and prefix %s"%(self._cartan_type._repr_(compact=True), self._q1, self._q2, self.base_ring(), self._prefix)243244def cartan_type(self):245"""246EXAMPLES::247248sage: IwahoriHeckeAlgebraT("D4",0).cartan_type()249['D', 4]250251"""252return self._cartan_type253254def coxeter_group(self):255"""256EXAMPLES::257258sage: IwahoriHeckeAlgebraT("B2",1).coxeter_group()259Weyl Group of type ['B', 2] (as a matrix group acting on the ambient space)260261"""262return self.basis().keys()263264def index_set(self):265"""266EXAMPLES::267268sage: IwahoriHeckeAlgebraT("B2",1).index_set()269[1, 2]270"""271return self._index_set272273@cached_method274def algebra_generators(self):275"""276Returns the generators. They do not have order two but satisfy277a quadratic relation. They coincide with the simple278reflections in the Coxeter group when `q_1=1` and `q_2=-1`. In279this special case, the Iwahori Hecke algebra is identified280with the group algebra of the Coxeter group.281282EXAMPLES::283284sage: R.<q>=QQ[]285sage: H = IwahoriHeckeAlgebraT("A3",q)286sage: T=H.algebra_generators(); T287Finite family {1: T1, 2: T2, 3: T3}288sage: T.list()289[T1, T2, T3]290sage: [T[i] for i in [1,2,3]]291[T1, T2, T3]292sage: [T1, T2, T3] = H.algebra_generators()293sage: T1294T1295sage: H = IwahoriHeckeAlgebraT(['A',2,1],q)296sage: T=H.algebra_generators(); T297Finite family {0: T0, 1: T1, 2: T2}298sage: T.list()299[T0, T1, T2]300sage: [T[i] for i in [0,1,2]]301[T0, T1, T2]302sage: [T0, T1, T2] = H.algebra_generators()303sage: T0304T0305"""306return self.coxeter_group().simple_reflections().map(self.monomial)307308def algebra_generator(self, i):309"""310EXAMPLES::311312sage: R.<q>=QQ[]313sage: H = IwahoriHeckeAlgebraT("A3",q)314sage: [H.algebra_generator(i) for i in H.index_set()]315[T1, T2, T3]316317"""318return self.algebra_generators()[i]319320def inverse_generator(self, i):321"""322This method is only available if q1 and q2 are invertible. In323that case, the algebra generators are also invertible and this324method returns the inverse of self.algebra_generator(i). The325base ring should be either a field or a Laurent polynomial ring.326327EXAMPLES::328329sage: P.<q1,q2>=QQ[]330sage: F=Frac(P)331sage: H = IwahoriHeckeAlgebraT("A2",q1,q2,base_ring=F)332sage: H.base_ring()333Fraction Field of Multivariate Polynomial Ring in q1, q2 over Rational Field334sage: H.inverse_generator(1)335((-1)/(q1*q2))*T1 + ((q1+q2)/(q1*q2))336sage: H = IwahoriHeckeAlgebraT("A2",q1,-1,base_ring=F)337sage: H.inverse_generator(2)338((-1)/(-q1))*T2 + ((q1-1)/(-q1))339sage: P1.<r1,r2>=LaurentPolynomialRing(QQ)340sage: H1 = IwahoriHeckeAlgebraT("B2",r1,r2,base_ring=P1)341sage: H1.base_ring()342Multivariate Laurent Polynomial Ring in r1, r2 over Rational Field343sage: H1.inverse_generator(2)344(-r1^-1*r2^-1)*T2 + (r2^-1+r1^-1)345sage: H2 = IwahoriHeckeAlgebraT("C2",r1,-1,base_ring=P1)346sage: H2.inverse_generator(2)347(r1^-1)*T2 + (-1+r1^-1)348349"""350try:351# This currently works better than ~(self._q1) if352# self.base_ring() is a Laurent polynomial ring since it353# avoids accidental coercion into a field of fractions.354i1 = self._q1.__pow__(-1)355i2 = self._q2.__pow__(-1)356except:357raise ValueError("%s and %s must be invertible."%(self._q1, self._q2))358return (-i1*i2)*self.algebra_generator(i)+(i1+i2)359360@cached_method361def inverse_generators(self):362"""363This method is only available if q1 and q2 are invertible. In364that case, the algebra generators are also invertible and this365method returns their inverses.366367EXAMPLES::368369sage: P.<q> = PolynomialRing(QQ)370sage: F = Frac(P)371sage: H = IwahoriHeckeAlgebraT("A2",q,base_ring=F)372sage: [T1,T2]=H.algebra_generators()373sage: [U1,U2]=H.inverse_generators()374sage: U1*T1,T1*U1375(1, 1)376sage: P1.<q> = LaurentPolynomialRing(QQ)377sage: H1 = IwahoriHeckeAlgebraT("A2",q,base_ring=P1,prefix="V")378sage: [V1,V2]=H1.algebra_generators()379sage: [W1,W2]=H1.inverse_generators()380sage: [W1,W2]381[(q^-1)*V1 + (-1+q^-1), (q^-1)*V2 + (-1+q^-1)]382sage: V1*W1, W2*V2383(1, 1)384385"""386return Family(self.index_set(), self.inverse_generator)387388def product_on_basis(self, w1, w2):389"""390391Returns `T_w1 T_w2`, where `w_1` and `w_2` are in the Coxeter group392393EXAMPLES::394395sage: R.<q>=QQ[]; H = IwahoriHeckeAlgebraT("A2",q)396sage: s1,s2 = H.coxeter_group().simple_reflections()397sage: [H.product_on_basis(s1,x) for x in [s1,s2]]398[(q-1)*T1 + q, T1*T2]399400"""401result = self.monomial(w1)402for i in w2.reduced_word():403result = self.product_by_generator(result, i)404return result405406def product_by_generator_on_basis(self, w, i, side = "right"):407"""408INPUT:409- ``w`` - an element of the Coxeter group410- ``i`` - an element of the index set411- ``side`` - "left" or "right" (default: "right")412413Returns the product `T_w T_i` (resp. `T_i T_w`) if ``side`` is "right" (resp. "left")414415EXAMPLES::416417sage: R.<q>=QQ[]; H = IwahoriHeckeAlgebraT("A2",q)418sage: s1,s2 = H.coxeter_group().simple_reflections()419sage: [H.product_by_generator_on_basis(w, 1) for w in [s1,s2,s1*s2]]420[(q-1)*T1 + q, T2*T1, T1*T2*T1]421sage: [H.product_by_generator_on_basis(w, 1, side = "left") for w in [s1,s2,s1*s2]]422[(q-1)*T1 + q, T1*T2, (q-1)*T1*T2 + q*T2]423"""424wi = w.apply_simple_reflection(i, side = side)425if w.has_descent(i, side = side):426# 10% faster than a plain addition on the example of #12528427return self.sum_of_terms(((w , self._q1+self._q2),428(wi, -self._q1*self._q2)), distinct=True)429else:430return self.monomial(wi)431432def product_by_generator(self, x, i, side = "right"):433"""434Returns T_i*x, where T_i is the i-th generator. This is coded435individually for use in x._mul_().436437EXAMPLES::438sage: R.<q>=QQ[]; H = IwahoriHeckeAlgebraT("A2",q)439sage: [T1,T2] = H.algebra_generators()440sage: [H.product_by_generator(x, 1, side = "left") for x in [T1,T2]]441[(q-1)*T1 + q, T2*T1]442443"""444return self.linear_combination((self.product_by_generator_on_basis(w, i), c) for (w,c) in x)445446def _repr_term(self, t):447"""448EXAMPLES::449450sage: R.<q>=QQ[]451sage: H = IwahoriHeckeAlgebraT("A3",q)452sage: W=H.coxeter_group()453sage: H._repr_term(W.from_reduced_word([1,2,3]))454'T1*T2*T3'455456"""457redword = t.reduced_word()458if len(redword) == 0:459return "1"460else:461return "*".join("%s%d"%(self._prefix, i) for i in redword)462463class Element(CombinatorialFreeModuleElement):464"""465A class for elements of an IwahoriHeckeAlgebra466467TESTS::468469sage: R.<q>=QQ[]470sage: H=IwahoriHeckeAlgebraT("B3",q)471sage: [T1, T2, T3] = H.algebra_generators()472sage: T1+2*T2*T3473T1 + 2*T2*T3474475sage: R.<q1,q2>=QQ[]476sage: H=IwahoriHeckeAlgebraT("A2",q1,q2,prefix="x")477sage: sum(H.algebra_generators())^2478x1*x2 + x2*x1 + (q1+q2)*x1 + (q1+q2)*x2 + (-2*q1*q2)479480sage: H=IwahoriHeckeAlgebraT("A2",q1,q2,prefix="t")481sage: [t1,t2] = H.algebra_generators()482sage: (t1-t2)^3483(q1^2-q1*q2+q2^2)*t1 + (-q1^2+q1*q2-q2^2)*t2484485sage: R.<q>=QQ[]486sage: H=IwahoriHeckeAlgebraT("G2",q)487sage: [T1, T2] = H.algebra_generators()488sage: T1*T2*T1*T2*T1*T2 == T2*T1*T2*T1*T2*T1489True490sage: T1*T2*T1 == T2*T1*T2491False492493sage: H = IwahoriHeckeAlgebraT("A2",1)494sage: [T1,T2]=H.algebra_generators()495sage: T1+T2496T1 + T2497498sage: -(T1+T2)499-T1 - T2500501sage: 1-T1502-T1 + 1503504sage: T1.parent()505The Iwahori Hecke Algebra of Type A2 in 1,-1 over Integer Ring and prefix T506"""507508def inverse(self):509"""510If the element is a basis element, that is, an element of the511form self(w) with w in the Weyl group, this method computes512its inverse. The base ring must be a field or Laurent513polynomial ring. Other elements of the ring have inverses but514the inverse method is only implemented for the basis elements.515516EXAMPLES::517518sage: R.<q>=LaurentPolynomialRing(QQ)519sage: H = IwahoriHeckeAlgebraT("A2",q)520sage: [T1,T2]=H.algebra_generators()521sage: x = (T1*T2).inverse(); x522(q^-2)*T2*T1 + (-q^-1+q^-2)*T1 + (-q^-1+q^-2)*T2 + (1-2*q^-1+q^-2)523sage: x*T1*T25241525526"""527if len(self) != 1:528raise NotImplementedError("inverse only implemented for basis elements (monomials in the generators)"%self)529H = self.parent()530w = self.support_of_term()531532return H.prod(H.inverse_generator(i) for i in reversed(w.reduced_word()))533534535