## Summary

Detailed version of the article.
In this article, we describe an explicit method for performing a descent via isogeny on elliptic curves which have a rational torsion point of order N where N is any of the following: 4,5,7,8,9. As an additional goal, we have tried to implement the entire algorithm described in this article in PARI/GP. This has culminated in the creation of a PARI/GP function, SelmerBound(N,t), which gives a bound on the N-Selmer group of the elliptic curve E^N_t found in Table 1 in the above article. For example, SelmerBound(5,-1) returns 5. Now we see that N=5 and t=-1 corresponds to the elliptic curve E: y^2 - y = x^3 -x^2, so the 5-Selmer group of E has order 5. Since the 5-torsion group of E also has order 5, we can conclude that the rank of E is 0. Notice that at the moment, this function works for N equal to 5 and 7, but not for 4,8,9. The hope is to resolve this soon.

Be aware that this function is not working in full generality, but that most of the components that are used in its implementation are. Links to the .gp files containing those functions can be found on this page. In addition, we have included some documentation about how to use these functions. They can be used to verify many of the calculations in the article or to construct new examples.

Note that the general outline for the method is based on work by Edward Schaefer in "Computing a Selmer group of a Jacobian using functions on the curve". More examples of this method for descent via 2-isogeny on hyperelliptic curves can by found in Prolegomena to a Middlebrow Arithmetic of Curves of Genus 2.

## The Files

isogeny.gp
dual_isogeny.gp
descent1.gp
descent2.gp

The best way to use these files is to edit your .gprc file to include the above .gp files (see this page for instructions). If they interfere with your other work later on, you can always remove them. Note that these functions were written using PARI/GP 2.1.7. If you are still using Version 2.1.6 or earlier, then you are almost certainly going to run into problems with any functions that do local calculations. This is because there is a bug in polrootspadic for some inputs of the form polrootspadic(x^q-k,p,M) where p|n. You may test to see if you have this problem by inputting polrootspadic(x^8-5,2,10). If you get *****root does not exist in rootpadic back, then you need to upgrade to the latest version of PARI/GP.

## A Bit of Documentation:

### Parametrized Families of Curves with Prescribed Torsion and Isogenies:

##### TateTorsion(N) : Torsion Order -> Model for X_1(N)
If E: y^2 + (1-w)*x*y + v*y = x^3 + v*x^2 is the equation for an elliptic curve with a rational torsion point of order N at the point (0,0), then TateTorsion(N) uses the group law to return a relation between v and w. This is an equation for the curve parametrizing the family of elliptic curves with a rational point of order N. That is, this function returns a model for the modular curve X_1(N). Note that this equation will almost certainly have singularities.
##### TorsionCurve(N,t) : Torsion Order, Rational Parameter -> Elliptic Curve with a Torsion Point of Order N
This function takes as input N in {4,5,7,8,9} and t in the rational numbers and returns the coefficients of the Weierstrass equation for the elliptic curve E^N_t from Table 1 in the above article (an elliptic curve from our one-parameter family of elliptic curves with a rational torsion point of order N). These are returned as a 5-component vector [a1,a2,a3,a4,a6], where it will always be the case that a2=a3 and a4=a6=0. Note that this output really is just a vector: users will need to take ellinit([a1,a2,a3,a4,a6]) in order to work with the elliptic curve E^N_t in PARI.
##### DualCurve(N,t) : Torsion Order, Rational Parameter -> Elliptic Curve Isogenous to TorsionCurve(N,t)
This function takes as input N in {4,5,7,8,9} and t in the rational numbers and returns the coefficients of the Weierstrass equation for the elliptic curve E'^N_t from Table 2 in the above article. E'^N_t is isogenous to E^N_t by an isogeny of degree N. This function implements Vélu's method, described in the above article.
##### IsogenyPhi(N,t,P) : Torsion Order, Rational Parameter, Point on E^n_t -> Phi(P)
This function takes as input N in {4,5,7,8,9}, t in the rational numbers, and a point P=[x,y] on E^N_t that is not in the kernel of the isogeny Phi. It then returns Phi(P) where Phi(P) is on E'^N_t. Usually, you would want to let P be a specific point on the curve (e.g. [1,2]), but you could also let P=[x,y] if you want to work with a general point. Doing this lets you retrieve the formula for the isogeny in the function field of the curve. This isogeny is constructed using Vélu's method.
##### IsogenyDual(N,t,P) : Torsion Order, Rational Parameter, Point on E'^n_t -> Dual(P)
This function takes as input N in {4,5,7,8,9}, t in the rational numbers, and a point P=[x,y] on E'^N_t that is not in the kernel of the dual isogeny Dual. It then returns Dual(P) where Dual(P) is on E^N_t. Usually, you would want to let P be a specific point on the curve (e.g. [1,2]), but you could also let P=[x,y] if you want to work with a general point. Doing this lets you retrieve the formula for the isogeny in the function field of the curve. This isogeny is constructed using Vélu's method, though it is not implemented as explicitly as in IsogenyPhi.
##### KernelDual(N,t) : Torsion Order, Rational Parameter -> Kernel of the Dual Isogeny
This function takes as input N in {4,5,7,8,9}, t in the rational numbers, and returns the kernel of the dual isogeny, Dual:E'^N_t -> E^N_t. Namely, the function returns a polynomial whose roots correspond to the x-coordinates of the points in the kernel of the dual isogeny.
##### OrderKernelDualp(N,t,p) : Torsion Order, Rational Parameter, Prime -> Order of the Kernel of the Dual Isogeny
This function takes as input N in {4,5,7,8,9}, t in the rational numbers, and a prime p. It then returns the number of Q_p points in the kernel of the dual isogeny. If p=0, then it returns the number of rational points in the kernel of the dual isogeny.

