from lmfdb import db
from lmfdb.ecnf.WebEllipticCurve import parse_ainvs
from lmfdb.belyi.main import hyperelliptic_polys_to_ainvs, curve_string_parser
from sage.all import EllipticCurve
import re
from lmfdb.genus2_curves.main import genus2_lookup_equation as genus2_lookup_equation_polys
def base_field_label(rec):
if rec['base_field'] == [-1, 1]:
rec['base_field_label'] = '1.1.1.1'
else:
field_rec = db.nf_fields.lucky({'coeffs':rec['base_field']})
if field_rec:
rec['base_field_label'] = field_rec['label']
return rec
def genus2_lookup_equation(rec):
f,h = curve_string_parser(rec)
lab, _ = genus2_lookup_equation_polys(str([f,h]))
if lab:
return lab
def genus1_lookup_equation_QQ(rec):
assert rec['g'] == 1
f,h = curve_string_parser(rec)
ainvs = hyperelliptic_polys_to_ainvs(f,h)
E = EllipticCurve(ainvs)
j = E.j_invariant()
for r in db.ec_curvedata.search({"jinv":[j.numerator(), j.denominator()]}):
ainvs2 = r['ainvs']
E2 = EllipticCurve(ainvs2)
if E.is_isomorphic(E2):
return r['lmfdb_label']
return None
def NFelt(a):
r""" Returns an NFelt string encoding the element a (in a number field
K). This consists of d strings representing the rational
coefficients of a (with respect to the power basis), separated by
commas, with no spaces.
For example the element (3+4*w)/2 in Q(w) gives '3/2,2'.
"""
return ",".join(str(c) for c in list(a))
def genus1_lookup_equation_nf(rec):
assert rec['g'] == 1
nf_matches = list(db.nf_fields.search({'coeffs':rec['base_field']}))
if len(nf_matches) == 0:
return None
else:
nf_rec = nf_matches[0]
f,h = curve_string_parser(rec)
ainvs = hyperelliptic_polys_to_ainvs(f,h)
E = EllipticCurve(ainvs)
K = E.base_field()
j = E.j_invariant()
j_str = NFelt(j)
j_matches = list(db.ec_nfcurves.search({"field_label":nf_rec['label'], "jinv":j_str}))
for r in j_matches:
ainvs2 = parse_ainvs(K, r['ainvs'])
E2 = EllipticCurve(ainvs2)
assert E.base_field() == E2.base_field()
if E.is_isomorphic(E2):
return r['label']
return None
def genus1_lookup_equation(rec):
if rec['base_field'] == [-1, 1]:
return genus1_lookup_equation_QQ(rec)
else:
return genus1_lookup_equation_nf(rec)
def find_curve_label(rec):
if rec['g'] == 1:
return genus1_lookup_equation(rec)
elif rec['g'] == 2:
if rec['base_field'] == [-1, 1]:
return genus2_lookup_equation(rec)
def find_curve_url(rec):
label = find_curve_label(rec)
if label:
curve_url = ''
if rec['g'] == 1:
curve_url += 'EllipticCurve'
if rec['base_field'] == [-1, 1]:
curve_url += '/Q'
label_spl = label.split(".")
curve_url += '/%s' % label_spl[0]
curve_url += '/%s/%s' % re.match(r"(\D+)(\d+)", label_spl[1]).groups()
else:
label_spl = label.split("-")
curve_url += "/%s/%s" % (label_spl[0], label_spl[1])
curve_url += '/%s/%s' % re.match(r"(\D+)(\d+)", label_spl[2]).groups()
if rec['g'] == 2:
curve_url += 'Genus2Curve'
if rec['base_field'] == [-1, 1]:
curve_url += '/Q'
curve_url += '/%s' % label.replace(".","/")
return curve_url
def initialize_friends(rec):
rec[u'friends'] = []
return rec
def assign_curve_friends(rec):
curve_url = find_curve_url(rec)
if curve_url:
rec['friends'].append(curve_url)
return rec
def assign_curve_label(rec):
label = find_curve_label(rec)
if label:
rec['curve_label'] = label
return rec