# local divisibility of Heegner point

23 views

### Ahmed Matar

Feb 5, 2020, 6:01:06 PM2/5/20
to sage-nt
I have an elliptic curve E defined over the rationals and K is an imaginary quadratic field. I have a Heegner point P for E over K. I also have a rational prime p. Let q be a prime of K above p. I would like to use Sage to check whether the point P is divisible by p in E(K) and also in E(Kq) where Kq is the completion of K at the prime q. To check this in E(K) is easy; one can use the heegner_index() function or one can use the division_points() function. I am wondering if there is a way in Sage to do my required check in E(Kq). It seems to me that completions of number fields at finite primes are not defined in Sage. One can define in sage Kq as an extension field of Qp but then one must consider P as an element of E(Kq) via an appropriate embedding and I'm unsure how to do this.

Any ideas on how I can do my local computation? I need to do a bunch of these local computations for a paper I'm working on.

### kevin lui

Feb 6, 2020, 3:21:23 AM2/6/20
to sage-nt
This is probably naive. I'm also not sure how to easily consider P as an element of E(Kq). But perhaps we can compute the p-th division polynomial of P as an element of E(K). Embed this polynomial into Kq and find the x-coordinates by computing the roots in Kq. Then lift the roots in `E.change_ring(Kq)`.

This is how division_points works under the hood anyways but it won't require you to view P as an element of E(Kq).

### Ahmed Matar

Feb 8, 2020, 11:19:53 AM2/8/20
to sage-nt
Hi Kevin,

Thanks for your suggestion. You are right; we only need to find the roots of the p-th division polynomial of P in Kq. The problem is embedding K in Kq which is kind of the same problem of viewing P as an element of E(Kq). I have made some progress on doing this. First of all, I realized that sage doesn't actually compute the basic Heegner point over K. It can find the one defined over the Hilbert class field of K. Then one has to take the trace to K. I'll try to code this trace later. I will present an example using K=Q(sqrt(-11)) which has class number 1 so we don't have to worry about the Hilbert class field.

Let E be the elliptic curve 75a1. P=E.heegner_point(-11) and Q=P.point_exact(). Q is the point (-2 : a :1). One would think that "a" is a root of x^2+11, but it turns out (using parent() to check) that it is the root of f=x^2+x+3 which actually defines the same extension K. Now let p=79 which is inert in K. We let Qp be Q_{79} in sage. Then  we define W.<b>=Qp.ext(f). E_local=E.base_extend(W). Since b is a root of the polynomial f (defined over Qp) therefore to view Q as a point in W=Kq we write in sage: Q2=E_local([-2,b]). Hence I must write code to define a new point replacing "a" by "b".

Finally we compute Q2.is_divisible_by(p). This computation takes a long time! let g be the p-th division polynomial of Q2. The source code for the function is_divisible_by() shows that this function (using the polynomial g) finds all the points R such that pR=Q2 and then checks if this list is empty or not. All I need is to check if the polynomial g has a root in W. I seem to remember reading somewhere there was a "fast" algorithm for checking if a polynomial has a root in a p-adic field. I'll look into this now

Ahmed