%cython
##############################################
# The following is code to find curves using
# torsion families. It uses cython code to
# calculate the discriminant of a curve from
# its a-invariants.
##############################################
from libc.stdint cimport uint32_t, int32_t, uint64_t, int64_t
from sage.schemes.elliptic_curves.constructor import EllipticCurve
from psage.modform.hilbert.sqrt5.sqrt5 import F as K
from sage.rings.integer cimport Integer
cdef int64_t quick_disc_norm(int32_t A, int32_t B, int32_t C, int32_t D, int32_t E, int32_t F, int32_t G, int32_t H, int32_t I, int32_t J):
cdef int32_t b21, b22, b41, b42, b61, b62, b81, b82, disc1, disc2, tp1,tp2,tp3,tp4,tp5,tp6
cdef int64_t temp, ret
cdef mpz_t s,t,u
b21 = A**2+B**2+4*C
b22 = B**2+2*A*B+4*D
tp1 = A*E+B*F
tp2 = A*F+B*(E+F)
b41 = tp1+2*G
b42 = tp2+2*H
tp3 = E**2+F**2
tp4 = 2*E*F+F**2
b61 = tp3+4*I
b62 = tp4+4*J
b81 = b21*I+b22*J-G*tp1-H*tp1+C*tp3+D*tp4-G**2-H**2
b82 = b21*J+b22*(I+J)-H*(tp1+tp2)-G*tp2+D*(tp3+tp4)+C*tp4-2*G*H-H**2
tp1 = b21**2+b22**2
tp2 = 2*b21*b22+b22**2
tp3 = b41**2+b42**2
tp4 = 2*b41*b42+b42**2
tp5 = b21*b41+b22*b42
tp6 = b21*b42+b22*b41+b22*b42
disc1 = -(tp1)*b81-(tp2)*b82-8*(tp3)*b41-8*(tp4)*b42-27*(b61**2+b62**2)+9*(tp5)*b61+9*(tp6)*b62
disc2 = -(tp1)*b82-(tp2)*(b81+b82)-8*(tp3)*b42-8*(tp4)*(b41+b42)-27*(2*b61*b62+b62**2)+9*(tp5)*b62+9*(tp6)*(b61+b62)
ret = disc1**2+disc1*disc2-disc2**2
return ret
################################################
# Below we define functions to compute
# curves with given torsion structure using
# the parametrizations given in Kubert's
# paper. Note: some of these parametrizations
# need four values while others only need
# two. This can be cleaned up a lot by defining
# a function that all of them call to check
# the discriminant, print a curve if necessary,
# etc... Some of the methods below can also
# be sped up by working component-wise and not
# introducing a = K.gens(0) until as late as
# possible.
################################################
#def check_disc_cond(
def family2_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v,y,z
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
for y in range(-B,B+1):
for z in range(-B,B+1):
if abs(u)>=L or abs(v)>=L or abs(y)>=L or abs(z)>=L:
N_d = quick_disc_norm(0,0,u,v,0,0,y,z,0,0)
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
a = K.gen(0)
E = EllipticCurve(K,[0,u+v*a,0,y+z*a,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break
def family3_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v,y,z
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
for y in range(-B,B+1):
for z in range(-B,B+1):
if abs(u)>=L or abs(v)>=L or abs(y)>=L or abs(z)>=L:
N_d = quick_disc_norm(u,v,0,0,y,z,0,0,0,0)
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
a = K.gen(0)
E = EllipticCurve(K,[u+v*a,0,y+z*a,0,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break
def family7_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
if abs(u)>=L or abs(v)>=L:
tp1 = u**2+v**2
tp2 = 2*u*v+v**2
c1 = tp1 - u
c2 = tp2 - v
b1 = tp1*u + tp2*v -tp1
b2 = tp1*v+tp2*(u+v)-tp2
N_d = quick_disc_norm(1-c1,-c2,-b1,-b2,-b1,-b2,0,0,0,0)
#print N_d
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
a = K.gen(0)
E = EllipticCurve(K,[1-(c1+c2*a),-b1-b2*a,-b1-b2*a,0,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break
def family5_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
if abs(u)>=L or abs(v)>=L:
N_d = quick_disc_norm(1-u,-v,-u,-v,-u,-v,0,0,0,0)
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
a = K.gen(0)
E = EllipticCurve(K,[1-(u+v*a),-u-v*a,-u-v*a,0,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break
def family2x2_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v,y,z
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
for y in range(-B,B+1):
for z in range(-B,B+1):
if abs(u)>=L or abs(v)>=L or abs(y)>=L or abs(z)>=L:
N_d = quick_disc_norm(0,0,u+y,v+z,0,0,u*y+v*z,u*z+v*y+v*z,0,0)
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
a = K.gen(0)
E = EllipticCurve(K,[0,(u+y)+(v+z)*a,0,(u*y+v*z)+(u*z+v*(y+z))*a,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break
def family6_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
if abs(u)>=L or abs(v)>=L:
b1 = u**2+v**2+u
b2 = 2*u*v+v**2+v
N_d = quick_disc_norm(1-u,-v,-b1,-b2,-b1,-b2,0,0,0,0)
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
a = K.gen(0)
E = EllipticCurve(K,[1-(u+v*a),-b1-b2*a,-b1-b2*a,0,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break
def family10_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
if abs(u)>=L or abs(v)>=L:
a=K.gen(0)
f = u+v*a
if f!=(f-1)**2:
d = f**2/(f-(f-1)**2)
c = f*d-f
b = c*d
N_d = quick_disc_norm(1-c[0],-c[1],-b[0],-b[1],-b[0],-b[1],0,0,0,0)
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
E = EllipticCurve(K,[1-c,-b,-b,0,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break
def family4_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
if abs(u)>=L or abs(v)>=L:
N_d = quick_disc_norm(1,0,-u,-v,-u,-v,0,0,0,0)
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
a = K.gen(0)
E = EllipticCurve(K,[1,-u-v*a,-u-v*a,0,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break
def family8x2_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
if abs(u)>=L or abs(v)>=L:
a = K.gen(0)
alpha = u+v*a
d = alpha*(8*alpha+2)/(8*alpha^2-1)
b = (2*d-1)*(d-1)
c = (2*d-1)*(d-1)/d
N_d = quick_disc_norm(c[1-c[0],-c[1],-b[0],-b[1],-b[0],-b[1],0,0,0,0)
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
a = K.gen(0)
E = EllipticCurve(K,[1-c,-b,-b,0,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break
def family8_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
if abs(u)>=L or abs(v)>=L:
a = K.gen(0)
d = u+v*a
b = (2*d-1)*(d-1)
c = (2*d-1)*(d-1)/d
N_d = quick_disc_norm(c[1-c[0],-c[1],-b[0],-b[1],-b[0],-b[1],0,0,0,0)
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
a = K.gen(0)
E = EllipticCurve(K,[1-c,-b,-b,0,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break
def family6x2_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
if abs(u)>=L or abs(v)>=L:
a = K.gen(0)
alpha = u+v*a
c = (10-2*alpha)/(alpha^2-9)
b = c+c^2
N_d = quick_disc_norm(c[1-c[0],-c[1],-b[0],-b[1],-b[0],-b[1],0,0,0,0)
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
a = K.gen(0)
E = EllipticCurve(K,[1-c,-b,-b,0,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break
def family12_new_curve_check(norm_list, uint32_t B, uint32_t L = 0):
cdef int32_t u,v
cdef int64_t N_d
for u in range(-B,B+1):
for v in range(-B,B+1):
if abs(u)>=L or abs(v)>=L:
a = K.gen(0)
t = u+v*a
m = (3*t-3*t^2-1)/(t-1)
f = m/(1-t)
d = m+t
c = f*d-f
b = c*d
N_d = quick_disc_norm(c[1-c[0],-c[1],-b[0],-b[1],-b[0],-b[1],0,0,0,0)
if N_d != 0:
for N in norm_list:
if N_d%N:
continue
else:
a = K.gen(0)
E = EllipticCurve(K,[1-c,-b,-b,0,0])
cond = E.conductor()
if cond.norm() in norm_list:
print cond.norm(),'---', cond,'---',E.a_invariants()
break