Sage can compute ordinary Kazhdan-Lusztig polynomials for Weyl groups or affine Weyl groups (and potentially other Coxeter groups).
You must create a Weyl group W and a ring containing an indeterminate q. The ring may be a univariate polynomial ring or a univariate Laurent polynomial ring. Then you may calculate Kazhdan-Lusztig polynomials as follows:
sage: W = WeylGroup("A3", prefix="s") sage: [s1,s2,s3] = W.simple_reflections() sage: P.<q> = LaurentPolynomialRing(QQ) sage: KL = KazhdanLusztigPolynomial(W,q) sage: KL.R(s2, s2*s1*s3*s2) -1 + 3*q - 3*q^2 + q^3 sage: KL.P(s2, s2*s1*s3*s2) 1 + q
Thus we have the Kazhdan-Lusztig \(R\) and \(P\) polynomials.
Known algorithms for computing Kazhdan-Lusztig polynomials are highly recursive, and caching of intermediate results is necessary for the programs not to be prohibitively slow. Therefore intermediate results are cached. This has the effect that as you run the program for any given KazhdanLusztigPolynomial class, the calculations will be slow at first but progressively faster as more polynomials are computed.
You may see the results of the intermediate calculations by creating the class with the option trace="true".
Since the parent of q must be a univariate ring, if you want to work with other indeterminates, first create a univariate polynomial or Laurent polynomial ring, and the Kazhdan-Lusztig class. Then create a ring containing q and the other variables:
sage: W = WeylGroup("B3", prefix="s") sage: [s1,s2,s3] = W.simple_reflections() sage: P.<q> = PolynomialRing(QQ) sage: KL = KazhdanLusztigPolynomial(W,q) sage: P1.<x,y> = PolynomialRing(P) sage: x*KL.P(s1*s3,s1*s3*s2*s1*s3) (q + 1)*x