### Example Parametrized Torsion Families and Isogenies

We go over how to use TorsionCurve, DualCurve, IsogenyPhi, and IsogenyDual.

### The Descent Procedure:

##### BpgenQSp(N,t,p) : Torsion Order, Parameter, Prime -> Generators for Bp(Q(S,N))
Let N be in {4,5,7,8,9} and let t be a rational number. Let p be a prime in Q(S,N). Then BpgenQSp(N,t,p) returns the generators the image of Q(S,N) in Q_p^*/(Q_p^*)^N under the map B_p (and the identity, 1). See Chapter 3, Remark 1.0.8 for a diagram that may clarify this. For example, BpgenQSp(5,4,5) = [1,2,5], which says that Q_5^*/(Q_5^*)^5 = <2,5>.
##### Fmap(N,t) : Torsion Order, Parameter -> F map
This function returns the function F: E^N_t(Q)/Dual(E'^N_t(Q)) described in the above article.
##### Fo(P,N,t) : Point, Torsion Order, Parameter -> F(P)
This function finds F(P) where F: E(Q)/Dual(E'(Q)) -> Q(S,N).
##### Fpp(P,N,t,p) : Point, Torsion Order, Parameter, Prime -> F_p(P)
This function finds F_p(P) where F_p: E(Q_p)/Dual(E'(Q_p)) -> Q_p^*/(Q_p^*)^N. See Chapter 3, Section 1 and Section 3 for more information about this map. Note that our output is a 2-component vector: If z=F(P), then this function returns [factor(z), order(z)] where factor(z) is the factorization of z and order(z) is its order in our local quotient group.
##### FpSearchp(N,t,p) : Torsion Order, Parameter, Prime -> Set of generators for Q_p^*/(Q_p^*)^N
This function searches for generators for Q_p^*/(Q_p^*)^N. Our generators are returned as 2-component vectors: If z is a generator that we found, then this function (essentially) labels z as [factor(z), order(z)] factor(z) is the factorization of z and order(z) is its order in our local quotient group. This second component should not be viewed as the order of z in all cases, though. It is difficult to explain efficiently, but this second component is there as a way of counting how big of a subgroup of Q_p^*/(Q_p^*)^N the points we've found generates.
##### GammaDual(N,t) : Torsion Order, Parameter -> Lead Coeff of the Power Series Rep of the Dual Isogeny
This function returns the leading coefficient to the power series representation of the dual isogeny, Dual:E'^N_t -> E^N_t, as explained in Chapter 3, Definition 4.0.11 and Remark 4.0.12. In our case, this will always be N.
##### GammaPhi(N,t) : Torsion Order, Parameter -> Lead Coeff of Power Series Rep of the Isogeny Phi
This function returns the leading coefficient to the power series representation of the isogeny Phi:E^N_t -> E'^N_t as explained in Chapter 3, Definition 4.0.11 and Remark 4.0.12. In our case, this will always be 1.
##### GeneratorsKernelBpp(N,t,p) : Torsion Order, Rational Parameter, Prime -> Generators for the Kernel of Bp
This function takes as input N in {4,5,7,8,9}, t in the rational numbers, and a prime p. It then returns generators for the kernel of the map B_p: Q(S,N) -> Q_p^*/(Q_p^*)^N.
##### genQS(E,N) : Elliptic Curve, Torsion Order -> Generators for Q(S,N)
Let E be a 5-component vector [a1,a2,a3,a4,a6] describing an elliptic curve and let N be in {4,5,7,8,9}. Then QS(E,N) returns the generators for Q(S,N). If N is odd, then this is the set of primes of bad reduction and the prime dividing N. If N is even, then this set also includes -1.
##### IsLocalPoint(N,t,p,x1) : Torsion Order, Parameter, Prime, Integer -> p-adic point on E^N_t or 0
If there exists a point of the form [x1,y] on E^N_t for some y in Q_p, then the function returns [x1,y] to the precision O(p^30). Otherwise, it returns 0. Note that this precision may not be sufficient in larger calculations--please adjust it as necessary. At some point, the aim is to change this function so the p-adic precision adjusts automatically.
##### LocalSizep(N,t,p) : Torsion Order, Parameter, Prime -> The order of E^N_t(Q_p)/dual(E'^N_t(Q_p))
This function the order of the quotient group E^N_t(Q_p)/dual(E'^N_t(Q_p)).
##### ModuloPow(z,N) : Rational #,Positive Integer -> The Image of z in Q^*/(Q^*)^N
This function returns z modulo Nth powers. For example, ModuloPow(2*3^5*7^11,5) = 14 = 2*7. The output from this function is rather simple--note that this is not case for the p-adic analogue to this function, ModuloPowLocalp, given below.
##### ModuloPowLocalp(z,N,t,p) : Rational #,Torsion Order, Parameter, Prime -> The Image of z in Q_p^*/(Q_p^*)^N
Let N be in {4,5,7,8,9} and let z and t be rational numbers. Let p be a prime in Q(S,N). Then ModuloPowLocalp(z,N,t,p) returns the image of z in Bp(Q(S,N)), which is contained in Q_p^*/(Q_p^*)^N. This function serves a rather straightforward purpose, but its output is not quite as easy to grasp at first glance. Let b denote the image of z in Q_p^*/(Q_p^*)^N. Then the output of our function will actually be a 2-component vector where the first component is factor(b) (the factorization of b in PARI/GP using the factor function), and the order of b as an element of Q_p^*/(Q_p^*)^N. For example, ModuloPowLocalp(2^-7,9,2,2) = [Mat([2, 2]), 9], which is equivalent to saying that b=4 and the order of 4 is 9 in Q_2^*/(Q_2^*)^9.
Note that this function does not return results that are guaranteed to be correct when N=4,8 because there is a part of this function which needs fixing.
##### SelmerBound(N,t) : Torsion Order, Parameter -> Bound on Order of N-Selmer Group of E^N_t
This function computes an upper bound on the order of the N-Selmer group of E^N_t. As long as the Tate-Shafarevich groups of E'^N_t and E^N_t are trivial, then this bound will allow us to determine the rank of E^N_t. Note that this function is still being developed--it will not work in every case. If you tried an example that did not work, please send an email with the N and t you tried, along with the error message you received. If you received an error message about your stack size being too small, try allocatemem() to allow PARI to use more memory to compute. If you received the message *****root does not exist in rootpadic, then you need to upgrade to the latest version of PARI/GP. Note that this function only works for N=5,7 at the moment, but the aim is to get it working for N=4,8,9 soon.
##### QS(E,N) : Elliptic Curve, Torsion Order -> Exceptional Primes
Let E be a 5-component vector [a1,a2,a3,a4,a6] describing an elliptic curve and let N be in {4,5,7,8,9}. Then QS(E,N) returns the set of primes of dividing the discriminant of E, plus the prime dividing N.