We construct Some Heegner Points over Ring Class Fields

{{{ #auto def qflist(D, N, b): b = ZZ(b) R = ZZ((b^2 - D)/(4*N)) L = [] Lprime = [] for d in divisors(R): fqf = BinaryQF([d*N,b,R/d]) fr = fqf.reduced() if not fr in Lprime: Lprime.append(fr) L.append(fqf) return L def tau(f): A,B,C = f D = f.discriminant() return (-B + sqrt(D))/(2*A) def phi(E, k, z, prec): """ Map a point z in the upper half plan to a point on the complex torus representation of the elliptic curve, using prec terms of the modular parametrization. """ b = exp(2*pi*I*z) q = k(b) a = E.anlist(prec) return sum( k(a[n]/n) * q^n for n in xrange(1,prec)) def topoint(E, k, z): """ Given a point in the complex lattice representation of E, return a point on the Weierstrass model of E. """ E2 = E.change_ring(k) gp.set_real_precision(k.prec()+10) e = gp(E2) w = list(e.ellztopoint(z)) k = E2.base_field() return E2.point([k(repr(w[0])), k(repr(w[1])), k(1)], check=False) def compute_y(E, FD, lam, prec_field=100, prec_ser=1000): N = E.conductor() D = FD * lam^2 srs = Mod(D, 4*N).sqrt(all=True) S = list(set([Mod(a, 2*N) for a in srs])) L = sum([qflist(D, N, b) for b in S], []) best = min([qf[1] for qf in L]) for qf in L: if qf[1] == best: break z = tau(qf) print z k = ComplexField(prec_field) y_lattice_point = phi(E, k, z, prec_ser) y = topoint(E, k, y_lattice_point) return y def Lambda1(E, ell, bnd): v = [] p = 3 while len(v) < bnd: if valuation(gcd(p+1, E.ap(p)), ell) >= 1: v.append(p) p = next_prime(p) return v }}} First we consider the rank 2 elliptic curve 389a, and construct Heegner points on E over ring class fields. {{{ E = EllipticCurve('389a1'); ell = 3 print E /// Elliptic Curve defined by y^2 + y = x^3 + x^2 - 2*x over Rational Field }}} {{{ E.rank() /// 2 }}} {{{ E.heegner_discriminants_list(10) /// [-7, -11, -19, -20, -24, -35, -52, -55, -59, -67] }}} {{{ Lambda1(E, ell, 5) /// [5, 17, 29, 41, 53] }}} {{{ time y = compute_y(E, -7, 5, 100); y /// 5 sqrt(7) I - 147 ------------------ 778 (0.67550755692680556826636464028 + 0.34474964930263231233411528464*I : -0.37714293140188761805689139731 + 0.84336622713714240827481069920*I : 1.0000000000000000000000000000) CPU time: 0.07 s, Wall time: 0.28 s }}} {{{ a = y[0]; a f =algdep(a,6) print f print f/f.leading_coefficient() /// 1225*x^6 + 1750*x^5 - 21675*x^4 - 380*x^3 + 110180*x^2 - 129720*x + 48771 x^6 + 10/7*x^5 - 867/49*x^4 - 76/245*x^3 + 3148/35*x^2 - 25944/245*x + 48771/1225 }}} {{{ f.discriminant().factor() /// 2^6 * 3^2 * 5^11 * 7^4 * 13^2 * 19^6 * 199^2 * 719^2 * 26161^2 }}} {{{ time y = compute_y(E, -11, 5, 100); y /// 5 sqrt(11) I - 219 ------------------- 778 (-0.67329035754573749937674815474 - 0.64091449578890809613320748111*I : 1.0519863860763819687931984957 + 0.49501836748979198616171079473*I : 1.0000000000000000000000000000) CPU time: 0.10 s, Wall time: 0.25 s }}} {{{ a = y[0]; a f =algdep(a,6) print f print f/f.leading_coefficient() /// 3025*x^5 + 41525*x^4 + 93065*x^3 + 5755*x^2 - 73814*x - 69556 x^5 + 151/11*x^4 + 18613/605*x^3 + 1151/605*x^2 - 73814/3025*x - 69556/3025 }}} {{{ f.discriminant().factor() /// -1 * 2^8 * 3^8 * 5^7 * 11^3 * 17^2 * 99529^2 * 1995857^2 }}} {{{ time y = compute_y(E, -19, 5, 200, 3000); y /// 5 sqrt(19) I - 129 ------------------- 778 (1.4450478263303708714199136159877044082036504980387037059928 - 0.11626869941770592100111118836663317701780744600746447536797*I : -2.0695227702112800637422368662289062891672601499990920011211 + 0.26450159789485868746376818716930413179411958316282060082443*I : 1.0000000000000000000000000000000000000000000000000000000000) CPU time: 0.08 s, Wall time: 0.26 s }}} {{{ a = y[0]; a f =algdep(a,6) print f print f/f.leading_coefficient() /// 3610000*x^5 + 13100500*x^4 - 22399475*x^3 - 60444780*x^2 + 79923231*x x^5 + 1379/380*x^4 - 895979/144400*x^3 - 3022239/180500*x^2 + 79923231/3610000*x }}} {{{ f.discriminant().factor() /// -1 * 2^6 * 3^8 * 5^15 * 19^3 * 109^2 * 131^2 * 479^2 * 67789^2 * 58824737^2 }}} {{{ [(p, gcd(p+1, E.ap(p))) for p in prime_range(100)] /// [(2, 1), (3, 2), (5, 3), (7, 1), (11, 4), (13, 1), (17, 6), (19, 5), (23, 4), (29, 6), (31, 4), (37, 2), (41, 3), (43, 4), (47, 2), (53, 6), (59, 3), (61, 2), (67, 1), (71, 2), (73, 1), (79, 1), (83, 12), (89, 2), (97, 1)] }}} First we consider another rank 2 elliptic curve 571b, and construct a Heegner point on E over a degree 12 class field. {{{ E = EllipticCurve('571b1'); ell = 3 print E.rank() E /// 2 Elliptic Curve defined by y^2 + y = x^3 + x^2 - 4*x + 2 over Rational Field }}} {{{ Lambda1(E, ell, 5) /// [11, 47, 59, 83, 89] }}} {{{ E.heegner_discriminants_list(10) /// [-7, -8, -15, -19, -35, -39, -40, -47, -67, -68] }}} {{{ time y = compute_y(E, -7, 11, 1000, 10000); y /// 11 sqrt(7) I - 61 ------------------ 1142 (-9.13588324885079364337833563951547601947405849453988331180479521834152982355590367321430216365268518907773228202332663517959286998370782798960479351888355333312437551286459366295265853610195393854619253395537596921985187417837229674192782848421183455006609761458137438917372644676138192923918942498502 - 4.77479840986864579477544068880909798548981486973531197608120009340282475192407950073536227482098237883500102150091622424869171220136673598487480191137290292024354441402653869716332313511231831780539368297850465981749570664538788068566712487597147267570588068492536054418940881140289173079612754824269*I : 21.2130776258188524134788796192393073563156098355335074217051336233946142607628427611682543103984919926328740129454527573048237082386669416634060068784623711054526134237162826637150751643697435004150871840454534983351961438243183218061761219296636853270171113886826383263637321996255491405103545631640 - 22.5756602829208939483249395606641551869544114536125350898340288878544451921776592783678015519512079861610541862802607939616499414864588589607137161569593398454160789140933979143462810487385287975847053959565004441916289694981664916200166215417556859492245575580013674997590104169526286505552705115543*I : 1.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000) CPU time: 0.88 s, Wall time: 1.90 s }}} {{{ f = algdep(y[0], 12); f /// 2448525479604140475*x^12 + 102189270342374437068*x^11 + 1802256744812731464807*x^10 + 16406739685285440384069*x^9 + 75506842289522117356344*x^8 + 123988820894525372822784*x^7 - 107889386217908954201356*x^6 - 118349097644340473631028*x^5 + 629701212580366952566783*x^4 - 1727588893757496077631070*x^3 + 2724551276815760017990925*x^2 - 1868688977358574024565265*x + 470380962888290366388441 }}} {{{ f.discriminant().valuation(11) /// 23 }}} {{{ f.discriminant().valuation(7) /// 8 }}} {{{ }}} We consider a rank 1 curve and construct points over a few class fields. {{{ E = EllipticCurve('53a1'); ell = 3 E /// Elliptic Curve defined by y^2 + x*y + y = x^3 - x^2 over Rational Field }}} {{{ E.rank() /// 1 }}} {{{ Lambda1(E, ell, 5) /// [5, 11, 17, 41, 107] }}} {{{ E.heegner_discriminants_list(10) /// [-7, -11, -15, -24, -40, -43, -47, -52, -59, -68] }}} {{{ time y = compute_y(E, -7, 5, 53); y /// 5 sqrt(7) I - 39 ----------------- 106 (0.000000000000000216689732378388 - 3.58916358698450*I : -5.76520618653731 - 2.42570548892695*I : 1.00000000000000) CPU time: 0.07 s, Wall time: 0.18 s }}} {{{ a = y[0]; a f = algdep(a, 6); f /// x^6 + 15*x^4 + 30*x^2 + 35 }}} {{{ f.discriminant().factor() /// -1 * 2^6 * 3^12 * 5^5 * 7^3 }}} {{{ time y = compute_y(E, -43, 5, 100); y /// 5 sqrt(43) I - 41 ------------------ 106 (4.5070659935812220190005169051 - 43.922955457150745285620963774*I : -177.91170438489241667483946781 - 213.07062469901404862717177198*I : 1.0000000000000000000000000000) CPU time: 0.05 s, Wall time: 0.24 s }}} {{{ a = y[0]; a f = algdep(a, 6); f /// x^6 - 12*x^5 + 1980*x^4 - 5855*x^3 + 6930*x^2 - 3852*x + 864 }}} {{{ f.discriminant().factor() /// -1 * 2^6 * 3^12 * 5^11 * 7^4 * 19^2 * 43^3 }}}