Isogeny_Computations_Find_Bugs

332 days ago by Ben.LeVeque

x = var('x') K.<a> = NumberField(x^2-x-1) import psage.modform.hilbert.sqrt5.tables as sqrt5 
       
def ap(E,p): return E.change_ring(p.residue_field()).trace_of_frobenius() R.<ch> = GF(2)[] def frob(E,p): t = ap(E,p) return ch^2 - ap(E, p)*ch + int(p.norm()) def disc(E, p): t = ap(E, p) return t^2 - 4*p.norm() def isogeny_primes(E, norm_bound, isog_degree_bound): P = [p for p in sqrt5.ideals_of_bounded_norm(norm_bound) if p.is_prime() and E.has_good_reduction(p)] w = set(primes(isog_degree_bound+1)) i = 0 w.remove(2) while len(w) > 0 and i < len(P): d = disc(E, P[i]) w = [ell for ell in w if not (legendre_symbol(d,ell) == -1)] i = i +1 i = 0 while i < len(P): if frob(E,P[i]).is_irreducible(): break i = i+1 if i == len(P): w.insert(0,2) return w 
       
def isogeny_class_computation(E,p): if p != 2: E = E.short_weierstrass_model() F = E.division_polynomial(p).change_ring(K) f = F.factor() i=0 S.<x> = K[] t=f[0][0].degree() w=[S(1)] while t < (p+1)/2: for j in w: if (j*f[i][0]).degree() < (p +1)/2 and (j*f[i][0]).divides(F): w.append(j*f[i][0]) t = f[i+1][0].degree() i+=1 v=[] for f in w: try: v.append(E.change_ring(K).isogeny(f).codomain()) except ValueError: pass v = [F.change_ring(K).global_minimal_model() for F in v] return v else: w = [Q for Q in E.torsion_subgroup() if order(Q)==2] v = [E.isogeny(E(Q)).codomain() for Q in w] v.insert(0,E) return v 
       
def curve_isogeny_classes(E): isolist = isogeny_primes(E,1000,1000) for i in isolist: print i,'- isogeny class: ' for j in isogeny_class_computation(E,i): print ' ',j.a_invariants() 
       
E = EllipticCurve(K,[1,0,1,-1,-2]) 
       
time curve_isogeny_classes(E) 
       
3 - isogeny class: 
   (1, 0, 1, -1, -2)
   (1, 0, 1, -126, -552)
5 - isogeny class: 
   (1, 0, 1, -1, -2)
   (1, 1, 1, -3, 1)
Time: CPU 4.51 s, Wall: 4.51 s
3 - isogeny class: 
   (1, 0, 1, -1, -2)
   (1, 0, 1, -126, -552)
5 - isogeny class: 
   (1, 0, 1, -1, -2)
   (1, 1, 1, -3, 1)
Time: CPU 4.51 s, Wall: 4.51 s