Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AndrewVSutherland
GitHub Repository: AndrewVSutherland/lmfdb
Path: blob/main/scripts/classical_modular_forms/check_ap2_amn_parallel.py
1448 views
1
2
import sys, os, time
3
try:
4
# Make lmfdb available
5
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)),"../.."))
6
except NameError:
7
pass
8
from psycodict import db
9
from sage.all import CC, prime_range, gcd
10
from lmfdb.characters.TinyConrey import ConreyCharacter
11
12
13
def check_ap2_slow(rec):
14
# Check a_{p^2} = a_p^2 - chi(p) for primes up to 31
15
ls = rec['lfunction_label'].split('.')
16
level, weight, chi = map(int, [ls[0], ls[1], ls[-2]])
17
char = ConreyCharacter(level, chi)
18
Z = rec['an_normalized[0:1000]']
19
for p in prime_range(31+1):
20
if level % p != 0:
21
# a_{p^2} = a_p^2 - chi(p)
22
charval = CC(2*char.conreyangle(int(p)) * CC.pi()*CC.gens()[0]).exp()
23
else:
24
charval = 0
25
if (CC(*Z[p**2 - 1]) - (CC(*Z[p-1])**2 - charval)).abs() > 1e-11:
26
return False
27
return True
28
29
pairs = [(m,n) for m in range(2,1000) for n in range(m, 1000) if gcd(m,n) == 1 and m*n <= 1000]
30
31
def check_amn_slow(rec):
32
Z = [0] + [CC(*elt) for elt in rec['an_normalized[0:1000]']]
33
for m, n in pairs:
34
if (Z[m*n] - Z[m]*Z[n]).abs() > 1e-11:
35
return False
36
return True
37
38
import sys
39
if len(sys.argv) == 3:
40
k = int(sys.argv[1])
41
j = int(sys.argv[2])
42
assert k > j
43
assert j >= 0
44
_min_id = db.mf_hecke_cc.min_id()
45
_max_id = db.mf_hecke_cc.max_id()
46
chunk_size = (_max_id - _min_id )/k + 1
47
start_time = time.time()
48
counter = 0
49
minid = _min_id + j*chunk_size
50
maxid = _min_id + (j+1)*chunk_size
51
query = {'id':{'$gte': minid, '$lt': maxid}}
52
total = db.mf_hecke_cc.count(query)
53
print("%d: %d rows to check" % (j, total))
54
if total > 0:
55
with open(os.path.join(os.path.dirname(os.path.realpath(__file__)),'../../logs/check_ap2_amn.%d.log' % j), 'w') as F:
56
while counter < total:
57
for rec in db.mf_hecke_cc.search(query, ['id','lfunction_label', 'an_normalized[0:1000]'], sort = ['id'], limit = 1000):
58
counter += 1
59
if not check_amn_slow(rec):
60
F.write('%s:amn\n' % rec['lfunction_label'])
61
F.flush()
62
if not check_ap2_slow(rec):
63
F.write('%s:ap2\n' % rec['lfunction_label'])
64
F.flush()
65
if total > 100:
66
if counter % (total/100) == 0:
67
print("%d: %.2ff%% done -- avg %.3f s" % (j, counter*100./total, (time.time() - start_time)/counter))
68
assert rec['id'] > minid
69
minid = rec['id']
70
query = {'id':{'$gt': minid, '$lt': maxid}}
71
print("%d: DONE -- avg %.3f s" % (j, (time.time() - start_time)/counter))
72
else:
73
print("%d: DONE -- avg oo s" % j)
74
75
76
else:
77
print(r"""Usage:
78
You should run this on legendre as: (this will use 40 cores):
79
# parallel -u -j 40 --halt 2 --progress sage -python %s 40 ::: {0..39}""" % sys.argv[0])
80
81