Path: blob/main/scripts/hmf/recompute_AL_modp.py
1452 views
# -*- coding: utf-8 -*-12from sage.misc.preparser import preparse3from sage.interfaces.magma import magma4from sage.all import PolynomialRing, Rationals5from lmfdb.base import getDBConnection6C = getDBConnection()78hmf_forms = C.hmfs.forms9hmf_fields = C.hmfs.fields10fields = C.numberfields.fields1112P = PolynomialRing(Rationals(), 3, ['w', 'e', 'x'])13w, e, x = P.gens()141516def recompute_AL(field_label=None, skip_odd=False):17if field_label is None:18S = hmf_forms.find({"AL_eigenvalues_fixed": None})19else:20S = hmf_forms.find({"field_label": field_label, "AL_eigenvalues_fixed": None})21S = S.sort("label")2223field_label = None2425magma.eval('SetVerbose("ModFrmHil", 1);')2627v = next(S)28while True:29NN_label = v["level_label"]30v_label = v["label"]3132print(v_label)3334if field_label is None or not field_label == v["field_label"]:35field_label = v["field_label"]36print("...new field " + field_label)3738F = fields.find_one({"label": field_label})39F_hmf = hmf_fields.find_one({"label": field_label})4041magma.eval('P<x> := PolynomialRing(Rationals());')42magma.eval('F<w> := NumberField(Polynomial(' + str(F["coefficients"]) + '));')43magma.eval('ZF := Integers(F);')44magma.eval('ideals_str := [' + ','.join([st for st in F_hmf["ideals"]]) + '];')45magma.eval('ideals := [ideal<ZF | {F!x : x in I}> : I in ideals_str];')4647magma.eval('primes_str := [' + ','.join([st for st in F_hmf["primes"]]) + '];')48magma.eval('primes := [ideal<ZF | {F!x : x in I}> : I in primes_str];')4950magma.eval('classno := NarrowClassNumber(F);')5152if skip_odd and F["degree"] % 2 == 1 and v["level_norm"] > 300:53print("...level norm > 300, skipping!")54try:55v = next(S)56continue57except StopIteration:58break5960NN_index = NN_label[NN_label.index('.') + 1:]61magma.eval(62'NN := [I : I in ideals | Norm(I) eq ' + str(v["level_norm"]) + '][' + str(NN_index) + '];')63magma.eval('Mfull := HilbertCuspForms(F, NN);')64magma.eval('M := NewSubspace(Mfull);')65magma.eval('O := QuaternionOrder(M); B := Algebra(O); DD := Discriminant(B);')6667if v["hecke_polynomial"] != 'x':68magma.eval('fpol := ' + v["hecke_polynomial"] + ';')69magma.eval('K<e> := NumberField(fpol);')70else:71magma.eval('fpol := x;')72magma.eval('K := Rationals(); e := 1;')7374magma.eval('hecke_eigenvalues := [' + ','.join([st for st in v["hecke_eigenvalues"]]) + '];')7576print("...Hecke eigenvalues loaded...")7778magma.eval('denom := Lcm([Denominator(a) : a in hecke_eigenvalues]); q := NextPrime(200);')79magma.eval(80'while #Roots(fpol, GF(q)) eq 0 or Valuation(denom,q) gt 0 do q := NextPrime(q); end while;')81magma.eval('if K cmpeq Rationals() then mk := hom<K -> GF(q) | >; else mk := hom<K -> GF(q) | Roots(fpol,GF(q))[1][1]>; end if;')8283magma.eval(84'_<xQ> := PolynomialRing(Rationals()); rootsofunity := [r[1] : r in Roots(xQ^(2*classno)-1,K)];')8586magma.eval('s := 0; KT := []; '87'while KT cmpeq [] or Dimension(KT) gt 1 do '88' s +:= 1; '89' if s gt Min(50,#hecke_eigenvalues) then '90' q := NextPrime(q); while #Roots(fpol, GF(q)) eq 0 or Valuation(denom,q) gt 0 do q := NextPrime(q); end while; '91' if K cmpeq Rationals() then mk := hom<K -> GF(q) | >; else mk := hom<K -> GF(q) | Roots(fpol,GF(q))[1][1]>; end if; '92' s := 1; '93' KT := []; '94' end if; '95' pp := primes[s]; '96' if Valuation(NN, pp) eq 0 then '97' T_pp := HeckeOperator(M, pp); '98' T_pp := Matrix(Nrows(T_pp),Ncols(T_pp),[mk(c) : c in Eltseq(T_pp)]); '99' a_pp := hecke_eigenvalues[s]; '100' if KT cmpeq [] then '101' KT := Kernel(T_pp-mk(a_pp)); '102' else '103' KT := KT meet Kernel(T_pp-mk(a_pp)); '104' end if; '105' end if; '106'end while;')107magma.eval('assert Dimension(KT) eq 1;')108109print("...dimension 1 subspace found...")110111magma.eval('NNfact := [pp : pp in Factorization(NN) | pp[1] in primes];')112magma.eval('f := Vector(Basis(KT)[1]); '113'AL_eigenvalues := []; '114'for pp in NNfact do '115' if Valuation(DD,pp[1]) gt 0 then U_pp := -HeckeOperator(M, pp[1]); '116' else U_pp := AtkinLehnerOperator(M, pp[1]); end if; '117' U_pp := Matrix(Nrows(U_pp),Ncols(U_pp),[mk(c) : c in Eltseq(U_pp)]); '118' U_ppf := f*U_pp; found := false; '119' for mu in rootsofunity do '120' if U_ppf eq mk(mu)*f then Append(~AL_eigenvalues, mu); found := true; end if; '121' end for; '122' assert found; '123'end for;')124125print("...AL eigenvalues computed!")126127AL_ind = eval(preparse(magma.eval('[Index(primes,pp[1])-1 : pp in NNfact]')))128AL_eigenvalues_jv = eval(preparse(magma.eval('AL_eigenvalues')))129AL_eigenvalues = [[F_hmf["primes"][AL_ind[i]], AL_eigenvalues_jv[i]] for i in range(len(AL_ind))]130pps_exps = eval(preparse(magma.eval('[pp[2] : pp in NNfact]')))131132hecke_eigenvalues = v["hecke_eigenvalues"]133for j in range(len(AL_ind)):134s = AL_ind[j]135try:136if pps_exps[j] >= 2:137hecke_eigenvalues[s] = '0'138else:139hecke_eigenvalues[s] = str(-AL_eigenvalues[j][1])140except IndexError:141pass142143AL_eigenvalues = [[a[0], str(a[1])] for a in AL_eigenvalues]144145v["hecke_eigenvalues"] = hecke_eigenvalues146v["AL_eigenvalues"] = AL_eigenvalues147v["AL_eigenvalues_fixed"] = 'done'148hmf_forms.save(v)149150v = next(S)151152153