Usually, when using the constructor for a point of an elliptic curve E
, the point should have components living in the field of coefficients of E
. If not, sage tries to convert. In our case, the first conversion works, the second conversion fails. To fix this, use instead of I
the root of −1 that exists in the field with p2 elements. I will use j
instead of i and/or I. (So there is no need to restart sage...)
The second error comes from the fact that the polynomial is x(x−1)2. Using x(x−1) instead also fails. I tried to guess which is the isogeny to be used, using instead an explicit point P4(1,√2), which is 4--torsion.
The following code shows the solution in a decent case.
F = GF(127)
R.<x> = PolynomialRing(Fp)
K.<j> = F.extension( x^2 + 1 )
E0 = EllipticCurve( K, [1,0] )
assert E0.is_supersingular()
params = ( None, None, 9, 22 )
phiP = E0( [ params[2], params[3]] )
print "phiP =", phiP
phiQ = E0( [-params[2], j*params[3]] )
print "phiQ =", phiQ
E = EllipticCurve( K, [1,0] )
P4 = E( ( 1, sqrt(F(2)) ) )
phi = EllipticCurveIsogeny(E, P4)
print "phi is:\n%s\n" % phi
print "phi has the kernel polynomial %s" % phi.kernel_polynomial().factor()
The prints are, after a slight manual rearrangement:
phiP = (9 : 22 : 1)
phiQ = (118 : 22*j : 1)
phi is:
Isogeny of degree 4
from Elliptic Curve defined by y^2 = x^3 + x
over Finite Field in j of size 127^2
to Elliptic Curve defined by y^2 = x^3 + 83*x + 15
over Finite Field in j of size 127^2
phi has the kernel polynomial x * (x + 126)
Note that P4 is a point of order four, and the degree of ϕ is also four.
sage: P4.order()
4
sage: phi.degree()
4
The code can be now easily adapted to work over the more complicated posted situation.