Пример #1
0
def make_extra_data(label, number, ainvs, gens):
    """Given a curve label (and number, as some data is only stored wih
    curve number 1 in each class) and its ainvs and gens, returns a
    dict with which to update the entry.

    Extra items computed here:
    'equation': latex string of curve's equation
    'signD': sign of discriminant
    'local_data': list of dicts, one item for each bad prime
    'min_quad_twist': dict holding curve's min quadratic twist and the twisting discriminant
    'heights': list of heights of gens

    and for curve #1 in a class only:

    'aplist': list of a_p for p<100
    'anlist': list of a_n for n<=20

    """
    E = EllipticCurve(parse_ainvs(ainvs))
    data = {}
    # convert from a list of strings to a single string, e.g. from ['0','0','0','1','1'] to '[0,0,0,1,1]'
    data['equation'] = web_latex(E)
    data['signD'] = int(E.discriminant().sign())
    data['local_data'] = [{
        'p':
        int(ld.prime().gen()),
        'ord_cond':
        int(ld.conductor_valuation()),
        'ord_disc':
        int(ld.discriminant_valuation()),
        'ord_den_j':
        int(max(0, -(E.j_invariant().valuation(ld.prime().gen())))),
        'red':
        int(ld.bad_reduction_type()),
        'rootno':
        int(E.root_number(ld.prime().gen())),
        'kod':
        web_latex(ld.kodaira_symbol()).replace('$', ''),
        'cp':
        int(ld.tamagawa_number())
    } for ld in E.local_data()]
    Etw, Dtw = E.minimal_quadratic_twist()
    if Etw.conductor() == E.conductor():
        data['min_quad_twist'] = {'label': label, 'disc': int(1)}
    else:
        minq_ainvs = ''.join(['['] + [str(c) for c in Etw.ainvs()] + [']'])
        r = curves.find_one({
            'jinv': str(E.j_invariant()),
            'ainvs': minq_ainvs
        })
        minq_label = "" if r is None else r['label']
        data['min_quad_twist'] = {'label': minq_label, 'disc': int(Dtw)}
    from lmfdb.elliptic_curves.web_ec import parse_points
    gens = [E(g) for g in parse_points(gens)]
    data['heights'] = [float(P.height()) for P in gens]
    if number == 1:
        data['aplist'] = E.aplist(100, python_ints=True)
        data['anlist'] = E.anlist(20, python_ints=True)
    return data
Пример #2
0
def make_extra_data(label, number, ainvs, gens):
    """
    C is a database elliptic curve entry.  Returns a dict with which to update the entry.

    Data fields needed in C already: 'ainvs', 'lmfdb_label', 'gens', 'number'
    """
    E = EllipticCurve([int(a) for a in ainvs])
    data = {}
    # convert from a list of strings to a single string, e.g. from ['0','0','0','1','1'] to '[0,0,0,1,1]'
    data['xainvs'] = ''.join(['[', ','.join(ainvs), ']'])
    data['equation'] = web_latex(E)
    data['signD'] = int(E.discriminant().sign())
    data['local_data'] = [{
        'p':
        int(ld.prime().gen()),
        'ord_cond':
        int(ld.conductor_valuation()),
        'ord_disc':
        int(ld.discriminant_valuation()),
        'ord_den_j':
        int(max(0, -(E.j_invariant().valuation(ld.prime().gen())))),
        'red':
        int(ld.bad_reduction_type()),
        'rootno':
        int(E.root_number(ld.prime().gen())),
        'kod':
        web_latex(ld.kodaira_symbol()).replace('$', ''),
        'cp':
        int(ld.tamagawa_number())
    } for ld in E.local_data()]
    Etw, Dtw = E.minimal_quadratic_twist()
    if Etw.conductor() == E.conductor():
        data['min_quad_twist'] = {'label': label, 'disc': int(1)}
    else:
        # Later this should be changed to look for xainvs but now all curves have ainvs
        minq_ainvs = [str(c) for c in Etw.ainvs()]
        r = curves.find_one({
            'jinv': str(E.j_invariant()),
            'ainvs': minq_ainvs
        })
        minq_label = "" if r is None else r['label']
        data['min_quad_twist'] = {'label': minq_label, 'disc': int(Dtw)}
    from lmfdb.elliptic_curves.web_ec import parse_points
    gens = [E(g) for g in parse_points(gens)]
    data['heights'] = [float(P.height()) for P in gens]
    if number == 1:
        data['aplist'] = E.aplist(100, python_ints=True)
        data['anlist'] = E.anlist(20, python_ints=True)
    return data
