# y-coordinate of a 4-torsion point

I want to find the y-coordinate of a 4-torsion point. I have the following code where I found the x-coordinate

E3=EllipticCurve([0,0,0,-3267,45630])
E=E3.division_polynomial(4);E
E.factor()


which gives

8*(x^4 + 30*x^3 - 18252*x^2 + 280530*x + 6465339)*(x^2 + 15*x - 3042)*(x^2 - 30*x + 2817)*(x - 15)


Then I factor $x^2 - 30x + 2817$ in $\mathbb{Q}(\sqrt{-2})$ and I got $[(-36\sqrt{-2} + 15, 1), (36\sqrt{-2} + 15, 1)]$ which is my x-coordinate. How to get the y-coordinate? If I denote $\sqrt{-2}=B$, then I have $x=15\pm 36B$. And I substitute it into my elliptic curve gives

B = var('B')
y2=x^3-3267*x+45630;y2
y=y2.subs({x:15+36*B});y
Y=y.simplify_full();Y
YY=Y.subs({B^2:-2});YY
YYY=YY.subs({B^3:-2*B});YYY


which equals to $y^2=186624B-116640$. How to get the y-coordinate. By trying an error multiple times (using PARI-gp) I manage to get y-coordinate as $y=27a^3-135a-108aB$ with $a^4-5a^2-32=0$ and $B^2=-2$. But i got this by trying an error comparing LHs and RHS equation. Not straight away from $y^2=186624B-116640$. I tried the following but it did not work :

K.<a> = NumberField(x^4 -5*x^2-32); K
f = K.factor(186624*B-116640); f

edit retag close merge delete

Can you edit your question and add the code for each step? For instance, when you write

And I substitute it into my elliptic curve gives me y^2 = 186624* B − 116640.

What code do you use to get that?

Also, make sure someone can replicate the code in your question in a fresh Sage session.

For instance, your last line involves B, but you didn't provide code that defines it.

( 2016-11-04 03:19:17 -0500 )edit

@slelievre Sorry I will edit this. Thank you.

( 2016-11-04 05:44:16 -0500 )edit

Sort by » oldest newest most voted

I would recommend to avoid Sage's symbolic ring for such computations.

The best here is to use algebraic numbers, which form the ring QQbar, and to work with polynomials over that ring.

For reference here is the Sage version I am working with.

sage: version()
'SageMath version 7.3, Release Date: 2016-08-04'


This is one way you could work.

sage: E3 = EllipticCurve([0, 0, 0, -3267, 45630])
sage: E = E3.division_polynomial(4); E
8*x^9 - 156816*x^7 + 7665840*x^6 - 25044299280*x^4 + 1873623790224*x^3 - 35065596749040*x^2 - 258340569679368*x + 6648422400893520
sage: E.parent()
Univariate Polynomial Ring in x over Rational Field


Here is how this polynomial factors over QQ:

sage: E.factor()
(8) * (x - 15) * (x^2 - 30*x + 2817) * (x^2 + 15*x - 3042) * (x^4 + 30*x^3 - 18252*x^2 + 280530*x + 6465339)


The list of factors over QQ:

sage: list(E.factor())
[(x - 15, 1),
(x^2 - 30*x + 2817, 1),
(x^2 + 15*x - 3042, 1),
(x^4 + 30*x^3 - 18252*x^2 + 280530*x + 6465339, 1)]


Let us select one factor:

sage: p = E.factor()[1][0]; p
x^2 - 30*x + 2817
sage: p.parent()
Univariate Polynomial Ring in x over Rational Field


This factor lives in QQ[x]. Let us change to QQbar[x].

sage: P.<x> = QQbar[]
sage: p = P(p); p
x^2 - 30*x + 2817
sage: p.parent()
Univariate Polynomial Ring in x over Algebraic Field


Now this polynomial factors completely, and has two roots of multiplicity one.

sage: p.factor()
(x - 15.00000000000000? - 50.91168824543143?*I) * (x - 15.00000000000000? + 50.91168824543143?*I)
sage: p.roots()
[(15.00000000000000? - 50.91168824543143?*I, 1),
(15.00000000000000? + 50.91168824543143?*I, 1)]


sage: roots = p.roots(multiplicities=False); roots
[15.00000000000000? - 50.91168824543143?*I,
15.00000000000000? + 50.91168824543143?*I]


Let us enter by hand the polynomial associated with E3.

sage: q = x^3 - 3267*x + 45630; q
x^3 - 3267*x + 45630
sage: q.parent()
Univariate Polynomial Ring in x over Algebraic Field


[Exercise: try to get hold of this polynomials starting from E3 instead of entering it by hand.]

Now for each root r of p, the corresponding y-value on E3 is sqrt(q(r)).

sage: for (x, y) in [(r, sqrt(q(r))) for r in roots]:
....:     print 'xr = {} = {}'.format(x, x.radical_expression())
....:     print 'yr = {} = {}\n'.format(y, y.radical_expression())
....:
xr = 15.00000000000000? - 50.91168824543143?*I = -36*I*sqrt(2) + 15
yr = 293.1820459230292? + 450.1063341607327?*I = 27*sqrt(256*I*sqrt(2) - 160)

xr = 15.00000000000000? + 50.91168824543143?*I = 36*I*sqrt(2) + 15
yr = 293.1820459230292? - 450.1063341607327?*I = 27*sqrt(-256*I*sqrt(2) - 160)


These are algebraic numbers and maybe their minimal polynomial is useful.

sage: for (x, y) in [(r, sqrt(q(r))) for r in roots]:
....:     print 'xr has minpoly {}'.format(x.minpoly())
....:     print 'yr has minpoly {}\n'.format(y.minpoly())
....:
xr has minpoly x^2 - 30*x + 2817
yr has minpoly x^4 + 233280*x ...
more

Thank you so much Sir for your answer. This is perfect way for me to play around with the code to get what I am looking for as it is so detailed. Thank you again!

( 2016-11-05 06:55:55 -0500 )edit