示例#1
0
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)]
示例#3
0
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)
示例#4
0
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(&quot;more&quot;); 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(&quot;less&quot;); return true" href="#eptable">show less</a></td>"""
    eptable += last_entry
    eptable += "</tr>\n</table>\n</div>\n"
    ans += "\n" + eptable
    return(ans)
示例#5
0
 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
示例#6
0
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)
示例#7
0
 def primes_cc_bound(self):
     return prime_pi(self.an_cc_bound)
示例#8
0
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
示例#9
0
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
示例#10
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
示例#11
0
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(&quot;more&quot;); 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(&quot;less&quot;); return true" href="#eptable">show less</a></td>"""
    eptable += last_entry
    eptable += "</tr>\n</table>\n</div>\n"
    ans += "\n" + eptable
    return (ans)
示例#12
0
 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