def spread(N): l = range(1, N + 1) max_c = count_c(l) min_c = prime_pi(N) if N == 1: min_c = 1 return max_c - min_c
def make_one_euler_factor_db(E, p): r""" Returns the Euler factor at p from a database elliptic curve E. """ ld = [ld for ld in E['local_data'] if ld['p']==p] if ld: # p is bad, we get ap from the stored local data: ap = ld[0]['red'] if ap: return [1,-ap] else: return [1] # Now p is good and < 100 so we retrieve ap from the stored aplist: ap = E['aplist'][prime_pi(p)-1] # rebase count from 1 to 0 return [1,-ap,int(p)]
def lfuncEPhtml(L,fmt): """ Euler product as a formula and a table of local factors. """ texform_gen = "\[L(s) = " # "\[L(A,s) = " texform_gen += "\prod_{p \\text{ prime}} F_p(p^{-s})^{-1} \]\n" pfactors = prime_divisors(L.level) if len(pfactors) == 1: #i.e., the conductor is prime pgoodset = "$p \\neq " + str(pfactors[0]) + "$" pbadset = "$p = " + str(pfactors[0]) + "$" else: badset = "\\{" + str(pfactors[0]) for j in range(1,len(pfactors)): badset += ",\\;" badset += str(pfactors[j]) badset += "\\}" pgoodset = "$p \\notin " + badset + "$" pbadset = "$p \\in " + badset + "$" ans = "" ans += texform_gen + "where, for " + pgoodset + ",\n" if L.degree == 4 and L.motivic_weight == 1: ans += "\[F_p(T) = 1 - a_p T + b_p T^2 - a_p p T^3 + p^2 T^4 \]" ans += "with $b_p = a_p^2 - a_{p^2}$. " elif L.degree == 2 and L.motivic_weight == 1: ans += "\[F_p(T) = 1 - a_p T + p T^2 .\]" else: ans += "\(F_p\) is a polynomial of degree " + str(L.degree) + ". " ans += "If " + pbadset + ", then $F_p$ is a polynomial of degree at most " ans += str(L.degree - 1) + ". " bad_primes = [] for lf in L.bad_lfactors: bad_primes.append(lf[0]) eulerlim = 25 good_primes = [] for j in range(0, eulerlim): this_prime = Primes().unrank(j) if this_prime not in bad_primes: good_primes.append(this_prime) eptable = "<table id='eptable' class='ntdata euler'>\n" eptable += "<thead>" eptable += "<tr class='space'><th class='weight'></th><th class='weight'>$p$</th><th class='weight'>$F_p$</th>" if L.degree > 2: eptable += "<th class='weight galois'>$\Gal(F_p)$</th>" eptable += "</tr>\n" eptable += "</thead>" goodorbad = "bad" for lf in L.bad_lfactors: try: thispolygal = list_to_factored_poly_otherorder(lf[1], galois=True) eptable += ("<tr><td>" + goodorbad + "</td><td>" + str(lf[0]) + "</td><td>" + "$" + thispolygal[0] + "$" + "</td>") if L.degree > 2: eptable += "<td class='galois'>" this_gal_group = thispolygal[1] if this_gal_group[0]==[0,0]: pass # do nothing, because the local faco is 1 elif this_gal_group[0]==[1,1]: eptable += group_display_knowl(this_gal_group[0][0],this_gal_group[0][1],'$C_1$') else: eptable += group_display_knowl(this_gal_group[0][0],this_gal_group[0][1]) for j in range(1,len(thispolygal[1])): eptable += "$\\times$" eptable += group_display_knowl(this_gal_group[j][0],this_gal_group[j][1]) eptable += "</td>" eptable += "</tr>\n" except IndexError: eptable += "<tr><td></td><td>" + str(j) + "</td><td>" + "not available" + "</td></tr>\n" goodorbad = "" goodorbad = "good" firsttime = " class='first'" good_primes1 = good_primes[:9] good_primes2 = good_primes[9:] for j in good_primes1: this_prime_index = prime_pi(j) - 1 thispolygal = list_to_factored_poly_otherorder(L.localfactors[this_prime_index],galois=True) eptable += ("<tr" + firsttime + "><td>" + goodorbad + "</td><td>" + str(j) + "</td><td>" + "$" + thispolygal[0] + "$" + "</td>") if L.degree > 2: eptable += "<td class='galois'>" this_gal_group = thispolygal[1] eptable += group_display_knowl(this_gal_group[0][0],this_gal_group[0][1]) for j in range(1,len(thispolygal[1])): eptable += "$\\times$" eptable += group_display_knowl(this_gal_group[j][0],this_gal_group[j][1]) eptable += "</td>" eptable += "</tr>\n" # eptable += "<td>" + group_display_knowl(4,1) + "</td>" # eptable += "</tr>\n" goodorbad = "" firsttime = "" firsttime = " id='moreep'" for j in good_primes2: this_prime_index = prime_pi(j) - 1 thispolygal = list_to_factored_poly_otherorder(L.localfactors[this_prime_index],galois=True) eptable += ("<tr" + firsttime + " class='more nodisplay'" + "><td>" + goodorbad + "</td><td>" + str(j) + "</td><td>" + "$" + list_to_factored_poly_otherorder(L.localfactors[this_prime_index], galois=True)[0] + "$" + "</td>") if L.degree > 2: this_gal_group = thispolygal[1] eptable += "<td class='galois'>" eptable += group_display_knowl(this_gal_group[0][0],this_gal_group[0][1]) for j in range(1,len(thispolygal[1])): eptable += "$\\times$" eptable += group_display_knowl(this_gal_group[j][0],this_gal_group[j][1]) eptable += "</td>" eptable += "</tr>\n" firsttime = "" eptable += "<tr class='less toggle'><td></td><td></td><td> <a onclick='" eptable += 'show_moreless("more"); return true' + "'" eptable += ' href="#moreep" ' eptable += ">show more</a></td></tr>\n" eptable += "<tr class='more toggle nodisplay'><td></td><td></td><td> <a onclick='" eptable += 'show_moreless("less"); return true' + "'" eptable += ' href="#eptable" ' eptable += ">show less</a></td></tr>\n" eptable += "</table>\n" ans += "\n" + eptable return(ans)
def lfuncEPhtml(L,fmt, prec = None): """ Euler product as a formula and a table of local factors. """ # Formula texform_gen = "\[L(s) = " # "\[L(A,s) = " texform_gen += "\prod_{p \\text{ prime}} F_p(p^{-s})^{-1} \]\n" pfactors = prime_divisors(L.level) if len(pfactors) == 0: pgoodset = None pbadset = None elif len(pfactors) == 1: #i.e., the conductor is prime pgoodset = "$p \\neq " + str(pfactors[0]) + "$" pbadset = "$p = " + str(pfactors[0]) + "$" else: badset = "\\{" + str(pfactors[0]) for j in range(1,len(pfactors)): badset += ",\\;" badset += str(pfactors[j]) badset += "\\}" pgoodset = "$p \\notin " + badset + "$" pbadset = "$p \\in " + badset + "$" ans = "" ans += texform_gen + "where" if pgoodset is not None: ans += ", for " + pgoodset ans += ",\n" if L.motivic_weight == 1 and L.characternumber == 1 and L.degree in [2,4]: if L.degree == 4: ans += "\[F_p(T) = 1 - a_p T + b_p T^2 - a_p p T^3 + p^2 T^4 \]" ans += "with $b_p = a_p^2 - a_{p^2}$. " elif L.degree == 2: ans += "\[F_p(T) = 1 - a_p T + p T^2 .\]" else: ans += "\(F_p\) is a polynomial of degree " + str(L.degree) + ". " if pbadset is not None: ans += "If " + pbadset + ", then $F_p$ is a polynomial of degree at most " ans += str(L.degree - 1) + ". " # Figuring out good and bad primes bad_primes = [] for lf in L.bad_lfactors: bad_primes.append(lf[0]) eulerlim = 25 good_primes = [] for p in primes_first_n(eulerlim): if p not in bad_primes: good_primes.append(p) #decide if we display galois display_galois = True if L.degree <= 2 or L.degree >= 12: display_galois = False if L.coefficient_field == "CDF": display_galois = False def pretty_poly(poly, prec = None): out = "1" for i,elt in enumerate(poly): if elt is None or (i == prec and prec != len(poly) - 1): out += "O(%s)" % (seriesvar(i, "polynomial"),) break; elif i > 0: out += seriescoeff(elt, i, "series", "polynomial", 3) return out eptable = r"""<div style="max-width: 100%; overflow-x: auto;">""" eptable += "<table class='ntdata euler'>\n" eptable += "<thead>" eptable += "<tr class='space'><th class='weight'></th><th class='weight'>$p$</th>" if L.degree > 2 and L.degree < 12: display_galois = True eptable += "<th class='weight galois'>$\Gal(F_p)$</th>" else: display_galois = False eptable += r"""<th class='weight' style="text-align: left;">$F_p$</th>""" eptable += "</tr>\n" eptable += "</thead>" def row(trclass, goodorbad, p, poly): out = "" try: if L.coefficient_field == "CDF" or None in poly: factors = str(pretty_poly(poly, prec = prec)) elif not display_galois: factors = list_to_factored_poly_otherorder(poly, galois=display_galois, prec = prec, p = p) else: factors, gal_groups = list_to_factored_poly_otherorder(poly, galois=display_galois, p = p) out += "<tr" + trclass + "><td>" + goodorbad + "</td><td>" + str(p) + "</td>"; if display_galois: out += "<td class='galois'>" if gal_groups[0]==[0,0]: pass # do nothing, because the local faco is 1 elif gal_groups[0]==[1,1]: out += group_display_knowl(gal_groups[0][0], gal_groups[0][1],'$C_1$') else: out += group_display_knowl(gal_groups[0][0], gal_groups[0][1]) for n, k in gal_groups[1:]: out += "$\\times$" out += group_display_knowl(n, k) out += "</td>" out += "<td>" +"$" + factors + "$" + "</td>" out += "</tr>\n" except IndexError: out += "<tr><td></td><td>" + str(j) + "</td><td>" + "not available" + "</td></tr>\n" return out goodorbad = "bad" trclass = "" for lf in L.bad_lfactors: eptable += row(trclass, goodorbad, lf[0], lf[1]) goodorbad = "" trclass = "" goodorbad = "good" trclass = " class='first'" good_primes1 = good_primes[:9] good_primes2 = good_primes[9:] for j in good_primes1: this_prime_index = prime_pi(j) - 1 eptable += row(trclass, goodorbad, j, L.localfactors[this_prime_index]) goodorbad = "" trclass = "" trclass = " id='moreep' class='more nodisplay'" for j in good_primes2: this_prime_index = prime_pi(j) - 1 eptable += row(trclass, goodorbad, j, L.localfactors[this_prime_index]) trclass = " class='more nodisplay'" eptable += r"""<tr class="less toggle"><td colspan="2"> <a onclick="show_moreless("more"); return true" href="#moreep">show more</a></td>""" last_entry = "" if display_galois: last_entry +="<td></td>" last_entry += "<td></td>" eptable += last_entry eptable += "</tr>" eptable += r"""<tr class="more toggle nodisplay"><td colspan="2"><a onclick="show_moreless("less"); return true" href="#eptable">show less</a></td>""" eptable += last_entry eptable += "</tr>\n</table>\n</div>\n" ans += "\n" + eptable return(ans)
def check_hecke_ring_character_values_and_an(self, rec, verbose=False): """ check that hecke_ring_character_values has the correct format, depending on whether hecke_ring_cyclotomic_generator is set or not check that an has length 100 and that each entry is either a list of integers of length hecke_ring_rank (if hecke_ring_cyclotomic_generator=0) or a list of pairs check that ap has length pi(maxp) and that each entry is formatted correctly (as for an) """ # TIME about 4000s for full table an = rec['an'] if len(an) != 100: if verbose: print("Length an", len(an)) return False ap = rec['ap'] maxp = rec['maxp'] if len(ap) != prime_pi(maxp): if verbose: print("Length ap", len(ap), prime_pi(maxp)) return False if maxp < 997: if verbose: print("Maxp", maxp) return False m = rec['hecke_ring_cyclotomic_generator'] d = rec['hecke_ring_rank'] def check_val(val): if not isinstance(val, list): return False if m == 0: return len(val) == d and all(isinstance(c, integer_types) for c in val) else: for pair in val: if len(pair) != 2: return False if not isinstance(pair[0], integer_types): return False e = pair[1] if not (isinstance(e, integer_types) and 0 <= 2*e < m): return False return True if not all(check_val(a) for a in an): if verbose: for n, a in enumerate(an, 1): if not check_val(a): print("Check an failure (m=%s, d=%s)"%(m, d), n, a) return False if not all(check_val(a) for a in ap): if verbose: for p, a in zip(prime_range(maxp), ap): if not check_val(a): print("Check ap failure (m=%s, d=%s)"%(m, d), p, a) return False for p, a in zip(prime_range(100), ap): if a != an[p-1]: if verbose: print("Match failure", p, a, an[p-1]) return False if rec['char_orbit_index'] != 1: if rec.get('hecke_ring_character_values') is None: if verbose: print("No hecke_ring_character_values") return False N = rec['level'] total_order = 1 for g, val in rec['hecke_ring_character_values']: total_order *= mod(g, N).multiplicative_order() if not check_val(val): if verbose: print("Bad character val (m=%s, d=%s)"%(m, d), g, val) return False success = (total_order == euler_phi(N)) if not success and verbose: print("Generators failed", total_order, euler_phi(N)) return success return True
def lfuncEPhtml(L, fmt): """ Euler product as a formula and a table of local factors. """ texform_gen = "\[L(s) = " # "\[L(A,s) = " texform_gen += "\prod_{p \\text{ prime}} F_p(p^{-s})^{-1} \]\n" pfactors = prime_divisors(L.level) if len(pfactors) == 1: #i.e., the conductor is prime pgoodset = "$p \\neq " + str(pfactors[0]) + "$" pbadset = "$p = " + str(pfactors[0]) + "$" else: badset = "\\{" + str(pfactors[0]) for j in range(1, len(pfactors)): badset += ",\\;" badset += str(pfactors[j]) badset += "\\}" pgoodset = "$p \\notin " + badset + "$" pbadset = "$p \\in " + badset + "$" ans = "" ans += texform_gen + "where, for " + pgoodset + ",\n" if L.degree == 4 and L.motivic_weight == 1: ans += "\[F_p(T) = 1 - a_p T + b_p T^2 - a_p p T^3 + p^2 T^4 \]" ans += "with $b_p = a_p^2 - a_{p^2}$. " elif L.degree == 2 and L.motivic_weight == 1: ans += "\[F_p(T) = 1 - a_p T + p T^2 .\]" else: ans += "\(F_p\) is a polynomial of degree " + str(L.degree) + ". " ans += "If " + pbadset + ", then $F_p$ is a polynomial of degree at most " ans += str(L.degree - 1) + ". " bad_primes = [] for lf in L.bad_lfactors: bad_primes.append(lf[0]) eulerlim = 25 good_primes = [] for j in range(0, eulerlim): this_prime = Primes().unrank(j) if this_prime not in bad_primes: good_primes.append(this_prime) eptable = "<table id='eptable' class='ntdata euler'>\n" eptable += "<thead>" eptable += "<tr class='space'><th class='weight'></th><th class='weight'>$p$</th><th class='weight'>$F_p$</th>" if L.degree > 2: eptable += "<th class='weight galois'>$\Gal(F_p)$</th>" eptable += "</tr>\n" eptable += "</thead>" goodorbad = "bad" for lf in L.bad_lfactors: try: thispolygal = list_to_factored_poly_otherorder(lf[1], galois=True) eptable += ("<tr><td>" + goodorbad + "</td><td>" + str(lf[0]) + "</td><td>" + "$" + thispolygal[0] + "$" + "</td>") if L.degree > 2: eptable += "<td class='galois'>" this_gal_group = thispolygal[1] if this_gal_group[0] == [0, 0]: pass # do nothing, because the local faco is 1 elif this_gal_group[0] == [1, 1]: eptable += group_display_knowl(this_gal_group[0][0], this_gal_group[0][1], '$C_1$') else: eptable += group_display_knowl(this_gal_group[0][0], this_gal_group[0][1]) for j in range(1, len(thispolygal[1])): eptable += "$\\times$" eptable += group_display_knowl(this_gal_group[j][0], this_gal_group[j][1]) eptable += "</td>" eptable += "</tr>\n" except IndexError: eptable += "<tr><td></td><td>" + str( j) + "</td><td>" + "not available" + "</td></tr>\n" goodorbad = "" goodorbad = "good" firsttime = " class='first'" good_primes1 = good_primes[:9] good_primes2 = good_primes[9:] for j in good_primes1: this_prime_index = prime_pi(j) - 1 thispolygal = list_to_factored_poly_otherorder( L.localfactors[this_prime_index], galois=True) eptable += ("<tr" + firsttime + "><td>" + goodorbad + "</td><td>" + str(j) + "</td><td>" + "$" + thispolygal[0] + "$" + "</td>") if L.degree > 2: eptable += "<td class='galois'>" this_gal_group = thispolygal[1] eptable += group_display_knowl(this_gal_group[0][0], this_gal_group[0][1]) for j in range(1, len(thispolygal[1])): eptable += "$\\times$" eptable += group_display_knowl(this_gal_group[j][0], this_gal_group[j][1]) eptable += "</td>" eptable += "</tr>\n" # eptable += "<td>" + group_display_knowl(4,1) + "</td>" # eptable += "</tr>\n" goodorbad = "" firsttime = "" firsttime = " id='moreep'" for j in good_primes2: this_prime_index = prime_pi(j) - 1 thispolygal = list_to_factored_poly_otherorder( L.localfactors[this_prime_index], galois=True) eptable += ("<tr" + firsttime + " class='more nodisplay'" + "><td>" + goodorbad + "</td><td>" + str(j) + "</td><td>" + "$" + list_to_factored_poly_otherorder( L.localfactors[this_prime_index], galois=True)[0] + "$" + "</td>") if L.degree > 2: this_gal_group = thispolygal[1] eptable += "<td class='galois'>" eptable += group_display_knowl(this_gal_group[0][0], this_gal_group[0][1]) for j in range(1, len(thispolygal[1])): eptable += "$\\times$" eptable += group_display_knowl(this_gal_group[j][0], this_gal_group[j][1]) eptable += "</td>" eptable += "</tr>\n" firsttime = "" eptable += "<tr class='less toggle'><td></td><td></td><td> <a onclick='" eptable += 'show_moreless("more"); return true' + "'" eptable += ' href="#moreep" ' eptable += ">show more</a></td></tr>\n" eptable += "<tr class='more toggle nodisplay'><td></td><td></td><td> <a onclick='" eptable += 'show_moreless("less"); return true' + "'" eptable += ' href="#eptable" ' eptable += ">show less</a></td></tr>\n" eptable += "</table>\n" ans += "\n" + eptable return (ans)
def primes_cc_bound(self): return prime_pi(self.an_cc_bound)
def rational_euler_factors(traces, euler_factors_cc, level, weight): dirichlet = [1] * 11 dirichlet[0] = 0 euler_factors = [] bad_lfactors = [] halfdegree = len(euler_factors_cc) PS = PowerSeriesRing(ZZ, "X") CCCx = PolynomialRing(CCC, "x") todo = list(enumerate(primes_first_n(30))) for p in sorted(ZZ(level).prime_divisors()): p_index = prime_pi(p) - 1 if p_index >= 30: todo.append((p_index, p)) for p_index, p in todo: if p_index > len(euler_factors_cc[0]): assert level % p == 0 bad_lfactors.append([int(p), [int(1)] + [None] * halfdegree]) continue #try to guess the rest by multiplying them roots = [] for lf in euler_factors_cc: roots += reciprocal_roots(lf[p_index]) root_powers = [None] * (halfdegree + 1) for j in range(1, halfdegree + 1): try: root_powers[j] = RRR(sum(map(lambda z: (z**j).real(), roots))).unique_integer() except ValueError: root_powers = root_powers[:j] break partial_efzz = from_power_sums(root_powers) efzz = map( int, partial_efzz) + [None] * (halfdegree + 1 - len(partial_efzz)) if len(traces) > p: if efzz[1] is None: efzz[1] = int(-traces[p - 1]) else: assert efzz[1] == -traces[p - 1] # to check that from_power_sums is correct ef = prod([CCCx(lf[p_index]) for lf in euler_factors_cc]) for j, elt in enumerate(ef.list()[:len(partial_efzz)]): try: efj = RRR(elt.real()).unique_integer() except ValueError: break assert efj == efzz[j] if level % p != 0: sign = RRR(ef.list()[-1].real() / p**((halfdegree) * (weight - 1))).unique_integer() assert sign in [1, -1], "%s\n%s" % (RRR( prod(lf[p_index][2] for lf in euler_factors_cc).real()).unique_integer(), p**( (halfdegree) * (weight - 1))) efzz2 = [None] * halfdegree for i, elt in enumerate(reversed(efzz[:-1])): if elt is None: efzz2[i] = None else: efzz2[i] = int(sign * p**((i + 1) * (weight - 1)) * elt) efzz += efzz2 euler_factors.append(efzz) else: if None not in efzz: k = len(efzz) while efzz[k - 1] == 0 and k >= 1: k -= 1 efzz = efzz[:k] bad_lfactors.append([int(p), efzz]) if p_index < 30: euler_factors.append(efzz) if p < 11: if p == 2: foo = (1 / PS(efzz[:4])).padded_list(4) for i in range(1, 4): dirichlet[p**i] = foo[i] elif p == 3: foo = (1 / PS(efzz[:3])).padded_list(4) for i in range(1, 3): dirichlet[p**i] = foo[i] else: dirichlet[p] = -efzz[1] if len(efzz) > 1 else 0 assert dirichlet[p] == traces[ p - 1], "p = %s, ap = %s, tp = %s, efzz = %s" % ( p, dirichlet[p], traces[p - 1], efzz) extend_multiplicatively(dirichlet) assert len(euler_factors) == 30 return euler_factors, bad_lfactors, dirichlet
def read_all(filename): # label -> [p, Lp] euler_factors_cc = {} # label -> labels orbits = {} # label -> postgres row as list rows = {} instances = {} base_dir = os.path.dirname(os.path.abspath(filename)) lfun_dir = os.path.join(base_dir, 'lfun') linecount = line_count(filename) check_all_files(filename, linecount) k = 0 with open(filename, 'r') as F: for line in F: linesplit = line[:-1].split(':') hoc, label, conrey_label_tmp, embedding_index_tmp, embedding_m, ap_txt = linesplit level, weight, char_orbit, hecke_orbit, conrey_label, embedding_index = label.split(".") assert conrey_label_tmp == conrey_label assert embedding_index_tmp == embedding_index mf_orbit_label = ".".join([level, weight, char_orbit, hecke_orbit]) if mf_orbit_label not in orbits: orbits[mf_orbit_label] = [] orbits[mf_orbit_label].append(label) ap_list = [ toCCC(*elt.split(',')) for elt in ap_txt[2:-2].split('],[')] ap_list = zip(primes_first_n(len(ap_list)),ap_list) lpfilename = os.path.join(lfun_dir, label + ".lpdata") lffilename = os.path.join(lfun_dir, label + ".lpdata.lfunction") if not all(map(os.path.exists, [lpfilename, lffilename])): continue level, weight, conrey_label, embedding_index = map(int, [level, weight, conrey_label, embedding_index]) G = DirichletGroup_conrey(level, CCC) char = DirichletCharacter_conrey(G, conrey_label) # the basis row = constant_lf(level, weight, 2) row['origin'] = "ModularForm/GL2/Q/holomorphic/%d/%d/%s/%s/%d/%d" % (level, weight, char_orbit, hecke_orbit, conrey_label, embedding_index) row['self_dual'] = self_dual(char, ap_list) row['central_character'] = "%s.%s" % (level, conrey_label) # sets accuracy, root_number, sign_arg, leading_term, order_of_vanishing, positive_zeros, plot_delta, plot_values for key, val in read_lfunction_file(lffilename).iteritems(): row[key] = val if row['self_dual']: row['conjugate'] = '\N' else: lfconjfilename= os.path.join(lfun_dir, label + ".lpdata.conj.lfunction") assert os.path.exists(lfconjfilename) row['conjugate'] = read_lfunction_file(lfconjfilename)['Lhash'] def euler_factor(p, ap): if p.divides(level): return [1, -ap] charval = CCC(2*char.logvalue(p)).exppii() if charval.contains_exact(ZZ(1)): charval = 1 elif charval.contains_exact(ZZ(-1)): charval = -1 return [1, -ap, (p**(weight-1))*charval] cut = 30 if level == 1 else max(30, prime_pi(max(prime_divisors(level)))) euler_factors = [ euler_factor(*elt) for elt in ap_list[:cut] ] bad_euler_factors = [ [elt[0], euler_factor(*elt)] for elt in ap_list if elt[0].divides(level)] euler_factors_cc[label] = euler_factors row['euler_factors'] = map( lambda x : map(CBF_to_pair, x), euler_factors) row['bad_lfactors'] = map( lambda x: [int(x[0]), map(CBF_to_pair, x[1])], bad_euler_factors) row['coefficient_field'] = 'CDF' for i, ai in enumerate(dirichlet(CCC, euler_factors[:11])[2:12]): if i + 2 <= 10: row['a' + str(i+2)] = CBF_to_pair(ai) for key in schema_lf: assert key in row, "%s not in row = %s" % (key, row) assert len(row) == len(schema_lf), "%s != %s" % (len(row) , len(schema_lf)) rows[label] = [row[key] for key in schema_lf] instances[label] = (row['origin'], row['Lhash'], 'CMF') k += 1 if linecount > 10: if (k % (linecount//10)) == 0: print "read_all %.2f%% done" % (k*100./linecount) print "read_all Done" rational_rows = populate_rational_rows(orbits, euler_factors_cc, rows, instances) positive_zeros = schema_lf_dict['positive_zeros'] for elt, val in rows.iteritems(): assert isinstance(val[positive_zeros], str), "%s, %s, %s" % (elt, type(val[positive_zeros]), val[positive_zeros]) lfun_filename = filename + ".lfunctions" instances_filename = filename + ".instances" export_lfunctions(rows, rational_rows, instances, lfun_filename, instances_filename) return 0
def rational_euler_factors(euler_factors_cc, level, weight, an_list_bound = 11): dirichlet = [1]*an_list_bound dirichlet[0] = 0 euler_factors = [] bad_lfactors = [] halfdegree = len(euler_factors_cc) PS = PowerSeriesRing(ZZ, "X") CCCx = PolynomialRing(CCC, "x") todo = list(enumerate(primes_first_n(30))) for p in sorted(ZZ(level).prime_divisors()): p_index = prime_pi(p) - 1 if p_index >= 30: todo.append((p_index, p)) for p_index, p in todo: if p_index >= len(euler_factors_cc[0]): assert level % p == 0, "%s, %s, %s" % (level, weight, len(euler_factors_cc)) bad_lfactors.append([int(p), [int(1)] + [None]*halfdegree]) continue #try to guess the rest by multiplying them roots = [] for lf in euler_factors_cc: roots += reciprocal_roots(lf[p_index]) root_powers = [None] * (halfdegree + 1) for j in range(1,halfdegree + 1): try: root_powers[j] = RRR(sum( map(lambda z: (z**j).real(), roots) )).unique_integer() except ValueError: root_powers = root_powers[:j] break partial_efzz = from_power_sums(root_powers) efzz = map(int, partial_efzz) + [None]*(halfdegree +1 - len(partial_efzz)) # to check that from_power_sums is correct ef = prod([CCCx(lf[p_index]) for lf in euler_factors_cc]) for j, elt in enumerate(ef.list()[:len(partial_efzz)]): try: efj = int(RRR(elt.real()).unique_integer()) except ValueError: #print j #print RRR(elt.real()) #print p #print "[%s]" % (", ".join(["[%s]" % (", ".join(map(print_CCC, lf[p_index]))) for ef in euler_factors_cc])) #assert False break; assert efj == efzz[j], "%s, %s, %s, %s != %s" % (level, weight, len(euler_factors_cc), efj, efzz[j]) if (level % p) != 0: sign = RRR(ef.list()[-1].real()/p**((halfdegree)*(weight - 1))).unique_integer() assert sign in [1,-1], "%s\n%s" % (RRR(prod( lf[p_index][2] for lf in euler_factors_cc).real()).unique_integer(),p**((halfdegree)*(weight - 1))) efzz2 = [None] * halfdegree for i, elt in enumerate(reversed(efzz[:-1])): if elt is None: efzz2[i] = None else: efzz2[i] = int(sign*p**((i+1)*(weight - 1)) * elt) efzz += efzz2 euler_factors.append(efzz) else: if None not in efzz: k = len(efzz) while efzz[k - 1] == 0 and k >= 1: k -= 1 efzz = efzz[:k] bad_lfactors.append([int(p), efzz]) if p_index < 30: euler_factors.append(efzz) if p < an_list_bound: k = RR(an_list_bound).log(p).floor()+1 foo = (1/PS(efzz)).padded_list(k) for i in range(1, k): dirichlet[p**i] = foo[i] extend_multiplicatively(dirichlet) assert len(euler_factors) == 30, "%s, %s, %s, %s != 30" % (level, weight, len(euler_factors_cc), len(euler_factors)) return euler_factors, bad_lfactors, dirichlet
def lfuncEPhtml(L, fmt, prec=None): """ Euler product as a formula and a table of local factors. """ # Formula texform_gen = "\[L(s) = " # "\[L(A,s) = " texform_gen += "\prod_{p \\text{ prime}} F_p(p^{-s})^{-1} \]\n" pfactors = prime_divisors(L.level) if len(pfactors) == 0: pgoodset = None pbadset = None elif len(pfactors) == 1: #i.e., the conductor is prime pgoodset = "$p \\neq " + str(pfactors[0]) + "$" pbadset = "$p = " + str(pfactors[0]) + "$" else: badset = "\\{" + str(pfactors[0]) for j in range(1, len(pfactors)): badset += ",\\;" badset += str(pfactors[j]) badset += "\\}" pgoodset = "$p \\notin " + badset + "$" pbadset = "$p \\in " + badset + "$" ans = "" ans += texform_gen + "where" if pgoodset is not None: ans += ", for " + pgoodset ans += ",\n" if L.motivic_weight == 1 and L.characternumber == 1 and L.degree in [2, 4]: if L.degree == 4: ans += "\[F_p(T) = 1 - a_p T + b_p T^2 - a_p p T^3 + p^2 T^4 \]" ans += "with $b_p = a_p^2 - a_{p^2}$. " elif L.degree == 2: ans += "\[F_p(T) = 1 - a_p T + p T^2 .\]" else: ans += "\(F_p\) is a polynomial of degree " + str(L.degree) + ". " if pbadset is not None: ans += "If " + pbadset + ", then $F_p$ is a polynomial of degree at most " ans += str(L.degree - 1) + ". " # Figuring out good and bad primes bad_primes = [] for lf in L.bad_lfactors: bad_primes.append(lf[0]) eulerlim = 25 good_primes = [] for p in primes_first_n(eulerlim): if p not in bad_primes: good_primes.append(p) #decide if we display galois display_galois = True if L.degree <= 2 or L.degree >= 12: display_galois = False if L.coefficient_field == "CDF": display_galois = False def pretty_poly(poly, prec=None): out = "1" for i, elt in enumerate(poly): if elt is None or (i == prec and prec != len(poly) - 1): out += "O(%s)" % (seriesvar(i, "polynomial"), ) break elif i > 0: out += seriescoeff(elt, i, "series", "polynomial", 3) return out eptable = r"""<div style="max-width: 100%; overflow-x: auto;">""" eptable += "<table class='ntdata euler'>\n" eptable += "<thead>" eptable += "<tr class='space'><th class='weight'></th><th class='weight'>$p$</th>" if L.degree > 2 and L.degree < 12: display_galois = True eptable += "<th class='weight galois'>$\Gal(F_p)$</th>" else: display_galois = False eptable += r"""<th class='weight' style="text-align: left;">$F_p$</th>""" eptable += "</tr>\n" eptable += "</thead>" def row(trclass, goodorbad, p, poly): out = "" try: if L.coefficient_field == "CDF" or None in poly: factors = str(pretty_poly(poly, prec=prec)) elif not display_galois: factors = list_to_factored_poly_otherorder( poly, galois=display_galois, prec=prec, p=p) else: factors, gal_groups = list_to_factored_poly_otherorder( poly, galois=display_galois, p=p) out += "<tr" + trclass + "><td>" + goodorbad + "</td><td>" + str( p) + "</td>" if display_galois: out += "<td class='galois'>" if gal_groups[0] == [0, 0]: pass # do nothing, because the local faco is 1 elif gal_groups[0] == [1, 1]: out += group_display_knowl(gal_groups[0][0], gal_groups[0][1], '$C_1$') else: out += group_display_knowl(gal_groups[0][0], gal_groups[0][1]) for n, k in gal_groups[1:]: out += "$\\times$" out += group_display_knowl(n, k) out += "</td>" out += "<td>" + "$" + factors + "$" + "</td>" out += "</tr>\n" except IndexError: out += "<tr><td></td><td>" + str( j) + "</td><td>" + "not available" + "</td></tr>\n" return out goodorbad = "bad" trclass = "" for lf in L.bad_lfactors: eptable += row(trclass, goodorbad, lf[0], lf[1]) goodorbad = "" trclass = "" goodorbad = "good" trclass = " class='first'" good_primes1 = good_primes[:9] good_primes2 = good_primes[9:] for j in good_primes1: this_prime_index = prime_pi(j) - 1 eptable += row(trclass, goodorbad, j, L.localfactors[this_prime_index]) goodorbad = "" trclass = "" trclass = " id='moreep' class='more nodisplay'" for j in good_primes2: this_prime_index = prime_pi(j) - 1 eptable += row(trclass, goodorbad, j, L.localfactors[this_prime_index]) trclass = " class='more nodisplay'" eptable += r"""<tr class="less toggle"><td colspan="2"> <a onclick="show_moreless("more"); return true" href="#moreep">show more</a></td>""" last_entry = "" if display_galois: last_entry += "<td></td>" last_entry += "<td></td>" eptable += last_entry eptable += "</tr>" eptable += r"""<tr class="more toggle nodisplay"><td colspan="2"><a onclick="show_moreless("less"); return true" href="#eptable">show less</a></td>""" eptable += last_entry eptable += "</tr>\n</table>\n</div>\n" ans += "\n" + eptable return (ans)
def check_hecke_ring_character_values_and_an(self, rec, verbose=False): """ check that hecke_ring_character_values has the correct format, depending on whether hecke_ring_cyclotomic_generator is set or not check that an has length 100 and that each entry is either a list of integers of length hecke_ring_rank (if hecke_ring_cyclotomic_generator=0) or a list of pairs check that ap has length pi(maxp) and that each entry is formatted correctly (as for an) """ # TIME about 4000s for full table an = rec['an'] if len(an) != 100: if verbose: print "Length an", len(an) return False ap = rec['ap'] maxp = rec['maxp'] if len(ap) != prime_pi(maxp): if verbose: print "Length ap", len(ap), prime_pi(maxp) return False if maxp < 997: if verbose: print "Maxp", maxp return False m = rec['hecke_ring_cyclotomic_generator'] d = rec['hecke_ring_rank'] def check_val(val): if not isinstance(val, list): return False if m == 0: return len(val) == d and all(isinstance(c, integer_types) for c in val) else: for pair in val: if len(pair) != 2: return False if not isinstance(pair[0], integer_types): return False e = pair[1] if not (isinstance(e, integer_types) and 0 <= 2*e < m): return False return True if not all(check_val(a) for a in an): if verbose: for n, a in enumerate(an, 1): if not check_val(a): print "Check an failure (m=%s, d=%s)"%(m, d), n, a return False if not all(check_val(a) for a in ap): if verbose: for p, a in zip(prime_range(maxp), ap): if not check_val(a): print "Check ap failure (m=%s, d=%s)"%(m, d), p, a return False for p, a in zip(prime_range(100), ap): if a != an[p-1]: if verbose: print "Match failure", p, a, an[p-1] return False if rec['char_orbit_index'] != 1: if rec.get('hecke_ring_character_values') is None: if verbose: print "No hecke_ring_character_values" return False N = rec['level'] total_order = 1 for g, val in rec['hecke_ring_character_values']: total_order *= mod(g, N).multiplicative_order() if not check_val(val): if verbose: print "Bad character val (m=%s, d=%s)"%(m, d), g, val return False success = (total_order == euler_phi(N)) if not success and verbose: print "Generators failed", total_order, euler_phi(N) return success return True