Пример #3
0
def make_extra_data(label,number,ainvs,gens):
    """Given a curve label (and number, as some data is only stored wih
    curve number 1 in each class) and its ainvs and gens, returns a
    dict with which to update the entry.

    Extra items computed here:
    'equation': latex string of curve's equation
    'signD': sign of discriminant
    'local_data': list of dicts, one item for each bad prime
    'min_quad_twist': dict holding curve's min quadratic twist and the twisting discriminant
    'heights': list of heights of gens

    and for curve #1 in a class only:

    'aplist': list of a_p for p<100
    'anlist': list of a_n for n<=20

    """
    E = EllipticCurve(parse_ainvs(ainvs))
    data = {}
    # convert from a list of strings to a single string, e.g. from ['0','0','0','1','1'] to '[0,0,0,1,1]'
    data['equation'] = web_latex(E)
    data['signD'] = int(E.discriminant().sign())
    data['local_data'] = [{'p': int(ld.prime().gen()),
                           'ord_cond':int(ld.conductor_valuation()),
                           'ord_disc':int(ld.discriminant_valuation()),
                           'ord_den_j':int(max(0,-(E.j_invariant().valuation(ld.prime().gen())))),
                           'red':int(ld.bad_reduction_type()),
                           'rootno':int(E.root_number(ld.prime().gen())),
                           'kod':web_latex(ld.kodaira_symbol()).replace('$',''),
                           'cp':int(ld.tamagawa_number())}
                          for ld in E.local_data()]
    Etw, Dtw = E.minimal_quadratic_twist()
    if Etw.conductor()==E.conductor():
        data['min_quad_twist'] = {'label':label, 'disc':int(1)}
    else:
        minq_ainvs = ''.join(['['] + [str(c) for c in Etw.ainvs()] + [']'])
        r = curves.find_one({'jinv':str(E.j_invariant()), 'ainvs':minq_ainvs})
        minq_label = "" if r is None else r['label']
        data['min_quad_twist'] = {'label':minq_label, 'disc':int(Dtw)}
    from lmfdb.elliptic_curves.web_ec import parse_points
    gens = [E(g) for g in parse_points(gens)]
    data['heights'] = [float(P.height()) for P in gens]
    if number==1:
        data['aplist'] = E.aplist(100,python_ints=True)
        data['anlist'] = E.anlist(20,python_ints=True)
    return data
Пример #4
0
def download_EC_all(label):
    CDB = lmfdb.base.getDBConnection().elliptic_curves.curves
    N, iso, number = split_lmfdb_label(label)
    if number:
        data = CDB.find_one({'lmfdb_label': label})
        if data is None:
            return elliptic_curve_jump_error(label, {})
        data_list = [data]
    else:
        data_list = sorted(list(CDB.find({'lmfdb_iso': label})),
                           key=lambda E: E['number'])
        if len(data_list) == 0:
            return elliptic_curve_jump_error(label, {})

    # titles of all entries of curves
    dump_data = []
    titles = [str(c) for c in data_list[0]]
    titles = [t for t in titles if t[0] != '_']
    titles.sort()
    dump_data.append(titles)
    for data in data_list:
        data1 = []
        for t in titles:
            d = data[t]
            if t == 'ainvs':
                data1.append(format_ainvs(d))
            elif t in ['torsion_generators', 'torsion_structure']:
                data1.append([eval(g) for g in d])
            elif t == 'x-coordinates_of_integral_points':
                data1.append(parse_list(d))
            elif t == 'gens':
                data1.append(parse_points(d))
            elif t in ['iso', 'label', 'lmfdb_iso', 'lmfdb_label']:
                data1.append(str(d))
            else:
                data1.append(d)
        dump_data.append(data1)
    response = make_response('\n'.join(str(an) for an in dump_data))
    response.headers['Content-type'] = 'text/plain'
    return response
