def statistics_by_signature(d, r): if d == 1: return redirect(url_for("ec.statistics")) info = {} ecnfstats = db_ecnfstats() sigs_by_deg = ecnfstats.find_one({'_id': 'signatures_by_degree'}, projection={'_id': False}) if not str(d) in sigs_by_deg: info[ 'error'] = "The database does not contain any elliptic curves defined over fields of degree %s" % d else: info['degree'] = d if not r in range(d % 2, d + 1, 2): info['error'] = "Invalid signature %s" % info['sig'] s = (d - r) // 2 info['sig'] = sig = '%s,%s' % (r, s) info['summary'] = ecnf_signature_summary(sig) fields_by_sig = ecnfstats.find_one({'_id': 'fields_by_signature'}, projection={'_id': False}) counts_by_field = ecnfstats.find_one({'_id': 'conductor_norm_by_field'}, projection={'_id': False}) def field_counts(f): ff = f.replace(".", ":") return [f, counts_by_field[ff]] sorted_fields = sorted(fields_by_sig[sig], key=sort_field) info['sig_stats'] = [field_counts(f) for f in sorted_fields] credit = 'John Cremona' if info['sig'] == '2,0': t = 'Elliptic curves over real quadratic number fields' elif info['sig'] == '0,1': t = 'Elliptic curves over imaginary quadratic number fields' elif info['sig'] == '3,0': t = 'Elliptic curves over totally real cubic number fields' elif info['sig'] == '1,1': t = 'Elliptic curves over mixed cubic number fields' elif info['sig'] == '4,0': t = 'Elliptic curves over totally real quartic number fields' elif info['sig'] == '5,0': t = 'Elliptic curves over totally real quintic number fields' elif info['sig'] == '6,0': t = 'Elliptic curves over totally real sextic number fields' else: t = 'Elliptic curves over number fields of degree %s, signature (%s)' % ( d, info['sig']) bread = [('Elliptic Curves', url_for("ecnf.index")), ('degree %s' % d, url_for("ecnf.statistics_by_degree", d=d)), ('signature (%s)' % info['sig'], ' ')] return render_template("ecnf-by-signature.html", info=info, credit=credit, title=t, bread=bread, learnmore=learnmore_list())
def get_torsion_structures(): global torsion_structures if torsion_structures==None: #print("Getting list of torsion structures from the database") ecnfstats = db_ecnfstats() torsion_structures = [t[0] for t in ecnfstats.find_one({'_id':'torsion_structure'})['counts']] torsion_structures = [[int(str(n)) for n in t.split(",")] for t in torsion_structures if t] torsion_structures.sort() return torsion_structures
def browse(): data = db_ecnfstats().find_one({'_id':'signatures_by_degree'}, projection={'_id': False}) # We could use the dict directly but then could not control the order # of the keys (degrees), so we use a list info = [[d,data[str(d)]] for d in sorted([int(d) for d in data.keys()])] credit = 'John Cremona' t = 'Elliptic curves over number fields' bread = [('Elliptic Curves', url_for("ecnf.index")), ('Browse', ' ')] return render_template("ecnf-stats.html", info=info, credit=credit, title=t, bread=bread, learnmore=learnmore_list())
def get_torsion_structures(): ecnfstats = db_ecnfstats() torsion_structures = [ t[0] for t in ecnfstats.find_one({'_id': 'torsion_structure'})['counts'] ] torsion_structures = [[int(str(n)) for n in t.split(",")] for t in torsion_structures if t] torsion_structures.sort() return torsion_structures
def browse(): data = db_ecnfstats().find_one({'_id':'signatures_by_degree'}, projection={'_id': False}) # We could use the dict directly but then could not control the order # of the keys (degrees), so we use a list info = [[d,data[str(d)]] for d in sorted([int(d) for d in data.keys()])] credit = 'John Cremona' t = 'Elliptic Curves over Number Fields' bread = [('Elliptic Curves', url_for("ecnf.index")), ('Browse', ' ')] return render_template("ecnf-stats.html", info=info, credit=credit, title=t, bread=bread, learnmore=learnmore_list())
def statistics_by_degree(d): if d == 1: return redirect(url_for("ec.statistics")) info = {} ecnfstats = db_ecnfstats() sigs_by_deg = ecnfstats.find_one({'_id': 'signatures_by_degree'}, projection={'_id': False}) if not str(d) in sigs_by_deg: info[ 'error'] = "The database does not contain any elliptic curves defined over fields of degree %s" % d else: info['degree'] = d fields_by_sig = ecnfstats.find_one({'_id': 'fields_by_signature'}, projection={'_id': False}) counts_by_sig = ecnfstats.find_one({'_id': 'conductor_norm_by_signature'}, projection={'_id': False}) counts_by_field = ecnfstats.find_one({'_id': 'conductor_norm_by_field'}, projection={'_id': False}) def field_counts(f): ff = f.replace(".", ":") return [f, counts_by_field[ff]] def sig_counts(sig): sorted_fields = sorted(fields_by_sig[sig], key=sort_field) return [ sig, counts_by_sig[sig], [field_counts(f) for f in sorted_fields] ] info['summary'] = ecnf_degree_summary(d) info['sig_stats'] = [sig_counts(sig) for sig in sigs_by_deg[str(d)]] credit = 'John Cremona' if d == 2: t = 'Elliptic curves over quadratic number fields' elif d == 3: t = 'Elliptic curves over cubic number fields' elif d == 4: t = 'Elliptic curves over quartic number fields' elif d == 5: t = 'Elliptic curves over quintic number fields' elif d == 6: t = 'Elliptic curves over sextic number fields' else: t = 'Elliptic curves over number fields of degree {}'.format(d) bread = [('Elliptic Curves', url_for("ecnf.index")), ('degree %s' % d, ' ')] return render_template("ecnf-by-degree.html", info=info, credit=credit, title=t, bread=bread, learnmore=learnmore_list())
def statistics_by_signature(d,r): if d==1: return redirect(url_for("ec.statistics")) info = {} ecnfstats = db_ecnfstats() sigs_by_deg = ecnfstats.find_one({'_id':'signatures_by_degree'}, projection={'_id': False}) if not str(d) in sigs_by_deg: info['error'] = "The database does not contain any elliptic curves defined over fields of degree %s" % d else: info['degree'] = d if not r in range(d%2,d+1,2): info['error'] = "Invalid signature %s" % info['sig'] s = (d-r)//2 info['sig'] = sig = '%s,%s' % (r,s) info['summary'] = ecnf_signature_summary(sig) fields_by_sig = ecnfstats.find_one({'_id':'fields_by_signature'}, projection={'_id': False}) counts_by_field = ecnfstats.find_one({'_id':'conductor_norm_by_field'}, projection={'_id': False}) def field_counts(f): ff = f.replace(".",":") return [f,counts_by_field[ff]] sorted_fields = sorted(fields_by_sig[sig], key=sort_field) info['sig_stats'] = [field_counts(f) for f in sorted_fields] credit = 'John Cremona' if info['sig'] == '2,0': t = 'Elliptic curves over real quadratic number fields' elif info['sig'] == '0,1': t = 'Elliptic curves over imaginary quadratic number fields' elif info['sig'] == '3,0': t = 'Elliptic curves over totally real cubic number fields' elif info['sig'] == '1,1': t = 'Elliptic curves over mixed cubic number fields' elif info['sig'] == '4,0': t = 'Elliptic curves over totally real quartic number fields' elif info['sig'] == '5,0': t = 'Elliptic curves over totally real quintic number fields' elif info['sig'] == '6,0': t = 'Elliptic curves over totally real sextic number fields' else: t = 'Elliptic curves over number fields of degree %s, signature (%s)' % (d,info['sig']) bread = [('Elliptic Curves', url_for("ecnf.index")), ('Degree %s' % d,url_for("ecnf.statistics_by_degree", d=d)), ('Signature (%s)' % info['sig'],' ')] return render_template("ecnf-by-signature.html", info=info, credit=credit, title=t, bread=bread, learnmore=learnmore_list())
def ecnf_degree_summary(d): ec_knowl = '<a knowl="ec">elliptic curves</a>' iso_knowl = '<a knowl="ec.isogeny_class">isogeny classes</a>' nf_knowl = '<a knowl="nf">number fields</a>' cond_knowl = '<a knowl="ec.conductor">conductors</a>' data = db_ecnfstats().find_one({'_id':'conductor_norm_by_degree'})[str(d)] ncurves = data['ncurves'] nclasses = data['nclasses'] max_norm = data['max_norm'] return ''.join([r'The database currently contains {} '.format(ncurves), ec_knowl, r' defined over ', nf_knowl, r' of degree {}, in {} '.format(d, nclasses), iso_knowl, r', with ', cond_knowl, r' of norm up to {}.'.format(max_norm)])
def statistics_by_degree(d): if d==1: return redirect(url_for("ec.statistics")) info = {} ecnfstats = db_ecnfstats() sigs_by_deg = ecnfstats.find_one({'_id':'signatures_by_degree'}, projection={'_id': False}) if not str(d) in sigs_by_deg: info['error'] = "The database does not contain any elliptic curves defined over fields of degree %s" % d else: info['degree'] = d fields_by_sig = ecnfstats.find_one({'_id':'fields_by_signature'}, projection={'_id': False}) counts_by_sig = ecnfstats.find_one({'_id':'conductor_norm_by_signature'}, projection={'_id': False}) counts_by_field = ecnfstats.find_one({'_id':'conductor_norm_by_field'}, projection={'_id': False}) def field_counts(f): ff = f.replace(".",":") return [f,counts_by_field[ff]] def sig_counts(sig): sorted_fields = sorted(fields_by_sig[sig], key=sort_field) return [sig, counts_by_sig[sig], [field_counts(f) for f in sorted_fields]] info['summary'] = ecnf_degree_summary(d) info['sig_stats'] = [sig_counts(sig) for sig in sigs_by_deg[str(d)]] credit = 'John Cremona' if d==2: t = 'Elliptic curves over quadratic number fields' elif d==3: t = 'Elliptic curves over cubic number fields' elif d==4: t = 'Elliptic curves over quartic number fields' elif d==5: t = 'Elliptic curves over quintic number fields' elif d==6: t = 'Elliptic curves over sextic number fields' else: t = 'Elliptic curves over number fields of degree {}'.format(d) bread = [('Elliptic Curves', url_for("ecnf.index")), ('Degree %s' % d,' ')] return render_template("ecnf-by-degree.html", info=info, credit=credit, title=t, bread=bread, learnmore=learnmore_list())
def ecnf_signature_summary(sig): ec_knowl = '<a knowl="ec">elliptic curves</a>' iso_knowl = '<a knowl="ec.isogeny_class">isogeny classes</a>' nf_knowl = '<a knowl="nf">number fields</a>' cond_knowl = '<a knowl="ec.conductor">conductors</a>' r, s = [int(x) for x in sig.split(",")] d = r+2*s data = db_ecnfstats().find_one({'_id':'conductor_norm_by_signature'})[sig] ncurves = data['ncurves'] nclasses = data['nclasses'] max_norm = data['max_norm'] return ''.join([r'The database currently contains {} '.format(ncurves), ec_knowl, r' defined over ', nf_knowl, r' of signature ({}) (degree {}), in {} '.format(sig, d, nclasses), iso_knowl, r', with ', cond_knowl, r' of norm up to {}.'.format(max_norm)])
def ecnf_summary(): ecnfstats = db_ecnfstats() ec_knowl = '<a knowl="ec">elliptic curves</a>' iso_knowl = '<a knowl="ec.isogeny_class">isogeny classes</a>' nf_knowl = '<a knowl="nf">number fields</a>' deg_knowl = '<a knowl="nf.degree">degree</a>' data = ecnfstats.find_one({'_id':'conductor_norm'}) ncurves = comma(data['ncurves']) nclasses = comma(data['nclasses']) data = ecnfstats.find_one({'_id':'field_label'}) nfields = len(data['counts']) data = ecnfstats.find_one({'_id':'signatures_by_degree'}) maxdeg = max(int(d) for d in data if d!='_id') return ''.join([r'The database currently contains {} '.format(ncurves), ec_knowl, r' in {} '.format(nclasses), iso_knowl, r', over {} '.format(nfields), nf_knowl, ' (not including $\mathbb{Q}$) of ', deg_knowl, r' up to {}.'.format(maxdeg)])
def ecnf_field_summary(field): data = db_ecnfstats().find_one({'_id':'conductor_norm_by_field'})[field] ncurves = data['ncurves'] s = '' if ncurves==1 else 's' ec_knowl = '<a knowl="ec">elliptic curve{}</a>'.format(s) nclasses = data['nclasses'] s = '' if nclasses==1 else 'es' iso_knowl = '<a knowl="ec.isogeny_class">isogeny class{}</a>'.format(s) nf_knowl = '<a knowl="nf">number field</a>' max_norm = data['max_norm'] s = '' if max_norm==1 else 's' cond_knowl = '<a knowl="ec.conductor">conductor{}</a>'.format(s) s = '' if max_norm==1 else 'up to ' return ''.join([r'The database currently contains {} '.format(ncurves), ec_knowl, r' defined over the ', nf_knowl, r' {}, in {} '.format(field_pretty(field), nclasses), iso_knowl, r', with ', cond_knowl, r' of norm {} {}.'.format(s,data['max_norm'])])
def get_torsion_structures(): ecnfstats = db_ecnfstats() torsion_structures = [t[0] for t in ecnfstats.find_one({'_id':'torsion_structure'})['counts']] torsion_structures = [[int(str(n)) for n in t.split(",")] for t in torsion_structures if t] torsion_structures.sort() return torsion_structures
def index(): # if 'jump' in request.args: # return show_ecnf1(request.args['label']) if len(request.args) > 0: return elliptic_curve_search(to_dict(request.args)) bread = get_bread() # the dict data will hold additional information to be displayed on # the main browse and search page data = {} # data['fields'] holds data for a sample of number fields of different # signatures for a general browse: ecnfstats = db_ecnfstats() fields_by_deg = ecnfstats.find_one({'_id':'fields_by_degree'}) fields_by_sig = ecnfstats.find_one({'_id':'fields_by_signature'}) data['fields'] = [] # Rationals data['fields'].append(['the rational field', (('1.1.1.1', [url_for('ec.rational_elliptic_curves'), '$\Q$']),)]) # Real quadratics (sample) rqfs = ['2.2.{}.1'.format(d) for d in [5, 89, 229, 497]] niqfs = len(fields_by_sig['0,1']) nrqfs = len(fields_by_sig['2,0']) data['fields'].append(['{} real quadratic fields, including'.format(nrqfs), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in rqfs)]) # Imaginary quadratics (sample) iqfs = ['2.0.{}.1'.format(d) for d in [4, 8, 3, 7, 11]] data['fields'].append(['{} imaginary quadratic fields, including'.format(niqfs), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in iqfs)]) # Cubics (sample) cubics = ['3.1.23.1'] + ['3.3.{}.1'.format(d) for d in [49,148,1957]] ncubics = len(fields_by_deg['3']) data['fields'].append(['{} cubic fields, including'.format(ncubics), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in cubics)]) # Quartics (sample) quartics = ['4.4.{}.1'.format(d) for d in [725,2777,9909,19821]] nquartics = len(fields_by_deg['4']) data['fields'].append(['{} totally real quartic fields, including'.format(nquartics), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in quartics)]) # Quintics (sample) quintics = ['5.5.{}.1'.format(d) for d in [14641, 24217, 36497, 38569, 65657]] nquintics = len(fields_by_deg['5']) data['fields'].append(['{} totally real quintic fields, including'.format(nquintics), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in quintics)]) # Sextics (sample) sextics = ['6.6.{}.1'.format(d) for d in [300125, 371293, 434581, 453789, 485125]] nsextics = len(fields_by_deg['6']) data['fields'].append(['{} totally real sextic fields, including'.format(nsextics), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in sextics)]) data['degrees'] = sorted([int(d) for d in fields_by_deg.keys() if d!='_id']) # data['highlights'] holds data (URL and descriptive text) for a # sample of elliptic curves with interesting features: data['highlights'] = [] data['highlights'].append( ['A curve with $C_3\\times C_3$ torsion', url_for('.show_ecnf', nf='2.0.3.1', class_label='a', conductor_label='2268.36.18', number=int(1))] ) data['highlights'].append( ['A curve with $C_4\\times C_4$ torsion', url_for('.show_ecnf', nf='2.0.4.1', class_label='b', conductor_label='5525.870.5', number=int(9))] ) data['highlights'].append( ['A curve with CM by $\\sqrt{-267}$', url_for('.show_ecnf', nf='2.2.89.1', class_label='a', conductor_label='81.1', number=int(1))] ) data['highlights'].append( ['An isogeny class with isogenies of degree $3$ and $89$ (and $267$)', url_for('.show_ecnf_isoclass', nf='2.2.89.1', class_label='a', conductor_label='81.1')] ) data['highlights'].append( ['A curve with everywhere good reduction, but no global minimal model', url_for('.show_ecnf', nf='2.2.229.1', class_label='a', conductor_label='1.1', number=int(1))] ) return render_template("ecnf-index.html", title="Elliptic Curves over Number Fields", data=data, bread=bread, learnmore=learnmore_list_remove('Completeness'))
def index(): # if 'jump' in request.args: # return show_ecnf1(request.args['label']) if len(request.args) > 0: return elliptic_curve_search(to_dict(request.args)) bread = get_bread() # the dict data will hold additional information to be displayed on # the main browse and search page data = {} # data['fields'] holds data for a sample of number fields of different # signatures for a general browse: ecnfstats = db_ecnfstats() fields_by_deg = ecnfstats.find_one({'_id': 'fields_by_degree'}) fields_by_sig = ecnfstats.find_one({'_id': 'fields_by_signature'}) data['fields'] = [] # Rationals data['fields'].append([ 'the rational field', (('1.1.1.1', [url_for('ec.rational_elliptic_curves'), '$\Q$']), ) ]) # Real quadratics (sample) rqfs = ['2.2.{}.1'.format(d) for d in [5, 89, 229, 497]] niqfs = len(fields_by_sig['0,1']) nrqfs = len(fields_by_sig['2,0']) data['fields'].append([ '{} real quadratic fields, including'.format(nrqfs), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in rqfs) ]) # Imaginary quadratics (sample) iqfs = ['2.0.{}.1'.format(d) for d in [4, 8, 3, 7, 11]] data['fields'].append([ '{} imaginary quadratic fields, including'.format(niqfs), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in iqfs) ]) # Cubics (sample) cubics = ['3.1.23.1'] + ['3.3.{}.1'.format(d) for d in [49, 148, 1957]] ncubics = len(fields_by_deg['3']) data['fields'].append([ '{} cubic fields, including'.format(ncubics), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in cubics) ]) # Quartics (sample) quartics = ['4.4.{}.1'.format(d) for d in [725, 2777, 9909, 19821]] nquartics = len(fields_by_deg['4']) data['fields'].append([ '{} totally real quartic fields, including'.format(nquartics), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in quartics) ]) # Quintics (sample) quintics = [ '5.5.{}.1'.format(d) for d in [14641, 24217, 36497, 38569, 65657] ] nquintics = len(fields_by_deg['5']) data['fields'].append([ '{} totally real quintic fields, including'.format(nquintics), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in quintics) ]) # Sextics (sample) sextics = [ '6.6.{}.1'.format(d) for d in [300125, 371293, 434581, 453789, 485125] ] nsextics = len(fields_by_deg['6']) data['fields'].append([ '{} totally real sextic fields, including'.format(nsextics), ((nf, [url_for('.show_ecnf1', nf=nf), field_pretty(nf)]) for nf in sextics) ]) data['degrees'] = sorted( [int(d) for d in fields_by_deg.keys() if d != '_id']) # data['highlights'] holds data (URL and descriptive text) for a # sample of elliptic curves with interesting features: data['highlights'] = [] data['highlights'].append([ 'A curve with $C_3\\times C_3$ torsion', url_for('.show_ecnf', nf='2.0.3.1', class_label='a', conductor_label='2268.36.18', number=int(1)) ]) data['highlights'].append([ 'A curve with $C_4\\times C_4$ torsion', url_for('.show_ecnf', nf='2.0.4.1', class_label='b', conductor_label='5525.870.5', number=int(9)) ]) data['highlights'].append([ 'A curve with CM by $\\sqrt{-267}$', url_for('.show_ecnf', nf='2.2.89.1', class_label='a', conductor_label='81.1', number=int(1)) ]) data['highlights'].append([ 'An isogeny class with isogenies of degree $3$ and $89$ (and $267$)', url_for('.show_ecnf_isoclass', nf='2.2.89.1', class_label='a', conductor_label='81.1') ]) data['highlights'].append([ 'A curve with everywhere good reduction, but no global minimal model', url_for('.show_ecnf', nf='2.2.229.1', class_label='a', conductor_label='1.1', number=int(1)) ]) return render_template("ecnf-index.html", title="Elliptic Curves over Number Fields", data=data, bread=bread, learnmore=learnmore_list_remove('Completeness'))