int main() { long iter; flint_rand_t state; printf("theta...."); fflush(stdout); flint_randinit(state); /* Test consistency with/without transform */ for (iter = 0; iter < 10000; iter++) { acb_t t1, t2, t3, t4, t1b, t2b, t3b, t4b, z, tau; long prec0, prec1, prec2, e0; acb_init(t1); acb_init(t2); acb_init(t3); acb_init(t4); acb_init(t1b); acb_init(t2b); acb_init(t3b); acb_init(t4b); acb_init(z); acb_init(tau); prec0 = 2 + n_randint(state, 2000); prec1 = 2 + n_randint(state, 2000); prec2 = 2 + n_randint(state, 2000); e0 = 1 + n_randint(state, 100); acb_randtest(tau, state, prec0, e0); acb_randtest(z, state, prec0, e0); acb_modular_theta(t1, t2, t3, t4, z, tau, prec1); acb_modular_theta_notransform(t1b, t2b, t3b, t4b, z, tau, prec2); if (!acb_overlaps(t1, t1b) || !acb_overlaps(t2, t2b) || !acb_overlaps(t3, t3b) || !acb_overlaps(t4, t4b)) { printf("FAIL (overlap)\n"); printf("z = "); acb_printd(z, 25); printf("\n\n"); printf("tau = "); acb_printd(tau, 25); printf("\n\n"); printf("t1 = "); acb_printd(t1, 15); printf("\n\n"); printf("t1b = "); acb_printd(t1b, 15); printf("\n\n"); printf("t2 = "); acb_printd(t2, 15); printf("\n\n"); printf("t2b = "); acb_printd(t2b, 15); printf("\n\n"); printf("t3 = "); acb_printd(t3, 15); printf("\n\n"); printf("t3b = "); acb_printd(t3b, 15); printf("\n\n"); printf("t4 = "); acb_printd(t4, 15); printf("\n\n"); printf("t4b = "); acb_printd(t4b, 15); printf("\n\n"); abort(); } acb_clear(t1); acb_clear(t2); acb_clear(t3); acb_clear(t4); acb_clear(t1b); acb_clear(t2b); acb_clear(t3b); acb_clear(t4b); acb_clear(z); acb_clear(tau); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
void acb_elliptic_p_jet(acb_ptr r, const acb_t z, const acb_t tau, slong len, slong prec) { acb_t t01, t02, t03, t04; acb_ptr tz1, tz2, tz3, tz4; acb_t t; int real; slong k; if (len < 1) return; if (len == 1) { acb_elliptic_p(r, z, tau, prec); return; } real = acb_is_real(z) && arb_is_int_2exp_si(acb_realref(tau), -1) && arb_is_positive(acb_imagref(tau)); acb_init(t); acb_init(t01); acb_init(t02); acb_init(t03); acb_init(t04); tz1 = _acb_vec_init(len); tz2 = _acb_vec_init(len); tz3 = _acb_vec_init(len); tz4 = _acb_vec_init(len); acb_modular_theta_jet(tz1, tz2, tz3, tz4, z, tau, len, prec); /* [theta_4(z) / theta_1(z)]^2 */ _acb_poly_div_series(tz2, tz4, len, tz1, len, len, prec); _acb_poly_mullow(tz1, tz2, len, tz2, len, len, prec); acb_zero(t); acb_modular_theta(t01, t02, t03, t04, t, tau, prec); /* [theta_2(0) * theta_3(0)] ^2 */ acb_mul(t, t02, t03, prec); acb_mul(t, t, t, prec); _acb_vec_scalar_mul(tz1, tz1, len, t, prec); /* - [theta_2(0)^4 + theta_3(0)^4] / 3 */ acb_pow_ui(t02, t02, 4, prec); acb_pow_ui(t03, t03, 4, prec); acb_add(t, t02, t03, prec); acb_div_ui(t, t, 3, prec); acb_sub(tz1, tz1, t, prec); /* times pi^2 */ acb_const_pi(t, prec); acb_mul(t, t, t, prec); _acb_vec_scalar_mul(r, tz1, len, t, prec); if (real) { for (k = 0; k < len; k++) arb_zero(acb_imagref(r + k)); } acb_clear(t); acb_clear(t01); acb_clear(t02); acb_clear(t03); acb_clear(t04); _acb_vec_clear(tz1, len); _acb_vec_clear(tz2, len); _acb_vec_clear(tz3, len); _acb_vec_clear(tz4, len); }