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.

Reply via email to