def half_integral_weight_hecke_operator_on_basis(B,chi,k,p): Tp2B = [half_integral_weight_hecke_operator_on_qexp(f,chi,k,p) for f in B] precp = Tp2B[0].prec() Tp2B_mat = matrix([Tp2f.padded_list() for Tp2f in Tp2B]) B_mat = matrix([f.padded_list()[:precp] for f in B]) piv = B_mat.pivots()[-1] assert precp > piv Tp_mat = B_mat.solve_left(Tp2B_mat) assert all([sum([Tp_mat[j][i]*B[i] for i in range(len(B))]) == Tp2B[j] for j in range(len(B))]) return Tp_mat
def half_integral_weight_hecke_operator_on_qexp(f,chi,k,p): prec = f.prec() R = f.parent() q = R.0 precp = prec // (p^2) Tp2f = O(q^(precp)) for n in range(1,precp): bn = f[p^2n] + chi(p)(-1)^(((k-1)(p-1))//4)kronecker_symbol(n,p)p^((k-3)//2)f[n] if n%(p^2) == 0: bn += chi(p^2)p^(k-2)f[n//(p^2)] Tp2f += bn*q^n return Tp2f
N = 64 chi = DirichletGroup(N).one() k = 5 prec = 1000
B = half_integral_weight_modform_basis(chi,k,prec) B_mat = matrix([f.padded_list()[:prec] for f in B]) piv = B_mat.pivots()[-1]
Tps = [half_integral_weight_hecke_operator_on_basis(B,chi,k,p) for p in prime_range(sqrt(prec//piv))] print prime_range(sqrt(prec//piv)) print Tps
ZZq = B[0].parent() q = ZZq.0 eta = sage.modular.etaproducts.qexp_eta(ZZq,prec) etaf = qeta(q^4)^4eta(q^8) + O(q^prec) B_mat = matrix([f.padded_list()[:prec] for f in B]) B_mat.solve_left(matrix(etaf.padded_list()))
for p in prime_range(sqrt(prec)): print p, half_integral_weight_hecke_operator_on_qexp(etaf,chi,k,p)/etaf
Np = N//2 m = (Np)prod([1-1/p^2 for p in Np.prime_divisors()]) R = (k-1)m/12 - (m-1)/(Np) floor(R)