def parameter(self, prec=20): r""" Return the Tate parameter `q` such that the curve is isomorphic over the algebraic closure of `\QQ_p` to the curve `\QQ_p^{\times}/q^{\ZZ}`. INPUT: - ``prec`` - the `p`-adic precision, default is 20. EXAMPLES:: sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.parameter(prec=5) 3*5^3 + 3*5^4 + 2*5^5 + 2*5^6 + 3*5^7 + O(5^8) """ try: qE = self._q if qE.absolute_precision() >= prec: return qE except AttributeError: pass E4 = EisensteinForms(weight=4).basis()[0] Delta = CuspForms(weight=12).basis()[0] j = (E4.q_expansion(prec + 3))**3 / Delta.q_expansion(prec + 3) jinv = (1 / j).power_series() q_in_terms_of_jinv = jinv.reverse() R = Qp(self._p, prec=prec) qE = q_in_terms_of_jinv(R(1 / self._E.j_invariant())) self._q = qE return qE
def parameter(self, prec=20): r""" Return the Tate parameter `q` such that the curve is isomorphic over the algebraic closure of `\QQ_p` to the curve `\QQ_p^{\times}/q^{\ZZ}`. INPUT: - ``prec`` - the `p`-adic precision, default is 20. EXAMPLES:: sage: eq = EllipticCurve('130a1').tate_curve(5) sage: eq.parameter(prec=5) 3*5^3 + 3*5^4 + 2*5^5 + 2*5^6 + 3*5^7 + O(5^8) """ try: qE = self._q if qE.absolute_precision() >= prec: return qE except AttributeError: pass E4 = EisensteinForms(weight=4).basis()[0] Delta = CuspForms(weight=12).basis()[0] j = (E4.q_expansion(prec + 3)) ** 3 / Delta.q_expansion(prec + 3) jinv = (1 / j).power_series() q_in_terms_of_jinv = jinv.reverse() R = Qp(self._p, prec=prec) qE = q_in_terms_of_jinv(R(1 / self._E.j_invariant())) self._q = qE return qE
def tate_parameter(E, p, prec = 20, R = None): if R is None: R = Qp(p,prec) jE = E.j_invariant() E4 = EisensteinForms(weight=4).basis()[0] Delta = CuspForms(weight=12).basis()[0] j = (E4.q_expansion(prec+3))**3/Delta.q_expansion(prec+3) jinv = (1/j).power_series() q_in_terms_of_jinv = jinv.reversion() return q_in_terms_of_jinv(R(1/E.j_invariant()))
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)
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)