def _hecke_tp_charpoly(self, p, var='x', algorithm='linbox'): a = p ** (self.wt - 2) + 1 N = self.klingeneisensteinAndCuspForms() S = CuspForms(1, self.wt) m = S.dimension() R = PolynomialRing(QQ, names=var) x = R.gens()[0] f = R(S.hecke_matrix(p).charpoly(var=var, algorithm=algorithm)) f1 = f.subs({x: a ** (-1) * x}) * a ** m g = R(N.hecke_matrix(p).charpoly(var=var, algorithm=algorithm)) return R(g / f1)
def _hecke_tp2_charpoly(self, p, var='x', algorithm='linbox'): u = p ** (self.wt - 2) N = self.klingeneisensteinAndCuspForms() S = CuspForms(1, self.wt) m = S.dimension() R = PolynomialRing(QQ, names=var) x = R.gens()[0] f = R(S.hecke_matrix(p).charpoly(var=var, algorithm=algorithm)) g = R(N.hecke_matrix(p ** 2).charpoly(var=var, algorithm=algorithm)) def morph(a, b, f, m): G = (-1) ** m * f.subs({x: -x}) * f alst = [[k // 2, v] for k, v in G.dict().iteritems()] F = sum([v * x ** k for k, v in alst]) return a ** m * F.subs({x: (x - b) / a}) f1 = morph(u ** 2 + u + 1, -p * u ** 3 - u ** 2 - p * u, f, m) return R(g / f1)