def check_ideal_labels(field_label='2.2.5.1', min_norm=0, max_norm=None, fix=False, verbose=False): r""" Go through all curves with the given field label, assumed totally real, check whether the ideal label agrees with the level_label of the associated Hilbert Modular Form. """ hmfs = conn.hmfs forms = hmfs.forms fields = hmfs.fields query = {} query['field_label'] = field_label query['conductor_norm'] = {'$gte': int(min_norm)} if max_norm: query['conductor_norm']['$lte'] = int(max_norm) else: max_norm = 'infinity' cursor = nfcurves.find(query) nfound = 0 nnotfound = 0 K = HilbertNumberField(field_label) # NB We used to have 20 in the next line but that is insufficient # to distinguish the a_p for forms 2.2.12.1-150.1-a and # 2.2.12.1-150.1-b ! primes = [P['ideal'] for P in K.primes_iter(30)] remap = {} # remap[old_label] = new_label for ec in cursor: fix_needed = False cond_label = ec['conductor_label'] if cond_label in remap: new_cond_label = remap[cond_label] fix_needed = (cond_label != new_cond_label) if not fix_needed: if verbose: print("conductor label %s ok" % cond_label) else: conductor = make_conductor(ec, K) level = K.ideal(cond_label) new_cond_label = K.ideal_label(conductor) remap[cond_label] = new_cond_label fix_needed = (cond_label != new_cond_label) if fix_needed: print("conductor label for curve %s is wrong, should be %s not %s" % (ec['label'], new_cond_label, cond_label)) if fix: iso = ec['iso_label'] num = str(ec['number']) newlabeldata = {} newlabeldata['conductor_label'] = new_cond_label newlabeldata['short_class_label'] = '-'.join([new_cond_label, iso]) newlabeldata['short_label'] = ''.join([newlabeldata['short_class_label'], num]) newlabeldata['class_label'] = '-'.join([field_label, newlabeldata['short_class_label']]) newlabeldata['label'] = '-'.join([field_label, newlabeldata['short_label']]) nfcurves.update({'_id': ec['_id']}, {"$set": newlabeldata}, upsert=True) else: if verbose: print("conductor label %s ok" % cond_label) return dict([(k, remap[k]) for k in remap if not k == remap[k]])
def check_ideal_labels(field_label='2.2.5.1', min_norm=0, max_norm=None, fix=False, verbose=False): r""" Go through all curves with the given field label, assumed totally real, check whether the ideal label agrees with the level_label of the associated Hilbert Modular Form. """ hmfs = conn.hmfs forms = hmfs.forms fields = hmfs.fields query = {} query['field_label'] = field_label query['conductor_norm'] = {'$gte' : int(min_norm)} if max_norm: query['conductor_norm']['$lte'] = int(max_norm) else: max_norm = 'infinity' cursor = nfcurves.find(query) nfound = 0 nnotfound = 0 K = HilbertNumberField(field_label) # NB We used to have 20 in the next line but that is insufficient # to distinguish the a_p for forms 2.2.12.1-150.1-a and # 2.2.12.1-150.1-b ! primes = [P['ideal'] for P in K.primes_iter(30)] remap = {} # remap[old_label] = new_label for ec in cursor: fix_needed = False cond_label = ec['conductor_label'] if cond_label in remap: new_cond_label = remap[cond_label] fix_needed=(cond_label!=new_cond_label) if not fix_needed: if verbose: print("conductor label %s ok" % cond_label) else: conductor = make_conductor(ec,K) level = K.ideal(cond_label) new_cond_label = K.ideal_label(conductor) remap[cond_label] = new_cond_label fix_needed=(cond_label!=new_cond_label) if fix_needed: print("conductor label for curve %s is wrong, should be %s not %s" % (ec['label'],new_cond_label, cond_label)) if fix: iso = ec['iso_label'] num = str(ec['number']) newlabeldata = {} newlabeldata['conductor_label'] = new_cond_label newlabeldata['short_class_label'] = '-'.join([new_cond_label,iso]) newlabeldata['short_label'] = ''.join([newlabeldata['short_class_label'],num]) newlabeldata['class_label'] = '-'.join([field_label, newlabeldata['short_class_label']]) newlabeldata['label'] = '-'.join([field_label, newlabeldata['short_label']]) nfcurves.update({'_id': ec['_id']}, {"$set": newlabeldata}, upsert=True) else: if verbose: print("conductor label %s ok" % cond_label) return dict([(k,remap[k]) for k in remap if not k==remap[k]])
def checkprimes(label): Fdata = get_Fdata(label) gen_name = findvar(Fdata['ideals']) WebF = get_WNF(label, gen_name) F = WebF.K() ideals = niceideals(F, Fdata['ideals']) primes = niceideals(F, Fdata['primes']) F = HilbertNumberField(label) L = [] for prhnf, prideal, prlabel in primes: ideal = F.ideal(prlabel) if ideal != prideal: L.append(prlabel) return L
def checkprimes(label): Fdata = get_Fdata(label) gen_name = findvar(Fdata['ideals']) WebF = get_WNF(label, gen_name) F = WebF.K() # ideals = niceideals(F, Fdata['ideals']) # never used primes = niceideals(F, Fdata['primes']) F = HilbertNumberField(label) L = [] for prhnf,prideal,prlabel in primes: ideal = F.ideal(prlabel) if ideal != prideal: L.append(prlabel) return L
def export_magma_output(infilename, outfilename=None, verbose=False): r""" Convert Magma search output to a curves file. INPUT: - ``infilename`` (string) -- name of file containing Magma output - ``outfilename`` (string, default ``None``) -- name of output file - ``verbose`` (boolean, default ``False``) -- verbosity flag. """ if outfilename: outfile = file(outfilename, mode="w") def output(L): if outfilename: outfile.write(L) if verbose: sys.stdout.write(L) K = None for field_label, cond_label, iso_label, num, cond_ideal, ai in magma_output_iter( infilename): ec = {} ec['field_label'] = field_label if not K: K = HilbertNumberField(field_label) ec['conductor_label'] = cond_label ec['iso_label'] = iso_label ec['number'] = num N = K.ideal(cond_label) norm = N.norm() hnf = N.pari_hnf() ec['conductor_ideal'] = cond_ideal ec['conductor_ideal'] = "[%i,%s,%s]" % (norm, hnf[1][0], hnf[1][1]) ec['conductor_norm'] = norm ec['ainvs'] = [[str(c) for c in list(a)] for a in ai] ec['cm'] = '?' ec['base_change'] = [] output(make_curves_line(ec) + "\n")
def export_magma_output(infilename, outfilename=None, verbose=False): r""" Convert Magma search output to a curves file. INPUT: - ``infilename`` (string) -- name of file containing Magma output - ``outfilename`` (string, default ``None``) -- name of output file - ``verbose`` (boolean, default ``False``) -- verbosity flag. """ if outfilename: outfile = file(outfilename, mode="w") def output(L): if outfilename: outfile.write(L) if verbose: sys.stdout.write(L) K = None for field_label, cond_label, iso_label, num, cond_ideal, ai in magma_output_iter(infilename): ec = {} ec['field_label'] = field_label if not K: K = HilbertNumberField(field_label) ec['conductor_label'] = cond_label ec['iso_label'] = iso_label ec['number'] = num N = K.ideal(cond_label) norm = N.norm() hnf = N.pari_hnf() ec['conductor_ideal'] = cond_ideal ec['conductor_ideal'] = "[%i,%s,%s]" % (norm, hnf[1][0], hnf[1][1]) ec['conductor_norm'] = norm ec['ainvs'] = [[str(c) for c in list(a)] for a in ai] ec['cm'] = '?' ec['base_change'] = [] output(make_curves_line(ec) + "\n")
def find_curves(field_label='2.2.5.1', min_norm=0, max_norm=None, label=None, outfilename=None, verbose=False, effort=500): r""" Go through all Hilbert Modular Forms with the given field label, assumed totally real, for level norms in the given range, test whether an elliptic curve exists with the same label; if not, find the curves using Magma; output these to a file. """ print("Checking forms over {}, norms from {} to {}".format(field_label,min_norm,max_norm)) if outfilename: print("Output of curves found to {}".format(outfilename)) else: print("No curve search or output, just checking") query = {} query['field_label'] = field_label if fields.find({'label': field_label}).count() == 0: if verbose: print("No HMF data for field %s" % field_label) return None query['dimension'] = 1 # only look at rational newforms if label: print("looking for {} only".format(label)) query['short_label'] = label # e.g. '91.1-a' else: query['level_norm'] = {'$gte': int(min_norm)} if max_norm: query['level_norm']['$lte'] = int(max_norm) cursor = forms.find(query) cursor.sort([('level_norm', pymongo.ASCENDING)]) labels = [f['label'] for f in cursor] nfound = 0 nnotfound = 0 nok = 0 missing_curves = [] K = HilbertNumberField(field_label) primes = [P['ideal'] for P in K.primes_iter(1000)] curve_ap = {} # curve_ap[conductor_label] will be a dict iso -> ap form_ap = {} # form_ap[conductor_label] will be a dict iso -> ap # Step 1: look at all newforms, check that there is an elliptic # curve of the same label, and if so compare ap-lists. The # dicts curve_ap and form_ap store these when there is # disagreement: e.g. curve_ap[conductor_label][iso_label] = # aplist. for curve_label in labels: # We find the forms again since otherwise the cursor might timeout during the loop. f = forms.find_one({'label': curve_label}) ec = nfcurves.find_one({'field_label': field_label, 'class_label': curve_label, 'number': 1}) if ec: if verbose: print("curve with label %s found in the database" % curve_label) nfound += 1 ainvsK = parse_ainvs(K.K(), ec['ainvs']) E = EllipticCurve(ainvsK) good_flags = [E.has_good_reduction(P) for P in primes] good_primes = [P for (P, flag) in zip(primes, good_flags) if flag] aplist = [E.reduction(P).trace_of_frobenius() for P in good_primes] f_aplist = [int(a) for a in f['hecke_eigenvalues']] f_aplist = [ap for ap, flag in zip(f_aplist, good_flags) if flag] nap = min(len(aplist), len(f_aplist)) if aplist[:nap] == f_aplist[:nap]: nok += 1 if verbose: print("Curve {} and newform agree! (checked {} ap)".format(ec['short_label'],nap)) else: print("Curve {} does NOT agree with newform".format(ec['short_label'])) if verbose: for P,aPf,aPc in zip(good_primes[:nap], f_aplist[:nap], aplist[:nap]): if aPf!=aPc: print("P = {} with norm {}".format(P,P.norm().factor())) print("ap from curve: %s" % aPc) print("ap from form: %s" % aPf) if not ec['conductor_label'] in curve_ap: curve_ap[ec['conductor_label']] = {} form_ap[ec['conductor_label']] = {} curve_ap[ec['conductor_label']][ec['iso_label']] = aplist form_ap[ec['conductor_label']][f['label_suffix']] = f_aplist else: if verbose: print("No curve with label %s found in the database!" % curve_label) missing_curves.append(f['short_label']) nnotfound += 1 # Report progress: n = nfound + nnotfound if nnotfound: print("Out of %s newforms, %s curves were found in the database and %s were not found" % (n, nfound, nnotfound)) else: print("Out of %s newforms, all %s had curves with the same label and ap" % (n, nfound)) if nfound == nok: print("All curves agree with matching newforms") else: print("%s curves agree with matching newforms, %s do not" % (nok, nfound - nok)) if nnotfound: print("%s missing curves" % len(missing_curves)) else: return # Step 2: for each newform for which there was no curve, call interface to Magma's EllipticCurveSearch() # (unless outfilename is None in which case just dump the missing labels to a file) if outfilename: outfile = file(outfilename, mode="w") else: t = file("curves_missing.{}".format(field_label), mode="w") for c in missing_curves: t.write(c) t.write("\n") t.close() return def output(L): if outfilename: outfile.write(L) if verbose: sys.stdout.write(L) bad_p = [] #if field_label=='4.4.1600.1': bad_p = [7**2,13**2,29**2] if field_label=='4.4.2304.1': bad_p = [19**2,29**2] if field_label=='4.4.4225.1': bad_p = [17**2,23**2] if field_label=='4.4.7056.1': bad_p = [29**2,31**2] if field_label=='4.4.7168.1': bad_p = [29**2] if field_label=='4.4.9248.1': bad_p = [23**2] if field_label=='4.4.11025.1': bad_p = [17**2,37**2,43**2] if field_label=='4.4.13824.1': bad_p = [19**2] if field_label=='4.4.12400.1': bad_p = [23**2] if field_label=='4.4.180769.1': bad_p = [23**2] if field_label=='6.6.905177.1': bad_p = [2**3] bad_p = [] effort0 = effort for nf_label in missing_curves: if verbose: print("Curve %s is missing from the database..." % nf_label) form = forms.find_one({'field_label': field_label, 'short_label': nf_label}) if not form: print("... form %s not found!" % nf_label) else: if verbose: print("... found form, calling Magma search") print("Conductor = %s" % form['level_ideal'].replace(" ","")) N = K.ideal(form['level_label']) neigs = len(form['hecke_eigenvalues']) Plist = [P['ideal'] for P in K.primes_iter(neigs)] goodP = [(i, P) for i, P in enumerate(Plist) if not P.divides(N) and not P.norm() in bad_p and P.residue_class_degree()==1] aplist = [int(form['hecke_eigenvalues'][i]) for i, P in goodP] Plist = [P for i,P in goodP] nap = len(Plist) neigs0 = min(nap,100) effort=effort0 if verbose: print("Using %s ap from Hilbert newform and effort %s" % (neigs0,effort)) if bad_p: print("( excluding primes with norms {})".format(bad_p)) #inds = list(set([randint(0,nap-1) for _ in range(neigs0)])) inds = range(neigs0) Plist0 = [Plist[i] for i in inds] aplist0 = [aplist[i] for i in inds] curves = EllipticCurveSearch(K.K(), Plist0, N, aplist0, effort) # rep = 0 allrep=0 while not curves and allrep<10: allrep += 1 effort*=2 # if rep<2: # rep += 1 # else: # rep = 1 # effort *=2 if verbose: print("No curves found by Magma, trying again with effort %s..." % effort) curves = EllipticCurveSearch(K.K(), Plist0, N, aplist0, effort) if verbose: if curves: print("Success!") else: print("Still no success") E = None if curves: E = curves[0] print("%s curves for %s found, first is %s" % (len(curves),nf_label,E.ainvs())) else: print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") print("!!! No curves for %s found (using %s ap) !!!" % (nf_label,len(aplist))) print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") if E!=None: ec = {} ec['field_label'] = field_label ec['conductor_label'] = form['level_label'] ec['iso_label'] = form['label_suffix'] ec['number'] = int(1) ec['conductor_ideal'] = form['level_ideal'].replace(" ","") ec['conductor_norm'] = form['level_norm'] ai = E.ainvs() ec['ainvs'] = ";".join([",".join([str(c) for c in list(a)]) for a in ai]) #print ec['ainvs'] ec['cm'] = '?' ec['base_change'] = [] output(make_curves_line(ec) + "\n") if outfilename: outfile.flush()
def find_curves(field_label='2.2.5.1', min_norm=0, max_norm=None, label=None, outfilename=None, verbose=False, effort=500): r""" Go through all Hilbert Modular Forms with the given field label, assumed totally real, for level norms in the given range, test whether an elliptic curve exists with the same label; if not, find the curves using Magma; output these to a file. """ print("Checking forms over {}, norms from {} to {}".format( field_label, min_norm, max_norm)) if outfilename: print("Output of curves found to {}".format(outfilename)) else: print("No curve search or output, just checking") query = {} query['field_label'] = field_label if fields.find({'label': field_label}).count() == 0: if verbose: print("No HMF data for field %s" % field_label) return None query['dimension'] = 1 # only look at rational newforms if label: print("looking for {} only".format(label)) query['short_label'] = label # e.g. '91.1-a' else: query['level_norm'] = {'$gte': int(min_norm)} if max_norm: query['level_norm']['$lte'] = int(max_norm) cursor = forms.find(query) cursor.sort([('level_norm', pymongo.ASCENDING)]) labels = [f['label'] for f in cursor] nfound = 0 nnotfound = 0 nok = 0 missing_curves = [] K = HilbertNumberField(field_label) primes = [P['ideal'] for P in K.primes_iter(1000)] curve_ap = {} # curve_ap[conductor_label] will be a dict iso -> ap form_ap = {} # form_ap[conductor_label] will be a dict iso -> ap # Step 1: look at all newforms, check that there is an elliptic # curve of the same label, and if so compare ap-lists. The # dicts curve_ap and form_ap store these when there is # disagreement: e.g. curve_ap[conductor_label][iso_label] = # aplist. for curve_label in labels: # We find the forms again since otherwise the cursor might timeout during the loop. f = forms.find_one({'label': curve_label}) ec = nfcurves.find_one({ 'field_label': field_label, 'class_label': curve_label, 'number': 1 }) if ec: if verbose: print("curve with label %s found in the database" % curve_label) nfound += 1 ainvsK = parse_ainvs(K.K(), ec['ainvs']) E = EllipticCurve(ainvsK) good_flags = [E.has_good_reduction(P) for P in primes] good_primes = [P for (P, flag) in zip(primes, good_flags) if flag] aplist = [E.reduction(P).trace_of_frobenius() for P in good_primes] f_aplist = [int(a) for a in f['hecke_eigenvalues']] f_aplist = [ap for ap, flag in zip(f_aplist, good_flags) if flag] nap = min(len(aplist), len(f_aplist)) if aplist[:nap] == f_aplist[:nap]: nok += 1 if verbose: print("Curve {} and newform agree! (checked {} ap)".format( ec['short_label'], nap)) else: print("Curve {} does NOT agree with newform".format( ec['short_label'])) if verbose: for P, aPf, aPc in zip(good_primes[:nap], f_aplist[:nap], aplist[:nap]): if aPf != aPc: print("P = {} with norm {}".format( P, P.norm().factor())) print("ap from curve: %s" % aPc) print("ap from form: %s" % aPf) if not ec['conductor_label'] in curve_ap: curve_ap[ec['conductor_label']] = {} form_ap[ec['conductor_label']] = {} curve_ap[ec['conductor_label']][ec['iso_label']] = aplist form_ap[ec['conductor_label']][f['label_suffix']] = f_aplist else: if verbose: print("No curve with label %s found in the database!" % curve_label) missing_curves.append(f['short_label']) nnotfound += 1 # Report progress: n = nfound + nnotfound if nnotfound: print( "Out of %s newforms, %s curves were found in the database and %s were not found" % (n, nfound, nnotfound)) else: print( "Out of %s newforms, all %s had curves with the same label and ap" % (n, nfound)) if nfound == nok: print("All curves agree with matching newforms") else: print("%s curves agree with matching newforms, %s do not" % (nok, nfound - nok)) if nnotfound: print("%s missing curves" % len(missing_curves)) else: return # Step 2: for each newform for which there was no curve, call interface to Magma's EllipticCurveSearch() # (unless outfilename is None in which case just dump the missing labels to a file) if outfilename: outfile = file(outfilename, mode="w") else: t = file("curves_missing.{}".format(field_label), mode="w") for c in missing_curves: t.write(c) t.write("\n") t.close() return def output(L): if outfilename: outfile.write(L) if verbose: sys.stdout.write(L) bad_p = [] #if field_label=='4.4.1600.1': bad_p = [7**2,13**2,29**2] if field_label == '4.4.2304.1': bad_p = [19**2, 29**2] if field_label == '4.4.4225.1': bad_p = [17**2, 23**2] if field_label == '4.4.7056.1': bad_p = [29**2, 31**2] if field_label == '4.4.7168.1': bad_p = [29**2] if field_label == '4.4.9248.1': bad_p = [23**2] if field_label == '4.4.11025.1': bad_p = [17**2, 37**2, 43**2] if field_label == '4.4.13824.1': bad_p = [19**2] if field_label == '4.4.12400.1': bad_p = [23**2] if field_label == '4.4.180769.1': bad_p = [23**2] if field_label == '6.6.905177.1': bad_p = [2**3] bad_p = [] effort0 = effort for nf_label in missing_curves: if verbose: print("Curve %s is missing from the database..." % nf_label) form = forms.find_one({ 'field_label': field_label, 'short_label': nf_label }) if not form: print("... form %s not found!" % nf_label) else: if verbose: print("... found form, calling Magma search") print("Conductor = %s" % form['level_ideal'].replace(" ", "")) N = K.ideal(form['level_label']) neigs = len(form['hecke_eigenvalues']) Plist = [P['ideal'] for P in K.primes_iter(neigs)] goodP = [(i, P) for i, P in enumerate(Plist) if not P.divides(N) and not P.norm() in bad_p and P.residue_class_degree() == 1] aplist = [int(form['hecke_eigenvalues'][i]) for i, P in goodP] Plist = [P for i, P in goodP] nap = len(Plist) neigs0 = min(nap, 100) effort = effort0 if verbose: print("Using %s ap from Hilbert newform and effort %s" % (neigs0, effort)) if bad_p: print("( excluding primes with norms {})".format(bad_p)) #inds = list(set([randint(0,nap-1) for _ in range(neigs0)])) inds = range(neigs0) Plist0 = [Plist[i] for i in inds] aplist0 = [aplist[i] for i in inds] curves = EllipticCurveSearch(K.K(), Plist0, N, aplist0, effort) # rep = 0 allrep = 0 while not curves and allrep < 10: allrep += 1 effort *= 2 # if rep<2: # rep += 1 # else: # rep = 1 # effort *=2 if verbose: print( "No curves found by Magma, trying again with effort %s..." % effort) curves = EllipticCurveSearch(K.K(), Plist0, N, aplist0, effort) if verbose: if curves: print("Success!") else: print("Still no success") E = None if curves: E = curves[0] print("%s curves for %s found, first is %s" % (len(curves), nf_label, E.ainvs())) else: print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") print("!!! No curves for %s found (using %s ap) !!!" % (nf_label, len(aplist))) print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") if E != None: ec = {} ec['field_label'] = field_label ec['conductor_label'] = form['level_label'] ec['iso_label'] = form['label_suffix'] ec['number'] = int(1) ec['conductor_ideal'] = form['level_ideal'].replace(" ", "") ec['conductor_norm'] = form['level_norm'] ai = E.ainvs() ec['ainvs'] = ";".join( [",".join([str(c) for c in list(a)]) for a in ai]) #print ec['ainvs'] ec['cm'] = '?' ec['base_change'] = [] output(make_curves_line(ec) + "\n") if outfilename: outfile.flush()
def find_curves(field_label='2.2.5.1', min_norm=0, max_norm=None, outfilename=None, verbose=False): r""" Go through all Hilbert Modular Forms with the given field label, assumed totally real, for level norms in the given range, test whether an elliptic curve exists with the same label; if not, find the curves using Magma; output these to a file. """ query = {} query['field_label'] = field_label if fields.find({'label': field_label}).count() == 0: if verbose: print("No HMF data for field %s" % field_label) return None query['dimension'] = 1 # only look at rational newforms query['level_norm'] = {'$gte': int(min_norm)} if max_norm: query['level_norm']['$lte'] = int(max_norm) else: max_norm = 'infinity' cursor = forms.find(query) cursor.sort([('level_norm', pymongo.ASCENDING)]) labels = [f['label'] for f in cursor] nfound = 0 nnotfound = 0 nok = 0 missing_curves = [] K = HilbertNumberField(field_label) primes = [P['ideal'] for P in K.primes_iter(100)] curve_ap = {} # curve_ap[conductor_label] will be a dict iso -> ap form_ap = {} # form_ap[conductor_label] will be a dict iso -> ap # Step 1: look at all newforms, check that there is an elliptic # curve of the same label, and if so compare ap-lists. The # dicts curve_ap and form_ap store these when there is # disagreement: e.g. curve_ap[conductor_label][iso_label] = # aplist. for curve_label in labels: # We find the forms again since otherwise the cursor might timeout during the loop. f = forms.find_one({'label': curve_label}) ec = nfcurves.find_one({'field_label': field_label, 'class_label': curve_label, 'number': 1}) if ec: if verbose: print("curve with label %s found in the database" % curve_label) nfound += 1 ainvsK = [K.K()([QQ(str(c)) for c in ai]) for ai in ec['ainvs']] E = EllipticCurve(ainvsK) good_flags = [E.has_good_reduction(P) for P in primes] good_primes = [P for (P, flag) in zip(primes, good_flags) if flag] aplist = [E.reduction(P).trace_of_frobenius() for P in good_primes[:30]] f_aplist = [int(a) for a in f['hecke_eigenvalues'][:40]] f_aplist = [ap for ap, flag in zip(f_aplist, good_flags) if flag][:30] if aplist == f_aplist: nok += 1 if verbose: print("Curve %s and newform agree!" % ec['short_label']) else: print("Curve %s does NOT agree with newform" % ec['short_label']) if verbose: print("ap from curve: %s" % aplist) print("ap from form: %s" % f_aplist) if not ec['conductor_label'] in curve_ap: curve_ap[ec['conductor_label']] = {} form_ap[ec['conductor_label']] = {} curve_ap[ec['conductor_label']][ec['iso_label']] = aplist form_ap[ec['conductor_label']][f['label_suffix']] = f_aplist else: if verbose: print("No curve with label %s found in the database!" % curve_label) missing_curves.append(f['short_label']) nnotfound += 1 # Report progress: n = nfound + nnotfound if nnotfound: print("Out of %s newforms, %s curves were found in the database and %s were not found" % (n, nfound, nnotfound)) else: print("Out of %s newforms, all %s had curves with the same label and ap" % (n, nfound)) if nfound == nok: print("All curves agree with matching newforms") else: print("%s curves agree with matching newforms, %s do not" % (nok, nfound - nok)) if nnotfound: print("%s missing curves" % len(missing_curves)) else: return # Step 2: for each newform for which there was no curve, call interface to Magma's EllipticCurveSearch() if outfilename: outfile = file(outfilename, mode="w") def output(L): if outfilename: outfile.write(L) if verbose: sys.stdout.write(L) for nf_label in missing_curves: if verbose: print("Curve %s is missing from the database..." % nf_label) form = forms.find_one({'field_label': field_label, 'short_label': nf_label}) if not form: print("... form %s not found!" % nf_label) else: if verbose: print("... found form, calling Magma search") N = K.ideal(form['level_label']) neigs = len(form['hecke_eigenvalues']) if verbose: print("Using %s ap from Hilbert newform" % neigs) Plist = [P['ideal'] for P in K.primes_iter(neigs)] goodP = [(i, P) for i, P in enumerate(Plist) if not P.divides(N)] aplist = [int(form['hecke_eigenvalues'][i]) for i, P in goodP] curves = EllipticCurveSearch(K.K(), Plist, N, aplist) if not curves: if verbose: print("No curves found by Magma, trying again...") curves = EllipticCurveSearch(K.K(), Plist, N, aplist) if verbose: if curves: print("Success!") else: print("Still no success, giving up") #curves = EllipticCurveSearch(K.K(), [], N, []) E = None if curves: E = curves[0] print("%s curves for %s found, first is %s" % (len(curves),nf_label,E.ainvs())) else: print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") print("!!! No curves for %s found (using %s ap) !!!" % (nf_label,len(aplist))) print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!") if E!=None: ec = {} ec['field_label'] = field_label ec['conductor_label'] = form['level_label'] ec['iso_label'] = form['label_suffix'] ec['number'] = int(1) ec['conductor_ideal'] = form['level_ideal'].replace(" ","") ec['conductor_norm'] = form['level_norm'] ai = E.ainvs() ec['ainvs'] = [[str(c) for c in list(a)] for a in ai] ec['cm'] = '?' ec['base_change'] = [] output(make_curves_line(ec) + "\n") if outfilename: outfile.flush()
def find_curves(field_label='2.2.5.1', min_norm=0, max_norm=None, outfilename=None, verbose=False): r""" Go through all Hilbert Modular Forms with the given field label, assumed totally real, for level norms in the given range, test whether an elliptic curve exists with the same label; if not, find the curves using Magma; output these to a file. """ query = {} query['field_label'] = field_label if fields.find({'label': field_label}).count() == 0: if verbose: print("No HMF data for field %s" % field_label) return None query['dimension'] = 1 # only look at rational newforms query['level_norm'] = {'$gte': int(min_norm)} if max_norm: query['level_norm']['$lte'] = int(max_norm) else: max_norm = 'infinity' cursor = forms.find(query) nfound = 0 nnotfound = 0 nok = 0 missing_curves = [] K = HilbertNumberField(field_label) primes = [P['ideal'] for P in K.primes_iter(100)] curve_ap = {} # curve_ap[conductor_label] will be a dict iso -> ap form_ap = {} # form_ap[conductor_label] will be a dict iso -> ap # Step 1: look at all newforms, check that there is an elliptic # curve of the same label, and if so compare ap-lists. The # dicts curve_ap and form_ap store these when there is # disagreement: e.g. curve_ap[conductor_label][iso_label] = # aplist. for f in cursor: curve_label = f['label'] ec = nfcurves.find_one({ 'field_label': field_label, 'class_label': curve_label, 'number': 1 }) if ec: if verbose: print("curve with label %s found in the database" % curve_label) nfound += 1 ainvsK = [K.K()([QQ(str(c)) for c in ai]) for ai in ec['ainvs']] E = EllipticCurve(ainvsK) good_flags = [E.has_good_reduction(P) for P in primes] good_primes = [P for (P, flag) in zip(primes, good_flags) if flag] aplist = [ E.reduction(P).trace_of_frobenius() for P in good_primes[:30] ] f_aplist = [int(a) for a in f['hecke_eigenvalues'][:40]] f_aplist = [ap for ap, flag in zip(f_aplist, good_flags) if flag][:30] if aplist == f_aplist: nok += 1 if verbose: print("Curve %s and newform agree!" % ec['short_label']) else: print("Curve %s does NOT agree with newform" % ec['short_label']) if verbose: print("ap from curve: %s" % aplist) print("ap from form: %s" % f_aplist) if not ec['conductor_label'] in curve_ap: curve_ap[ec['conductor_label']] = {} form_ap[ec['conductor_label']] = {} curve_ap[ec['conductor_label']][ec['iso_label']] = aplist form_ap[ec['conductor_label']][f['label_suffix']] = f_aplist else: if verbose: print("No curve with label %s found in the database!" % curve_label) missing_curves.append(f['short_label']) nnotfound += 1 # Report progress: n = nfound + nnotfound if nnotfound: print( "Out of %s newforms, %s curves were found in the database and %s were not found" % (n, nfound, nnotfound)) else: print( "Out of %s newforms, all %s had curves with the same label and ap" % (n, nfound)) if nfound == nok: print("All curves agree with matching newforms") else: print("%s curves agree with matching newforms, %s do not" % (nok, nfound - nok)) if nnotfound: print("Missing curves: %s" % missing_curves) else: return # Step 2: for each newform for which there was no curve, call interface to Magma's EllipticCurveSearch() if outfilename: outfile = file(outfilename, mode="w") def output(L): if outfilename: outfile.write(L) if verbose: sys.stdout.write(L) for nf_label in missing_curves: if verbose: print("Curve %s is missing from the database..." % nf_label) form = forms.find_one({ 'field_label': field_label, 'short_label': nf_label }) if not form: print("... form %s not found!" % nf_label) else: if verbose: print("... found form, calling Magma search") N = K.ideal(form['level_label']) Plist = [P['ideal'] for P in K.primes_iter(30)] goodP = [(i, P) for i, P in enumerate(Plist) if not P.divides(N)] label = form['short_label'] aplist = [int(form['hecke_eigenvalues'][i]) for i, P in goodP] curves = EllipticCurveSearch(K.K(), Plist, N, aplist[:5]) #curves = EllipticCurveSearch(K.K(), [], N, []) if curves: E = curves[0] print("%s curves found by Magma, first is %s" % (len(curves), E)) else: print("No curves found by Magma (using %s ap)" % len(aplist)) ec = {} ec['field_label'] = field_label ec['conductor_label'] = form['level_label'] ec['iso_label'] = form['label_suffix'] ec['number'] = int(1) ec['conductor_ideal'] = form['level_ideal'].replace(" ", "") ec['conductor_norm'] = form['level_norm'] ai = E.ainvs() ec['ainvs'] = [[str(c) for c in list(a)] for a in ai] ec['cm'] = '?' ec['base_change'] = [] output(make_curves_line(ec) + "\n")