division_points_scheme

586 days ago by daniel.disegni

#This should probably be implemented as an option in P.division_points(n, ---) def division_points_scheme(P,n): """ INPUT P: a point on an elliptic curve over a field n: a positive integer (not divisible by the characteristic of the aforementioned field) OUTPUT The finite subscheme of E consisting of n-th roots of P, given as a list of at most n points with coordinates in extensions of the ground field. This means that there is exactly one element of the list for each Galois orbit of n-th roots of P. *Warning*: each element of the output is a point defined over a different field; in particular, the "a"s that may appear in its coordinates bear no relations with those appearing in the coordinates of other elements of the output. """ nRootsofP=[] if P==E(0): nRootsofP.append(P) g = P.division_points(n,poly_only=true) for g1,e in factor(g): g1monic,d = sage.schemes.elliptic_curves.heegner.make_monic(g1); K.<a> = QQ.extension(g1monic) R.<y> = K['y'] EK = E.change_ring(K) ypoly = E.defining_polynomial()(a/d,y,1) ypoly1=factor(ypoly)[0][0] if ypoly1.degree()>1: ypoly1m, dd= sage.schemes.elliptic_curves.heegner.make_monic(ypoly1) J.<b> = K.extension(ypoly1m); EJ=EK.change_ring(J); newpoints=[EJ.lift_x(a/d)] else: EJ=EK; J=K; newpoints=[Q for Q in EJ.lift_x(a/d, all=True) if n*Q==EJ(P)] nRootsofP+=newpoints return nRootsofP 
       
E=EllipticCurve('11a'); P=E(0) S=division_points_scheme(P,5) print S print len(S) add([Q.domain().base_ring().absolute_degree() for Q in S]) 
       
[(0 : 1 : 0), (16 : 60 : 1), (16 : -61 : 1), (5 : 5 : 1), (5 : -6 : 1),
(1/5*a : 1/25*b : 1), (a : 1/11*a^3 + 6/11*a^2 + 19/11*a + 48/11 : 1),
(a : -1/11*a^3 - 6/11*a^2 - 19/11*a - 59/11 : 1), (a : 1/11*a^3 +
9/11*a^2 + 5*a + 35/11 : 1), (a : -1/11*a^3 - 9/11*a^2 - 5*a - 46/11 :
1)]
10
25
[(0 : 1 : 0), (16 : 60 : 1), (16 : -61 : 1), (5 : 5 : 1), (5 : -6 : 1), (1/5*a : 1/25*b : 1), (a : 1/11*a^3 + 6/11*a^2 + 19/11*a + 48/11 : 1), (a : -1/11*a^3 - 6/11*a^2 - 19/11*a - 59/11 : 1), (a : 1/11*a^3 + 9/11*a^2 + 5*a + 35/11 : 1), (a : -1/11*a^3 - 9/11*a^2 - 5*a - 46/11 : 1)]
10
25
E=EllipticCurve('37a'); P=E(0,0) S=division_points_scheme(P,3) print S print len(S) add([Q.domain().base_ring().absolute_degree() for Q in S]) 
       
[(a : -4/37*a^7 - 3/37*a^6 - 52/37*a^5 + 58/37*a^4 - 90/37*a^3 -
43/37*a^2 + 65/37*a - 25/37 : 1)]
1
9
[(a : -4/37*a^7 - 3/37*a^6 - 52/37*a^5 + 58/37*a^4 - 90/37*a^3 - 43/37*a^2 + 65/37*a - 25/37 : 1)]
1
9