Пример #5
0
def download_EC_all(label):
    CDB = lmfdb.base.getDBConnection().elliptic_curves.curves
    N, iso, number = split_lmfdb_label(label)
    if number:
        data = CDB.find_one({'lmfdb_label': label})
        if data is None:
            return elliptic_curve_jump_error(label, {})
        data_list = [data]
    else:
        data_list = sorted(list(CDB.find({'lmfdb_iso': label})), key=lambda E: E['number'])
        if len(data_list) == 0:
            return elliptic_curve_jump_error(label, {})

    # titles of all entries of curves
    dump_data = []
    titles = [str(c) for c in data_list[0]]
    titles = [t for t in titles if t[0] != '_']
    titles.sort()
    dump_data.append(titles)
    for data in data_list:
        data1 = []
        for t in titles:
            d = data[t]
            if t == 'ainvs':
                data1.append(format_ainvs(d))
            elif t in ['torsion_generators', 'torsion_structure']:
                data1.append([eval(g) for g in d])
            elif t == 'x-coordinates_of_integral_points':
                data1.append(parse_list(d))
            elif t == 'gens':
                data1.append(parse_points(d))
            elif t in ['iso', 'label', 'lmfdb_iso', 'lmfdb_label']:
                data1.append(str(d))
            else:
                data1.append(d)
        dump_data.append(data1)
    response = make_response('\n'.join(str(an) for an in dump_data))
    response.headers['Content-type'] = 'text/plain'
    return response
Пример #6
0
def download_EC_all(label):
    CDB = lmfdb.base.getDBConnection().elliptic_curves.curves
    N, iso, number = split_lmfdb_label(label)
    if number:
        data = CDB.find_one({"lmfdb_label": label})
        if data is None:
            return elliptic_curve_jump_error(label, {})
        data_list = [data]
    else:
        data_list = sorted(list(CDB.find({"lmfdb_iso": label})), key=lambda E: E["number"])
        if len(data_list) == 0:
            return elliptic_curve_jump_error(label, {})

    # titles of all entries of curves
    dump_data = []
    titles = [str(c) for c in data_list[0]]
    titles = [t for t in titles if t[0] != "_"]
    titles.sort()
    dump_data.append(titles)
    for data in data_list:
        data1 = []
        for t in titles:
            d = data[t]
            if t == "ainvs":
                data1.append(format_ainvs(d))
            elif t in ["torsion_generators", "torsion_structure"]:
                data1.append([eval(g) for g in d])
            elif t == "x-coordinates_of_integral_points":
                data1.append(split_list(d))
            elif t == "gens":
                data1.append(parse_points(d))
            elif t in ["iso", "label", "lmfdb_iso", "lmfdb_label"]:
                data1.append(str(d))
            else:
                data1.append(d)
        dump_data.append(data1)
    response = make_response("\n".join(str(an) for an in dump_data))
    response.headers["Content-type"] = "text/plain"
    return response
Пример #7
0
def make_extra_data(label,number,ainvs,gens):
    """
    C is a database elliptic curve entry.  Returns a dict with which to update the entry.

    Data fields needed in C already: 'ainvs', 'lmfdb_label', 'gens', 'number'
    """
    E = EllipticCurve([int(a) for a in ainvs])
    data = {}
    # convert from a list of strings to a single string, e.g. from ['0','0','0','1','1'] to '[0,0,0,1,1]'
    data['xainvs'] = ''.join(['[',','.join(ainvs),']'])
    data['equation'] = web_latex(E)
    data['signD'] = int(E.discriminant().sign())
    data['local_data'] = [{'p': int(ld.prime().gen()),
                           'ord_cond':int(ld.conductor_valuation()),
                           'ord_disc':int(ld.discriminant_valuation()),
                           'ord_den_j':int(max(0,-(E.j_invariant().valuation(ld.prime().gen())))),
                           'red':int(ld.bad_reduction_type()),
                           'rootno':int(E.root_number(ld.prime().gen())),
                           'kod':web_latex(ld.kodaira_symbol()).replace('$',''),
                           'cp':int(ld.tamagawa_number())}
                          for ld in E.local_data()]
    Etw, Dtw = E.minimal_quadratic_twist()
    if Etw.conductor()==E.conductor():
        data['min_quad_twist'] = {'label':label, 'disc':int(1)}
    else:
        # Later this should be changed to look for xainvs but now all curves have ainvs
        minq_ainvs = [str(c) for c in Etw.ainvs()]
        r = curves.find_one({'jinv':str(E.j_invariant()), 'ainvs':minq_ainvs})
        minq_label = "" if r is None else r['label']
        data['min_quad_twist'] = {'label':minq_label, 'disc':int(Dtw)}
    from lmfdb.elliptic_curves.web_ec import parse_points
    gens = [E(g) for g in parse_points(gens)]
    data['heights'] = [float(P.height()) for P in gens]
    if number==1:
        data['aplist'] = E.aplist(100,python_ints=True)
        data['anlist'] = E.anlist(20,python_ints=True)
    return data
