Esempio n. 1
0
File: util.py Progetto: mmasdeu/shp
def getcoords(E, u, prec=20, R=None):
    if R is None:
        R = u.parent()
        u = R(u)
    p = R.prime()
    jE = E.j_invariant()

    # Calculate the Tate parameter
    E4 = EisensteinForms(weight=4).basis()[0]
    Delta = CuspForms(weight=12).basis()[0]
    j = (E4.q_expansion(prec + 7)) ** 3 / Delta.q_expansion(prec + 7)
    qE = (1 / j).power_series().reversion()(R(1 / jE))

    # Normalize the period by appropriate powers of qE
    un = u * qE ** (-(u.valuation() / qE.valuation()).floor())

    precn = (prec / qE.valuation()).floor() + 4
    # formulas in Silverman II (Advanced Topics in the Arithmetic of Elliptic curves, p. 425)
    xx = un / (1 - un) ** 2 + sum(
        [
            qE ** n * un / (1 - qE ** n * un) ** 2
            + qE ** n / un / (1 - qE ** n / un) ** 2
            - 2 * qE ** n / (1 - qE ** n) ** 2
            for n in range(1, precn)
        ]
    )
    yy = un ** 2 / (1 - un) ** 3 + sum(
        [
            qE ** (2 * n) * un ** 2 / (1 - qE ** n * un) ** 3
            - qE ** n / un / (1 - qE ** n / un) ** 3
            + qE ** n / (1 - qE ** n) ** 2
            for n in range(1, precn)
        ]
    )

    sk = lambda q, k, pprec: sum([n ** k * q ** n / (1 - q ** n) for n in range(1, pprec + 1)])
    n = qE.valuation()
    precp = ((prec + 4) / n).floor() + 2

    tate_a4 = -5 * sk(qE, 3, precp)
    tate_a6 = (tate_a4 - 7 * sk(qE, 5, precp)) / 12
    Eq = EllipticCurve([R(1), R(0), R(0), tate_a4, tate_a6])

    C2 = (Eq.c4() * E.c6()) / (Eq.c6() * E.c4())

    C = R(C2).square_root()
    s = (C - R(E.a1())) / R(2)
    r = (s * (C - s) - R(E.a2())) / 3
    t = (r * (2 * s - C) - R(E.a3())) / 2

    return (r + C2 * xx, t + s * C2 * xx + C * C2 * yy)
Esempio n. 2
0
File: util.py Progetto: mmasdeu/shp
def getcoords(E, u, prec=20, R=None):
    if R is None:
        R = u.parent()
        u = R(u)
    p = R.prime()
    jE = E.j_invariant()

    # Calculate the Tate parameter
    E4 = EisensteinForms(weight=4).basis()[0]
    Delta = CuspForms(weight=12).basis()[0]
    j = (E4.q_expansion(prec + 7))**3 / Delta.q_expansion(prec + 7)
    qE = (1 / j).power_series().reversion()(R(1 / jE))

    # Normalize the period by appropriate powers of qE
    un = u * qE**(-(u.valuation() / qE.valuation()).floor())

    precn = (prec / qE.valuation()).floor() + 4
    # formulas in Silverman II (Advanced Topics in the Arithmetic of Elliptic curves, p. 425)
    xx = un / (1 - un)**2 + sum([
        qE**n * un / (1 - qE**n * un)**2 + qE**n / un /
        (1 - qE**n / un)**2 - 2 * qE**n / (1 - qE**n)**2
        for n in range(1, precn)
    ])
    yy = un**2 / (1 - un)**3 + sum([
        qE**(2 * n) * un**2 / (1 - qE**n * un)**3 - qE**n / un /
        (1 - qE**n / un)**3 + qE**n / (1 - qE**n)**2 for n in range(1, precn)
    ])

    sk = lambda q, k, pprec: sum(
        [n**k * q**n / (1 - q**n) for n in range(1, pprec + 1)])
    n = qE.valuation()
    precp = ((prec + 4) / n).floor() + 2

    tate_a4 = -5 * sk(qE, 3, precp)
    tate_a6 = (tate_a4 - 7 * sk(qE, 5, precp)) / 12
    Eq = EllipticCurve([R(1), R(0), R(0), tate_a4, tate_a6])

    C2 = (Eq.c4() * E.c6()) / (Eq.c6() * E.c4())

    C = R(C2).square_root()
    s = (C - R(E.a1())) / R(2)
    r = (s * (C - s) - R(E.a2())) / 3
    t = (r * (2 * s - C) - R(E.a3())) / 2

    return (r + C2 * xx, t + s * C2 * xx + C * C2 * yy)