Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AndrewVSutherland
GitHub Repository: AndrewVSutherland/lmfdb
Path: blob/main/scripts/hmf/recompute_AL.py
1448 views
1
# -*- coding: utf-8 -*-
2
3
from sage.misc.preparser import preparse
4
from sage.interfaces.magma import magma
5
from sage.all import PolynomialRing, Rationals
6
7
from lmfdb.base import getDBConnection
8
C = getDBConnection()
9
10
hmf_forms = C.hmfs.forms
11
hmf_fields = C.hmfs.fields
12
fields = C.numberfields.fields
13
14
P = PolynomialRing(Rationals(), 3, ['w', 'e', 'x'])
15
w, e, x = P.gens()
16
17
18
def recompute_AL():
19
field_label = None
20
S = hmf_forms.find({})
21
S = S.sort("label")
22
23
while True:
24
v = next(S)
25
NN_label = v["level_label"]
26
v_label = v["label"]
27
28
try:
29
if v["AL_eigenvalues_fixed"] == 'done' or v["AL_eigenvalues_fixed"] == 'working':
30
continue
31
except KeyError:
32
print(v_label)
33
print("...new, computing!")
34
v["AL_eigenvalues_fixed"] = 'working'
35
hmf_forms.save(v)
36
37
if field_label is None or not field_label == v["field_label"]:
38
field_label = v["field_label"]
39
print("...new field " + field_label)
40
41
F = fields.find_one({"label": field_label})
42
F_hmf = hmf_fields.find_one({"label": field_label})
43
44
magma.eval('P<x> := PolynomialRing(Rationals());')
45
magma.eval('F<w> := NumberField(Polynomial(' + str(F["coefficients"]) + '));')
46
magma.eval('ZF := Integers(F);')
47
magma.eval('ideals_str := [' + ','.join([st for st in F_hmf["ideals"]]) + '];')
48
magma.eval('ideals := [ideal<ZF | {F!x : x in I}> : I in ideals_str];')
49
50
magma.eval('primes_str := [' + ','.join([st for st in F_hmf["primes"]]) + '];')
51
magma.eval('primes := [ideal<ZF | {F!x : x in I}> : I in primes_str];')
52
53
NN_index = NN_label[NN_label.index('.') + 1:]
54
magma.eval(
55
'NN := [I : I in ideals | Norm(I) eq ' + str(v["level_norm"]) + '][' + str(NN_index) + '];')
56
magma.eval('M := HilbertCuspForms(F, NN);')
57
58
if v["hecke_polynomial"] != 'x':
59
magma.eval('K<e> := NumberField(' + v["hecke_polynomial"] + ');')
60
else:
61
magma.eval('K := Rationals(); e := 1;')
62
63
magma.eval('hecke_eigenvalues := [' + ','.join([st for st in v["hecke_eigenvalues"]]) + '];')
64
65
print("...Hecke eigenvalues loaded...")
66
67
magma.eval('s := 0; KT := []; '
68
'while KT cmpeq [] or Dimension(KT) gt 1 do '
69
' s +:= 1; '
70
' pp := primes[s]; '
71
' if Valuation(NN, pp) eq 0 then '
72
' T_pp := HeckeOperator(M, pp); '
73
' a_pp := hecke_eigenvalues[s]; '
74
' if KT cmpeq [] then '
75
' KT := Kernel(ChangeRing(Matrix(T_pp),K)-a_pp); '
76
' else '
77
' KT := KT meet Kernel(ChangeRing(Matrix(T_pp),K)-a_pp); '
78
' end if; '
79
' end if; '
80
'end while;')
81
magma.eval('assert Dimension(KT) eq 1;')
82
83
print("...dimension 1 subspace found...")
84
85
magma.eval('NNfact := Factorization(NN);')
86
magma.eval('f := Vector(Basis(KT)[1]); '
87
'AL_eigenvalues := []; '
88
'for pp in NNfact do '
89
' U_ppf := f*ChangeRing(AtkinLehnerOperator(M, pp[1]),K); '
90
' assert U_ppf eq f or U_ppf eq -f; '
91
' if U_ppf eq f then '
92
' Append(~AL_eigenvalues, 1); '
93
' else '
94
' Append(~AL_eigenvalues, -1); '
95
' end if; '
96
'end for;')
97
98
# ' T_ppf := f*ChangeRing(HeckeOperator(M, pp[1]),K); '\
99
# ' if pp[2] ge 2 then assert T_ppf eq 0*f; else assert T_ppf eq -U_ppf; end if; '\
100
101
print("...AL eigenvalues computed!")
102
103
AL_ind = eval(preparse(magma.eval('[Index(primes,pp[1])-1 : pp in NNfact]')))
104
AL_eigenvalues_jv = eval(preparse(magma.eval('AL_eigenvalues')))
105
AL_eigenvalues = [[F_hmf["primes"][AL_ind[i]], AL_eigenvalues_jv[i]] for i in range(len(AL_ind))]
106
pps_exps = eval(preparse(magma.eval('[pp[2] : pp in NNfact]')))
107
108
hecke_eigenvalues = v["hecke_eigenvalues"]
109
for j in range(len(AL_ind)):
110
s = AL_ind[j]
111
if pps_exps[j] >= 2:
112
hecke_eigenvalues[s] = '0'
113
else:
114
hecke_eigenvalues[s] = str(-AL_eigenvalues[j][1])
115
AL_eigenvalues = [[a[0], str(a[1])] for a in AL_eigenvalues]
116
117
v["hecke_eigenvalues"] = hecke_eigenvalues
118
v["AL_eigenvalues"] = AL_eigenvalues
119
v["AL_eigenvalues_fixed"] = 'done'
120
hmf_forms.save(v)
121
122