def invariant_differential(self): """ Returns the invariant differential $dx/2y$ on self EXAMPLES:: sage: R.<x> = QQ['x'] sage: H = HyperellipticCurve(x^3+1) sage: K = Qp(5,8) sage: HK = H.change_ring(K) sage: w = HK.invariant_differential(); w (((1+O(5^8)))*1) dx/2y :: sage: K = pAdicField(11, 6) sage: x = polygen(K) sage: C = HyperellipticCurve(x^5 + 33/16*x^4 + 3/4*x^3 + 3/8*x^2 - 1/4*x + 1/16) sage: C.invariant_differential() (((1+O(11^6)))*1) dx/2y """ import sage.schemes.elliptic_curves.monsky_washnitzer as monsky_washnitzer S = monsky_washnitzer.SpecialHyperellipticQuotientRing(self) MW = monsky_washnitzer.MonskyWashnitzerDifferentialRing(S) return MW.invariant_differential()
def coleman_integral_S_to_Q(self,w,S,Q): r""" Computes the Coleman integral $\int_S^Q w$ **one should be able to feed $S,Q$ into coleman_integral, but currently that segfaults** INPUT: - w: a differential - S: a point with coordinates in an extension of $\Q_p$ - Q: a non-Weierstrass point defined over $\Q_p$ OUTPUT: the Coleman integral $\int_S^Q w$ EXAMPLES:: sage: R.<x> = QQ['x'] sage: H = HyperellipticCurve(x^3-10*x+9) sage: K = Qp(5,6) sage: HK = H.change_ring(K) sage: J.<a> = K.extension(x^20-5) sage: HJ = H.change_ring(J) sage: x,y = HK.monsky_washnitzer_gens() sage: P = HK(1,0) sage: Q = HK(0,3) sage: S = HK.get_boundary_point(HJ,P) sage: P_to_S = HK.coleman_integral_P_to_S(y.diff(),P,S) sage: S_to_Q = HJ.coleman_integral_S_to_Q(y.diff(),S,Q) sage: P_to_S + S_to_Q 3 + O(a^119) sage: HK.coleman_integral(y.diff(),P,Q) 3 + O(5^6) AUTHOR: - Jennifer Balakrishnan """ import sage.schemes.elliptic_curves.monsky_washnitzer as monsky_washnitzer K = self.base_ring() R = monsky_washnitzer.SpecialHyperellipticQuotientRing(self, K) MW = monsky_washnitzer.MonskyWashnitzerDifferentialRing(R) w = MW(w) f, vec = w.reduce_fast() g = self.genus() const = f(Q[0],Q[1])-f(S[0],S[1]) if vec == vector(2*g*[0]): return const else: basis_values = self.S_to_Q(S, Q) dim = len(basis_values) dot = sum([vec[i] * basis_values[i] for i in range(dim)]) return const + dot
def invariant_differential(self): """ Returns $dx/2y$, as an element of the Monsky-Washnitzer cohomology of self EXAMPLES:: sage: R.<x> = QQ['x'] sage: C = HyperellipticCurve(x^5 - 4*x + 4) sage: C.invariant_differential() 1 dx/2y """ import sage.schemes.elliptic_curves.monsky_washnitzer as m_w S = m_w.SpecialHyperellipticQuotientRing(self) MW = m_w.MonskyWashnitzerDifferentialRing(S) return MW.invariant_differential()
def coleman_integral(self, w, P, Q, algorithm = 'None'): r""" Returns the Coleman integral $\int_P^Q w$ INPUT: - w differential (if one of P,Q is Weierstrass, w must be odd) - P point on self - Q point on self - algorithm (optional) = None (uses Frobenius) or teichmuller (uses Teichmuller points) OUTPUT: the Coleman integral $\int_P^Q w$ EXAMPLES:: Example of Leprevost from Kiran Kedlaya The first two should be zero as $(P-Q) = 30(P-Q)$ in the Jacobian and $dx/2y$ and $x dx/2y$ are holomorphic. sage: K = pAdicField(11, 6) sage: x = polygen(K) sage: C = HyperellipticCurve(x^5 + 33/16*x^4 + 3/4*x^3 + 3/8*x^2 - 1/4*x + 1/16) sage: P = C(-1, 1); P1 = C(-1, -1) sage: Q = C(0, 1/4); Q1 = C(0, -1/4) sage: x, y = C.monsky_washnitzer_gens() sage: w = C.invariant_differential() sage: w.coleman_integral(P, Q) O(11^6) sage: C.coleman_integral(x*w, P, Q) O(11^6) sage: C.coleman_integral(x^2*w, P, Q) 7*11 + 6*11^2 + 3*11^3 + 11^4 + 5*11^5 + O(11^6) :: sage: p = 71; m = 4 sage: K = pAdicField(p, m) sage: x = polygen(K) sage: C = HyperellipticCurve(x^5 + 33/16*x^4 + 3/4*x^3 + 3/8*x^2 - 1/4*x + 1/16) sage: P = C(-1, 1); P1 = C(-1, -1) sage: Q = C(0, 1/4); Q1 = C(0, -1/4) sage: x, y = C.monsky_washnitzer_gens() sage: w = C.invariant_differential() sage: w.integrate(P, Q), (x*w).integrate(P, Q) (O(71^4), O(71^4)) sage: R, R1 = C.lift_x(4, all=True) sage: w.integrate(P, R) 21*71 + 67*71^2 + 27*71^3 + O(71^4) sage: w.integrate(P, R) + w.integrate(P1, R1) O(71^4) A simple example, integrating dx:: sage: R.<x> = QQ['x'] sage: E= HyperellipticCurve(x^3-4*x+4) sage: K = Qp(5,10) sage: EK = E.change_ring(K) sage: P = EK(2, 2) sage: Q = EK.teichmuller(P) sage: x, y = EK.monsky_washnitzer_gens() sage: EK.coleman_integral(x.diff(), P, Q) 5 + 2*5^2 + 5^3 + 3*5^4 + 4*5^5 + 2*5^6 + 3*5^7 + 3*5^9 + O(5^10) sage: Q[0] - P[0] 5 + 2*5^2 + 5^3 + 3*5^4 + 4*5^5 + 2*5^6 + 3*5^7 + 3*5^9 + O(5^10) Yet another example:: sage: R.<x> = QQ['x'] sage: H = HyperellipticCurve(x*(x-1)*(x+9)) sage: K = Qp(7,10) sage: HK = H.change_ring(K) sage: import sage.schemes.elliptic_curves.monsky_washnitzer as mw sage: M_frob, forms = mw.matrix_of_frobenius_hyperelliptic(HK) sage: w = HK.invariant_differential() sage: x,y = HK.monsky_washnitzer_gens() sage: f = forms[0] sage: S = HK(9,36) sage: Q = HK.teichmuller(S) sage: P = HK(-1,4) sage: b = x*w*w._coeff.parent()(f) sage: HK.coleman_integral(b,P,Q) 7 + 7^2 + 4*7^3 + 5*7^4 + 3*7^5 + 7^6 + 5*7^7 + 3*7^8 + 4*7^9 + 4*7^10 + O(7^11) :: sage: R.<x> = QQ['x'] sage: H = HyperellipticCurve(x^3+1) sage: K = Qp(5,8) sage: HK = H.change_ring(K) sage: w = HK.invariant_differential() sage: P = HK(0,1) sage: Q = HK.lift_x(5) sage: x,y = HK.monsky_washnitzer_gens() sage: (2*y*w).coleman_integral(P,Q) 5 + O(5^9) sage: xloc,yloc,zloc = HK.local_analytic_interpolation(P,Q) sage: I2 = (xloc.derivative()/(2*yloc)).integral() sage: I2.polynomial()(1) - I2(0) 3*5 + 2*5^2 + 2*5^3 + 5^4 + 4*5^6 + 5^7 + O(5^9) sage: HK.coleman_integral(w,P,Q) 3*5 + 2*5^2 + 2*5^3 + 5^4 + 4*5^6 + 5^7 + O(5^9) Integrals involving Weierstrass points:: sage: R.<x> = QQ['x'] sage: H = HyperellipticCurve(x^3-10*x+9) sage: K = Qp(5,8) sage: HK = H.change_ring(K) sage: S = HK(1,0) sage: P = HK(0,3) sage: negP = HK(0,-3) sage: T = HK(0,1,0) sage: w = HK.invariant_differential() sage: x,y = HK.monsky_washnitzer_gens() sage: HK.coleman_integral(w*x^3,S,T) 0 sage: HK.coleman_integral(w*x^3,T,S) 0 sage: HK.coleman_integral(w,S,P) 2*5^2 + 5^4 + 5^5 + 3*5^6 + 3*5^7 + 2*5^8 + O(5^9) sage: HK.coleman_integral(w,T,P) 2*5^2 + 5^4 + 5^5 + 3*5^6 + 3*5^7 + 2*5^8 + O(5^9) sage: HK.coleman_integral(w*x^3,T,P) 5^2 + 2*5^3 + 3*5^6 + 3*5^7 + O(5^8) sage: HK.coleman_integral(w*x^3,S,P) 5^2 + 2*5^3 + 3*5^6 + 3*5^7 + O(5^8) sage: HK.coleman_integral(w, P, negP, algorithm='teichmuller') 5^2 + 4*5^3 + 2*5^4 + 2*5^5 + 3*5^6 + 2*5^7 + 4*5^8 + O(5^9) sage: HK.coleman_integral(w, P, negP) 5^2 + 4*5^3 + 2*5^4 + 2*5^5 + 3*5^6 + 2*5^7 + 4*5^8 + O(5^9) AUTHORS: - Robert Bradshaw (2007-03) - Kiran Kedlaya (2008-05) - Jennifer Balakrishnan (2010-02) """ # TODO: implement Jacobians and show the relationship directly import sage.schemes.elliptic_curves.monsky_washnitzer as monsky_washnitzer K = self.base_ring() prec = K.precision_cap() S = monsky_washnitzer.SpecialHyperellipticQuotientRing(self, K) MW = monsky_washnitzer.MonskyWashnitzerDifferentialRing(S) w = MW(w) f, vec = w.reduce_fast() basis_values = self.coleman_integrals_on_basis(P, Q, algorithm) dim = len(basis_values) x,y = self.local_coordinates_at_infinity(2*prec) if self.is_weierstrass(P): if self.is_weierstrass(Q): return 0 elif f == 0: return sum([vec[i] * basis_values[i] for i in range(dim)]) elif w._coeff(x,-y)*x.derivative()/(-2*y)+w._coeff(x,y)*x.derivative()/(2*y) == 0: return self.coleman_integral(w,self(Q[0],-Q[1]), self(Q[0],Q[1]), algorithm)/2 else: raise ValueError, "The differential is not odd: use coleman_integral_from_weierstrass_via_boundary" elif self.is_weierstrass(Q): if f == 0: return sum([vec[i] * basis_values[i] for i in range(dim)]) elif w._coeff(x,-y)*x.derivative()/(-2*y)+w._coeff(x,y)*x.derivative()/(2*y) == 0: return -self.coleman_integral(w,self(P[0],-P[1]), self(P[0],P[1]), algorithm)/2 else: raise ValueError, "The differential is not odd: use coleman_integral_from_weierstrass_via_boundary" else: return f(Q[0], Q[1]) - f(P[0], P[1]) + sum([vec[i] * basis_values[i] for i in range(dim)]) # this is just a dot product...