Path: blob/main/scripts/classical_modular_forms/check_ap2_amn_parallel.py
1448 views
1import sys, os, time2try:3# Make lmfdb available4sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)),"../.."))5except NameError:6pass7from psycodict import db8from sage.all import CC, prime_range, gcd9from lmfdb.characters.TinyConrey import ConreyCharacter101112def check_ap2_slow(rec):13# Check a_{p^2} = a_p^2 - chi(p) for primes up to 3114ls = rec['lfunction_label'].split('.')15level, weight, chi = map(int, [ls[0], ls[1], ls[-2]])16char = ConreyCharacter(level, chi)17Z = rec['an_normalized[0:1000]']18for p in prime_range(31+1):19if level % p != 0:20# a_{p^2} = a_p^2 - chi(p)21charval = CC(2*char.conreyangle(int(p)) * CC.pi()*CC.gens()[0]).exp()22else:23charval = 024if (CC(*Z[p**2 - 1]) - (CC(*Z[p-1])**2 - charval)).abs() > 1e-11:25return False26return True2728pairs = [(m,n) for m in range(2,1000) for n in range(m, 1000) if gcd(m,n) == 1 and m*n <= 1000]2930def check_amn_slow(rec):31Z = [0] + [CC(*elt) for elt in rec['an_normalized[0:1000]']]32for m, n in pairs:33if (Z[m*n] - Z[m]*Z[n]).abs() > 1e-11:34return False35return True3637import sys38if len(sys.argv) == 3:39k = int(sys.argv[1])40j = int(sys.argv[2])41assert k > j42assert j >= 043_min_id = db.mf_hecke_cc.min_id()44_max_id = db.mf_hecke_cc.max_id()45chunk_size = (_max_id - _min_id )/k + 146start_time = time.time()47counter = 048minid = _min_id + j*chunk_size49maxid = _min_id + (j+1)*chunk_size50query = {'id':{'$gte': minid, '$lt': maxid}}51total = db.mf_hecke_cc.count(query)52print("%d: %d rows to check" % (j, total))53if total > 0:54with open(os.path.join(os.path.dirname(os.path.realpath(__file__)),'../../logs/check_ap2_amn.%d.log' % j), 'w') as F:55while counter < total:56for rec in db.mf_hecke_cc.search(query, ['id','lfunction_label', 'an_normalized[0:1000]'], sort = ['id'], limit = 1000):57counter += 158if not check_amn_slow(rec):59F.write('%s:amn\n' % rec['lfunction_label'])60F.flush()61if not check_ap2_slow(rec):62F.write('%s:ap2\n' % rec['lfunction_label'])63F.flush()64if total > 100:65if counter % (total/100) == 0:66print("%d: %.2ff%% done -- avg %.3f s" % (j, counter*100./total, (time.time() - start_time)/counter))67assert rec['id'] > minid68minid = rec['id']69query = {'id':{'$gt': minid, '$lt': maxid}}70print("%d: DONE -- avg %.3f s" % (j, (time.time() - start_time)/counter))71else:72print("%d: DONE -- avg oo s" % j)737475else:76print(r"""Usage:77You should run this on legendre as: (this will use 40 cores):78# parallel -u -j 40 --halt 2 --progress sage -python %s 40 ::: {0..39}""" % sys.argv[0])798081