Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
AndrewVSutherland
GitHub Repository: AndrewVSutherland/lmfdb
Path: blob/main/scripts/belyi/find_friends.py
1127 views
1
from lmfdb import db
2
from lmfdb.ecnf.WebEllipticCurve import parse_ainvs
3
from lmfdb.belyi.main import hyperelliptic_polys_to_ainvs, curve_string_parser
4
from sage.all import EllipticCurve
5
import re
6
from lmfdb.genus2_curves.main import genus2_lookup_equation as genus2_lookup_equation_polys
7
8
def base_field_label(rec):
9
if rec['base_field'] == [-1, 1]:
10
rec['base_field_label'] = '1.1.1.1'
11
else:
12
field_rec = db.nf_fields.lucky({'coeffs':rec['base_field']})
13
if field_rec:
14
rec['base_field_label'] = field_rec['label']
15
return rec
16
17
def genus2_lookup_equation(rec):
18
f,h = curve_string_parser(rec)
19
lab, _ = genus2_lookup_equation_polys(str([f,h]))
20
if lab:
21
return lab
22
23
def genus1_lookup_equation_QQ(rec):
24
assert rec['g'] == 1
25
f,h = curve_string_parser(rec)
26
ainvs = hyperelliptic_polys_to_ainvs(f,h)
27
E = EllipticCurve(ainvs)
28
j = E.j_invariant()
29
for r in db.ec_curvedata.search({"jinv":[j.numerator(), j.denominator()]}):
30
ainvs2 = r['ainvs']
31
E2 = EllipticCurve(ainvs2)
32
if E.is_isomorphic(E2):
33
return r['lmfdb_label']
34
#print("Curve not found in database")
35
return None
36
37
def NFelt(a):
38
r""" Returns an NFelt string encoding the element a (in a number field
39
K). This consists of d strings representing the rational
40
coefficients of a (with respect to the power basis), separated by
41
commas, with no spaces.
42
43
For example the element (3+4*w)/2 in Q(w) gives '3/2,2'.
44
"""
45
return ",".join(str(c) for c in list(a))
46
47
def genus1_lookup_equation_nf(rec):
48
assert rec['g'] == 1
49
# make base field
50
nf_matches = list(db.nf_fields.search({'coeffs':rec['base_field']}))
51
if len(nf_matches) == 0:
52
return None
53
else:
54
nf_rec = nf_matches[0]
55
# make curve
56
f,h = curve_string_parser(rec)
57
ainvs = hyperelliptic_polys_to_ainvs(f,h)
58
E = EllipticCurve(ainvs)
59
K = E.base_field()
60
j = E.j_invariant()
61
j_str = NFelt(j)
62
j_matches = list(db.ec_nfcurves.search({"field_label":nf_rec['label'], "jinv":j_str}))
63
for r in j_matches:
64
ainvs2 = parse_ainvs(K, r['ainvs'])
65
E2 = EllipticCurve(ainvs2)
66
assert E.base_field() == E2.base_field()
67
if E.is_isomorphic(E2):
68
return r['label']
69
#print("Curve not found in database")
70
return None
71
72
# This code might not find base changes.
73
def genus1_lookup_equation(rec):
74
if rec['base_field'] == [-1, 1]: # if defined over QQ
75
return genus1_lookup_equation_QQ(rec)
76
else:
77
return genus1_lookup_equation_nf(rec)
78
79
def find_curve_label(rec):
80
if rec['g'] == 1:
81
#print("Searched for curve for %s") % rec['label']
82
return genus1_lookup_equation(rec)
83
elif rec['g'] == 2:
84
if rec['base_field'] == [-1, 1]: # currently LMFDB only has g2 curves over QQ
85
#print("Searched for curve for %s") % rec['label']
86
return genus2_lookup_equation(rec)
87
88
def find_curve_url(rec):
89
label = find_curve_label(rec)
90
if label:
91
curve_url = ''
92
if rec['g'] == 1:
93
curve_url += 'EllipticCurve'
94
if rec['base_field'] == [-1, 1]: # over QQ
95
curve_url += '/Q'
96
label_spl = label.split(".")
97
curve_url += '/%s' % label_spl[0] # conductor
98
curve_url += '/%s/%s' % re.match(r"(\D+)(\d+)", label_spl[1]).groups() # isog class and isomorphism index
99
else: # over number field
100
label_spl = label.split("-")
101
curve_url += "/%s/%s" % (label_spl[0], label_spl[1]) # field, conductor
102
curve_url += '/%s/%s' % re.match(r"(\D+)(\d+)", label_spl[2]).groups() # isog class and isomorphism index
103
if rec['g'] == 2:
104
curve_url += 'Genus2Curve'
105
if rec['base_field'] == [-1, 1]:
106
curve_url += '/Q'
107
curve_url += '/%s' % label.replace(".","/")
108
return curve_url
109
110
def initialize_friends(rec):
111
rec[u'friends'] = []
112
return rec
113
114
def assign_curve_friends(rec):
115
curve_url = find_curve_url(rec)
116
if curve_url:
117
rec['friends'].append(curve_url)
118
return rec
119
120
def assign_curve_label(rec):
121
label = find_curve_label(rec)
122
if label:
123
rec['curve_label'] = label
124
return rec
125
126