def myhelper(self, coefmult): coef = string2list(coefmult[0]) subfield = self.from_coeffs(coef) if subfield._data is None: deg = len(coef) - 1 mypol = latex(coeff_to_poly(coef)) mypol = mypol.replace(' ','').replace('+','%2B').replace('{', '%7B').replace('}','%7d') mypol = '<a title = "Field missing" knowl="nf.field.missing" kwargs="poly=%s">Deg %d</a>' % (mypol,deg) return [mypol, coefmult[1]] return [nf_display_knowl(subfield.get_label(),subfield.field_pretty()), coefmult[1]]
def formatfield(coef): coef = string2list(coef) thefield = WebNumberField.from_coeffs(coef) if thefield._data is None: deg = len(coef) - 1 mypol = latex(coeff_to_poly(coef)) mypol = mypol.replace(' ','').replace('+','%2B').replace('{', '%7B').replace('}','%7d') mypol = '<a title = "Field missing" knowl="nf.field.missing" kwargs="poly=%s">Deg %d</a>' % (mypol,deg) return mypol return nf_display_knowl(thefield.get_label(),thefield.field_pretty())
def _order_basis_forward(self): basis = [] for i, (num, den) in enumerate(zip(self.hecke_ring_numerators, self.hecke_ring_denominators)): numsize = sum(len(str(c)) for c in num if c) if numsize > 80: num = web_latex_poly(num, self._nu_latex, superscript=True) else: num = web_latex(coeff_to_poly(num, self._nu_var)) betai = r'\(\beta_{%s}\)'%i basis.append((betai, self._make_frac(num, den))) return self._make_table(basis)
def lf_knowl_guts(label, C): f = C.localfields.fields.find_one({"label": label}) ans = "Local number field %s<br><br>" % label ans += "Extension of $\Q_{%s}$ defined by %s<br>" % (str(f["p"]), web_latex(coeff_to_poly(f["coeffs"]))) GG = f["gal"] ans += "Degree: %s<br>" % str(GG[0]) ans += "Ramification index $e$: %s<br>" % str(f["e"]) ans += "Residue field degree $f$: %s<br>" % str(f["f"]) ans += "Discriminant ideal: $(p^{%s})$ <br>" % str(f["c"]) ans += "Galois group $G$: %s<br>" % group_display_knowl(GG[0], GG[1], C) ans += '<div align="right">' ans += '<a href="%s">%s home page</a>' % (str(url_for("local_fields.by_label", label=label)), label) ans += "</div>" return ans
def make_torsion_growth(self): if self.tor_gro is None: self.torsion_growth_data_exists = False return tor_gro = self.tor_gro self.torsion_growth_data_exists = True self.tg = tg = {} tg['data'] = tgextra = [] # find all base-changes of this curve in the database, if any bcs = list(db.ec_nfcurves.search({'base_change': {'$contains': [self.lmfdb_label]}}, projection='label')) bcfs = [lab.split("-")[0] for lab in bcs] for F, T in tor_gro.items(): tg1 = {} tg1['bc'] = "Not in database" if ":" in F: F = F.replace(":",".") field_data = nf_display_knowl(F, field_pretty(F)) deg = int(F.split(".")[0]) bcc = [x for x,y in zip(bcs, bcfs) if y==F] if bcc: from lmfdb.ecnf.main import split_full_label F, NN, I, C = split_full_label(bcc[0]) tg1['bc'] = bcc[0] tg1['bc_url'] = url_for('ecnf.show_ecnf', nf=F, conductor_label=NN, class_label=I, number=C) else: field_data = web_latex_split_on_pm(coeff_to_poly(string2list(F))) deg = F.count(",") tg1['d'] = deg tg1['f'] = field_data tg1['t'] = '\(' + ' \\times '.join(['\Z/{}\Z'.format(n) for n in T.split(",")]) + '\)' tg1['m'] = 0 tgextra.append(tg1) tgextra.sort(key = lambda x: x['d']) tg['n'] = len(tgextra) lastd = 1 for tg1 in tgextra: d = tg1['d'] if d!=lastd: tg1['m'] = len([x for x in tgextra if x['d']==d]) lastd = d ## Hard-code this for now. While something like ## max(db.ec_curves.search({},projection='tor_degs')) might ## work, since 'tor_degs' is in the extra table it is very ## slow. Note that the *only* place where this number is used ## is in the ec-curve template where it says "The number ## fields ... of degree up to {{data.tg.maxd}} such that...". tg['maxd'] = 7
def lf_knowl_guts(label, C): f = C.localfields.fields.find_one({'label':label}) ans = 'Local number field %s<br><br>'% label ans += 'Extension of $\Q_{%s}$ defined by %s<br>'%(str(f['p']),web_latex(coeff_to_poly(f['coeffs']))) GG = f['gal'] ans += 'Degree: %s<br>' % str(GG[0]) ans += 'Ramification index $e$: %s<br>' % str(f['e']) ans += 'Residue field degree $f$: %s<br>' % str(f['f']) ans += 'Discriminant ideal: $(p^{%s})$ <br>' % str(f['c']) ans += 'Galois group $G$: %s<br>' % group_display_knowl(GG[0], GG[1], C) ans += '<div align="right">' ans += '<a href="%s">%s home page</a>' % (str(url_for("local_fields.by_label", label=label)),label) ans += '</div>' return ans
def display_hecke_cutters(self): polynomials = [] truncated = False for p,F in self.hecke_cutters: cut = len(F) - 1 count = 0 while cut >= 0 and count < 8: if F[cut]: count += 1 cut -= 1 if count < 8 or cut == 0 and abs(F[0]) < 100: F = latex(coeff_to_poly(F, 'T%s'%p)) else: # truncate to the first 8 nonzero coefficients F = [0]*(cut+1) + F[cut+1:] F = latex(coeff_to_poly(F, 'T%s'%p)) + r' + \cdots' truncated = True polynomials.append(web_latex_split_on_pm(F)) title = 'linear operator' if len(polynomials) > 1: title += 's' knowl = display_knowl('mf.elliptic.hecke_cutter', title=title) desc = "<p>This newform can be constructed as the " if truncated or len(polynomials) > 1: if len(polynomials) > 1: desc += "intersection of the kernels " else: desc += "kernel " desc += "of the following %s acting on %s:</p>\n<table>" desc = desc % (knowl, self.display_newspace()) desc += "\n".join("<tr><td>%s</td></tr>" % F for F in polynomials) + "\n</table>" elif len(polynomials) == 1: desc += "kernel of the %s %s acting on %s." desc = desc % (knowl, polynomials[0], self.display_newspace()) else: desc = r"<p>There are no other newforms in %s.</p>"%(self.display_newspace()) return desc
def make_torsion_growth(self): try: tor_gro = self.tor_gro self.torsion_growth_data_exists = True except AttributeError: self.torsion_growth_data_exists = False return self.tg = tg = {} tg['data'] = tgextra = [] # find all base-changes of this curve in the database, if any from lmfdb.ecnf.WebEllipticCurve import db_ecnf bcs = [res['label'] for res in db_ecnf().find({'base_change': self.lmfdb_label}, projection={'label': True, '_id': False})] bcfs = [lab.split("-")[0] for lab in bcs] for F, T in tor_gro.items(): tg1 = {} tg1['bc'] = "Not in database" if ":" in F: F = F.replace(":",".") field_data = nf_display_knowl(F, getDBConnection(), field_pretty(F)) deg = int(F.split(".")[0]) bcc = [x for x,y in zip(bcs, bcfs) if y==F] if bcc: from lmfdb.ecnf.main import split_full_label F, NN, I, C = split_full_label(bcc[0]) tg1['bc'] = bcc[0] tg1['bc_url'] = url_for('ecnf.show_ecnf', nf=F, conductor_label=NN, class_label=I, number=C) else: field_data = web_latex_split_on_pm(coeff_to_poly(string2list(F))) deg = F.count(",") tg1['d'] = deg tg1['f'] = field_data tg1['t'] = '\(' + ' \\times '.join(['\Z/{}\Z'.format(n) for n in T.split(",")]) + '\)' tg1['m'] = 0 tgextra.append(tg1) tgextra.sort(key = lambda x: x['d']) tg['n'] = len(tgextra) lastd = 1 for tg1 in tgextra: d = tg1['d'] if d!=lastd: tg1['m'] = len([x for x in tgextra if x['d']==d]) lastd = d tg['maxd'] = max(db_ecstats().find_one({'_id': 'torsion_growth'})['degrees'])
def local_field_data(label): f = db.lf_fields.lookup(label) nicename = '' if f['n'] < 3: nicename = ' = '+ prettyname(f) ans = 'Local number field %s%s<br><br>'% (label, nicename) ans += 'Extension of $\Q_{%s}$ defined by %s<br>'%(str(f['p']),web_latex(coeff_to_poly(f['coeffs']))) gt = f['gal'] gn = f['n'] ans += 'Degree: %s<br>' % str(gt) ans += 'Ramification index $e$: %s<br>' % str(f['e']) ans += 'Residue field degree $f$: %s<br>' % str(f['f']) ans += 'Discriminant ideal: $(p^{%s})$ <br>' % str(f['c']) ans += 'Galois group $G$: %s<br>' % group_pretty_and_nTj(gn, gt, True) ans += '<div align="right">' ans += '<a href="%s">%s home page</a>' % (str(url_for("local_fields.by_label", label=label)),label) ans += '</div>' return ans
def make_torsion_growth(self): if self.tor_gro is None: self.torsion_growth_data_exists = False return tor_gro = self.tor_gro self.torsion_growth_data_exists = True self.tg = tg = {} tg['data'] = tgextra = [] # find all base-changes of this curve in the database, if any bcs = list(db.ec_nfcurves.search({'base_change': {'$contains': [self.lmfdb_label]}}, projection='label')) bcfs = [lab.split("-")[0] for lab in bcs] for F, T in tor_gro.items(): tg1 = {} tg1['bc'] = "Not in database" if ":" in F: F = F.replace(":",".") field_data = nf_display_knowl(F, field_pretty(F)) deg = int(F.split(".")[0]) bcc = [x for x,y in zip(bcs, bcfs) if y==F] if bcc: from lmfdb.ecnf.main import split_full_label F, NN, I, C = split_full_label(bcc[0]) tg1['bc'] = bcc[0] tg1['bc_url'] = url_for('ecnf.show_ecnf', nf=F, conductor_label=NN, class_label=I, number=C) else: field_data = web_latex_split_on_pm(coeff_to_poly(string2list(F))) deg = F.count(",") tg1['d'] = deg tg1['f'] = field_data tg1['t'] = '\(' + ' \\times '.join(['\Z/{}\Z'.format(n) for n in T.split(",")]) + '\)' tg1['m'] = 0 tgextra.append(tg1) tgextra.sort(key = lambda x: x['d']) tg['n'] = len(tgextra) lastd = 1 for tg1 in tgextra: d = tg1['d'] if d!=lastd: tg1['m'] = len([x for x in tgextra if x['d']==d]) lastd = d ## Hard code for now #tg['maxd'] = max(db.ec_curves.stats.get_oldstat('torsion_growth')['degrees']) tg['maxd'] = 7
def polynomial_latex(self): return web_latex(coeff_to_poly(self.polynomial()), enclose=False)
def poly(self): return coeff_to_poly(string2list(self._data['coeffs']))
def render_field_webpage(args): data = None info = {} if 'label' in args: label = clean_input(args['label']) data = db.lf_fields.lookup(label) if data is None: if re.match(r'^\d+\.\d+\.\d+\.\d+$', label): flash_error("Field <span style='color:black'>%s</span> was not found in the database.", label) else: flash_error("<span style='color:black'>%s</span> is not a valid label for a local number field.", label) return redirect(url_for(".index")) title = 'Local Number Field ' + prettyname(data) polynomial = coeff_to_poly(data['coeffs']) p = data['p'] Qp = r'\Q_{%d}' % p e = data['e'] f = data['f'] cc = data['c'] gt = data['gal'] gn = data['n'] the_gal = WebGaloisGroup.from_nt(gn,gt) isgal = ' Galois' if the_gal.order() == gn else ' not Galois' abelian = ' and abelian' if the_gal.is_abelian() else '' galphrase = 'This field is'+isgal+abelian+' over $\Q_{%d}$.'%p autstring = r'\Gal' if the_gal.order() == gn else r'\Aut' prop2 = [ ('Label', label), ('Base', '\(%s\)' % Qp), ('Degree', '\(%s\)' % data['n']), ('e', '\(%s\)' % e), ('f', '\(%s\)' % f), ('c', '\(%s\)' % cc), ('Galois group', group_pretty_and_nTj(gn, gt)), ] # Look up the unram poly so we can link to it unramlabel = db.lf_fields.lucky({'p': p, 'n': f, 'c': 0}, projection=0) if unramlabel is None: logger.fatal("Cannot find unramified field!") unramfriend = '' else: unramfriend = "/LocalNumberField/%s" % unramlabel unramdata = db.lf_fields.lookup(unramlabel) Px = PolynomialRing(QQ, 'x') Pxt=PolynomialRing(Px,'t') Pt = PolynomialRing(QQ, 't') Ptx = PolynomialRing(Pt, 'x') if data['f'] == 1: unramp = r'$%s$' % Qp # Eliminate t from the eisenstein polynomial eisenp = Pxt(str(data['eisen']).replace('y','x')) eisenp = Pt(str(data['unram'])).resultant(eisenp) eisenp = web_latex(eisenp) else: unramp = data['unram'].replace('t','x') unramp = web_latex(Px(str(unramp))) unramp = prettyname(unramdata)+' $\\cong '+Qp+'(t)$ where $t$ is a root of '+unramp eisenp = Ptx(str(data['eisen']).replace('y','x')) eisenp = '$'+web_latex(eisenp, False)+'\\in'+Qp+'(t)[x]$' rflabel = db.lf_fields.lucky({'p': p, 'n': {'$in': [1, 2]}, 'rf': data['rf']}, projection=0) if rflabel is None: logger.fatal("Cannot find discriminant root field!") rffriend = '' else: rffriend = "/LocalNumberField/%s" % rflabel gsm = data['gsm'] if gsm == [0]: gsm = 'Not computed' elif gsm == [-1]: gsm = 'Does not exist' else: gsm = web_latex(coeff_to_poly(gsm)) info.update({ 'polynomial': web_latex(polynomial), 'n': data['n'], 'p': p, 'c': data['c'], 'e': data['e'], 'f': data['f'], 't': data['t'], 'u': data['u'], 'rf': lf_display_knowl( rflabel, name=printquad(data['rf'], p)), 'base': lf_display_knowl(str(p)+'.1.0.1', name='$%s$'%Qp), 'hw': data['hw'], 'slopes': show_slopes(data['slopes']), 'gal': group_pretty_and_nTj(gn, gt, True), 'gt': gt, 'inertia': group_display_inertia(data['inertia']), 'unram': unramp, 'eisen': eisenp, 'gms': data['gms'], 'gsm': gsm, 'galphrase': galphrase, 'autstring': autstring, 'subfields': format_subfields(data['subfields'],p), 'aut': data['aut'], }) friends = [('Galois group', "/GaloisGroup/%dT%d" % (gn, gt))] if unramfriend != '': friends.append(('Unramified subfield', unramfriend)) if rffriend != '': friends.append(('Discriminant root field', rffriend)) bread = get_bread([(label, ' ')]) return render_template("lf-show-field.html", credit=LF_credit, title=title, bread=bread, info=info, properties2=prop2, friends=friends, learnmore=learnmore_list())
def computation_minimal_polynomial_latex(self): pol = coeff_to_poly(self._data["QpRts-minpoly"]) return web_latex(pol, enclose=False)
def render_field_webpage(args): data = None info = {} if 'label' in args: label = clean_input(args['label']) data = lfdb().find_one({'label': label}) if data is None: bread = get_bread([("Search error", ' ')]) info['err'] = "Field " + label + " was not found in the database." info['label'] = label return search_input_error(info, bread) title = 'Local Number Field ' + label polynomial = coeff_to_poly(string2list(data['coeffs'])) p = data['p'] e = data['e'] f = data['f'] cc = data['c'] GG = data['gal'] gn = GG[0] gt = GG[1] the_gal = WebGaloisGroup.from_nt(gn,gt) isgal = ' Galois' if the_gal.order() == gn else ' not Galois' abelian = ' and abelian' if the_gal.is_abelian() else '' galphrase = 'This field is'+isgal+abelian+' over $\Q_{%d}$.'%p autstring = r'\Gal' if the_gal.order() == gn else r'\Aut' prop2 = [ ('Label', label), ('Base', '\(\Q_{%s}\)' % p), ('Degree', '\(%s\)' % data['n']), ('e', '\(%s\)' % e), ('f', '\(%s\)' % f), ('c', '\(%s\)' % cc), ('Galois group', group_display_short(gn, gt, db())), ] Pt = PolynomialRing(QQ, 't') Pyt = PolynomialRing(Pt, 'y') eisenp = Pyt(str(data['eisen'])) unramp = Pyt(str(data['unram'])) # Look up the unram poly so we can link to it unramdata = lfdb().find_one({'p': p, 'n': f, 'c': 0}) if unramdata is not None: unramfriend = "/LocalNumberField/%s" % unramdata['label'] else: logger.fatal("Cannot find unramified field!") unramfriend = '' rfdata = lfdb().find_one({'p': p, 'n': {'$in': [1, 2]}, 'rf': data['rf']}) if rfdata is None: logger.fatal("Cannot find discriminant root field!") rffriend = '' else: rffriend = "/LocalNumberField/%s" % rfdata['label'] gsm = data['gsm'] if gsm == '0': gsm = 'Not computed' elif gsm == '-1': gsm = 'Does not exist' else: gsm = web_latex(coeff_to_poly(string2list(gsm))) info.update({ 'polynomial': web_latex(polynomial), 'n': data['n'], 'p': p, 'c': data['c'], 'e': data['e'], 'f': data['f'], 't': data['t'], 'u': data['u'], 'rf': printquad(data['rf'], p), 'hw': data['hw'], 'slopes': show_slopes(data['slopes']), 'gal': group_display_knowl(gn, gt, db()), 'gt': gt, 'inertia': group_display_inertia(data['inertia'], db()), 'unram': web_latex(unramp), 'eisen': web_latex(eisenp), 'gms': data['gms'], 'gsm': gsm, 'galphrase': galphrase, 'autstring': autstring, 'subfields': format_subfields(data['subfields'],p), 'aut': data['aut'], }) friends = [('Galois group', "/GaloisGroup/%dT%d" % (gn, gt))] if unramfriend != '': friends.append(('Unramified subfield', unramfriend)) if rffriend != '': friends.append(('Discriminant root field', rffriend)) bread = get_bread([(label, ' ')]) learnmore = [('Completeness of the data', url_for(".completeness_page")), ('Source of the data', url_for(".how_computed_page")), ('Local field labels', url_for(".labels_page"))] return render_template("lf-show-field.html", credit=LF_credit, title=title, bread=bread, info=info, properties2=prop2, friends=friends, learnmore=learnmore)
def coeff_to_nf(c): return NumberField(coeff_to_poly(c), 'a')
def display_poly(coeffs): return web_latex(coeff_to_poly(string2list(coeffs)))
def defining_polynomial(self): if self.field_poly: return web_latex_split_on_pm(web_latex(coeff_to_poly(self.field_poly), enclose=False)) return None
def computation_minimal_polynomial_raw_typeset(self): pol = coeff_to_poly(self._data["QpRts-minpoly"]) return raw_typeset_poly(pol)
def format_coeffs(coeffs): return pol_to_html(str(coeff_to_poly(string2list(coeffs))))
def render_field_webpage(args): data = None info = {} if 'label' in args: label = clean_input(args['label']) data = lfdb().find_one({'label': label}) if data is None: bread = get_bread([("Search error", ' ')]) info['err'] = "Field " + label + " was not found in the database." info['label'] = label return search_input_error(info, bread) title = 'Local Number Field ' + label polynomial = coeff_to_poly(string2list(data['coeffs'])) p = data['p'] e = data['e'] f = data['f'] cc = data['c'] GG = data['gal'] gn = GG[0] gt = GG[1] the_gal = WebGaloisGroup.from_nt(gn, gt) isgal = ' Galois' if the_gal.order() == gn else ' not Galois' abelian = ' and abelian' if the_gal.is_abelian() else '' galphrase = 'This field is' + isgal + abelian + ' over $\Q_{%d}$.' % p autstring = r'\Gal' if the_gal.order() == gn else r'\Aut' prop2 = [ ('Label', label), ('Base', '\(\Q_{%s}\)' % p), ('Degree', '\(%s\)' % data['n']), ('e', '\(%s\)' % e), ('f', '\(%s\)' % f), ('c', '\(%s\)' % cc), ('Galois group', group_display_short(gn, gt, db())), ] Pt = PolynomialRing(QQ, 't') Pyt = PolynomialRing(Pt, 'y') eisenp = Pyt(str(data['eisen'])) unramp = Pyt(str(data['unram'])) # Look up the unram poly so we can link to it unramdata = lfdb().find_one({'p': p, 'n': f, 'c': 0}) if unramdata is not None: unramfriend = "/LocalNumberField/%s" % unramdata['label'] else: logger.fatal("Cannot find unramified field!") unramfriend = '' rfdata = lfdb().find_one({ 'p': p, 'n': { '$in': [1, 2] }, 'rf': data['rf'] }) if rfdata is None: logger.fatal("Cannot find discriminant root field!") rffriend = '' else: rffriend = "/LocalNumberField/%s" % rfdata['label'] gsm = data['gsm'] if gsm == '0': gsm = 'Not computed' elif gsm == '-1': gsm = 'Does not exist' else: gsm = web_latex(coeff_to_poly(string2list(gsm))) info.update({ 'polynomial': web_latex(polynomial), 'n': data['n'], 'p': p, 'c': data['c'], 'e': data['e'], 'f': data['f'], 't': data['t'], 'u': data['u'], 'rf': printquad(data['rf'], p), 'hw': data['hw'], 'slopes': show_slopes(data['slopes']), 'gal': group_display_knowl(gn, gt, db()), 'gt': gt, 'inertia': group_display_inertia(data['inertia'], db()), 'unram': web_latex(unramp), 'eisen': web_latex(eisenp), 'gms': data['gms'], 'gsm': gsm, 'galphrase': galphrase, 'autstring': autstring, 'subfields': format_subfields(data['subfields'], p), 'aut': data['aut'], }) friends = [('Galois group', "/GaloisGroup/%dT%d" % (gn, gt))] if unramfriend != '': friends.append(('Unramified subfield', unramfriend)) if rffriend != '': friends.append(('Discriminant root field', rffriend)) bread = get_bread([(label, ' ')]) learnmore = [('Completeness of the data', url_for(".completeness_page")), ('Source of the data', url_for(".how_computed_page")), ('Local field labels', url_for(".labels_page"))] return render_template("lf-show-field.html", credit=LF_credit, title=title, bread=bread, info=info, properties2=prop2, friends=friends, learnmore=learnmore)
def display_poly(coeffs): return web_latex(coeff_to_poly(string2list(coeffs)))
def test_coeff_to_poly(self): r""" Checking utility: coeff_to_poly """ x = var('x') self.assertEqual(coeff_to_poly("1 - 3x + x^2"), x**2 - 3 * x + 1)
def polynomial_raw_typeset(self): return raw_typeset_poly(coeff_to_poly(self.polynomial()))
def render_field_webpage(args): data = None info = {} if 'label' in args: label = clean_input(args['label']) data = db.lf_fields.lookup(label) if data is None: if re.match(r'^\d+\.\d+\.\d+\.\d+$', label): flash_error("Field %s was not found in the database.", label) else: flash_error("%s is not a valid label for a $p$-adic field.", label) return redirect(url_for(".index")) title = '$p$-adic field ' + prettyname(data) titletag = 'p-adic field ' + prettyname(data) polynomial = coeff_to_poly(data['coeffs']) p = data['p'] Qp = r'\Q_{%d}' % p e = data['e'] f = data['f'] cc = data['c'] gt = int(data['galois_label'].split('T')[1]) gn = data['n'] the_gal = WebGaloisGroup.from_nt(gn, gt) isgal = ' Galois' if the_gal.order() == gn else ' not Galois' abelian = ' and abelian' if the_gal.is_abelian() else '' galphrase = 'This field is' + isgal + abelian + r' over $\Q_{%d}.$' % p autstring = r'\Gal' if the_gal.order() == gn else r'\Aut' prop2 = [ ('Label', label), ('Base', r'\(%s\)' % Qp), ('Degree', r'\(%s\)' % data['n']), ('e', r'\(%s\)' % e), ('f', r'\(%s\)' % f), ('c', r'\(%s\)' % cc), ('Galois group', group_pretty_and_nTj(gn, gt)), ] # Look up the unram poly so we can link to it unramlabel = db.lf_fields.lucky({'p': p, 'n': f, 'c': 0}, projection=0) if unramlabel is None: logger.fatal("Cannot find unramified field!") unramfriend = '' else: unramfriend = "/LocalNumberField/%s" % unramlabel unramdata = db.lf_fields.lookup(unramlabel) Px = PolynomialRing(QQ, 'x') Pt = PolynomialRing(QQ, 't') Ptx = PolynomialRing(Pt, 'x') if data['f'] == 1: unramp = r'$%s$' % Qp eisenp = Ptx(str(data['eisen']).replace('y', 'x')) eisenp = web_latex(eisenp) else: unramp = data['unram'].replace('t', 'x') unramp = web_latex(Px(str(unramp))) unramp = prettyname( unramdata ) + ' $\\cong ' + Qp + '(t)$ where $t$ is a root of ' + unramp eisenp = Ptx(str(data['eisen']).replace('y', 'x')) eisenp = '$' + web_latex(eisenp, False) + '\\in' + Qp + '(t)[x]$' rflabel = db.lf_fields.lucky( { 'p': p, 'n': { '$in': [1, 2] }, 'rf': data['rf'] }, projection=0) if rflabel is None: logger.fatal("Cannot find discriminant root field!") rffriend = '' else: rffriend = "/LocalNumberField/%s" % rflabel gsm = data['gsm'] if gsm == [0]: gsm = 'Not computed' elif gsm == [-1]: gsm = 'Does not exist' else: gsm = lf_formatfield(','.join([str(b) for b in gsm])) info.update({ 'polynomial': web_latex(polynomial), 'n': data['n'], 'p': p, 'c': data['c'], 'e': data['e'], 'f': data['f'], 't': data['t'], 'u': data['u'], 'rf': lf_display_knowl(rflabel, name=printquad(data['rf'], p)), 'base': lf_display_knowl(str(p) + '.1.0.1', name='$%s$' % Qp), 'hw': data['hw'], 'slopes': show_slopes(data['slopes']), 'gal': group_pretty_and_nTj(gn, gt, True), 'gt': gt, 'inertia': group_display_inertia(data['inertia']), 'unram': unramp, 'eisen': eisenp, 'gms': data['gms'], 'gsm': gsm, 'galphrase': galphrase, 'autstring': autstring, 'subfields': format_subfields(data['subfields'], p), 'aut': data['aut'], }) friends = [('Galois group', "/GaloisGroup/%dT%d" % (gn, gt))] if unramfriend != '': friends.append(('Unramified subfield', unramfriend)) if rffriend != '': friends.append(('Discriminant root field', rffriend)) bread = get_bread([(label, ' ')]) return render_template( "lf-show-field.html", credit=LF_credit, title=title, titletag=titletag, bread=bread, info=info, properties=prop2, friends=friends, learnmore=learnmore_list(), KNOWL_ID="lf.%s" % label, )
def render_field_webpage(args): data = None info = {} if 'label' in args: label = clean_input(args['label']) C = base.getDBConnection() data = C.localfields.fields.find_one({'label': label}) if data is None: bread = get_bread([("Search error", ' ')]) info['err'] = "Field " + label + " was not found in the database." info['label'] = label return search_input_error(info, bread) title = 'Local Number Field ' + label polynomial = coeff_to_poly(data['coeffs']) p = data['p'] e = data['e'] f = data['f'] cc = data['c'] GG = data['gal'] gn = GG[0] gt = GG[1] prop2 = [ ('Label', label), ('Base', '\(\Q_{%s}\)' % p), ('Degree', '\(%s\)' % data['n']), ('e', '\(%s\)' % e), ('f', '\(%s\)' % f), ('c', '\(%s\)' % cc), ('Galois group', group_display_short(gn, gt, C)), ] Pt = PolynomialRing(QQ, 't') Pyt = PolynomialRing(Pt, 'y') eisenp = Pyt(str(data['eisen'])) unramp = Pyt(str(data['unram'])) # Look up the unram poly so we can link to it unramdata = C.localfields.fields.find_one({'p': p, 'n': f, 'c': 0}) if len(unramdata) > 0: unramfriend = "/LocalNumberField/%s" % unramdata['label'] else: logger.fatal("Cannot find unramified field!") unramfriend = '' rfdata = C.localfields.fields.find_one({ 'p': p, 'n': { '$in': [1, 2] }, 'rf': data['rf'] }) if rfdata is None: logger.fatal("Cannot find discriminant root field!") rffriend = '' else: rffriend = "/LocalNumberField/%s" % rfdata['label'] info.update({ 'polynomial': web_latex(polynomial), 'n': data['n'], 'p': data['p'], 'c': data['c'], 'e': data['e'], 'f': data['f'], 't': data['t'], 'u': data['u'], 'rf': printquad(data['rf'], p), 'hw': data['hw'], 'slopes': show_slopes(data['slopes']), 'gal': group_display_knowl(gn, gt, C), 'gt': gt, 'inertia': group_display_inertia(data['inertia'], C), 'unram': web_latex(unramp), 'eisen': web_latex(eisenp), 'gms': data['gms'], 'aut': data['aut'], }) friends = [('Galois group', "/GaloisGroup/%dT%d" % (gn, gt))] if unramfriend != '': friends.append(('Unramified subfield', unramfriend)) if rffriend != '': friends.append(('Discriminant root field', rffriend)) bread = get_bread([(label, ' ')]) learnmore = [('Completeness of the data', url_for(".completeness_page")), ('Source of the data', url_for(".how_computed_page")), ('Local field labels', url_for(".labels_page"))] return render_template("lf-show-field.html", credit=LF_credit, title=title, bread=bread, info=info, properties2=prop2, friends=friends, learnmore=learnmore)
def display_poly(coeffs): return web_latex(coeff_to_poly(coeffs))
def render_field_webpage(args): data = None info = {} if 'label' in args: label = clean_input(args['label']) C = base.getDBConnection() data = C.localfields.fields.find_one({'label': label}) if data is None: bread = get_bread([("Search error", url_for('.search'))]) info['err'] = "Field " + label + " was not found in the database." info['label'] = label return search_input_error(info, bread) title = 'Local Number Field:' + label polynomial = coeff_to_poly(data['coeffs']) p = data['p'] e = data['e'] f = data['f'] cc = data['c'] GG = data['gal'] gn = GG[0] gt = GG[1] prop2 = [ ('Base', '\(\Q_{%s}\)' % p), ('Degree', '\(%s\)' % data['n']), ('e', '\(%s\)' % e), ('f', '\(%s\)' % f), ('c', '\(%s\)' % cc), ('Galois group', group_display_short(gn, gt, C)), ] Pt = PolynomialRing(QQ, 't') Pyt = PolynomialRing(Pt, 'y') eisenp = Pyt(str(data['eisen'])) unramp = Pyt(str(data['unram'])) # Look up the unram poly so we can link to it unramdata = C.localfields.fields.find_one({'p': p, 'n': f, 'c': 0}) if len(unramdata) > 0: unramfriend = "/LocalNumberField/%s" % unramdata['label'] else: logger.fatal("Cannot find unramified field!") unramfriend = '' rfdata = C.localfields.fields.find_one({'p': p, 'n': {'$in': [1, 2]}, 'rf': data['rf']}) if rfdata is None: logger.fatal("Cannot find discriminant root field!") rffriend = '' else: rffriend = "/LocalNumberField/%s" % rfdata['label'] info.update({ 'polynomial': web_latex(polynomial), 'n': data['n'], 'p': data['p'], 'c': data['c'], 'e': data['e'], 'f': data['f'], 't': data['t'], 'u': data['u'], 'rf': printquad(data['rf'], p), 'hw': data['hw'], 'slopes': show_slopes(data['slopes']), 'gal': group_display_knowl(gn, gt, C), 'gt': gt, 'inertia': group_display_inertia(data['inertia'], C), 'unram': web_latex(unramp), 'eisen': web_latex(eisenp), 'gms': data['gms'], 'aut': data['aut'], }) friends = [('Galois group', "/GaloisGroup/%dT%d" % (gn, gt))] if unramfriend != '': friends.append(('Unramified subfield', unramfriend)) if rffriend != '': friends.append(('Discriminant root field', rffriend)) bread = get_bread([(label, ' ')]) learnmore = [('Completeness of the data', url_for(".completeness_page")), ('Source of the data', url_for(".how_computed_page")), ('Local field labels', url_for(".labels_page"))] return render_template("lf-show-field.html", credit=LF_credit, title=title, bread=bread, info=info, properties2=prop2, friends=friends, learnmore=learnmore)
def poly(self, var="x"): return coeff_to_poly(self._data['coeffs'], var=var)
def test_coeff_to_poly(self): r""" Checking utility: coeff_to_poly """ x = var('x') self.assertEqual(coeff_to_poly("1 - 3x + x^2"), x**2 - 3*x + 1)
def coeff_to_nf(c): return NumberField(coeff_to_poly(c), 'a')
def display_poly(coeffs): return web_latex(coeff_to_poly(coeffs))
def poly(self): return coeff_to_poly(self._data['coeffs'])
def format_coeffs(coeffs): return pol_to_html(str(coeff_to_poly(coeffs)))
def web_poly(self): return pol_to_html(str(coeff_to_poly(self.coeffs())))
def poly(self): return coeff_to_poly(self._data['coeffs'])
def make_torsion_growth(self): try: tor_gro = self.tor_gro except AttributeError: # for curves with norsion growth data tor_gro = None if tor_gro is None: self.torsion_growth_data_exists = False return self.torsion_growth_data_exists = True self.tg = tg = {} tg['data'] = tgextra = [] # find all base-changes of this curve in the database, if any bcs = list( db.ec_nfcurves.search( {'base_change': { '$contains': [self.lmfdb_label] }}, projection='label')) bcfs = [lab.split("-")[0] for lab in bcs] for F, T in tor_gro.items(): tg1 = {} tg1['bc'] = "Not in database" # mongo did not allow "." in a dict key so we changed (e.g.) '3.1.44.1' to '3:1:44:1' # Here we change it back (but this code also works in case the fields already use ".") F = F.replace(":", ".") if "." in F: field_data = nf_display_knowl(F, field_pretty(F)) deg = int(F.split(".")[0]) bcc = [x for x, y in zip(bcs, bcfs) if y == F] if bcc: from lmfdb.ecnf.main import split_full_label F, NN, I, C = split_full_label(bcc[0]) tg1['bc'] = bcc[0] tg1['bc_url'] = url_for('ecnf.show_ecnf', nf=F, conductor_label=NN, class_label=I, number=C) else: field_data = web_latex(coeff_to_poly(string2list(F))) deg = F.count(",") tg1['d'] = deg tg1['f'] = field_data tg1['t'] = r'\(' + r' \times '.join( [r'\Z/{}\Z'.format(n) for n in T.split(",")]) + r'\)' tg1['m'] = 0 tgextra.append(tg1) tgextra.sort(key=lambda x: x['d']) tg['n'] = len(tgextra) lastd = 1 for tg1 in tgextra: d = tg1['d'] if d != lastd: tg1['m'] = len([x for x in tgextra if x['d'] == d]) lastd = d ## Hard-code this for now. While something like ## max(db.ec_curves.search({},projection='tor_degs')) might ## work, since 'tor_degs' is in the extra table it is very ## slow. Note that the *only* place where this number is used ## is in the ec-curve template where it says "The number ## fields ... of degree up to {{data.tg.maxd}} such that...". tg['maxd'] = 7
def web_poly(self): return pol_to_html(str(coeff_to_poly(self.coeffs())))
def render_field_webpage(args): data = None info = {} if "label" in args: label = clean_input(args["label"]) C = base.getDBConnection() data = C.localfields.fields.find_one({"label": label}) if data is None: bread = get_bread([("Search error", " ")]) info["err"] = "Field " + label + " was not found in the database." info["label"] = label return search_input_error(info, bread) title = "Local Number Field " + label polynomial = coeff_to_poly(data["coeffs"]) p = data["p"] e = data["e"] f = data["f"] cc = data["c"] GG = data["gal"] gn = GG[0] gt = GG[1] prop2 = [ ("Label", label), ("Base", "\(\Q_{%s}\)" % p), ("Degree", "\(%s\)" % data["n"]), ("e", "\(%s\)" % e), ("f", "\(%s\)" % f), ("c", "\(%s\)" % cc), ("Galois group", group_display_short(gn, gt, C)), ] Pt = PolynomialRing(QQ, "t") Pyt = PolynomialRing(Pt, "y") eisenp = Pyt(str(data["eisen"])) unramp = Pyt(str(data["unram"])) # Look up the unram poly so we can link to it unramdata = C.localfields.fields.find_one({"p": p, "n": f, "c": 0}) if len(unramdata) > 0: unramfriend = "/LocalNumberField/%s" % unramdata["label"] else: logger.fatal("Cannot find unramified field!") unramfriend = "" rfdata = C.localfields.fields.find_one({"p": p, "n": {"$in": [1, 2]}, "rf": data["rf"]}) if rfdata is None: logger.fatal("Cannot find discriminant root field!") rffriend = "" else: rffriend = "/LocalNumberField/%s" % rfdata["label"] info.update( { "polynomial": web_latex(polynomial), "n": data["n"], "p": data["p"], "c": data["c"], "e": data["e"], "f": data["f"], "t": data["t"], "u": data["u"], "rf": printquad(data["rf"], p), "hw": data["hw"], "slopes": show_slopes(data["slopes"]), "gal": group_display_knowl(gn, gt, C), "gt": gt, "inertia": group_display_inertia(data["inertia"], C), "unram": web_latex(unramp), "eisen": web_latex(eisenp), "gms": data["gms"], "aut": data["aut"], } ) friends = [("Galois group", "/GaloisGroup/%dT%d" % (gn, gt))] if unramfriend != "": friends.append(("Unramified subfield", unramfriend)) if rffriend != "": friends.append(("Discriminant root field", rffriend)) bread = get_bread([(label, " ")]) learnmore = [ ("Completeness of the data", url_for(".completeness_page")), ("Source of the data", url_for(".how_computed_page")), ("Local field labels", url_for(".labels_page")), ] return render_template( "lf-show-field.html", credit=LF_credit, title=title, bread=bread, info=info, properties2=prop2, friends=friends, learnmore=learnmore, )