Ask Your Question
1

How to find the generator of the points on the quartic curve?

asked 2020-08-05 11:36:20 +0100

Gamzeee gravatar image

updated 2020-08-05 12:36:07 +0100

slelievre gravatar image

How to find the generator of the points on a quartic curve?

For example, given the curve

y^2 = -2500*x^4 + 451976*x^2 - 2500

how do I find the generator of the points on that curve?

edit retag flag offensive close merge delete

1 Answer

Sort by » oldest newest most voted
2

answered 2020-08-05 19:09:30 +0100

dan_fulea gravatar image

updated 2020-08-05 19:13:45 +0100

To use the sage libraries, we bring the quartic into the Weierstraß form.

First of all, we need a rational point at least on the curve. (I suppose we are working over $\Bbb Q$.) Let us search for a "simple integer" that makes the R.H.S. of the given equation, here using variables $\xi,v$ $$ E(\xi,v)\ :\ y^2 = -2500\xi^4 + 451976\xi^2 - 2500 $$

sage: [xi for xi in [0..200] if (-2500*xi^4 + 451976*xi^2 - 2500).is_square()]                                                                  
[5]

OK, we are lucky, and take the $5$, then slightly change the equation for $(E)$ using the substitution $\xi=u+5$, $u=\xi-5$, so that $u=0$ is leading to a point $(0,3120)=(0,q)$ on the transformed curve:

$$ E(u,v)\ :\ v^2 = -2500u^4 + 50000u^3 + 76976u^2 - 3269760u + \underbrace{9734400}_{q^2}\ . $$ Code finding this equation:

sage: var('u'); 
sage: def f(xi):
....:     return  -2500*xi^4 + 451976*xi^2 - 2500 
....:        

sage: f(u+5).factor()                                                                                                                       
-4*(25*u^2 + 588*u + 2340)*(25*u^2 - 88*u - 1040)
sage: f(u+5).expand()                                                                                                                       
-2500*u^4 - 50000*u^3 + 76976*u^2 + 3269760*u + 9734400

sage: sqrt(9734400)
3120

Now we proceed as in [Ian Conell, Elliptic Curves Hanbook, page 105, Quartic to Weierstrass] . (Wonderful exposition.)

Consider the substitutions that apply in the general situation of a quartic with a rational point (without loss of generality moved in the position $(0,q)$), given by $v^2=au^4 + bu^3 + cu^2 + du+q^2$: $$ x = ( Q(v+q)+du )/u^2\ , $$ $$ y = ( Q^2(v+q) + Q(cu^2+du) - d^2u^2/Q)/u^3\ . $$

See also

https://ask.sagemath.org/question/36637/change-of-variable-from-hyperellictic-curve-to-weierstrass-form/

https://ask.sagemath.org/question/37478/transform-quartic-to-weierstrass/

for other examples.

Then the following code finds the cubic:

var( 'u,v' );

a, b, c, d, q = -2500, -50000, 76976, 3269760, 3120
Q = 2*q

def f(u):
    return a*u^4 + b*u^3 + c*u^2 + d*u + q^2

x = ( Q*(v+q) + d*u ) / u^2
y = ( Q^3*(v+q) + Q^2*( d*u + c*u^2 ) - d^2*u^2 ) / Q / u^3

# inverse transformation:
# u = ( Q*(x+c) - d^2/Q ) / y
# v = -q + u*(u*x-d)/Q

# one can easily define rational functions (u,v) -> (x,y) and (x,y) -> (u,v)
# to be used in the concrete situation

a1 = d/q
a2 = c - (d/Q)^2
a3 = b*Q
a4 = -a*Q^2
a6 = a2*a4

( ( y^2 + a1*x*y + a3*y ) - ( x^3 + a2*x^2 + a4*x + a6 ) ) . factor()

The above gives:

80990208000
    *(2500*u^4 + 50000*u^3 - 76976*u^2 + v^2 - 3269760*u - 9734400)
    *(95*u^2 - 1572*u - 3*v - 9360)/u^6

(The result was manually broken to fit somehow in shorter lines.) One factor corresponds to the equation of $E(u,v)$ after using the birational transformations mentioned in the code. Now we consider the corresponding curve, and ask for rank, and generator(s).

E = EllipticCurve(QQ, [a1, a2, a3, a4, a6])
print(f"E is the elliptic curve:\n{E}")
print(f"E has rank {E.rank()}")
P = E.gens()[0]
print(f"Generator: P = {P.xy()}")

We obtain (result manually broken again):

E is the elliptic curve:
Elliptic Curve defined by 
    y^2 + 1048*x*y - 312000000*y = x^3 - 197600*x^2 + 97344000000*x - 19235174400000000
over Rational Field
E has rank 1
Generator: P = (4798560, 8222323200)

It remains to bring this generator back in the $(u,v)$ then $(\xi,v)$ word.

x, y = P.xy()
u = ( Q*(x+c) - d^2/Q ) / y
v = -q + u*(u*x-d)/Q
xi = u + 5
print(f"(xi, v) = ({xi}, {v})")

We get:

(xi, v) = (1537/181, 145001328/32761)

Well, this is an "ugly" point... To get simpler points, we many try...

points = []
for n in [-5..-1] + [1..5]:
    for T in E.torsion_points():
        R = n*P + T
        x, y = R.xy()
        u = ( Q*(x+c) - d^2/Q ) / y
        v = -q + u*(u*x-d)/Q
        xi = u + 5
        points.append((xi, v))

points.sort(key=lambda point: len(str(point)))
for point in points[:8]:
    print(point)

But in the list there are no really simpler points. Here is the list, reminding us that the given equation was reciprocal on the R.H.S. :

(1537/181, 145001328/32761)
(-1537/181, 145001328/32761)
(1537/181, -145001328/32761)
(181/1537, 145001328/2362369)
(-1537/181, -145001328/32761)
(-181/1537, 145001328/2362369)
(181/1537, -145001328/2362369)
(3281/9125, 787407504/3330625)

Let us check that the first point is on the given curve:

def p(xi, v):
    return v^2 - ( -2500*xi^4 + 451976*xi^2 - 2500 )
print(p(1537/181, 145001328/32761))

Yes, we obtain a clean zero.

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

Stats

Asked: 2020-08-05 11:36:20 +0100

Seen: 4,671 times

Last updated: Aug 05 '20