> See this worksheet, which has the polynomials and two examples: Thanks. So this is the curve E: y^2 + y = x^3 - x. The discriminant w.r.t. y is D = 4*x^3 - 4*x + 1, so we're seeking quadratic forms [A,B,C] over Q(x) with B^2-4AC=D; the class group of such forms is isomorphic with the E(Q). Let's do the case of discriminant -115 first, because the class number is only 2. You get a point (x,y)=(a,a+8) where a^2+5a+12=0. This means that D=B^2-4AC with A = x^2+5*x+12, B = 2*y+1 = 2*x+17. (In general B will be 2*y + a1*x + a3.) So C = (D-B^2)/(4*A) = 6-x. This (A,B,C) is not reduced because deg(C) > deg(A). Replacing (A,B,C) by the equivalent (C,-B,A) yields (6-x, -(2*x+17), x^2+5*x+12). To finish the reduction, take (A,B,C) to (A, B-2*d*A, C-d*B+d^2*A) where d is the polynomial part of C/(2*A); here d=1 so we get (A, B-2*A, C-B+A) = (6-x, -29, x^2+6*x+35) . Thus the trace is (x,y) = (6,-15) which is the (-6)th multiple of the standard generator (0,0), as expected (up to sign). For discriminant -47 we have D = 4*x^3 - 4*x + 1 \\ as before A = x^5 - x^4 + x^3 + x^2 - 2*x + 1 \\ "y_1[0].minpoly()" B = 2*(x^4+x-1) + 1 \\ 2*y+1 as before C = (B^2-D) / (4*A) \\ = x^3 + x^2 and the reduction can be implemented as follows: verbose = 1; { while(poldegree(C)<poldegree(A), A_copy = A; A = C; C = A_copy; B = -B; \\ (A,B,C) <-- (C,-B,A) d = B \ (2*A); \\ happily gp interprets "\" correctly C += d*(d*A-B); B -= 2*d*A; if(verbose,print([A,B,C])) ) } and since I set "verbose" to be nonzero the output keeps track of the reduction as it progresses: [x^3 + x^2, -2*x^2 - 2*x + 1, x] [x, -1, -x^2 + 1] at the last step we find that the trace has x=0 (the root of A) and y=-1 (because 2*y+1 = -1). So it's -1 times the standard generator. Again this is consistent with the computation you report. Here's an example of what happens when the trace is zero. The first case is discriminant -139; using the same program but with -139 in place of -47 or -115, I find (on sage.math.washington.edu -- Heegner_point isn't yet implemented in the version of sage at alhambra) (x, y) = (A, 5*A-4) with A^3 - 25*A^2 + 34*A - 12 = 0. So here A = x^3 - 25*x^2 + 34*x - 12; B = 2*(5*x-4) + 1; C = (B^2-D) / (4*A); makes C = -1, and the reduction algorithm reaches [-1, 0, x^3-x+1/4] in one step. Since here deg(A)=0 we have the trivial element of the class group, i.e. the origin of the group law. This is the example used in the original Gross-Zagier paper, where they showed directly that the trace is zero by producing a modular function on X_0(37)/w [which is the elliptic curve 37A1 -- the parametrization degree is 2] with a triple pole at the cusp and zeros at the CM-139 point! NDE PS: I wrote: > Here's an example of what happens when the trace is zero. > The first case is discriminant -139; No it isn't, though it *is* historically first... Here's what it looks like for D = -95, which also has a larger class number so you can see more steps of the reduction algorithm. Change the and B lines to A = x^8 - 5*x^7 + 7*x^6 + 13*x^5 - 10*x^4 - 4*x^3 + x^2 - 5*x + 7 B = 2*(24*x^7-55*x^6-78*x^5+683*x^4-234*x^3+1017*x^2+1905*x-2821)/2329 + 1 and then the same algorithm works, reaching in three steps an equivalent (A,B,C) with deg(A)=0. It accumulates unnecessary denominators along the way, so the final A is not 1 or -1 as before but 331776/5424241 = 2^12 3^4 / (17 * 137)^2, with the denominator coming from B (which is an algebraic integer but not necessarily in Z[x]), and thus C is the quotient of D by the same constant. This behavior can be ameliorated by inserting a couple of lines at the start of the loop that scale A and C so that the "content" (gcd of coefficients) of A, and usually of C, is the same as that of B: { while(poldegree(C)<poldegree(A), c = content(B)/content(A); A *= c; C /= c; if(verbose, c=content([A,B,C]); print(c,"*",[A,B,C]/c)); A_copy = A; A = C; C = A_copy; B = -B; \\ (A,B,C) <-- (C,-B,A) d = B \ (2*A); \\ happily gp interprets "\" correctly C += d*(d*A-B); B -= 2*d*A; ) } [A,B,C] the output is then better behaved (NB I cheated a bit by prettifying the print line): 1/2329*[x^8 - 5*x^7 + 7*x^6 + 13*x^5 - 10*x^4 - 4*x^3 + x^2 - 5*x + 7, 48*x^7 - 110*x^6 - 156*x^5 + 1366*x^4 - 468*x^3 + 2034*x^2 + 3810*x - 3313, 576*x^6 + 240*x^5 - 3551*x^4 + 14441*x^3 + 19424*x^2 + 14908*x + 198276] 1/1152*[2304*x^6 + 960*x^5 - 14204*x^4 + 57764*x^3 + 77696*x^2 + 59632*x + 793104, -96*x^5 + 316*x^4 - 580*x^3 - 2560*x^2 + 4624*x - 20496, x^4 - 7*x^3 + 32*x^2 - 68*x + 132] 1*[x^4 - 7*x^3 + 32*x^2 - 68*x + 132, -2*x^2 + 6*x - 23, 1] [1, 0, -x^3 + x - 1/4] Hope this helps, --NDE PSS: BTW if you're going to implement something like this in Sage you'll probably want to check first that the content ratio is nonzero. (If it's zero then B=0 and you've found a 2-torsion point, which cannot happen on 37A but will occur in other examples.) This should all work on hyperelliptic curves too -- it must be basically the reduction part of Cantor's algorithm. NDE