Path: blob/main/scripts/lfunctions/build_Lfunction_db.py
1128 views
1import sys23from sage.all import DirichletGroup4from sage.all import CC, EllipticCurve, sqrt56import sage.libs.lcalc.lcalc_Lfunction as lc78from lmfdb import base9C = base.getDBConnection()1011Lfunctions = C.test.Lfunctions_test2121314def remove_all():15Lfunctions.drop()161718def insert_dirichlet_L_functions(start, end):19print("Putting Dirichlet L-functions into database.")20start = max(3, start)21for q in range(start, end):22print("Working on modulus", q)23sys.stdout.flush()24G = DirichletGroup(q)25for n in range(len(G)):26chi = G[n]27if chi.is_primitive():28L = lc.Lfunction_from_character(chi)29z = L.find_zeros_via_N(1)[0]30Lfunction_data = {}31Lfunction_data['first_zero'] = float(z)32Lfunction_data['description'] = "Dirichlet L-function for character number " + \33str(n) + " modulo " + str(q)34Lfunction_data['degree'] = 135Lfunction_data['signature'] = (1, 0)36if chi.is_odd():37Lfunction_data['mu'] = [(1.0, 0.0), ]38else:39Lfunction_data['mu'] = [(0.0, 0.0), ]4041Lfunction_data['level'] = q4243coeffs = []4445for k in range(0, 10):46coeffs.append(CC(chi(k)))4748Lfunction_data['coeffs'] = [(float(x.real()), float(x.imag())) for x in coeffs]49Lfunction_data['special'] = {'type': 'dirichlet', 'modulus': q, 'number': n}5051Lfunctions.insert(Lfunction_data)525354def update_entries():55# one time function to run to update everything in the database with an extra tag56everything = Lfunctions.find()57for L in everything:58if L['description'].startswith("Dirichlet"):59n, q = L['description'][42:].split(" modulo ")60# print n, q61n = int(n)62q = int(q)63L['special'] = {'type': 'dirichlet', 'modulus': q, 'number': n}64Lfunctions.save(L)65elif L['description'].startswith("Elliptic"):66label = L['description'][36:]67L['special'] = {'type': 'elliptic', 'label': label}68Lfunctions.save(L)697071def insert_EC_L_functions(start=1, end=100):72curves = C.ellcurves.curves73for N in range(start, end):74print("Processing conductor", N)75sys.stdout.flush()76query = curves.find({'conductor': N, 'number': 1})77for curve in query:78E = EllipticCurve([int(x) for x in curve['ainvs']])79L = lc.Lfunction_from_elliptic_curve(E)80first_zeros = L.find_zeros_via_N(curve['rank'] + 1)81if len(first_zeros) > 1:82if not first_zeros[-2] == 0:83print("problem")8485z = float(first_zeros[-1])8687Lfunction_data = {}88Lfunction_data['first_zero'] = z89Lfunction_data['description'] = 'Elliptic curve L-function for curve ' + str(curve['label'][:-1])90Lfunction_data['degree'] = 291Lfunction_data['signature'] = [0, 1]92Lfunction_data['eta'] = [(1.0, 0), ]9394Lfunction_data['level'] = N95Lfunction_data['special'] = {'type': 'elliptic', 'label': curve['label'][:-1]}9697coeffs = []9899for k in range(1, 11):100coeffs.append(CC(E.an(k) / sqrt(k)))101102Lfunction_data['coeffs'] = [(float(x.real()), float(x.imag())) for x in coeffs]103104Lfunctions.insert(Lfunction_data)105106107def build_indices():108Lfunctions.create_index("first_zero")109Lfunctions.create_index("level")110Lfunctions.create_index("degree")111112113if __name__ == "__main__":114# build_indices()115# remove_all()116for n in range(1, 10):117insert_EC_L_functions(n * 100, (n + 1) * 100)118# insert_dirichlet_L_functions(n * 100, (n+1)*100)119# insert_dirichlet_L_functions(50)120121122