Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AndrewVSutherland
GitHub Repository: AndrewVSutherland/lmfdb
Path: blob/main/scripts/classical_modular_forms/populate_euler_factors.py
1448 views
1
# parallel -u -j 40 --halt 2 --progress sage -python scripts/classical_modular_forms/populate_euler_factors.py 40 ::: {0..39}
2
3
import sys, os
4
sys.path.append(os.path.join(os.path.dirname(os.path.realpath(__file__)),"../.."))
5
from lmfdb.db_backend import db
6
from sage.all import PowerSeriesRing, ZZ, prime_range, prime_powers, gcd, RR, PolynomialRing, prod
7
8
9
ZZT = PolynomialRing(ZZ, "T")
10
ps = prime_range(100)
11
def extend_multiplicatively(Z):
12
for pp in prime_powers(len(Z)-1):
13
for k in range(1, (len(Z) - 1)//pp + 1):
14
if gcd(k, pp) == 1:
15
Z[pp*k] = Z[pp]*Z[k]
16
def strip_zeros(L):
17
for i, v in reversed(list(enumerate(L))):
18
if v != 0:
19
break
20
else:
21
i = -1
22
L[i+1:] = []
23
24
def factorization(original_poly):
25
poly = ZZT(original_poly)
26
assert poly[0] == 1
27
if poly == 1:
28
return [1]
29
try:
30
facts = poly.factor()
31
except NotImplementedError:
32
try:
33
# try to sort out the memory leak
34
PolynomialRing(ZZ, 'T', implementation='NTL')([1] + [0]*(len(original_poly) - 2) + [1])._pari_with_name().factor()
35
facts = PolynomialRing(ZZ, 'T', implementation='NTL')(original_poly).factor()
36
except NotImplementedError:
37
raise
38
# if the factor is -1+T^2, replace it by 1-T^2
39
# this should happen an even number of times, mod powers
40
out = [[-g if g[0] == -1 else g, e] for g, e in facts]
41
assert prod( g**e for g, e in out ) == poly, "%s != %s" % (prod( [g**e] for g, e in out ), poly)
42
return [[g.list(), e] for g,e in out]
43
44
45
46
start_origin = 'ModularForm/GL2/Q/holomorphic/'
47
PS = PowerSeriesRing(ZZ, "X")
48
def fix_euler(idnumber, an_list_bound = 11):
49
lfun = db.lfunc_lfunctions.lucky({'id':idnumber}, sort = [])
50
euler_factors = lfun['euler_factors'] # up to 30 euler factors
51
bad_lfactors = lfun['bad_lfactors']
52
print(lfun['origin'])
53
assert lfun['origin'][:len(start_origin)] == start_origin, lfun['origin']
54
label = lfun['origin'][len(start_origin):].replace('/','.')
55
newform = db.mf_newforms.lucky({'label':label}, ['hecke_orbit_code', 'level'])
56
lpolys = list(db.mf_hecke_lpolys.search({'hecke_orbit_code': newform['hecke_orbit_code']},['lpoly','p'],sort='p'))
57
if lpolys == []:
58
# we don't have exact data
59
assert lfun['degree'] > 40
60
return True
61
assert ps == [elt['p'] for elt in lpolys]
62
dirichlet = [1]*an_list_bound
63
dirichlet[0] = 0
64
65
euler_factors_factorization = []
66
67
for i, elt in enumerate(lpolys):
68
p = ps[i]
69
assert elt['p'] == p, "%s %s" % (p, label)
70
new_lpoly = map(int, elt['lpoly'])
71
strip_zeros(new_lpoly)
72
if None in euler_factors[i]:
73
euler_factors[i] = new_lpoly
74
else:
75
assert euler_factors[i] == new_lpoly, "%s %s %s %s" % (p, label, euler_factors[i], new_lpoly)
76
if newform['level'] % p == 0:
77
# it is a bad euler factor
78
for j, (pj, badl) in enumerate(bad_lfactors):
79
if pj == p:
80
break
81
if None in badl:
82
bad_lfactors[j][1] = new_lpoly
83
else:
84
assert bad_lfactors[j][1] == new_lpoly, "%s %s %s %s" % (p, label, bad_lfactors[j][1], new_lpoly)
85
86
euler_factors_factorization.append(factorization(new_lpoly))
87
88
if p < an_list_bound:
89
k = RR(an_list_bound).log(p).floor()+1
90
foo = (1/PS(euler_factors[i])).padded_list(k)
91
for j in range(1, k):
92
dirichlet[p**j] = foo[j]
93
94
for i, elt in enumerate(euler_factors[len(lpolys):], len(lpolys)):
95
if None not in elt:
96
euler_factors_factorization.append(factorization(elt))
97
else:
98
break
99
100
extend_multiplicatively(dirichlet)
101
assert len(euler_factors) == 30
102
row = {'euler_factors':euler_factors, 'bad_lfactors': bad_lfactors, 'euler_factors_factorization': euler_factors_factorization}
103
# fill in ai
104
for i, ai in enumerate(dirichlet):
105
if i > 1:
106
row['a' + str(i)] = int(dirichlet[i])
107
108
#print row.keys()
109
db.lfunc_lfunctions.update({'id':idnumber}, row, restat = False, resort = False)
110
return True
111
112
if len(sys.argv) == 2:
113
fix_euler(int(sys.argv[1]))
114
115
if len(sys.argv) == 3:
116
k = int(sys.argv[1])
117
start = int(sys.argv[2])
118
assert k > start
119
ids = sorted(list(db.lfunc_lfunctions.search({'coefficient_field':'1.1.1.1', 'load_key':'CMFs-workshop', 'euler_factors_factorization': None}, 'id', sort = [])))
120
ids = ids[start::k]
121
for j, i in enumerate(ids):
122
fix_euler(i)
123
if j % int(len(ids)*0.01) == 0:
124
print('%d\t--> %.2f %% done' % (start, (100.*(j+1)/len(ids))))
125
else:
126
print(r"""Usage:
127
You should run this on legendre as: (this will use 40 cores):
128
# parallel -u -j 40 --halt 2 --progress sage -python %s 40 ::: {0..39}""" % sys.argv[0])
129
130