I fear you will have to do a lot by hand in sage. You can reduce a projective point modulo p^k as below, but the output will have to be a list of elements in Z/p^kZ, since projective spaces are not defined over general rings as far as I am aware. What I meant is that you can actually work in E( Qp ) instead and at the end extract the mod p^k information that you need.
I am sure others are better placed to comment how much easier these things are in magma. Chris sage: def reduction_of_point(P,k): ....: """ ....: Reduce projective point P defined over Qp modulo p^k ....: """ ....: v = min(valuation(x) for x in P) ....: p = P[0].parent().prime() ....: R = IntegerModRing(p^k) ....: return [ R( p^(-v)*x ) for x in P] On Friday, 15 May 2020 09:53:46 UTC+1, Daniel Loughran wrote: > > Hi Chris, > > Thanks for the advice, but I can't seem to get this to work either. I get > the error "ValueError: element must have non-negative valuation in order > to compute residue". > > Any idea how to make this work without errors? Or should I just give up > and use magma instead? > > E=EllipticCurve(Qp(2,5),[0, 0, 1, -1, 0]); E > > Elliptic Curve defined by y^2 + (1+O(2^5))*y = x^3 + > (1+2+2^2+2^3+2^4+O(2^5))*x over 2-adic Field with capped relative precision 5 > > P=E(2,-3,8); P > > (2^-2 + O(2^3) : 2^-3 + 2^-1 + 1 + 2 + O(2^2) : 1 + O(2^5)) > > E4=E.change_ring(Integers(4)); E4 > > Elliptic Curve defined by y^2 + y = x^3 + 3*x over Ring of integers modulo 4 > > E4(P) > ValueError: element must have non-negative valuation in order to compute > residue. > > > Dan > > On Friday, 15 May 2020 09:44:43 UTC+1, chris wuthrich wrote: >> >> Dear Daniel >> >> indeed elliptic curves over rings (what should be called technically >> Weierstrass equations with non-zero discriminant, instead of unit >> discriminant) are rather useless in Sage. >> I would recommend to work with 2-adics in your case and to reduce modulo >> 4 in the end. You could work over Qp(p,k) if you want modulo p^k. >> >> I hope that this may help with what you do. Of course, one should >> implement this properly one day. >> >> Chris >> >> On Thursday, 14 May 2020 11:41:04 UTC+1, Daniel Loughran wrote: >>> >>> Hello. I think that I may have found a bug involving elliptic curves >>> modulo powers of primes. I have attached the working jupyter notebook, but >>> my code and results are also below. >>> >>> In my code I have an elliptic curve E over Q with good reduction at 2 >>> and the point P = (2:-3:8) (homogeneous coordinates). >>> >>> It is clear that the reduction modulo 4 of this point in projective >>> space is (2:1:0). >>> >>> However, sage is telling me that when I reduce the curve modulo 4 then >>> ask what point P reduces to, I get the identity element (0:1:0). >>> >>> My guess is that sage does something like put this point into the form >>> (1/4:-3/8:1), then notices that 4 divides the denominator of the >>> x-coordinate so just kills it. But really it should be clearing >>> denominators before it tries to reduce modulo 4. >>> >>> There is another related bug: if I try to instead reduce this point >>> modulo 16, then I just get the error "inverse of Mod(4, 16) does not >>> exist". I guess this is a similar problem to the above. >>> >>> >>> >>> ------------------------------------------------------------------------------------------------------------------------------ >>> >>> E=EllipticCurve([0, 0, 1, -1, 0]); E >>> >>> Elliptic Curve defined by y^2 + y = x^3 - x over Rational Field >>> >>> P=E(2,-3,8); P >>> >>> (1/4 : -3/8 : 1) >>> >>> E4=E.change_ring(Integers(4)); E4 >>> >>> Elliptic Curve defined by y^2 + y = x^3 + 3*x over Ring of integers modulo 4 >>> >>> E4(P) >>> >>> (0 : 1 : 0) >>> >>> P2.<X,Y,Z> = ProjectiveSpace(Integers(4),2); P2 >>> >>> Projective Space of dimension 2 over Ring of integers modulo 4 >>> >>> P2(2,-3,8) >>> >>> (2 : 1 : 0) >>> >>> P2(0,1,0) >>> >>> (0 : 1 : 0) >>> >>> P2(2,-3,8)==P2(0,1,0) >>> >>> False >>> >>> E16=E.change_ring(Integers(16)); E16 >>> >>> Elliptic Curve defined by y^2 + y = x^3 + 15*x over Ring of integers modulo >>> 16 >>> >>> E16(P) >>> ZeroDivisionError: inverse of Mod(4, 16) does not exist >>> >>> -- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-devel/43d0ccd8-bbe1-4305-b816-e97791e5d25e%40googlegroups.com.