Finding a genus 2 curve from it's Jacobian ========================================== The programs in this directory can be used to compute an equation for a genus 2 curve with a given (simple, 2 dimensional) Jacobian. The Jacobian is specified by giving an element, tau, of two dimensional Siegel upper half-space (that is, a symmetric 2x2 matrix with positive definite imaginary part. If the period matrix of the Jacobian is given by (omega1, omega2) where omega1 and omega2 are 2x2 matrices, then tau = omega2^-1 * omega1). These are gp programs and so you need the (free) PARI-GP package, see http://www.parigp-home.de/ For more details concerning the mathematics involved and the algorithms used, see Paul van Wamelen, "Examples of genus two CM curves defined over the rationals", Math. Comp., vol. 68 (1999), no. 225, 307--320. It's available at http://www.math.lsu.edu/~wamelen/publications.html. Here are the particular functions that are available: 1) From tau compute (numerically) lambda1, lambda2, lambda3 such that the curve y^2 = x(x-1)(x - lambda1)(x - lambda2)(x - lambda3) has Jacobian specified by tau. tau2lambda ========== File: tau2lambda.gp Input: tau as a 2x2 matrix Output: list of the form [lambda1, lambda2, lambda3] 2) For any curve y^2 = f(x) where f(x) is a polynomial of degree 5 or 6 compute the Igusa invariants, i1, i2 and i3. lambda2igusa ============ File: lambda2igusa.gp Input: lambda1, lambda2 and lambda3 Output: list [i1,i2,i3] There is also igusainvpol =========== File: lambda2igusa.gp Input: A polynomial of degree 5 or 6 Output: list [i1,i2,i3] 3) If the Igusa invariants are rational numbers then it is likely that the curve has an equation defined over the rationals. Mestre gave an algorithm for finding such a curve (if it exists) from the Igusa invariants. Given rational Igusa invariants you can look for an equation for the corresponding curve defined over the rationals and with "small" coefficients. igusa2curve =========== File: igusa2curve.gp Input: list [i1,i2,i3] with i1, i2 and i3 rational numbers. Output: Either a message indicating that the curve can not be defined over the rationals, or a "small" polynomial (with rational coefficients) of degree 5 or 6, defining a curve with the given Igusa invariants. This program can take a while but is pretty verbose so you will know it's still working on your problem. The size messages give essentially the average number of digits of the coefficients of the smallest polynomial found so far. ********************************* * * * EXAMPLE * * * ********************************* GP/PARI CALCULATOR Version 2.1.0 (released) UltraSparc (MicroSparc kernel) 32-bit version (readline disabled, extended help available) Copyright (C) 2000 The PARI Group PARI/GP is free software, covered by the GNU General Public License, and comes WITHOUT ANY WARRANTY WHATSOEVER. Type ? for help, \q to quit. Type ?12 for how to get moral (and possibly technical) support. realprecision = 28 significant digits seriesprecision = 16 significant terms format = g0.28 parisize = 4000000, primelimit = 500000 ? \r tau2lambda.gp \\ \\ Read in the program. \\ ? default(realprecision,70) realprecision = 77 significant digits (70 digits displayed) ? a = 0.6884867379843463894666218073916214290356748461717674232290638988262816 %1 = 0.6884867379843463894666218073916214290356748461717674232290638988262816 ? b=-0.02639603083638888571179238170528291461236442098696871736258105367854753 %2 = -0.02639603083638888571179238170528291461236442098696871736258105367854753 ? c = 0.8156529259355996246499038920562833105514529167651212134150177697170389 %3 = 0.8156529259355996246499038920562833105514529167651212134150177697170389 ? tau = I*[a,b;b,c]; \\ \\ This tau comes from the somos 6 sequence. See Noam Elkies's message "What \\ is this abelian surface? (Somos-6)" of November 2000, at \\ http://listserv.nodak.edu/archives/nmbrthry.html \\ ? lambdas = tau2lambda(tau) %6 = [-0.1805166864798464738259686054639589516891288440195876490798799192309534 + 0.E-77*I, -0.1814188384480086218979181106824346890134853013823188930083938376293411 + 0.E-77*I, -0.1817848086674143103238124507146465347940302014268457954554207263555015 + 0.E-87*I] ? \r lambda2igusa.gp ? igusas = lambda2igusa(lambdas[1],lambdas[2],lambdas[3]) %7 = [93202421539085394963.13311486290289127639274899406811299622515463905 + 0.E-47*I, 351459874527399.2124953333056788484672501762973410212801261044201555 + 0.E-52*I, 117016284771457.0619075890820093748703696021902352013937860372403251 + 0.E-53*I] \\ \\ At least the Igusa invariants are real, are they rational? \\ ? ld1 = lindep([1,real(igusas[1])],60) %8 = [2246830776042731616376250, -24107] ? i1 = -ld1[1]/ld1[2] %9 = 2246830776042731616376250/24107 ? i1/igusas[1]-1 %10 = 8.77306631 E-62 + 0.E-67*I \\ \\ i1 is very close to 2246830776042731616376250/24107, good thing we started \\ with high precision! \\ ? ld2 = lindep([1,real(igusas[2])],60) %11 = [67781145561856102525, -192856] ? i2 = -ld2[1]/ld2[2] %12 = 67781145561856102525/192856 ? i2/igusas[2]-1 %13 = 8.77306631 E-62 + 0.E-67*I \\ \\ Note that 192856 = 8*24107, another strong indication that these are the \\ correct rational numbers. \\ ? ld3 = lindep([1,real(igusas[3])],60) %14 = [-90269170463536492525, 771424] ? i3 = -ld3[1]/ld3[2] %15 = 90269170463536492525/771424 ? i3/igusas[3]-1 %16 = 8.77306631 E-62 + 0.E-67*I \\ \\ 771424 = 32*24107 \\ Now that we have the Igusa invariants we can try to find a curve defined \\ over the rationals. \\ ? \r igusa2curve.gp ? igusa2curve([i1,i2,i3]) done factoring! Found the big curve! low size 1337. low size 1333. low size 1323. snip snip ... low size 49. low size 46. low size 43. low size 40. low size 37. low size 32. low size 28. low size 24. low size 22. low size 7.6 Size of linear transforms now : 3 new low size: 7.6 new low size: 7.1 new low size: 7.0 new low size: 5.2 new low size: 3.5 new low size: 3.1 new low size: 2.4 new low size: 2.2 Size of linear transforms now : 4 Size of linear transforms now : 5 Size of linear transforms now : 6 Size of linear transforms now : 7 Size of linear transforms now : 8 Size of linear transforms now : 9 Size of linear transforms now : 10 Size of linear transforms now : 11 %21 = -63*x^6 + 16*x^5 + 252*x^4 - 46*x^3 - 332*x^2 + 32*x + 145 ? \\ \\ Not bad, considering the curve given by Mestre's machine has coefficients \\ with more than a 1000 digits. The polynomial above has -1 as a root. \\ Sending this to infinity gives the curve \\ y^2 = 8*x^5 + 213*x^4 + 366*x^3 - 773*x^2 + 394*x - 63 \\ which might be considered smaller... \\