Ask Your Question

Determining Elliptic Curve Components

asked 2018-11-13 20:02:38 -0500

octonion gravatar image

Say we have an elliptic curve:

R.<a,b,c> = QQ[]
cubic = a*(a+c)*(a+b)+b*(b+c)*(a+b)+c*(b+c)*(a+c)-4*(a+b)*(a+c)*(b+c)
E = EllipticCurve_from_cubic(cubic, morphism=False)

f = EllipticCurve_from_cubic(cubic, morphism=True)
finv = f.inverse()
generators = E.gens()

print("generators = %s" %(generators))


Elliptic Curve defined by y^2 + x*y = x^3 + 69*x^2 + 1365*x + 8281 over Rational Field
Elliptic Curve defined by y^2 + x*y + y = x^3 - 234*x + 1352 over Rational Field

generators = [(-39 : 52 : 1)]

How do we determine which of the two elliptic curve components a particular point is on? If we had this elliptic curve in the form $y^2 = x^3 + 109 x^2 + 234 x$ it'd be quite simple (if $x<0$ it's on the egg). Is there a nice way to automate this process in SageMath? For example, in this case the generator is on the egg.

edit retag flag offensive close merge delete

2 answers

Sort by ยป oldest newest most voted

answered 2018-11-14 07:48:39 -0500

rburing gravatar image

updated 2018-11-14 11:48:55 -0500

We can consider the Weierstrass equation $f(x,y) = 0$ (which is quadratic in $y$) and ask when the discriminant with respect to $y$ (which is a polynomial in $x$) is nonnegative (so that there is a real solution):

E = EllipticCurve([1,69,0,1365,8281])
f = E.defining_polynomial().subs({f.parent().gen(2) : 1})
R.<x> = QQ[]
S.<y> = R[]
discr = S(f).discriminant()
components = solve(SR(discr) >= 0, x)

This gives a list of intervals, which describe the real connected components:

[[x >= -13/8*sqrt(65) - 221/8, x <= 13/8*sqrt(65) - 221/8], [x >= -14]]

You can ask to which one a certain point P belongs:

P = E.gens()[0]
px = P.xy()[0];
component_index = [all(bool(eqn.subs(x=px)) for eqn in component) for component in components].index(True)
print('The point {} lies on component {}'.format(P, components[component_index]))

In this case:

The point (-39 : 52 : 1) lies on component [x >= -13/8*sqrt(65) - 221/8, x <= 13/8*sqrt(65) - 221/8]
edit flag offensive delete link more



Thanks! I found a slightly different method involving calculating the short Weierstrass form, then manually building and finding the roots of the cubic from the a2, a4 and a6 coefficients. But your method is much nicer and more general, and is greatly appreciated!

octonion gravatar imageoctonion ( 2018-11-14 14:44:43 -0500 )edit

answered 2020-05-28 11:26:10 -0500

John Cremona gravatar image

If P is the generator, use this:

sage: P.is_on_identity_component()

You can also see it with E.plot()+P.plot()!

edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower


Asked: 2018-11-13 19:59:02 -0500

Seen: 116 times

Last updated: yesterday