Skip to content

Instantly share code, notes, and snippets.

@khaotik
Created January 19, 2025 16:43
Show Gist options
  • Save khaotik/b9a9256e92108c6b3f396144da5fbaf4 to your computer and use it in GitHub Desktop.
Save khaotik/b9a9256e92108c6b3f396144da5fbaf4 to your computer and use it in GitHub Desktop.
elltaniyama code snippet
GEN
elltaniyama(GEN e, long prec)
{
GEN x, w, c, d, X, C, b2, b4;
long n, m;
pari_sp av = avma;
checkell_Q(e);
if (prec < 0) pari_err_DOMAIN("elltaniyama","precision","<",gen_0,stoi(prec));
if (!prec) retmkvec2(triv_ser(gen_1,-2), triv_ser(gen_m1,-3));
x = cgetg(prec+3,t_SER);
x[1] = evalsigne(1) | _evalvalser(-2) | evalvarn(0);
d = ginv(RgV_to_ser(ellanQ(e,prec+1), 0, prec+3)); setvalser(d,-1);
/* 2y(q) + a1x + a3 = d qx'(q). Solve for x(q),y(q):
* 4y^2 = 4x^3 + b2 x^2 + 2b4 x + b6 */
c = gsqr(d);
/* solve 4x^3 + b2 x^2 + 2b4 x + b6 = c (q x'(q))^2; c = 1/q^2 + O(1/q)
* Take derivative then divide by 2x':
* b2 x + b4 = (1/2) (q c')(q x') + c q (q x')' - 6x^2.
* Write X[i] = coeff(x, q^i), C[i] = coeff(c, q^i), we obtain for all n
* ((n+1)(n+2)-12) X[n+2] = b2 X[n] + b4 delta_{n = 0}
* + 6 \sum_{m = -1}^{n+1} X[m] X[n-m]
* - (1/2)\sum_{m = -2}^{n+1} (n+m) m C[n-m]X[m].
* */
C = c+4;
X = x+4;
gel(X,-2) = gen_1;
gel(X,-1) = gmul2n(gel(C,-1), -1); /* n = -3, X[-1] = C[-1] / 2 */
b2 = ell_get_b2(e);
b4 = ell_get_b4(e);
for (n=-2; n <= prec-4; n++)
{
pari_sp av2 = avma;
GEN s1, s2, s3;
if (n != 2)
{
s3 = gmul(b2, gel(X,n));
if (!n) s3 = gadd(s3, b4);
s2 = gen_0;
for (m=-2; m<=n+1; m++)
if (m) s2 = gadd(s2, gmulsg(m*(n+m), gmul(gel(X,m),gel(C,n-m))));
s2 = gmul2n(s2,-1);
s1 = gen_0;
for (m=-1; m+m < n; m++) s1 = gadd(s1, gmul(gel(X,m),gel(X,n-m)));
s1 = gmul2n(s1, 1);
if (m+m==n) s1 = gadd(s1, gsqr(gel(X,m)));
/* ( (n+1)(n+2) - 12 ) X[n+2] = (6 s1 + s3 - s2) */
s1 = gdivgs(gsub(gadd(gmulsg(6,s1),s3),s2), (n+2)*(n+1)-12);
}
else
{
GEN b6 = ell_get_b6(e);
GEN U = cgetg(9, t_SER);
U[1] = evalsigne(1) | _evalvalser(-2) | evalvarn(0);
gel(U,2) = gel(x,2);
gel(U,3) = gel(x,3);
gel(U,4) = gel(x,4);
gel(U,5) = gel(x,5);
gel(U,6) = gel(x,6);
gel(U,7) = gel(x,7);
gel(U,8) = gen_0; /* defined mod q^5 */
/* write x = U + x_4 q^4 + O(q^5) and expand original equation */
w = derivser(U); setvalser(w,-2); /* q X' */
/* 4X^3 + b2 U^2 + 2b4 U + b6 */
s1 = gadd(b6, gmul(U, gadd(gmul2n(b4,1), gmul(U,gadd(b2,gmul2n(U,2))))));
/* s2 = (qX')^2 - (4X^3 + b2 U^2 + 2b4 U + b6) = 28 x_4 + O(q) */
s2 = gsub(gmul(c,gsqr(w)), s1);
s1 = signe(s2)? gdivgu(gel(s2,2), 28): gen_0; /* = x_4 */
}
gel(X,n+2) = gerepileupto(av2, s1);
}
w = gmul(d,derivser(x)); setvalser(w, valser(w)+1);
w = gsub(w, ec_h_evalx(e,x));
c = cgetg(3,t_VEC);
gel(c,1) = gcopy(x);
gel(c,2) = gmul2n(w,-1); return gerepileupto(av, c);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment