References:
https://en.wikipedia.org/wiki/Imaginary_hyperelliptic_curve
The question implicitly assumes there is such a divisor. In order to have a "normal situation" (small(er) prime p, so that the prints are suited to the width of this page, that still captures the solution, its idea, and where the claimed divisor is really a divisor) let us make a small computation in Z[x]:
R.<x> = ZZ[]
f, h = x^5 + x^3 + 1, x^2 + x
u, v = x^2 + 18*x, 17*x + 1
(f -h*v - v^2) % u
This gives:
sage: (f -h*v - v^2) % u
105283*x
Note that we have the factorization:
sage: factor(105283)
127 * 829
So let p be one of the two factors, my choice is 127. We will work with this prime a while. Finally there will be also the following bigger prime p involved in a small note:
sage: p = next_prime(2^160)
sage: p
1461501637330902918203684832716283019655932542983
Then we can initialize the corresponding divisor in Mumford coordinates as follows:
p = 127
K = GF(p)
R.<x> = K[]
f, h = x^5 + x^3 + 1, x^2 + x
C = HyperellipticCurve( f, h )
J = C.jacobian()
X = J(K)
u, v = x^2 + 18*x, 17*x + 1
D = X( [u,v] )
print D
This gives:
(x^2 + 18*x, y + 110*x + 126)
Observation:
sage: K(110/126)
17
Note that modulo p=127 we have the fulfilled condition that u divides v2+vh−f.
sage: factor( v^2 +v*h - f )
(126) * x * (x + 18) * (x^3 + 109*x^2 + 54*x + 118)
Note: A more sophisticated way to get the divisor D among those with given u is as follows. The roots of u=x(x+18) are 0 and −18. We associate the corresponding points / lifts P,Q as follows:
CP, CQ = C.lift_x(0), C.lift_x(-18)
JP, JQ = J(CP), J(CQ)
print "JP = %s" % JP
print "JQ = %s" % JQ
print "+JP+JQ = %s" % (+JP+JQ)
print "+JP-JQ = %s" % (+JP-JQ)
print "-JP+JQ = %s" % (-JP+JQ)
print "-JP-JQ = %s" % (-JP-JQ)
This gives:
JP = (x, y + 126)
JQ = (x + 18, y + 1)
+JP+JQ = (x^2 + 18*x, y + 14*x + 126)
+JP-JQ = (x^2 + 18*x, y + 110*x + 126)
-JP+JQ = (x^2 + 18*x, y + 1)
-JP-JQ = (x^2 + 18*x, y + 96*x + 1)
One of the values is our D.
Note: As promised, let us also do some related computations for the bigger prime 1461501637330902918203684832716283019655932542983
. Same code, but this prime:
p = next_prime(2^160)
K = GF(p)
R.<x> = K[]
f, h = x^5 + x^3 + 1, x^2 + x
C = HyperellipticCurve( f, h )
J = C.jacobian()
X = J(K)
u, v = x^2 + 18*x, 17*x + 1
D = X( [u,v] )
print D
This runs immediately into the
ValueError: Argument polys (= (x^2 + 18*x, 17*x + 1)) must be divisor
on curve Hyperelliptic Curve
over Finite Field of size 1461501637330902918203684832716283019655932542983
defined by y^2 + (x^2 + x)*y = x^5 + x^3 + 1.
The error was manually reshaped.
Note: We can construct now corresponding divisors with u=x2+18x in the same way:
CP, CQ = C.lift_x(0), C.lift_x(-18)
JP, JQ = J(CP), J(CQ)
print "JP = %s" % JP
print "JQ = %s" % JQ
print "+JP+JQ = %s" % (+JP+JQ)
print "+JP-JQ = %s" % (+JP-JQ)
print "-JP+JQ = %s" % (-JP+JQ)
print "-JP-JQ = %s" % (-JP-JQ)
To see why i preferred to use 127 instead, here is the result:
JP = (x, y + 1461501637330902918203684832716283019655932542982)
JQ = (x + 18, y + 1256459954126949149574270634668696857738035268857)
+JP+JQ = (x^2 + 18*x, y + 742142023287893335136809871805229629934516120054*x + 1461501637330902918203684832716283019655932542982)
+JP-JQ = (x^2 + 18*x, y + 1044137755672099120445471590403560727422734765797*x + 1461501637330902918203684832716283019655932542982)
-JP+JQ = (x^2 + 18*x, y + 417363881658803797758213242312722292233197777169*x + 1)
-JP-JQ = (x^2 + 18*x, y + 719359614043009583066874960911053389721416422912*x + 1)