| =?gb18030?b?udzA7dSx?= on Wed, 12 Nov 2025 23:24:57 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
| Correct implementation of elleta |
GEN
elleta(GEN om, long prec)
{
pari_sp av = avma;
GEN y1, y2, E2, pi;
ellred_t T;
if (!check_periods(om, &T))
{
pari_err_TYPE("elleta",om);
return NULL;/*LCOV_EXCL_LINE*/
}
if (T.type == t_PER_ELL) return ellR_eta(om, prec);
compute_periods(&T, NULL, prec);
prec = T.prec;
pi = mppi(prec);
E2 = cxEk(T.Tau, 2, prec); /* E_2(Tau) */
if (signe(T.c))
{
GEN u = gdiv(T.w2, T.W2);
/* E2 := u^2 E2 + 6iuc/pi = E_2(tau) */
E2 = gadd(gmul(gsqr(u), E2), mulcxI(gdiv(gmul(mului(6,T.c), u), pi)));
}
y2 = gdiv(gmul(E2, sqrr(pi)), gmulsg(3, T.w2));
if (T.swap)
{
y1 = y2;
y2 = gsub(gmul(T.tau,y1), PiI2div(T.w2, prec));
}
else
y1 = gsub(gmul(T.tau,y2), PiI2div(T.w2, prec));
switch(typ(T.w1))
{
case t_INT: case t_FRAC: case t_REAL:
y1 = real_i(y1);
}
return gerepilecopy(av, mkvec2(y1,y2));
}