Path: blob/main/scripts/classical_modular_forms/populate_euler_factors.py
1448 views
# parallel -u -j 40 --halt 2 --progress sage -python scripts/classical_modular_forms/populate_euler_factors.py 40 ::: {0..39}12import sys, os3sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)),"../.."))4from lmfdb.db_backend import db5from sage.all import PowerSeriesRing, ZZ, prime_range, prime_powers, gcd, RR, PolynomialRing, prod678ZZT = PolynomialRing(ZZ, "T")9ps = prime_range(100)10def extend_multiplicatively(Z):11for pp in prime_powers(len(Z)-1):12for k in range(1, (len(Z) - 1)//pp + 1):13if gcd(k, pp) == 1:14Z[pp*k] = Z[pp]*Z[k]15def strip_zeros(L):16for i, v in reversed(list(enumerate(L))):17if v != 0:18break19else:20i = -121L[i+1:] = []2223def factorization(original_poly):24poly = ZZT(original_poly)25assert poly[0] == 126if poly == 1:27return [1]28try:29facts = poly.factor()30except NotImplementedError:31try:32# try to sort out the memory leak33PolynomialRing(ZZ, 'T', implementation='NTL')([1] + [0]*(len(original_poly) - 2) + [1])._pari_with_name().factor()34facts = PolynomialRing(ZZ, 'T', implementation='NTL')(original_poly).factor()35except NotImplementedError:36raise37# if the factor is -1+T^2, replace it by 1-T^238# this should happen an even number of times, mod powers39out = [[-g if g[0] == -1 else g, e] for g, e in facts]40assert prod( g**e for g, e in out ) == poly, "%s != %s" % (prod( [g**e] for g, e in out ), poly)41return [[g.list(), e] for g,e in out]42434445start_origin = 'ModularForm/GL2/Q/holomorphic/'46PS = PowerSeriesRing(ZZ, "X")47def fix_euler(idnumber, an_list_bound = 11):48lfun = db.lfunc_lfunctions.lucky({'id':idnumber}, sort = [])49euler_factors = lfun['euler_factors'] # up to 30 euler factors50bad_lfactors = lfun['bad_lfactors']51print(lfun['origin'])52assert lfun['origin'][:len(start_origin)] == start_origin, lfun['origin']53label = lfun['origin'][len(start_origin):].replace('/','.')54newform = db.mf_newforms.lucky({'label':label}, ['hecke_orbit_code', 'level'])55lpolys = list(db.mf_hecke_lpolys.search({'hecke_orbit_code': newform['hecke_orbit_code']},['lpoly','p'],sort='p'))56if lpolys == []:57# we don't have exact data58assert lfun['degree'] > 4059return True60assert ps == [elt['p'] for elt in lpolys]61dirichlet = [1]*an_list_bound62dirichlet[0] = 06364euler_factors_factorization = []6566for i, elt in enumerate(lpolys):67p = ps[i]68assert elt['p'] == p, "%s %s" % (p, label)69new_lpoly = map(int, elt['lpoly'])70strip_zeros(new_lpoly)71if None in euler_factors[i]:72euler_factors[i] = new_lpoly73else:74assert euler_factors[i] == new_lpoly, "%s %s %s %s" % (p, label, euler_factors[i], new_lpoly)75if newform['level'] % p == 0:76# it is a bad euler factor77for j, (pj, badl) in enumerate(bad_lfactors):78if pj == p:79break80if None in badl:81bad_lfactors[j][1] = new_lpoly82else:83assert bad_lfactors[j][1] == new_lpoly, "%s %s %s %s" % (p, label, bad_lfactors[j][1], new_lpoly)8485euler_factors_factorization.append(factorization(new_lpoly))8687if p < an_list_bound:88k = RR(an_list_bound).log(p).floor()+189foo = (1/PS(euler_factors[i])).padded_list(k)90for j in range(1, k):91dirichlet[p**j] = foo[j]9293for i, elt in enumerate(euler_factors[len(lpolys):], len(lpolys)):94if None not in elt:95euler_factors_factorization.append(factorization(elt))96else:97break9899extend_multiplicatively(dirichlet)100assert len(euler_factors) == 30101row = {'euler_factors':euler_factors, 'bad_lfactors': bad_lfactors, 'euler_factors_factorization': euler_factors_factorization}102# fill in ai103for i, ai in enumerate(dirichlet):104if i > 1:105row['a' + str(i)] = int(dirichlet[i])106107#print row.keys()108db.lfunc_lfunctions.update({'id':idnumber}, row, restat = False, resort = False)109return True110111if len(sys.argv) == 2:112fix_euler(int(sys.argv[1]))113114if len(sys.argv) == 3:115k = int(sys.argv[1])116start = int(sys.argv[2])117assert k > start118ids = sorted(list(db.lfunc_lfunctions.search({'coefficient_field':'1.1.1.1', 'load_key':'CMFs-workshop', 'euler_factors_factorization': None}, 'id', sort = [])))119ids = ids[start::k]120for j, i in enumerate(ids):121fix_euler(i)122if j % int(len(ids)*0.01) == 0:123print('%d\t--> %.2f %% done' % (start, (100.*(j+1)/len(ids))))124else:125print(r"""Usage:126You should run this on legendre as: (this will use 40 cores):127# parallel -u -j 40 --halt 2 --progress sage -python %s 40 ::: {0..39}""" % sys.argv[0])128129130