(*^ ::[paletteColors = 128; currentKernel; fontset = title, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeTitle, center, M7, bold, e8, 24, "Times"; ; fontset = subtitle, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeTitle, center, M7, bold, e6, 18, "Times"; ; fontset = subsubtitle, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeTitle, center, M7, bold, e6, 14, "Times"; ; fontset = section, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeSection, grayBox, M22, bold, a20, 14, "Times"; ; fontset = subsection, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeSection, blackBox, M19, bold, a15, 12, "Times"; ; fontset = subsubsection, inactive, noPageBreakBelow, nohscroll, preserveAspect, groupLikeSection, whiteBox, M18, bold, a12, 10, "Times"; ; fontset = text, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 12, "Times"; ; fontset = smalltext, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 10, "Times"; ; fontset = input, noPageBreakInGroup, nowordwrap, preserveAspect, groupLikeInput, M42, N23, bold, 12, "Courier"; ; fontset = output, output, inactive, noPageBreakInGroup, nowordwrap, preserveAspect, groupLikeOutput, M42, N23, 12, "Courier"; ; fontset = message, inactive, noPageBreakInGroup, nowordwrap, preserveAspect, groupLikeOutput, M42, N23, R65535, 12, "Courier"; ; fontset = print, inactive, noPageBreakInGroup, nowordwrap, preserveAspect, groupLikeOutput, M42, N23, 12, "Courier"; ; fontset = info, inactive, noPageBreakInGroup, nowordwrap, preserveAspect, groupLikeOutput, M42, N23, 12, "Courier"; ; fontset = postscript, PostScript, formatAsPostScript, output, inactive, noPageBreakInGroup, nowordwrap, preserveAspect, groupLikeGraphics, M7, l34, w282, h287, 12, "Courier"; ; fontset = name, inactive, nowordwrap, nohscroll, noKeepOnOnePage, preserveAspect, M7, italic, B65535, 10, "Geneva"; ; fontset = header, inactive, noKeepOnOnePage, preserveAspect, M7, 10, "Times"; ; fontset = Left Header, inactive, 10, "Times"; ; fontset = footer, inactive, noKeepOnOnePage, preserveAspect, center, M7, 12, "Times"; ; fontset = Left Footer, inactive, center, 12, "Times"; ; fontset = help, inactive, nohscroll, noKeepOnOnePage, preserveAspect, M7, 10, "Geneva"; ; fontset = clipboard, inactive, noKeepOnOnePage, preserveAspect, M7, 12, "New York"; ; fontset = completions, inactive, nowordwrap, noKeepOnOnePage, preserveAspect, M7, 12, "New York"; ; fontset = special1, inactive, nowordwrap, noKeepOnOnePage, preserveAspect, M7, 12, "New York"; ; fontset = special2, inactive, nowordwrap, noKeepOnOnePage, preserveAspect, center, M7, 12, "New York"; ; fontset = special3, inactive, nowordwrap, noKeepOnOnePage, preserveAspect, right, M7, 12, "New York"; ; fontset = special4, inactive, nowordwrap, noKeepOnOnePage, preserveAspect, M7, 12, "New York"; ; fontset = special5, inactive, nowordwrap, noKeepOnOnePage, preserveAspect, M7, 12, "New York"; ;] :[font = title; inactive; Cclosed; dontPreserveAspect; startGroup; ] Elliptic Curve Calculator :[font = subsubtitle; inactive; dontPreserveAspect; ] Version 2.0 Ñ July 25th, 1992 Joseph H. Silverman Mathematics Department Brown University Providence, RI 02912 Email: joseph_silverman@brown.edu jhs@gauss.math.brown.edu Paul van Mulbregt Dragon Systems Newton, MA 02160 Email: paulvm@dragonsys.com :[font = text; inactive; dontPreserveAspect; center; endGroup; ] A collection of Mathematica routines to perform calculations on elliptic curves defined over the rational numbers. Elliptic Curve Calculator copyright 1990-92, Joseph H. Silverman Mathematica is a trademark of Wolfram Research Inc. ;[s] 5:0,0;16,1;27,0;183,1;194,0;235,-1; 2:3,14,9,Times,0,12,0,0,0;2,14,9,Times,2,12,0,0,0; :[font = section; inactive; Cclosed; dontPreserveAspect; startGroup; ] READ ME FIRST :[font = text; inactive; dontPreserveAspect; endGroup; ] The Elliptic Curve Calculator (ECC) is a collection of Mathematica routines to perform calculations on elliptic curves defined over the rational numbers. The routines are contained in the section "Function Definitions for Elliptic Curve Calculator". In order to run ECC you must activate these functions. The easiest way to do this is to click "Yes" when Mathematica asks if you want to "automatically evaluate all Initialization cells" or by choosing "Evaluate Initialization" from the "Action" menu. All of the functions available in the ECC are described in the section "Description of Functions and Parameters Available with the Elliptic Curve Calculator". The alphabetical list of functions may prove especially useful. To see ECC in action, you can browse through the "Sample Sessions", which illustrate many of ECC's capabilities. You are currently using Elliptic Curve Calculator Version 2.0 Release Date: July 25th, 1992 Please send comments, suggestions, bug reports, etc., to Joseph H. Silverman Mathematics Department Brown University Providence, RI 02912 USA email: < ma420000@brownvm.bitnet > < ma420000@brownvm.brown.edu > In order to receive the latest version of the Elliptic Curve Calculator, please send a self-addressed mailer and a formatted disk to the above address. The current version number can be obtained from the above email address. It is unlikely that a new release will be ready before Fall, 1993. The Elliptic Curve Calculator may be freely distributed, but may not be included on any disk that is sold (even at cost) without the written consent of the author. Elliptic Curve Calculator copyright 1990, Joseph H. Silverman Mathematica is a trademark of Wolfram Research Inc. ;[s] 13:0,0;55,1;66,0;881,2;918,0;946,2;961,0;1272,2;1293,0;1300,2;1314,0;1707,1;1718,0;1759,-1; 3:7,14,9,Times,0,12,0,0,0;2,14,9,Times,2,12,0,0,0;4,14,9,Times,4,12,0,0,0; :[font = section; inactive; Cclosed; preserveAspect; startGroup; ] What's different about Version 2? :[font = text; inactive; preserveAspect; ] EllipticCurveCalc Version 2 is compatible with (and requires) Mathematica v2.0. The best location for EllipticCurveCalc is inside the folder(directory) Packages:ElipticCurvesCalc wherever Mathematica is kept on your machine. Almost everything in v2.0 is a function and looks like a function, (as opposed to v1.0 where several functions came disguised as variables.) The only non-functions are varaibles computed whenever a curve is entered (a[1]..a[6], b[2],..b[8], c[4], c[6], Discriminant, and j). So TorsionGroup from v1.0 becomes TorsionGroup[] in v2.0, Conductor becomes Conductor[] etc. This change makes the Command-Completion and Make-Template features of Mathematica work much better, as well as offering a much more consistent interface. We apologise for this non-compatibility with v1.0, but we feel the improvement is worth it. Many features of v1.0 have been rewritten, improved, enhanced and/or sped up. Some bugs have now been fixed. (In particular, the fudge-factor routines should now work correctly for curves with non-split multiplicative reduction and some curves with additive reduction.) Additional features have been added. :[font = subsection; inactive; preserveAspect; startGroup; ] Changes in usage :[font = text; inactive; preserveAspect; endGroup; ] Conductor[] ConductorList[] FudgeFactor[] LaskaAlgorithm[] MinimalQ[] MinimalEquation[] MiscellaneousPoints[] TorsionGroup[] RealPeriod[] :[font = subsection; inactive; dontPreserveAspect; startGroup; ] New in v2.0 :[font = text; inactive; dontPreserveAspect; endGroup; endGroup; ] $EllipticCurveCalcVersion $EllipticCurveCalcVersionNumber BSD[P[x1,y1],P[x2,y2]...] ChangeCoordinatesFull[u,r,s,t] ClearECC[] ConductorListFull[] Displayacoeffs[] Displaybcoeffs[] Displayccoeffs[] DisplayDiscj[] EllipticCurveLegendre[lambda] EllipticCurveWNF[a,b,c] EquationCurve[x,y] FunctionalEquationSignTwist[eps,N,d] FundamentalDiscriminantQ[n] FundamentalDiscriminant[n] ImaginaryPeriod[] KroneckerSymbol[d,n] MiscellaneousPoints[] OmegaOne[lambda] OmegTwo[lambda] PointsModp[p] PullBackLSeries[n] QuadraticTwist[d] Reductiontype[prime] ReductiontypeList[prime] SecantLine[P[x,y]] SquareFreeQ[n] TangentLine[P[x,y]] TorsionGroupInfo[] TorsionGroupPoints[] TorsionQ[P[x,y]] WhichTorsion[g] :[font = section; inactive; Cclosed; dontPreserveAspect; startGroup; ] Sample Sessions using Elliptic Curve Calculator :[font = subsection; inactive; Cclosed; dontPreserveAspect; startGroup; ] Getting Started ;[s] 2:0,1;15,0;16,-1; 2:1,14,9,Times,1,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; ] The Elliptic Curve Calculator (ECC) works with one curve at a time. To enter a curve in generalized Weierstrass form, use the command :[font = input; dontPreserveAspect; startGroup; ] EllipticCurve[0,-1,1,0,0] :[font = print; inactive; dontPreserveAspect; endGroup; ] 2 3 2 Curve 1: y + y = x - x :[font = text; inactive; dontPreserveAspect; ] You will notice that each curve is assigned a number. You can return to previous curve number n with the command OldCurve[n]. Points in the ECC are specified in the form P[x,y]. The symbol P is just a placeholder. (In Mathematica parlance, points have head P.) Our curve has the obvious point P[0,0]. To add, subtract, and take multiples of a point, one uses the standard mathematical notation: ;[s] 13:0,0;95,1;96,0;114,1;125,0;172,1;178,0;192,1;193,0;261,1;262,0;298,1;304,0;401,-1; 2:7,14,9,Times,0,12,0,0,0;6,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] -P[0,0] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] P[0, -1] ;[o] P[0, -1] :[font = input; dontPreserveAspect; startGroup; ] 2*P[0,0] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] P[1, -1] ;[o] P[1, -1] :[font = input; dontPreserveAspect; startGroup; ] P[0,0] + P[0,-1] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] P[DirectedInfinity[1], DirectedInfinity[1]] ;[o] Origin :[font = text; inactive; dontPreserveAspect; ] Notice that the zero element is denoted Origin. It is stored internally as P[Infinity,Infinity]. You may specify it either way. We can use Mathematica's built-in functions to compute more multiples of P[0,0]. ;[s] 5:0,0;40,1;46,0;76,1;96,0;213,-1; 2:3,14,9,Times,0,12,0,0,0;2,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] Table[ n*P[0,0], {n,1,6} ] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {P[0, 0], P[1, -1], P[1, 0], P[0, -1], P[DirectedInfinity[1], DirectedInfinity[1]], P[0, 0]} ;[o] {P[0, 0], P[1, -1], P[1, 0], P[0, -1], Origin, P[0, 0]} :[font = text; inactive; dontPreserveAspect; ] We see from our table that 5*P[0,0] is zero, so P[0,0] is a point of order 5. We could also have ascertained this fact using the function PointOrder. ;[s] 7:0,0;27,1;35,0;48,1;54,0;139,1;149,0;151,-1; 2:4,14,9,Times,0,12,0,0,0;3,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] PointOrder[ P[0,0] ] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 5 ;[o] 5 :[font = text; inactive; dontPreserveAspect; ] Or we could have found the complete subgroup consisting of points of finite order with the function TorsionGroup[]. ;[s] 3:0,0;100,1;114,0;116,-1; 2:2,14,9,Times,0,12,0,0,0;1,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] TorsionGroup[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {P[0, -1], P[0, 0], P[1, -1], P[1, 0], P[DirectedInfinity[1], DirectedInfinity[1]]} ;[o] {P[0, -1], P[0, 0], P[1, -1], P[1, 0], Origin} :[font = text; inactive; dontPreserveAspect; ] Yet another way to have discovered that P[0,0] has finite order would have been to compute its canonical height using the function h, since a point has finite order if and only if its canonical height is 0. ;[s] 5:0,0;40,1;46,0;131,1;132,0;207,-1; 2:3,14,9,Times,0,12,0,0,0;2,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] h[ P[0,0] ] ;[o] h[P[0, 0]] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 0 ;[o] 0 :[font = text; inactive; dontPreserveAspect; ] Let's look at another elliptic curve. :[font = input; dontPreserveAspect; startGroup; ] EllipticCurve[0,0,0,0,17] :[font = print; inactive; dontPreserveAspect; endGroup; ] 2 3 Curve 2: y = x + 17 :[font = text; inactive; dontPreserveAspect; ] If we give ECC the x-coordinate of a point, it will give us one of the two points with that x-coordinate. :[font = input; dontPreserveAspect; startGroup; ] P[2] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] P[2, 5] ;[o] P[2, 5] :[font = text; inactive; dontPreserveAspect; ] And if we happen to choose a non-rational point, we get an answer involving square roots. :[font = input; dontPreserveAspect; startGroup; ] P[3] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] P[3, 2*11^(1/2)] ;[o] P[3, 2 Sqrt[11]] :[font = text; inactive; dontPreserveAspect; ] Another way to find rational points is the FindPoints command. To find all integer points with height less than (say) 25 we write :[font = input; dontPreserveAspect; startGroup; ] FindPoints[{25,1}] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {P[-2, -3], P[-2, 3], P[-1, -4], P[-1, 4], P[2, -5], P[2, 5], P[4, -9], P[4, 9], P[8, -23], P[8, 23]} ;[o] {P[-2, -3], P[-2, 3], P[-1, -4], P[-1, 4], P[2, -5], P[2, 5], P[4, -9], P[4, 9], P[8, -23], P[8, 23]} :[font = text; inactive; dontPreserveAspect; ] Similarly, to find all points whose x-coordinate has numerator at most 25 and denominator at most 9 we write :[font = input; dontPreserveAspect; startGroup; ] FindPoints[{25,9}] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {P[-2, -3], P[-2, 3], P[-1, -4], P[-1, 4], P[-8/9, -109/27], P[-8/9, 109/27], P[1/4, -33/8], P[1/4, 33/8], P[2, -5], P[2, 5], P[4, -9], P[4, 9], P[8, -23], P[8, 23]} ;[o] 8 109 {P[-2, -3], P[-2, 3], P[-1, -4], P[-1, 4], P[-(-), -(---)], 9 27 8 109 1 33 1 33 P[-(-), ---], P[-, -(--)], P[-, --], P[2, -5], P[2, 5], 9 27 4 8 4 8 P[4, -9], P[4, 9], P[8, -23], P[8, 23]} :[font = text; inactive; dontPreserveAspect; endGroup; ] One can also write FindPoints[H] instead of FindPoints[{H,H}]. :[font = subsection; inactive; Cclosed; dontPreserveAspect; startGroup; ] A Second Example ;[s] 2:0,1;16,0;17,-1; 2:1,14,9,Times,1,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] EllipticCurve[1,-1,1,-3002,63929] :[font = print; inactive; dontPreserveAspect; endGroup; ] Curve 2: y^2 + xy + y = x^3 - x^2 - 3002 x + 63929 :[font = text; inactive; dontPreserveAspect; ] The a[i], b[i], c[i], Discriminant and j-invariant can be displayed by using the following command: :[font = input; dontPreserveAspect; startGroup; ] DisplayWeierstrassData[] :[font = print; inactive; dontPreserveAspect; endGroup; ] a coefficients = {1, -1, 1, -3002, 63929} b coefficients = {-3, -6003, 255717, -9200790} c coefficients = {144081, -54586521} Discriminant = 6561000000 6 8 6 = 2 3 5 4102915888729 j invariant = ------------- 9000000 3 3 7 2287 = -------- 6 2 6 2 3 5 :[font = text; inactive; dontPreserveAspect; ] We can also compute the conductor of the curve. :[font = input; dontPreserveAspect; startGroup; ] Conductor[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 90 ;[o] 90 :[font = text; inactive; dontPreserveAspect; ] Further information about the reduction of the curve, including the exponents for the conductor and the Kodaira reduction types, can be listed with the following command: :[font = input; dontPreserveAspect; startGroup; ] ConductorList[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] TableForm[{{" prime ", "ord disc", "ord cond", "Kodaira", "red type"}, {2, 6, 1, StringForm["``````", "I", Subscript[6], Superscript[""]], "Split"}, {3, 8, 2, StringForm["``````", "I", Subscript[2], Superscript["*"]], "Additive"}, {5, 6, 1, StringForm["``````", "I", Subscript[6], Superscript[""]], "Split"}}, TableAlignments -> Center, TableSpacing -> {0, 2}] ;[o] prime ord disc ord cond Kodaira red type 2 6 1 I Split 6 * 3 8 2 I Additive 2 5 6 1 I Split 6 :[font = text; inactive; dontPreserveAspect; ] Now lets compute the torsion subgroup of Curve 2. :[font = input; dontPreserveAspect; startGroup; ] t = TorsionGroup[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {P[-63, 31], P[-3, -269], P[-3, 271], P[27, -59], P[27, 31], P[123/4, -127/8], P[33, -17], P[37, -69], P[37, 31], P[87, -719], P[87, 631], P[DirectedInfinity[1], DirectedInfinity[1]]} ;[o] {P[-63, 31], P[-3, -269], P[-3, 271], P[27, -59], P[27, 31], 123 127 P[---, -(---)], P[33, -17], P[37, -69], P[37, 31], 4 8 P[87, -719], P[87, 631], Origin} :[font = text; inactive; dontPreserveAspect; ] The torsion subgroup has order twelve, so it is either cyclic, or a group of type (2,6). We can determine which one by computing the orders of the points in the subgroup. :[font = input; dontPreserveAspect; startGroup; ] Sort[ Map[PointOrder,t] ] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {1, 2, 2, 2, 3, 3, 6, 6, 6, 6, 6, 6} ;[o] {1, 2, 2, 2, 3, 3, 6, 6, 6, 6, 6, 6} :[font = text; inactive; dontPreserveAspect; ] From this list we see that Curve 3 has three points of order two, so its torsion subgroup is a group of type (2,6). :[font = text; inactive; dontPreserveAspect; ] Even easier would have been :[font = input; dontPreserveAspect; startGroup; ] TorsionGroupInfo[] :[font = output; output; inactive; preserveAspect; endGroup; ] {{{P[-63, 31], 2}, {P[-3, -269], 6}, {P[-3, 271], 6}, {P[27, -59], 6}, {P[27, 31], 6}, {P[123/4, -127/8], 2}, {P[33, -17], 2}, {P[37, -69], 3}, {P[37, 31], 3}, {P[87, -719], 6}, {P[87, 631], 6}, {P[DirectedInfinity[1], DirectedInfinity[1]], 1}}, "Z2 * Z6"} ;[o] {{{P[-63, 31], 2}, {P[-3, -269], 6}, {P[-3, 271], 6}, {P[27, -59], 6}, 123 127 {P[27, 31], 6}, {P[---, -(---)], 2}, {P[33, -17], 2}, {P[37, -69], 3}, 4 8 {P[37, 31], 3}, {P[87, -719], 6}, {P[87, 631], 6}, {Origin, 1}}, Z2 * Z6} :[font = text; inactive; dontPreserveAspect; ] Next we'll compute the number of points on this curve modulo various primes. If the curve has good reduction, then the rational torsion injects into the reduction, so we expect the orders to be divisible by 12. ECC does not have a command to actually count the points; instead it computes the trace of Frobenius. We can use this in the formula # of points modulo p = p + 1 - FrobeniusTrace[p]. (We also note that FrobeniusTrace returns the p th coefficient of the L-series of the curve, even for primes of bad reduction.) :[font = input; dontPreserveAspect; startGroup; ] 7 + 1 - FrobeniusTrace[7] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 12 ;[o] 12 :[font = input; dontPreserveAspect; startGroup; ] 17 + 1 - FrobeniusTrace[17] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 24 ;[o] 24 :[font = input; dontPreserveAspect; startGroup; ] 541 + 1 - FrobeniusTrace[541] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 552 ;[o] 552 :[font = text; inactive; dontPreserveAspect; ] Or we can print a table of the number of points modulo p. :[font = input; dontPreserveAspect; startGroup; ] MatrixForm[Join[{{"p","trace","# of pts"}}, Map[{#,FrobeniusTrace[#],#+1-FrobeniusTrace[#]}&, {7,11,13,17,19} ] ] ] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] MatrixForm[{{"p", "trace", "# of pts"}, {7, -4, 12}, {11, 0, 12}, {13, 2, 12}, {17, -6, 24}, {19, -4, 24}}] ;[o] p trace # of pts 7 -4 12 11 0 12 13 2 12 17 -6 24 19 -4 24 :[font = text; inactive; dontPreserveAspect; ] Finally, we will compute the "real period" and the "fudge factor" of the curve. The RealPeriod command gives the number appearing in the Birch-Swinnerton-Dyer conjecture. It equals either the real period or twice the real period, depending on whether or not the real locus is connected. The FudgeFactor command gives the p-adic periods appearing in the Birch-Swinnerton-Dyer conjecture; it is the product of the number of components on the bad fibers of the Neron model. :[font = input; dontPreserveAspect; startGroup; ] RealPeriod[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 1.337595994588646983 ;[o] 1.3376 :[font = input; dontPreserveAspect; startGroup; ] FudgeFactor[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 144 ;[o] 144 :[font = input; preserveAspect; startGroup; ] RealPeriod[]*FudgeFactor[]/Length[TorsionGroupPoints[]]^2 :[font = output; output; inactive; preserveAspect; endGroup; ] 1.337595994588646983 ;[o] 1.3376 :[font = input; dontPreserveAspect; startGroup; ] BSD[] :[font = output; output; inactive; dontPreserveAspect; endGroup; endGroup; ] 1.337595994588646983 ;[o] 1.3376 :[font = subsection; inactive; Cclosed; dontPreserveAspect; startGroup; ] A Third Example ;[s] 1:0,1;16,-1; 2:0,14,9,Times,1,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; ] Now we will enter another curve, and do some calculations similar to those we did for Curve 1. :[font = input; dontPreserveAspect; startGroup; ] EllipticCurve[0,0,-1,1,0] :[font = print; inactive; dontPreserveAspect; endGroup; ] 2 3 Curve 3: y - y = x + x :[font = input; dontPreserveAspect; startGroup; ] Table[ n*P[0,0], {n,1,5} ] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {P[0, 0], P[1, 2], P[3, -5], P[-2/9, 17/27], P[33/4, 195/8]} ;[o] 2 17 33 195 {P[0, 0], P[1, 2], P[3, -5], P[-(-), --], P[--, ---]} 9 27 4 8 :[font = text; inactive; dontPreserveAspect; ] Since 4*P[0,0] has a 3 in its denominators, we know that P[0,0] must have infinite order. Here are three other ways to verify this fact. The second way even shows that Curve 3 actually has no non-trivial points of finite order. ;[s] 5:0,0;6,1;14,0;57,1;63,0;230,-1; 2:3,14,9,Times,0,12,0,0,0;2,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] PointOrder[ P[0,0] ] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] DirectedInfinity[1] ;[o] Infinity :[font = input; dontPreserveAspect; startGroup; ] TorsionGroup[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {P[DirectedInfinity[1], DirectedInfinity[1]]} ;[o] {Origin} :[font = input; dontPreserveAspect; startGroup; ] h[ P[0,0] ] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 0.07119607533438432958 ;[o] 0.0711961 :[font = text; inactive; dontPreserveAspect; ] If we compute the heights of the multiples of P[0,0], we can see visibly demonstrated the relationship h[ n*P ] == n^2 h[ P ]. ;[s] 5:0,0;46,1;52,0;117,1;141,0;143,-1; 2:3,14,9,Times,0,12,0,0,0;2,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] Table[ h[ n*P[0,0] ], {n,1,5} ] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {0.07119607533438432958, 0.2847843013375373183, 0.6407646780094589665, 0.8958984367182351112, 1.77990188335960824} ;[o] {0.0711961, 0.284784, 0.640765, 0.895898, 1.7799} :[font = text; inactive; dontPreserveAspect; ] One also sometimes uses the Weil height of a point, which is the larger of the numerator of x and the denominator of x. Although this function is not built into ECC, we can easily make a new definition. ;[s] 3:0,0;28,1;39,0;204,-1; 2:2,14,9,Times,0,12,0,0,0;1,14,9,Times,2,12,0,0,0; :[font = input; dontPreserveAspect; ] WeilHeight[P[x_,y_]] := Max[ Abs[Numerator[x]], Abs[Denominator[x]] ] :[font = text; inactive; dontPreserveAspect; ] One knows that if the point P has infinite order, then the Weil height of n*P has approximately n^2 decimal digits as n increases. We can illustrate this quadratic growth with a table, where we list the Weil height of n*P[0,0] for odd integers 1 <= n <= 29 ;[s] 9:0,0;28,1;29,0;74,1;77,0;96,1;99,0;118,1;119,0;279,-1; 2:5,14,9,Times,0,12,0,0,0;4,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] Table[ WeilHeight[ n*P[0,0] ], {n,1,29,2} ] //ColumnForm :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 1 3 33 841 93025 20497356 28027370943 53828252727076 688703352175377841 13473234124501103040001 1859319551223939460315630008 337720092123813872752743762479643 408361045228783758729565169618069611876 931519612708610199454571778343319388617431225 9640190788429218101307342299095721048741374697845596 ;[o] 1 3 33 841 93025 20497356 28027370943 53828252727076 688703352175377841 13473234124501103040001 1859319551223939460315630008 337720092123813872752743762479643 408361045228783758729565169618069611876 931519612708610199454571778343319388617431225 9640190788429218101307342299095721048741374697845596 :[font = text; inactive; dontPreserveAspect; ] One definition of the canonical height is :[font = input; output; dontPreserveAspect; ] StringForm[" h[P] = `` ``````", 1/2, HoldForm[Lim],Subscript[HoldForm[n->Infinity]], HoldForm[Log[WeilHeight[ n*P ]]]/n^2 ] ;[o] 1 Log[WeilHeight[n P]] h[P] = - Lim -------------------- 2 n -> Infinity 2 n ;[s] 2:0,1;125,0;126,-1; 2:1,14,10,Courier,1,12,0,0,0;1,12,10,Courier,0,12,0,0,0; :[font = text; inactive; dontPreserveAspect; ] We can "test" this definition by taking the logarithms of the values in our table, dividing by n^2*h[P[0,0]], and watching the resulting values approach 2. :[font = input; dontPreserveAspect; startGroup; ] Table[ N[Log[WeilHeight[n*P[0,0]]]/(n^2*h[P[0,0]])], {n,1,29,2} ] //ColumnForm :[font = output; output; inactive; dontPreserveAspect; endGroup; endGroup; ] 0. 1.714533160724399325 1.964438373910103904 1.930452563240091718 1.983849045410211994 1.95430570732503819 1.999349570249137235 1.973693037331614495 1.99622153084658976 1.98254695500301444 1.999842969956078271 1.988697644571636598 1.997980133103724231 1.995019710392849522 1.999097832841569447 ;[o] 0. 1.71453 1.96444 1.93045 1.98385 1.95431 1.99935 1.97369 1.99622 1.98255 1.99984 1.9887 1.99798 1.99502 1.9991 :[font = subsection; inactive; Cclosed; dontPreserveAspect; startGroup; ] A Fourth Example ;[s] 2:0,1;16,0;17,-1; 2:1,14,9,Times,1,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; ] Next we will look at the following elliptic curve. :[font = input; dontPreserveAspect; startGroup; ] EllipticCurve[12,-48,32,-144,768] :[font = print; inactive; dontPreserveAspect; endGroup; ] Curve 5: y^2 + 12 xy + 32 y = x^3 - 48 x^2 - 144 x + 768 :[font = text; inactive; dontPreserveAspect; ] When we try to find the reduction types for this curve, we find that our equation is not minimal at the prime 2. :[font = input; dontPreserveAspect; startGroup; ] ConductorList[] :[font = message; inactive; preserveAspect; startGroup; ] ReductiontypeList::nonminimal: The given curve is not minimal. Trying again with y^2 + 6 xy + 76 y = x^3 + 24 x^2 + 135 x - 96. :[font = output; output; inactive; dontPreserveAspect; endGroup; endGroup; ] TableForm[{{" prime ", "ord disc", "ord cond", "Kodaira", "red type"}, {2, 4, 2, "IV", "Additive"}, {3, 3, 2, "III", "Additive"}, {17, 2, 2, "II", "Additive"}}, TableAlignments -> Center, TableSpacing -> {0, 2}] ;[o] prime ord disc ord cond Kodaira red type 2 4 2 IV Additive 3 3 2 III Additive 17 2 2 II Additive :[font = text; inactive; dontPreserveAspect; ] Some of the routines in the ECC, such as height calculations, will give erroneous results if the equation is not minimal. The ECC does not automatically check for minimality. You can check for minimality with the MinimalQ command. ;[s] 3:0,0;215,1;223,0;233,-1; 2:2,14,9,Times,0,12,0,0,0;1,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] MinimalQ[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] False ;[o] False :[font = text; inactive; dontPreserveAspect; ] In order to change to a minimal equation, use the command MinimalEquation[]. Note, however, that the MinimalEquation[] command will always produce a new equation whose a[1], a[2], a[3] coefficients are in "standard" form. It also returns a triple {u,r,s,t} describing the shift of coordinates used to produce the minimal equation. It is possible to shift points from the old equation to the new equation using the ShiftPoints command; but we will content ourselves with finding a minimal equation. ;[s] 9:0,0;58,1;75,0;102,1;119,0;169,1;185,0;417,1;428,0;501,-1; 2:5,14,9,Times,0,12,0,0,0;4,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] MinimalEquation[]; :[font = print; inactive; dontPreserveAspect; endGroup; ] 2 3 Curve 5: y = x + 17 :[font = text; inactive; dontPreserveAspect; ] When we compute the torsion subgroup of this curve we find: :[font = input; dontPreserveAspect; startGroup; ] TorsionGroup[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {P[DirectedInfinity[1], DirectedInfinity[1]]} ;[o] {Origin} :[font = text; inactive; dontPreserveAspect; ] Curve 5 has lots of points with small integer coordinates, such as: :[font = input; dontPreserveAspect; ] p1 = P[-2,3] p2 = P[-1,4] p3 = P[2,5]; :[font = text; inactive; dontPreserveAspect; ] Since there is no non-trivial torsion, all of these points have infinite order. It is natural to ask whether or not they are independent. The command PointRelation will check, and will give a relation if one exists. We start by checking the first two points. ;[s] 3:0,0;152,1;165,0;262,-1; 2:2,14,9,Times,0,12,0,0,0;1,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] PointRelation[p1,p2] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] "Independent" ;[o] Independent :[font = text; inactive; dontPreserveAspect; ] So Curve 5 has rank at least 2. Now we check the third point. :[font = input; dontPreserveAspect; startGroup; ] PointRelation[p1,p2,p3] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] HoldForm[-2]*P[-2, 3] + HoldForm[-1]*P[-1, 4] + HoldForm[1]*P[2, 5] == 0 ;[o] -2 P[-2, 3] + -1 P[-1, 4] + 1 P[2, 5] == 0 :[font = text; inactive; dontPreserveAspect; ] Thus the three points are dependent, p3 == 2*p1 + p2. We can, of course, verify this directly. ;[s] 3:0,0;37,1;52,0;96,-1; 2:2,14,9,Times,0,12,0,0,0;1,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] 2*p1 + p2 :[font = output; output; inactive; dontPreserveAspect; endGroup; ] P[2, 5] ;[o] P[2, 5] :[font = text; inactive; dontPreserveAspect; ] Curve 5 also has an integral point with fairly large coordinates: :[font = input; dontPreserveAspect; startGroup; ] p4 = P[5234,378661] PointRelation[p1,p2,p4] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] HoldForm[-2]*P[-2, 3] + HoldForm[-3]*P[-1, 4] + HoldForm[1]*P[5234, 378661] == 0 ;[o] -2 P[-2, 3] + -3 P[-1, 4] + 1 P[5234, 378661] == 0 :[font = text; inactive; dontPreserveAspect; ] Again, we directly verify the relation found by ECC. :[font = input; dontPreserveAspect; startGroup; ] 2*P[-2,3] + 3*P[-1,4] :[font = output; output; inactive; dontPreserveAspect; endGroup; endGroup; ] P[5234, 378661] ;[o] P[5234, 378661] :[font = subsection; inactive; dontPreserveAspect; startGroup; ] A Fifth Example ;[s] 1:0,1;16,-1; 2:0,14,9,Times,1,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; ] Next we will look at the following elliptic curve. :[font = input; dontPreserveAspect; startGroup; ] EllipticCurveWNF[0,-1,0] :[font = print; inactive; dontPreserveAspect; endGroup; ] Curve 6: y^2 = x^3 - x :[font = input; dontPreserveAspect; startGroup; ] ConductorListFull[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] TableForm[{{" prime ", "ord disc", "ord cond", "c_p", "Kodaira", "red type"}, {2, 6, 5, 2, "III", "Additive"}}, TableAlignments -> Center, TableSpacing -> {0, 2}] ;[o] prime ord disc ord cond c_p Kodaira red type 2 6 5 2 III Additive :[font = text; inactive; dontPreserveAspect; ] When we compute the torsion subgroup of this curve we find: :[font = input; dontPreserveAspect; startGroup; ] TorsionGroup[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {P[-1, 0], P[0, 0], P[1, 0], P[DirectedInfinity[1], DirectedInfinity[1]]} ;[o] {P[-1, 0], P[0, 0], P[1, 0], Origin} :[font = text; inactive; dontPreserveAspect; ] Compute the Sign of the Functional Equation :[font = input; preserveAspect; startGroup; ] FunctionalEquationSign[20] :[font = output; output; inactive; preserveAspect; endGroup; ] 1 ;[o] 1 :[font = text; inactive; preserveAspect; ] Evaluate the L-Series at s=1, (the default number of terms is 20) :[font = input; dontPreserveAspect; startGroup; ] LSeries[1] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 0.6555143885731067839 ;[o] 0.655514 :[font = text; inactive; preserveAspect; ] What is the Birch--Swinnerton-Dyer conjecture for the LSeries at s=1? :[font = input; preserveAspect; startGroup; ] BSD[] :[font = output; output; inactive; preserveAspect; endGroup; ] 0.6555143885730299525 ;[o] 0.655514 :[font = input; preserveAspect; startGroup; ] EllipticCurveWNF[0,-36,0] :[font = print; inactive; preserveAspect; endGroup; ] Curve 7: y^2 = x^3 - 36 x :[font = input; preserveAspect; startGroup; ] TorsionGroup[] :[font = output; output; inactive; preserveAspect; endGroup; ] {P[-6, 0], P[0, 0], P[6, 0], P[DirectedInfinity[1], DirectedInfinity[1]]} ;[o] {P[-6, 0], P[0, 0], P[6, 0], Origin} :[font = input; preserveAspect; startGroup; ] TorsionGroupInfo[] :[font = output; output; inactive; preserveAspect; endGroup; ] {{{P[-6, 0], 2}, {P[0, 0], 2}, {P[6, 0], 2}, {P[DirectedInfinity[1], DirectedInfinity[1]], 1}}, "Z2 * Z2"} ;[o] {{{P[-6, 0], 2}, {P[0, 0], 2}, {P[6, 0], 2}, {Origin, 1}}, Z2 * Z2} :[font = text; inactive; preserveAspect; ] Any rational points found while looking for torsion points? :[font = input; preserveAspect; startGroup; ] MiscellaneousPoints[] :[font = output; output; inactive; preserveAspect; endGroup; ] {P[-3, 9], P[-2, 8], P[12, 36], P[18, 72]} ;[o] {P[-3, 9], P[-2, 8], P[12, 36], P[18, 72]} :[font = text; inactive; preserveAspect; ] What is the height of each these points? :[font = input; preserveAspect; startGroup; ] h[%] :[font = output; output; inactive; preserveAspect; endGroup; ] {0.4443129374198096199, 0.4443129374198096198, 0.4443129374198096195, 0.4443129374198096198} ;[o] {0.444313, 0.444313, 0.444313, 0.444313} :[font = text; inactive; preserveAspect; ] h is Listable :[font = input; preserveAspect; startGroup; ] h[{P[-2,8], P[18,72]}] :[font = output; output; inactive; preserveAspect; endGroup; ] {0.4443129374198096198, 0.4443129374198096198} ;[o] {0.444313, 0.444313} :[font = input; preserveAspect; startGroup; ] EquationCurve[] :[font = output; output; inactive; preserveAspect; endGroup; ] y^2 == -36*x + x^3 ;[o] 2 3 y == -36 x + x :[font = input; preserveAspect; startGroup; ] TangentLine[P[-3,9]] :[font = output; output; inactive; preserveAspect; endGroup; ] y == 15/2 - x/2 ;[o] 15 x y == -- - - 2 2 :[font = input; preserveAspect; startGroup; ] Solve[{TangentLine[P[-3,9]], EquationCurve[]},{x,y}] :[font = output; output; inactive; preserveAspect; endGroup; ] {{x -> -3, y -> 9}, {x -> -3, y -> 9}, {x -> 25/4, y -> 35/8}} ;[o] 25 35 {{x -> -3, y -> 9}, {x -> -3, y -> 9}, {x -> --, y -> --}} 4 8 :[font = input; preserveAspect; startGroup; ] 2P[-3,9] :[font = output; output; inactive; preserveAspect; endGroup; endGroup; ] P[25/4, -35/8] ;[o] 25 35 P[--, -(--)] 4 8 :[font = input; preserveAspect; startGroup; ] QuadraticTwist[24] :[font = print; inactive; preserveAspect; endGroup; ] Curve 8: y^2 = x^3 - x :[font = input; preserveAspect; startGroup; ] QuadraticTwist[24] :[font = print; inactive; preserveAspect; endGroup; endGroup; ] Curve 9: y^2 = x^3 - 36 x :[font = section; inactive; Cclosed; dontPreserveAspect; startGroup; ] Description of Functions and Parameters Available with the Elliptic Curve Calculator :[font = subsection; inactive; Cclosed; dontPreserveAspect; startGroup; ] Alphabetical List of Elliptic Curve Calculator Functions ;[s] 2:0,1;56,0;57,-1; 2:1,14,9,Times,1,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; endGroup; ] a[1],a[2],a[3],a[4],a[6]: Weierstrass coefficients AlwaysFactorDiscriminant: Option for EllipticCurve b[2],b[4],b[6],b[8]: Weierstrass coefficients BSD[P[x1,y1],P[x2,y2], ...] : Birch---Swinnerton-Dyer estimate for the leading term in the L-Series, without the contribution of shah c[4],c[6]: Weierstrass coefficient ChangeCoordinates[u,r,s,t] : Change the a[i] for the curve. ChangeCoordinatesFull[u,r,s,t] : Change all the Weierstrass data for the curve. ClearECC[] : Clear some of the EllipticCurve stored information Conductor[]: Conductor of the elliptic curve. ConductorList[]: Table of reduction information ConductorListFull[]: Table of reduction information with "Fudge-factors" Discriminant: Discriminant of the curve Displayacoeffs[] : Displays a[1],...a[6] Displaybcoeffs[] : Displays b[2],...b[8] Displayccoeffs[] : Displays a[4],c[6] DisplayCurve: Option for EllipticCurve DisplayDiscj[] : Display the discriminant and j-invariant DisplayEllipticCurve: Display the Weierstrass equation DisplayPoints: Option for GraphTangents and GraphSecants DisplayWeierstrassData[]: Display a's, b's, c's, etc. dx: Option for GraphTangents dy: Option for GraphTangents EllipticCurve[a1,a2,a3,a4,a6]: Enter a curve $EllipticCurveCalcVersion : The version as a string $EllipticCurveCalcVersionNumber: The version as a number EllipticCurveLegendre[lam] : enters y^2=x(x-1)(x-lam) EllipticCurveWNF[a,b,c]:enters y^2 = x^3 + ax^2 + bx + c EquationCurve[] : returns y^2 == x^3 + ax^2 + bx + c Extension: Option for GraphSecants FindPoints[bound]: Search for rational points up to given bound FrobeniusTrace[p]: Trace of Frobenius at p FudgeFactor[]: Birch-Swinnerton-Dyer "fudge factor" FunctionalEquationSign[n]: Sign of functional equation FunctionalEquationSignTwist[eps, N, d]; returns the sign of the FE associated to E twisted by d, if the conductor of E is N, sign of FE is eps. FundamentalDiscriminant[n] : discriminant of Q(sqrt(n)) FundamentalDiscriminantQ[d] True if d=disc(Q(sqrt(d))) GraphPoints[{P[x1,y1],...},opts]: Graph points GraphSecants[{{P[x1,y1],P[x2,y2]},...},opts]: Graph secants GraphTangents[{P[x1,y1],...},opts]: Graph tangent lines h[P[x,y]]: The canonical height HeightAngle[P[x1,y1],P[x2,y2]]: Canonical height angle HeightPairing[P[x1,y1],P[x2,y2]]: Canonical height pairing HeightRegulator[P[x1,y1],...]: Height regulator ImaginaryPeriod[]: The pure imaginary period if E(R) has two components j: j-invariant of the curve KroneckerSymbol[d,n]: Kronecker Symbol LaskaAlgorithm[]: returns {u,r,s,t} to make E minimal LatticeRelation[A]: approximate soln to Ax=0 LocalHeight[P[x,y],p]: Local height at p LSeries[s,opts]: Value of L-series LSeriesCoefficient[n]: n th coefficient of L-series MinimalEquation[]: Find a minimal Weierstrass equation MinimalQ[]: Is the equation minimal? MiscellaneousPoints[]: Any extra points found while searching for torsion points NumberOfTerms: Option for LSeries, FunctionalEquationSign OldCurve[n]: Reloads Curve n OmegaOne[lambda],OmegaTwo[lambda] : periods associated with y^2=x(x-1)(x-lambda) ord[n,p]: order of p dividing n P[x,y]: Point on the elliptic curve with coordinates (x,y) P[x]: Find a point P[x,y] curve with the given x-coordinate PlotEllipticCurve[xmax,opts]: Plot the elliptic curve PointLabels: Option for GraphPoints, GraphTangents, GraphSecants PointOrder[P[x,y]]: The order of the point (x,y) PointRelation[P[x1,y1],...]: Linear relation points satisfy PointsModp[p]: points on E mod p PullBackLSeries[n]: The first n terms of the q-expansion RealPeriod: Real period of the elliptic curve Reductiontype[p]: Encoded Kodaira reduction type ReductiontypeList[p]: List of reduction information SecantLine[P[x1,y1],P[x2,y2]]: equation of the secant line through the two points ShiftPoints[{P[x1,y1],...},{u,r,s,t}]: Change coordinates SingularPoint[p]: Singular point modulo p SquareFreeQ[n]: True if n is squarefree TorsionGroup[]: Compute torsion subgroup TorsionGroupInfo[]: Torsiongroup with orders, and abelian type. TorsionGroupPoints[]:torsiongroup points TorsionQ[P[x,y]]: True if P[x,y] is torsion WhichTorsion[{points}]: type of abelian group ;[s] 164:0,1;24,0;50,1;75,0;103,1;122,0;149,1;177,0;282,1;293,0;319,1;345,0;378,1;409,0;458,2;459,1;470,0;522,2;523,1;534,0;569,1;584,0;617,1;636,0;691,1;703,0;731,1;748,0;771,1;789,0;812,1;830,0;850,1;863,0;889,1;905,0;947,2;948,1;968,0;1003,1;1016,0;1060,1;1084,0;1113,1;1116,0;1143,1;1145,0;1172,1;1202,0;1218,1;1244,0;1269,1;1301,0;1327,1;1353,0;1380,1;1404,0;1437,1;1453,0;1490,1;1500,0;1527,1;1544,0;1591,1;1608,0;1634,1;1649,0;1686,1;1711,0;1741,1;1779,0;1884,1;1911,0;1940,1;1968,0;1995,1;2029,0;2044,1;2088,0;2103,1;2138,0;2161,1;2170,0;2193,1;2223,0;2248,1;2280,0;2307,1;2336,0;2356,1;2373,0;2427,2;2429,1;2430,0;2458,1;2478,0;2498,1;2514,0;2552,1;2570,0;2596,1;2620,0;2638,1;2653,0;2672,1;2694,0;2726,1;2743,0;2781,1;2791,0;2818,1;2839,0;2900,1;2913,0;2959,1;2972,0;2988,1;3004,0;3005,1;3021,0;3069,1;3077,0;3102,1;3108,0;3161,1;3165,0;3221,1;3249,0;3275,1;3286,0;3339,1;3360,0;3389,1;3416,0;3449,1;3464,0;3482,1;3502,0;3540,1;3550,0;3586,1;3602,0;3635,1;3655,0;3688,1;3717,2;3719,0;3769,2;3770,1;3807,0;3828,1;3844,0;3871,1;3885,0;3912,1;3928,0;3953,1;3971,0;4016,1;4037,0;4057,1;4076,0;4101,1;4124,0;4148,-1; 3:79,14,9,Times,0,12,0,0,0;79,14,9,Times,1,12,0,0,0;6,14,9,Times,0,12,0,0,65535; :[font = subsection; inactive; Cclosed; dontPreserveAspect; startGroup; ] Detailed Description of Elliptic Curve Calculator Functions ;[s] 2:0,1;59,0;60,-1; 2:1,14,9,Times,1,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; Cclosed; dontPreserveAspect; startGroup; ] The Elliptic Curve ;[s] 2:0,1;18,0;19,-1; 2:1,14,9,Times,0,12,0,0,0;1,14,10,Courier,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; endGroup; ] EllipticCurve[a1,a2,a3,a4,a6]: Enter a curve with generalized Weierstrass coefficients a1,a2,a3,a4,a6. The curve will be assigned a number which you can later use to recall the curve without retyping the coordinates. Options: AlwaysFactorDiscriminant -> True (default) or False Set this to False to save time if the calculations you will be doing do not need the factorization of the discriminant. E.g. Graphing and adding points do not need the factorization. Height, conductor, and L-series calculations do need the factorization. DisplayCurve -> True (default) or False Display the Weierstrass equation of the curve. Important Note: Many functions in the Elliptic Curve Calculator, such as height and L-series calculations, will not return the correct result unless the Weierstrass equation is minimal. You can check if it is minimal with the command MinimalQ, which returns a True/False answer. The command ConductorList will display a list of primes for which the equation is not minimal. Or you can use the command MinimalEquation to have the computer change coordinates to a minimal equation in standard form. OldCurve[n]: Reloads Curve n. DisplayEllipticCurve[]: Display the Weierstrass equation DisplayWeierstrassData[]: Display a's, b's ,c's ,Discriminant, and j-invariant associated to the Weierstrass equation References: For general information about elliptic curves, Weierstrass equations, and the associated a's, b's, c's, Discriminant, and j-invariant, see [Silverman 1, Chapter III, Section 1]. ;[s] 24:0,2;29,3;219,1;226,3;233,2;284,3;546,2;585,3;634,1;648,3;870,2;878,3;929,2;942,3;1042,2;1057,3;1140,2;1153,3;1171,2;1193,3;1229,2;1253,3;1348,1;1358,3;1539,-1; 4:0,14,9,Times,0,12,0,0,0;3,14,10,Courier,4,12,0,0,0;9,14,10,Courier,1,12,0,0,0;12,14,10,Courier,0,12,0,0,0; :[font = text; inactive; Cclosed; dontPreserveAspect; startGroup; ] Addition and Multiplication of Points Points of Finite Order, Point Relations, Searching for Points ;[s] 2:0,1;99,0;100,-1; 2:1,14,9,Times,0,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; endGroup; ] P[x,y]: Point on the elliptic curve with coordinates (x,y). The Elliptic Curve Calculator reserves the letter P to denote points on the elliptic curve. (I.e. A point on the curve is specified by a pair of numbers with Head equal to P.) P[x]: Find a point P[x,y] on the curve with the given x-coordinate. The other point with that x-coordinate is -P[x]. P[x1,y1] + P[x2,y2]: Sum of two points P[x1,y1] - P[x2,y2]: Difference of two points - P[x,y]: Negative of a point n*P[x,y]: Multiple of a point TorsionGroup[]: Returns the set of points of finite order on the curve. To get the order of the torsion subgroup, use the command Length[TorsionGroupPoints[]]. PointOrder[P[x,y]]: returns the order of the given point, either as an integer or as Infinity. Note that by Mazur's theorem [Mazur], the order of a torsion point satisfies 1<=n<=10 or n=12. PointRelation[P[x1,x2],...]: returns a linear relation satisfied by the given points. It returns the string "Independent" if the points are independent. It returns the string "Could not determine dependence" if points appear dependent, but the routine could not find a relation. FindPoints[bound]: Search for rational points with height less than a given bound. If bound is a number, find points with x-coordinate a/d satisfying |a|,|d| =< bound. If bound has the form {A,D}, find points with |a| =< A and 1 =< d =< D. References: For the formulas to add and multiply points, see [Silverman 1, Chapter III, Section 2]. For general information about points of finite order, see [Silverman 1, Chapter VIII, Section 7]. By Mazur's theorem [Mazur], the order of a torsion point satisfies 1<=n<=10 or n=12. ;[s] 24:0,2;7,1;113,2;114,1;242,2;246,1;361,2;380,1;401,2;420,1;448,2;456,1;479,2;487,1;510,2;526,1;671,2;691,1;863,2;890,1;1145,2;1162,1;1396,3;1406,1;1682,-1; 4:0,14,9,Times,0,12,0,0,0;12,14,10,Courier,0,12,0,0,0;11,14,10,Courier,1,12,0,0,0;1,14,10,Courier,4,12,0,0,0; :[font = text; inactive; Cclosed; dontPreserveAspect; startGroup; ] Minimal Weierstrass Equations ;[s] 2:0,1;29,0;30,-1; 2:1,14,9,Times,0,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; endGroup; ] MinimalEquation[]: Changes coordinates to produce a minimal Weierstrass equation in the standard form a[1] = 0,1, a[2] = -1,0,1, a[3] = 0,1. MinimalEquation returns a list {u,r,s,t} describing the change of coordinates that was required. To check if the equation is minimal without changing coordinates, use the command MinimalQ. To simultaneously change the coordinates of a list of points, use the command ShiftPoints[ {list of points}, MinimalEquation ]. For a description of the algorithm used to find the minimal equation, see [Laska]. MinimalQ[]: Returns True if the Weierstrass equation is minimal, otherwise returns False. Does not affect the equation. ShiftPoints[{P[x1,y1],P[x2,y2],...},{u,r,s,t}]: returns a list of the given points with their coordinates shifted by the indicated {u,r,s,t}. References: For the change of coordinate formulas in terms of {u,r,s,t}, see [Silverman 1, Chapter III, Section 1]. For a description of the algorithm used to find a minimal equation, see [Laska]. For general information about minimal Weierstrass equations, see [Silverman 1, Chapter VII, Section 1 and Chapter VIII, Section 8]. ;[s] 8:0,2;17,1;562,2;572,1;683,2;729,1;827,3;837,1;1159,-1; 4:0,14,9,Times,0,12,0,0,0;4,14,10,Courier,0,12,0,0,0;3,14,10,Courier,1,12,0,0,0;1,14,10,Courier,4,12,0,0,0; :[font = text; inactive; Cclosed; dontPreserveAspect; startGroup; ] Heights ;[s] 2:0,1;7,0;8,-1; 2:1,14,9,Times,0,12,0,0,0;1,14,10,Courier,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; endGroup; ] h[P[x,y]]: The canonical height of the specified point relative to the divisor (O). HeightPairing[P[x1,y1],P[x2,y2]]: The canonical height pairing. HeightAngle[P[x1,y1],P[x2,y2]]: The angle between the two points, relative to the canonical height pairing. HeightRegulator[P[x1,y1],P[x2,y2],...]: The height regulator for the given set of points. The height regulator will equal 0 (up to roundoff error) if and only if the points are linearly dependent. Note that this height regulator differs from the height regulator appearing in the Birch-Swinnerton-Dyer conjecture by a factor of 2^r, where r is the rank of the Mordell-Weil group. The reason for this discrepancy is that the Birch-Swinnerton-Dyer conjecture uses the height computed relative to the divisor 2(O). LocalHeight[P[x,y],prime]: Local height of the point at the prime. Taking prime = Infinity gives the archimedean height. For finite primes p, the LocalHeight does not include the Log[p] factor, and it does not include the contribution from the formal group. Thus the actual local height at p is given by the formula LocalHeight[P[x,y],p]*Log[p] + .5*ord[x,p]*Log[p]. Further, LocalHeight assumes that the given Weierstrass equation is minimal at the prime. This may be checked by using the command MinimalQ or by looking at the reduction types with the command ConductorList. References: The archimedean local height is computed by the algorithm of Tate, as modified by Silverman. The archimedean local heights are computed using the formulas of Silverman. See [Silverman 2]. For general information about the canonical height, see [Silverman 1, Chapter VII, Section 9]. ;[s] 13:0,1;9,2;85,1;117,2;150,1;180,2;259,1;297,2;778,1;805,2;1375,3;1385,2;1672,0;1673,-1; 4:1,14,9,Times,0,12,0,0,0;5,14,10,Courier,1,12,0,0,0;6,14,10,Courier,0,12,0,0,0;1,14,10,Courier,4,12,0,0,0; :[font = text; inactive; Cclosed; dontPreserveAspect; startGroup; ] Conductor and Reduction Types ;[s] 2:0,1;29,0;30,-1; 2:1,14,9,Times,0,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; ] Conductor[]: The conductor of the elliptic curve. ConductorList[]: Displays a table giving primes of bad reduction, the exponent of the discriminant, the exponent of the conductor, and the Kodaira reduction type. ConductorListFull[]: Displays a table giving primes of bad reduction, the exponent of the discriminant, the exponent of the conductor, the "Fudge-Factors" and the Kodaira reduction type. References: The Kodaira reduction type is computed using the algorithm of Tate, and then the exponent of the conductor is computed using Ogg's formula. See [Tate] or [Silverman 1, Appendix C, Sections 15,16]. ;[s] 8:0,1;11,0;52,1;67,0;216,1;235,0;404,2;414,0;615,-1; 3:4,14,9,Times,0,12,0,0,0;3,14,9,Times,1,12,0,0,0;1,14,9,Times,4,12,0,0,0; :[font = text; inactive; Cclosed; dontPreserveAspect; startGroup; ] Low level functions (for the technically inclined) ;[s] 2:0,1;19,0;51,-1; 2:1,14,9,Times,0,12,0,0,0;1,14,9,Times,4,12,0,0,0; :[font = text; inactive; dontPreserveAspect; endGroup; endGroup; ] reductiontype[prime]: returns the Kodaira reduction type at the prime, encoded as follows: 0 I(0) (good reduction) 2,3,4 II,III,IV -2,-3,-4 II*,III*,IV* 10 + n I(n) -10 - n I(n)* 1 not minimal -1 singular reductiontypelist[prime]: returns a list containing the following information: the prime p order of the discriminant at p order of the conductor at p Kodaira reduction type (as a string) Birch-Swinnerton-Dyer "fudge factor" Thus a typical returned list would be { 7, 3, 2, "III", 2 }. ChangeCoordinates[u,r,s,t]: Changes the a[i] coordinates according to the transformation x -> u^2 x + r, y -> u^3 y + u^2 s x + t DO NOT USE unless you're sure you know what you're doing!! This function does not change the b[i], c[i], Discriminant, etc., so almost every other function will get messed up. SingularPoint[prime]: Returns a point P[x,y] that is singular on the elliptic curve reduced modulo the prime. If the curve has good reduction, returns the Origin. ;[s] 8:0,1;20,0;296,1;320,0;613,1;639,0;931,1;951,0;1098,-1; 2:4,14,9,Times,0,12,0,0,0;4,14,9,Times,1,12,0,0,0; :[font = text; inactive; Cclosed; dontPreserveAspect; startGroup; ] Graphing ;[s] 2:0,1;8,0;9,-1; 2:1,14,9,Times,0,12,0,0,0;1,14,10,Courier,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; endGroup; ] PlotEllipticCurve[xmax,options]: Plots the elliptic curve with x-values up to xmax. If xmax is omitted, the default range is x < 5. The usual options for Plot[] may be specified. The default label for the plot is the equation of the curve; to omit the label, specify the option PlotLabel -> None. GraphPoints[{P[x1,y1],P[x2,y2],...},options]: Create a graphics object displaying the indicated list of points. Options: PointLabels -> Automatic (default) or None GraphTangents[{P[x1,y1],P[x2,y2], ...},options]: Create a graphics object displaying the tangent lines to the elliptic curve at the indicated points. Options: dx -> x-span of tangent line (default = 5) dy -> y-span of tangent line if vertical (default = 5) DisplayPoints -> True (default) or False PointLabels -> Automatic (default) or None GraphSecants[{{P[x1,y1],P[x2,y2]}, {P[x3,y3],P[x4,y4]},...}, options]: Create a graphics object displaying the secant lines connecting the indicated pairs of points. Options: Extension -> 0.1 (default). Amount that lines extend beyond the points (as a fraction of the length of the line.) DisplayPoints -> True (default) or False PointLabels -> Automatic (default) or None ;[s] 43:0,1;31,2;281,1;298,2;301,1;348,2;414,3;421,2;428,1;453,2;465,1;470,2;472,1;519,2;623,3;630,2;637,1;642,2;685,1;690,2;745,1;767,2;779,1;785,2;791,1;816,2;828,1;833,2;840,1;916,2;1014,3;1021,2;1028,1;1044,2;1147,1;1168,2;1182,1;1187,2;1193,1;1217,2;1231,1;1235,2;1236,0;1237,-1; 4:1,14,9,Times,0,12,0,0,0;18,14,10,Courier,1,12,0,0,0;21,14,10,Courier,0,12,0,0,0;3,14,10,Courier,4,12,0,0,0; :[font = text; inactive; Cclosed; dontPreserveAspect; startGroup; ] L-Series and Periods ;[s] 2:0,1;20,0;21,-1; 2:1,14,9,Times,0,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; endGroup; ] LSeries[s, options]: returns the value of the L-series. It is assumed that the elliptic curve is modular. Options: NumberOfTerms -> 20 (default) or number of terms of series to use in the computation. Note: At present, LSeries[s,_] is only implemented for s = 1, and it is not possible to compute derivatives with respect to s. RealPeriod[]: computes the period that appears in the Birch-Swinnerton-Dyer conjecture. If the real locus is connected, this is the usual real period; if the real locus is disconnected, it is twice the usual real period. FudgeFactor[]:the Birch-Swinnerton-Dyer "fudge factor", equal to the product over the bad primes of the number of components on the Neron model. FrobeniusTrace[prime]: returns the trace of Frobenius for the given prime. If the curve has bad reduction, returns -1,1,0 if reduction is split, non-split, additive respectively. In all cases, this is the p th coefficient of the L-series. LSeriesCoefficient[n]: returns the n th coefficient of the L-series of the curve. FunctionalEquationSign[n]: returns the sign of the functional equation of the L-series. If there is any additive reduction, the sign is computed by using n terms of the corresponding modular form. If n is omitted, 20 terms are used. References: For general information about L-series of elliptic curves over Q, their relation to modular forms, and the Birch-Swinnerton-Dyer conjecture, see [Birch-Swinnerton-Dyer]. For a description of the Birch-Swinnerton-Dyer constant, see [Silverman 1, Appendix C, Section 16]. ;[s] 26:0,1;22,0;107,2;114,0;121,1;137,0;138,1;140,0;207,2;211,0;225,1;237,0;336,1;350,0;559,1;574,0;705,1;730,0;946,1;971,0;1029,1;1058,0;1271,2;1281,0;1348,1;1349,0;1558,-1; 3:13,14,9,Times,0,12,0,0,0;10,14,9,Times,1,12,0,0,0;3,14,9,Times,4,12,0,0,0; :[font = text; inactive; Cclosed; dontPreserveAspect; startGroup; ] Useful Variables ;[s] 2:0,1;16,0;17,-1; 2:1,14,9,Times,0,12,0,0,0;1,14,10,Courier,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; endGroup; endGroup; ] a[1],a[2],a[3],a[4],a[6],b[2],b[4],b[6],b[8],c[4],c[6]: Weierstrass coefficients associated with the curve Discriminant: The discriminant of the curve j: The j-invariant of the curve P[x,y]: Point on the curve with coordinates (x,y) Origin = P[Infinity,Infinity]: Zero point for curve ;[s] 11:0,2;55,1;112,2;124,1;156,2;157,1;188,2;194,1;238,2;245,1;289,0;290,-1; 3:1,14,9,Times,0,12,0,0,0;5,14,10,Courier,0,12,0,0,0;5,14,10,Courier,1,12,0,0,0; :[font = subsection; inactive; Cclosed; dontPreserveAspect; startGroup; ] References ;[s] 2:0,1;10,0;11,-1; 2:1,14,9,Times,1,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; endGroup; endGroup; ] [Birch-Kuyk] Birch, B., Kuyk, W., eds., Modular Functions of One Variable IV, Lecture Notes in Math. 476, Springer, Berlin, 1975 [Birch-Swinnerton-Dyer] Birch, B., Swinnerton-Dyer, H.P.F., Elliptic curves and modular functions, in Modular Functions of One Variable IV, Lecture Notes in Math. 476, Springer, Berlin, 1975 [Brumer-McGuinness] Elliptic curves with prime conductor, to appear [Buhler-Gross-Zagier] J.P. Buhler, B.H. Gross, D.B. Zagier, On the conjecture of Birch and Swinnerton-Dyer for an elliptic curve of rank 3, Math. Comp., 44 (1985), 473-481 [Hindry-Silverman] M. Hindry, J.H. Silverman, The canonical height and integral points on elliptic curves, Invent. Math. 93 (1988), 419-450 [Lang] S. Lang, Elliptic Curves: Diophantine Analysis, Springer, Berlin, 1978 [Laska] M. Laska, An algorithm for finding a minimal Weierstrass equation of an elliptic curve, Math. Comp. 38 (1982), 257-260 [McGuinness] O. McGuinness, Computing periods of elliptic curves, October, 1982, unpublished manuscript [Mazur] B. Mazur, Modular curves and the Eisenstein ideal, IHES Publ. Math. 47, (1977), 33-186 [Silverman 1] J.H. Silverman, The Arithmetic of Elliptic Curves, Springer, New York, 1986 [Silverman 2] -------------, Computing heights on elliptic curves, Math. Comp. 51 (1988), 339-358 [Tate] J. Tate, Algorithm for determining the type of a singular fiber in an elliptic pencil, Lecture Notes in Math. 476, Modular Functions in One Variable IV, 1975, 33-52 :[font = section; inactive; Cclosed; dontPreserveAspect; startGroup; ] Examples :[font = subsection; inactive; Cclosed; dontPreserveAspect; startGroup; ] Curves and points with small height and small h(P)/log(D) ratio ;[s] 2:0,1;63,0;64,-1; 2:1,14,9,Times,1,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; ] Serge Lang [Lang] has conjectured that there should be an absolute lower bound for the ratio h(P)/log(D), where h(P) runs over the canonical height of all non-torsion points of elliptic curves defined over Q, and D is the minimal discriminant of the curve containing P. The following point has small ratio of height to log(Discriminant) with fairly small coefficients. ;[s] 3:0,0;211,1;212,0;389,-1; 2:2,14,9,Times,0,12,0,0,0;1,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] EllipticCurve[1,1,1,-1001,12375] :[font = print; inactive; dontPreserveAspect; endGroup; ] Curve 1: y^2 + xy + y = x^3 + x^2 - 1001 x + 12375 :[font = input; dontPreserveAspect; startGroup; ] TableForm[{ {"P", P[45,224]}, {"h(P)", h[P[45,224]]}, {"Discriminant",Discriminant}, {HoldForm[h][P[45,224]]/Log[HoldForm[Discriminant]], N[h[P[45,224]]/Log[Abs[Discriminant]]] } }] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] TableForm[{{"P", P[45, 224]}, {"h(P)", 0.01049206065917646774}, {"Discriminant", -6497214464}, {HoldForm[h][P[45, 224]]/Log[HoldForm[Discriminant]], 0.0004643606159695514533}}] ;[o] P P[45, 224] h(P) 0.01049206065917646774 Discriminant -6497214464 h[P[45, 224]] ----------------- 0.0004643606159695514533 Log[Discriminant] :[font = text; inactive; dontPreserveAspect; ] It is known that Lang's conjecture is true unless the elliptic curve has a lot of "complicated" multiplicative reduction. (See [Hindry-Silverman].) We can see that this is true for the curve listed above by computing its Neron reduction types. :[font = input; dontPreserveAspect; startGroup; ] ConductorList[] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] TableForm[{{" prime ", "ord disc", "ord cond", "Kodaira", "red type"}, {2, 13, 1, StringForm["``````", "I", Subscript[13], Superscript[""]], "Split"}, {13, 3, 1, StringForm["``````", "I", Subscript[3], Superscript[""]], "Split"}, {19, 2, 1, StringForm["``````", "I", Subscript[2], Superscript[""]], "Non-Split"}}, TableAlignments -> Center, TableSpacing -> {0, 2}] ;[o] prime ord disc ord cond Kodaira red type 2 13 1 I Split 13 13 3 1 I Split 3 19 2 1 I Non-Split 2 :[font = text; inactive; dontPreserveAspect; ] If Lang's conjecture is true, then in particular there should be some non-torsion point with the absolutely smallest non-zero height. (Or possibly some finite list of points.) The following point is an example with small height. :[font = input; dontPreserveAspect; startGroup; ] EllipticCurve[1,-1,1,-48,147] :[font = print; inactive; dontPreserveAspect; endGroup; ] Curve 2: y^2 + xy + y = x^3 - x^2 - 48 x + 147 :[font = input; dontPreserveAspect; startGroup; ] TableForm[{ {"P", P[13,33]}, {"h(P)", h[P[13,33]]}, {"Discriminant", Discriminant} }] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] TableForm[{{"P", P[13, 33]}, {"h(P)", 0.01028400572837062643}, {"Discriminant", -972800}}] ;[o] P P[13, 33] h(P) 0.010284 Discriminant -972800 :[font = input; dontPreserveAspect; startGroup; ] ConductorList[] :[font = output; output; inactive; dontPreserveAspect; endGroup; endGroup; ] TableForm[{{" prime ", "ord disc", "ord cond", "Kodaira", "red type"}, {2, 11, 1, StringForm["``````", "I", Subscript[11], Superscript[""]], "Split"}, {5, 2, 1, StringForm["``````", "I", Subscript[2], Superscript[""]], "Non-Split"}, {19, 1, 1, StringForm["``````", "I", Subscript[1], Superscript[""]], "Split"}}, TableAlignments -> Center, TableSpacing -> {0, 2}] ;[o] prime ord disc ord cond Kodaira red type 2 11 1 I Split 11 5 2 1 I Non-Split 2 19 1 1 I Split 1 :[font = subsection; inactive; Cclosed; dontPreserveAspect; startGroup; ] Curves of Low Conductor ;[s] 2:0,1;23,0;24,-1; 2:1,14,9,Times,1,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; ] Mathematica 1.0 came with a partial list of the curves of low conductor from the Antwerp IV tables [Birch-Kuyk, Table 1]. It was in the file "EllipticCurves.m". The curves are formatted in the following form, where we include a few curves from that file. ;[s] 2:0,1;11,0;252,-1; 2:1,14,9,Times,0,12,0,0,0;1,14,9,Times,2,12,0,0,0; :[font = input; dontPreserveAspect; ] Curve11A = { y^2 + y == x^3 - x^2, 11, { 1/5 , 0 } } Curve14A = { y^2 + x y + y == x^3 - x, 14, { 1/6 , 0 } } Curve15A = { y^2 + x y + y == x^3 + x^2, 15, { 1/4 , 0 } } Curve19A = { y^2 + y == x^3 + x^2 + x, 19, { 1/3 , 0 } } Curve20A = { y^2 == x^3 + x^2 - x, 20, { 1/3 , 0 } }; :[font = text; inactive; dontPreserveAspect; ] This format is not well-suited to using the Elliptic Curve Calculator. After reading in the "EllipticCurves.m" file, the following function takes a curve as described in that file and enters it into the Elliptic Curve Calculator. :[font = input; dontPreserveAspect; ] Antwerp::usage= "Antwerp[curvename]: Takes a curve from the Antwerp IV tables, as described in the \"EllipticCurves.m\" file that comes with Mathematica, and enters it into the Elliptic Curve Calculator. For example, Antwerp[Curve20A]." Antwerp[curve_] := EllipticCurve @@ Apply[CoefficientList[ curve[[1,1]]+curve[[1,2]],{y,x}][[#1,#2]]&, {{2,2},{1,3},{2,1},{1,2},{1,1}}, 1] :[font = text; inactive; dontPreserveAspect; ] Now it is easy to enter one of the "EllipticCurves.m" curves into the ECC. For example, :[font = input; dontPreserveAspect; startGroup; ] Antwerp[Curve19A] :[font = print; inactive; dontPreserveAspect; endGroup; endGroup; ] 2 3 2 Curve 1: y + y = x + x + x :[font = subsection; inactive; Cclosed; dontPreserveAspect; startGroup; ] Curves of Prime Conductor ;[s] 2:0,1;25,0;26,-1; 2:1,14,9,Times,1,12,0,0,0;1,14,9,Times,5,12,0,0,0; :[font = text; inactive; dontPreserveAspect; ] The elliptic curve of smallest (prime) conductor and rank 3 over Q is probably the following curve, which was carefully analyzed in [Buhler-Gross-Zagier]. ;[s] 3:0,0;65,1;66,0;155,-1; 2:2,14,9,Times,0,12,0,0,0;1,14,9,Times,1,12,0,0,0; :[font = input; dontPreserveAspect; startGroup; ] EllipticCurve[0,0,1,-7,6] :[font = print; inactive; dontPreserveAspect; endGroup; ] 2 3 Curve 1: y + y = x - 7 x + 6 :[font = text; inactive; dontPreserveAspect; ] The Mordell-Weil group is generated by the following three points, which we verify are independent. :[font = input; dontPreserveAspect; startGroup; ] PointRelation[ P[0,2], P[1,0], P[2,0] ] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] "Independent" ;[o] Independent :[font = text; inactive; dontPreserveAspect; ] This curve has many other points with integer coordinates, such as P[816,23309]. We can express this point in terms of the generators: :[font = input; dontPreserveAspect; startGroup; ] PointRelation[ P[0,2], P[1,0], P[2,0], P[816,23309] ] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] HoldForm[1]*P[0, 2] + HoldForm[3]*P[1, 0] + HoldForm[-1]*P[2, 0] + HoldForm[1]*P[816, 23309] == 0 ;[o] 1 P[0, 2] + 3 P[1, 0] + -1 P[2, 0] + 1 P[816, 23309] == 0 :[font = text; inactive; dontPreserveAspect; ] Curves with prime conductor have been extensively studied in [Brumer-McGuinness]. The smallest curve with prime conductor and rank 4 in their list is the following: :[font = input; dontPreserveAspect; startGroup; ] EllipticCurve[0,1,1,-72,210] :[font = print; inactive; dontPreserveAspect; endGroup; ] 2 3 2 Curve 2: y + y = x + x - 72 x + 210 :[font = text; inactive; dontPreserveAspect; ] A generating set for the Mordell-Weil group is given by the following set of points: :[font = input; dontPreserveAspect; startGroup; ] HeightRegulator[ P[5, 0], P[4, 1], P[3, 5], P[6, 5] ] :[font = output; output; inactive; dontPreserveAspect; endGroup; ] 0.1980889897305232585 ;[o] 0.198089 :[font = text; inactive; dontPreserveAspect; ] Note that if you want to use this height regulator to numerically verify the Birch-Swinnerton-Dyer conjectures, you must multiply by 16, since our height is 1/2 the Birch-Swinnerton-Dyer height. Brumer and McGuinnesss [op. cit.] also found what may be the curve of smallest prime conductor and rank 5. :[font = input; dontPreserveAspect; startGroup; ] EllipticCurve[0,0,1,-79,342] :[font = print; inactive; dontPreserveAspect; endGroup; ] 2 3 Curve 7: y + y = x - 79 x + 342 :[font = input; dontPreserveAspect; startGroup; ] { Discriminant, PrimeQ[Discriminant] } :[font = output; output; inactive; dontPreserveAspect; endGroup; ] {-19047851, True} ;[o] {-19047851, True} :[font = input; dontPreserveAspect; endGroup; endGroup; ] MordellWeilGenerators = {P[5,8], P[4,9], P[3,11], P[7,11], P[0,18]}; ^*)