Пример #8
0
def allgens(line):
    r""" Parses one line from an allgens file.  Returns the label and
    a dict containing fields with keys 'conductor', 'iso', 'number',
    'ainvs', 'jinv', 'cm', 'rank', 'gens', 'torsion_order', 'torsion_structure',
    'torsion_generators', all values being strings or ints, and more.

    Input line fields:

    conductor iso number ainvs rank torsion_structure gens torsion_gens

    Sample input line:

    20202 i 2 [1,0,0,-298389,54947169] 1 [2,4] [-570:6603:1] [-622:311:1] [834:19239:1]
    """
    global lmfdb_label_to_label
    global label_to_lmfdb_label

    data = split(line)
    iso = data[0] + data[1]
    label = iso + data[2]
    try:
        lmfdb_label = label_to_lmfdb_label[label]
    except AttributeError:
        print("Label {} not found in label_to_lmfdb_label dict!".format(label))
        lmfdb_label = ""

    global nallgens
    nallgens += 1
    if nallgens % 100 == 0:
        print("processing allgens for {} (#{})".format(label, nallgens))
    rank = int(data[4])
    t = data[5]
    tor_struct = [] if t == '[]' else t[1:-1].split(",")
    torsion = int(prod([int(ti) for ti in tor_struct], 1))
    ainvs = parse_ainvs(data[3])
    E = EllipticCurve(ainvs)
    jinv = text_type(E.j_invariant())
    if E.has_cm():
        cm = int(E.cm_discriminant())
    else:
        cm = int(0)
    N = E.conductor()
    bad_p = N.prime_factors()  # will be sorted
    num_bad_p = len(bad_p)

    local_data = [{
        'p':
        int(ld.prime().gen()),
        'ord_cond':
        int(ld.conductor_valuation()),
        'ord_disc':
        int(ld.discriminant_valuation()),
        'ord_den_j':
        int(max(0, -(E.j_invariant().valuation(ld.prime().gen())))),
        'red':
        int(ld.bad_reduction_type()),
        'rootno':
        int(E.root_number(ld.prime().gen())),
        'kod':
        web_latex(ld.kodaira_symbol()).replace('$', ''),
        'cp':
        int(ld.tamagawa_number())
    } for ld in E.local_data()]
    semistable = all([ld['ord_cond'] == 1 for ld in local_data])

    gens = [
        gen.replace("[", "(").replace("]", ")") for gen in data[6:6 + rank]
    ]
    tor_gens = ["%s" % parse_tgens(tgens[1:-1]) for tgens in data[6 + rank:]]

    from lmfdb.elliptic_curves.web_ec import parse_points
    heights = [float(E(P).height()) for P in parse_points(gens)]

    Etw, Dtw = E.minimal_quadratic_twist()
    if Etw.conductor() == N:
        min_quad_twist = {
            'label': label,
            'lmfdb_label': lmfdb_label,
            'disc': int(1)
        }
    else:
        minq_ainvs = Etw.ainvs()
        r = curves.lucky({
            'jinv': str(E.j_invariant()),
            'ainvs': minq_ainvs
        },
                         projection=['label', 'lmfdb_label'])
        min_quad_twist = {
            'label': r['label'],
            'lmfdb_label': r['lmfdb_label'],
            'disc': int(Dtw)
        }

    trace_hash = TraceHashClass(iso, E)

    return label, {
        'conductor': int(data[0]),
        'iso': iso,
        'number': int(data[2]),
        'ainvs': ainvs,
        'jinv': jinv,
        'cm': cm,
        'rank': rank,
        'gens': gens,
        'torsion': torsion,
        'torsion_structure': tor_struct,
        'torsion_generators': tor_gens,
        'trace_hash': trace_hash,
        'equation': web_latex(E),
        'bad_primes': bad_p,
        'num_bad_primes': num_bad_p,
        'local_data': local_data,
        'semistable': semistable,
        'signD': int(E.discriminant().sign()),
        'heights': heights,
        'aplist': E.aplist(100, python_ints=True),
        'anlist': E.anlist(20, python_ints=True),
        'min_quad_twist': min_quad_twist,
    }