int main() { slong iter; flint_rand_t state; flint_printf("exp_series_basecase...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++) { slong m, n, bits1, bits2, bits3; acb_poly_t a, b, c, d; bits1 = 2 + n_randint(state, 100); bits2 = 2 + n_randint(state, 100); bits3 = 2 + n_randint(state, 100); m = 1 + n_randint(state, 30); n = 1 + n_randint(state, 30); acb_poly_init(a); acb_poly_init(b); acb_poly_init(c); acb_poly_init(d); acb_poly_randtest(a, state, m, bits1, 5); acb_poly_randtest(b, state, m, bits1, 5); /* check exp(a+b) = exp(a) exp(b) */ acb_poly_exp_series_basecase(c, a, n, bits2); acb_poly_exp_series_basecase(d, b, n, bits2); acb_poly_mullow(c, c, d, n, bits2); acb_poly_add(d, a, b, bits3); acb_poly_exp_series_basecase(d, d, n, bits3); /* also aliasing test */ if (!acb_poly_overlaps(c, d)) { flint_printf("FAIL\n\n"); flint_printf("a = "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b = "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("c = "); acb_poly_printd(c, 15); flint_printf("\n\n"); flint_printf("d = "); acb_poly_printd(d, 15); flint_printf("\n\n"); abort(); } acb_poly_clear(a); acb_poly_clear(b); acb_poly_clear(c); acb_poly_clear(d); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
void acb_hypgeom_bessel_k_0f1_series(acb_poly_t res, const acb_poly_t nu, const acb_poly_t z, slong len, slong prec) { acb_poly_t s, u, A, B; acb_poly_struct b[2]; arb_t c; slong wlen; int singular; acb_poly_init(s); acb_poly_init(u); acb_poly_init(A); acb_poly_init(B); acb_poly_init(b + 0); acb_poly_init(b + 1); arb_init(c); singular = (nu->length == 0) || acb_is_int(nu->coeffs); wlen = len + (singular != 0); /* A = (z/2)^nu, B = 1/A */ acb_poly_scalar_mul_2exp_si(A, z, -1); acb_poly_pow_series(A, A, nu, wlen, prec); acb_poly_inv_series(B, A, wlen, prec); acb_poly_mullow(u, z, z, wlen, prec); acb_poly_scalar_mul_2exp_si(u, u, -2); acb_poly_one(b + 1); acb_poly_add_si(b + 0, nu, 1, prec); acb_hypgeom_pfq_series_direct(s, NULL, 0, b, 2, u, 1, -1, wlen, prec); acb_poly_mullow(A, A, s, wlen, prec); acb_poly_add_si(b + 0, nu, -1, prec); acb_poly_neg(b + 0, b + 0); acb_hypgeom_pfq_series_direct(s, NULL, 0, b, 2, u, 1, -1, wlen, prec); acb_poly_mullow(B, B, s, wlen, prec); acb_poly_sub(A, B, A, prec); acb_poly_scalar_mul_2exp_si(A, A, -1); /* multiply by pi csc(pi nu) */ acb_poly_sin_pi_series(B, nu, wlen, prec); if (singular) { acb_poly_shift_right(A, A, 1); acb_poly_shift_right(B, B, 1); } acb_poly_div_series(res, A, B, len, prec); arb_const_pi(c, prec); _acb_vec_scalar_mul_arb(res->coeffs, res->coeffs, res->length, c, prec); acb_poly_clear(s); acb_poly_clear(u); acb_poly_clear(A); acb_poly_clear(B); acb_poly_clear(b + 0); acb_poly_clear(b + 1); arb_clear(c); }
int main() { slong iter; flint_rand_t state; flint_printf("airy_series...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 1000 * arb_test_multiplier(); iter++) { acb_poly_t ai, aip, bi, bip, ai2, aip2, bi2, bip2, z, w, t; acb_t c; slong n1, n2, prec1, prec2; unsigned int mask; acb_poly_init(ai); acb_poly_init(aip); acb_poly_init(bi); acb_poly_init(bip); acb_poly_init(ai2); acb_poly_init(aip2); acb_poly_init(bi2); acb_poly_init(bip2); acb_poly_init(z); acb_poly_init(w); acb_poly_init(t); acb_init(c); prec1 = 2 + n_randint(state, 300); prec2 = 2 + n_randint(state, 300); n1 = n_randint(state, 6); n2 = n_randint(state, 6); acb_poly_randtest(ai, state, 10, prec1, 10); acb_poly_randtest(aip, state, 10, prec1, 10); acb_poly_randtest(bi, state, 10, prec1, 10); acb_poly_randtest(bip, state, 10, prec1, 10); acb_poly_randtest(z, state, 1 + n_randint(state, 10), prec1, 10); acb_hypgeom_airy_series(ai, aip, bi, bip, z, n1, prec1); acb_poly_mullow(w, ai, bip, n1, prec1); acb_poly_mullow(t, bi, aip, n1, prec1); acb_poly_sub(w, w, t, prec1); acb_const_pi(c, prec1); acb_inv(c, c, prec1); acb_poly_set_acb(t, c); acb_poly_truncate(t, n1); if (!acb_poly_overlaps(w, t)) { flint_printf("FAIL: wronskian\n\n"); flint_printf("z = "); acb_poly_printd(z, 30); flint_printf("\n\n"); flint_printf("ai = "); acb_poly_printd(ai, 30); flint_printf("\n\n"); flint_printf("aip = "); acb_poly_printd(aip, 30); flint_printf("\n\n"); flint_printf("bi = "); acb_poly_printd(bi, 30); flint_printf("\n\n"); flint_printf("bip = "); acb_poly_printd(bip, 30); flint_printf("\n\n"); flint_printf("w = "); acb_poly_printd(w, 30); flint_printf("\n\n"); abort(); } mask = n_randlimb(state); acb_hypgeom_airy_series((mask & 1) ? ai2 : NULL, (mask & 2) ? aip2 : NULL, (mask & 4) ? bi2 : NULL, (mask & 8) ? bip2 : NULL, z, n2, prec2); acb_poly_truncate(ai, FLINT_MIN(n1, n2)); acb_poly_truncate(aip, FLINT_MIN(n1, n2)); acb_poly_truncate(bi, FLINT_MIN(n1, n2)); acb_poly_truncate(bip, FLINT_MIN(n1, n2)); acb_poly_truncate(ai2, FLINT_MIN(n1, n2)); acb_poly_truncate(aip2, FLINT_MIN(n1, n2)); acb_poly_truncate(bi2, FLINT_MIN(n1, n2)); acb_poly_truncate(bip2, FLINT_MIN(n1, n2)); if (((mask & 1) && (!acb_poly_overlaps(ai, ai2))) || ((mask & 2) && (!acb_poly_overlaps(aip, aip2))) || ((mask & 4) && (!acb_poly_overlaps(bi, bi2))) || ((mask & 8) && (!acb_poly_overlaps(bip, bip2)))) { flint_printf("FAIL: consistency (mask)\n\n"); flint_printf("mask = %u\n\n", mask); flint_printf("len1 = %wd, len2 = %wd\n\n", n1, n2); flint_printf("z = "); acb_poly_printd(z, 30); flint_printf("\n\n"); flint_printf("ai = "); acb_poly_printd(ai, 30); flint_printf("\n\n"); flint_printf("ai2 = "); acb_poly_printd(ai2, 30); flint_printf("\n\n"); flint_printf("aip = "); acb_poly_printd(aip, 30); flint_printf("\n\n"); flint_printf("aip2 = "); acb_poly_printd(aip2, 30); flint_printf("\n\n"); flint_printf("bi = "); acb_poly_printd(bi, 30); flint_printf("\n\n"); flint_printf("bi2 = "); acb_poly_printd(bi2, 30); flint_printf("\n\n"); flint_printf("bip = "); acb_poly_printd(bip, 30); flint_printf("\n\n"); flint_printf("bip2 = "); acb_poly_printd(bip2, 30); flint_printf("\n\n"); abort(); } acb_poly_clear(ai); acb_poly_clear(aip); acb_poly_clear(bi); acb_poly_clear(bip); acb_poly_clear(ai2); acb_poly_clear(aip2); acb_poly_clear(bi2); acb_poly_clear(bip2); acb_poly_clear(z); acb_poly_clear(w); acb_poly_clear(t); acb_clear(c); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
void acb_hypgeom_pfq_series_sum_forward(acb_poly_t s, acb_poly_t t, const acb_poly_struct * a, long p, const acb_poly_struct * b, long q, const acb_poly_t z, int regularized, long n, long len, long prec) { acb_poly_t u, v; acb_poly_t tmp; long k, i; acb_poly_init(u); acb_poly_init(v); acb_poly_init(tmp); if (!regularized) { acb_poly_zero(s); acb_poly_one(t); for (k = 0; k < n && acb_poly_length(t) != 0; k++) { acb_poly_add(s, s, t, prec); if (p > 0) { acb_poly_add_si(u, a, k, prec); for (i = 1; i < p; i++) { acb_poly_add_si(v, a + i, k, prec); acb_poly_mullow(u, u, v, len, prec); } acb_poly_mullow(t, t, u, len, prec); } if (q > 0) { acb_poly_add_si(u, b, k, prec); for (i = 1; i < q; i++) { acb_poly_add_si(v, b + i, k, prec); acb_poly_mullow(u, u, v, len, prec); } acb_poly_div_series(t, t, u, len, prec); } acb_poly_mullow(t, t, z, len, prec); } } else { acb_poly_zero(s); for (i = 0; i < q; i++) { if (i == 0) { acb_poly_rgamma_series(t, b + i, len, prec); } else { acb_poly_rgamma_series(u, b + i, len, prec); acb_poly_mullow(tmp, t, u, len, prec); acb_poly_swap(tmp, t); } } for (k = 0; k < n; k++) { acb_poly_add(s, s, t, prec); if (p > 0) { acb_poly_add_si(u, a, k, prec); for (i = 1; i < p; i++) { acb_poly_add_si(v, a + i, k, prec); acb_poly_mullow(tmp, u, v, len, prec); acb_poly_swap(tmp, u); } acb_poly_mullow(tmp, t, u, len, prec); acb_poly_swap(tmp, t); } if (q > 0) { acb_poly_add_si(u, b, k, prec); for (i = 1; i < q; i++) { acb_poly_add_si(v, b + i, k, prec); acb_poly_mullow(tmp, u, v, len, prec); acb_poly_swap(tmp, u); } if (acb_poly_length(u) > 0 && !acb_contains_zero(u->coeffs)) { acb_poly_div_series(tmp, t, u, len, prec); acb_poly_mullow(t, tmp, z, len, prec); } else { /* compute term from scratch */ acb_poly_one(t); for (i = 0; i < p; i++) { acb_poly_rising_ui_series(v, a + i, k + 1, len, prec); acb_poly_mullow(t, t, v, len, prec); } for (i = 0; i < q; i++) { acb_poly_add_si(v, b + i, k + 1, prec); acb_poly_rgamma_series(v, v, len, prec); acb_poly_mullow(t, t, v, len, prec); } acb_poly_pow_ui_trunc_binexp(v, z, k + 1, len, prec); acb_poly_mullow(t, t, v, len, prec); } } else { acb_poly_mullow(tmp, t, z, len, prec); acb_poly_swap(tmp, t); } } } acb_poly_clear(u); acb_poly_clear(v); acb_poly_clear(tmp); }
int main() { slong iter; flint_rand_t state; flint_printf("pow_acb_series...."); fflush(stdout); flint_randinit(state); /* compare with exp/log */ for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++) { slong prec, trunc; acb_poly_t f, g, h1, h2; acb_t c; prec = 2 + n_randint(state, 200); trunc = n_randint(state, 20); acb_poly_init(f); acb_poly_init(g); acb_poly_init(h1); acb_poly_init(h2); acb_init(c); /* generate binomials */ if (n_randint(state, 20) == 0) { acb_randtest(c, state, prec, 10); acb_poly_set_coeff_acb(f, 0, c); acb_randtest(c, state, prec, 10); acb_poly_set_coeff_acb(f, 1 + n_randint(state, 20), c); } else { acb_poly_randtest(f, state, 1 + n_randint(state, 20), prec, 10); } acb_poly_randtest(h1, state, 1 + n_randint(state, 20), prec, 10); acb_randtest(c, state, prec, 10); acb_poly_set_acb(g, c); /* f^c */ acb_poly_pow_acb_series(h1, f, c, trunc, prec); /* f^c = exp(c*log(f)) */ acb_poly_log_series(h2, f, trunc, prec); acb_poly_mullow(h2, h2, g, trunc, prec); acb_poly_exp_series(h2, h2, trunc, prec); if (!acb_poly_overlaps(h1, h2)) { flint_printf("FAIL\n\n"); flint_printf("prec = %wd\n", prec); flint_printf("trunc = %wd\n", trunc); flint_printf("f = "); acb_poly_printd(f, 15); flint_printf("\n\n"); flint_printf("c = "); acb_printd(c, 15); flint_printf("\n\n"); flint_printf("h1 = "); acb_poly_printd(h1, 15); flint_printf("\n\n"); flint_printf("h2 = "); acb_poly_printd(h2, 15); flint_printf("\n\n"); abort(); } acb_poly_pow_acb_series(f, f, c, trunc, prec); if (!acb_poly_overlaps(f, h1)) { flint_printf("FAIL (aliasing)\n\n"); abort(); } acb_poly_clear(f); acb_poly_clear(g); acb_poly_clear(h1); acb_poly_clear(h2); acb_clear(c); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
int main() { slong iter; flint_rand_t state; flint_printf("mullow...."); fflush(stdout); flint_randinit(state); /* compare with fmpq_poly */ for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++) { slong qbits1, qbits2, rbits1, rbits2, rbits3, trunc; fmpq_poly_t A, B, C; acb_poly_t a, b, c, d; qbits1 = 2 + n_randint(state, 200); qbits2 = 2 + n_randint(state, 200); rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); rbits3 = 2 + n_randint(state, 200); trunc = n_randint(state, 10); fmpq_poly_init(A); fmpq_poly_init(B); fmpq_poly_init(C); acb_poly_init(a); acb_poly_init(b); acb_poly_init(c); acb_poly_init(d); fmpq_poly_randtest(A, state, 1 + n_randint(state, 10), qbits1); fmpq_poly_randtest(B, state, 1 + n_randint(state, 10), qbits2); fmpq_poly_mullow(C, A, B, trunc); acb_poly_set_fmpq_poly(a, A, rbits1); acb_poly_set_fmpq_poly(b, B, rbits2); acb_poly_mullow(c, a, b, trunc, rbits3); if (!acb_poly_contains_fmpq_poly(c, C)) { flint_printf("FAIL\n\n"); flint_printf("bits3 = %wd\n", rbits3); flint_printf("trunc = %wd\n", trunc); flint_printf("A = "); fmpq_poly_print(A); flint_printf("\n\n"); flint_printf("B = "); fmpq_poly_print(B); flint_printf("\n\n"); flint_printf("C = "); fmpq_poly_print(C); flint_printf("\n\n"); flint_printf("a = "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b = "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("c = "); acb_poly_printd(c, 15); flint_printf("\n\n"); flint_abort(); } acb_poly_set(d, a); acb_poly_mullow(d, d, b, trunc, rbits3); if (!acb_poly_equal(d, c)) { flint_printf("FAIL (aliasing 1)\n\n"); flint_abort(); } acb_poly_set(d, b); acb_poly_mullow(d, a, d, trunc, rbits3); if (!acb_poly_equal(d, c)) { flint_printf("FAIL (aliasing 2)\n\n"); flint_abort(); } /* test squaring */ acb_poly_set(b, a); acb_poly_mullow(c, a, b, trunc, rbits3); acb_poly_mullow(d, a, a, trunc, rbits3); if (!acb_poly_overlaps(c, d)) /* not guaranteed to be identical */ { flint_printf("FAIL (squaring)\n\n"); flint_printf("a = "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b = "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("c = "); acb_poly_printd(c, 15); flint_printf("\n\n"); flint_abort(); } acb_poly_mullow(a, a, a, trunc, rbits3); if (!acb_poly_equal(d, a)) { flint_printf("FAIL (aliasing, squaring)\n\n"); flint_printf("a = "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b = "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("d = "); acb_poly_printd(d, 15); flint_printf("\n\n"); flint_abort(); } fmpq_poly_clear(A); fmpq_poly_clear(B); fmpq_poly_clear(C); acb_poly_clear(a); acb_poly_clear(b); acb_poly_clear(c); acb_poly_clear(d); } /* compare with classical */ for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++) { slong bits, trunc; acb_poly_t a, b, ab, ab2; bits = 2 + n_randint(state, 200); trunc = n_randint(state, 10); acb_poly_init(a); acb_poly_init(b); acb_poly_init(ab); acb_poly_init(ab2); acb_poly_randtest(a, state, 1 + n_randint(state, 10), bits, 5); acb_poly_randtest(b, state, 1 + n_randint(state, 10), bits, 5); acb_poly_mullow_classical(ab, a, b, trunc, bits); acb_poly_mullow(ab2, a, b, trunc, bits); if (!acb_poly_overlaps(ab, ab2)) { flint_printf("FAIL\n\n"); flint_printf("bits = %wd\n", bits); flint_printf("trunc = %wd\n", trunc); flint_printf("a = "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b = "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("ab = "); acb_poly_printd(ab, 15); flint_printf("\n\n"); flint_printf("ab2 = "); acb_poly_printd(ab2, 15); flint_printf("\n\n"); flint_abort(); } acb_poly_clear(a); acb_poly_clear(b); acb_poly_clear(ab); acb_poly_clear(ab2); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
int main() { slong iter; flint_rand_t state; flint_printf("li_series...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 200 * arb_test_multiplier(); iter++) { slong m, n1, n2, n3, bits1, bits2, bits3; acb_poly_t S, A, B, C, T, U; int offset; bits1 = 2 + n_randint(state, 200); bits2 = 2 + n_randint(state, 200); bits3 = 2 + n_randint(state, 200); m = 1 + n_randint(state, 10); n1 = 1 + n_randint(state, 10); n2 = 1 + n_randint(state, 10); n3 = FLINT_MIN(n1, n2); offset = n_randint(state, 2); acb_poly_init(S); acb_poly_init(A); acb_poly_init(B); acb_poly_init(C); acb_poly_init(T); acb_poly_init(U); acb_poly_randtest(S, state, m, bits1, 3); acb_poly_randtest(A, state, m, bits1, 3); acb_poly_randtest(B, state, m, bits1, 3); acb_hypgeom_li_series(A, S, offset, n1, bits2); acb_hypgeom_li_series(B, S, offset, n2, bits3); acb_poly_set(C, A); acb_poly_truncate(C, n3); acb_poly_truncate(B, n3); /* [li(h(x))]' log(h(x)) = h'(x) */ acb_poly_derivative(T, A, bits2); acb_poly_log_series(U, S, n3, bits2); acb_poly_mullow(T, T, U, FLINT_MAX(0, n3 - 1), bits2); acb_poly_derivative(U, S, bits2); acb_poly_truncate(U, FLINT_MAX(0, n3 - 1)); if (!acb_poly_overlaps(B, C) || !acb_poly_overlaps(T, U)) { flint_printf("FAIL\n\n"); flint_printf("S = "); acb_poly_printd(S, 15); flint_printf("\n\n"); flint_printf("A = "); acb_poly_printd(A, 15); flint_printf("\n\n"); flint_printf("B = "); acb_poly_printd(B, 15); flint_printf("\n\n"); flint_printf("T = "); acb_poly_printd(T, 15); flint_printf("\n\n"); flint_printf("U = "); acb_poly_printd(U, 15); flint_printf("\n\n"); abort(); } acb_hypgeom_li_series(S, S, offset, n1, bits2); if (!acb_poly_overlaps(A, S)) { flint_printf("FAIL (aliasing)\n\n"); abort(); } acb_poly_clear(S); acb_poly_clear(A); acb_poly_clear(B); acb_poly_clear(C); acb_poly_clear(T); acb_poly_clear(U); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
int main() { slong iter; flint_rand_t state; flint_printf("sqrt_series...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 5000; iter++) { slong m, n, qbits, rbits1, rbits2; fmpq_poly_t A; acb_poly_t a, b, c; qbits = 2 + n_randint(state, 200); rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); m = 1 + n_randint(state, 30); n = 1 + n_randint(state, 30); fmpq_poly_init(A); acb_poly_init(a); acb_poly_init(b); acb_poly_init(c); fmpq_poly_randtest_not_zero(A, state, m, qbits); acb_poly_set_fmpq_poly(a, A, rbits1); acb_poly_sqrt_series(b, a, n, rbits2); /* Check sqrt(a)^2 = a */ acb_poly_mullow(c, b, b, n, rbits2); fmpq_poly_truncate(A, n); if (!acb_poly_contains_fmpq_poly(c, A)) { flint_printf("FAIL\n\n"); flint_printf("bits2 = %wd\n", rbits2); flint_printf("A = "); fmpq_poly_print(A); flint_printf("\n\n"); flint_printf("a = "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b = "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("c = "); acb_poly_printd(c, 15); flint_printf("\n\n"); abort(); } acb_poly_sqrt_series(a, a, n, rbits2); if (!acb_poly_equal(a, b)) { flint_printf("FAIL (aliasing)\n\n"); abort(); } fmpq_poly_clear(A); acb_poly_clear(a); acb_poly_clear(b); acb_poly_clear(c); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
int main() { slong iter; flint_rand_t state; flint_printf("binomial_transform...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 500 * arb_test_multiplier(); iter++) { acb_poly_t a, b, c, d; slong j, n, prec; acb_poly_init(a); acb_poly_init(b); acb_poly_init(c); acb_poly_init(d); n = n_randint(state, 20); prec = 2 + n_randint(state, 200); acb_poly_randtest(a, state, n, prec, 10); acb_poly_randtest(b, state, n, prec, 10); acb_poly_randtest(c, state, n, prec, 10); /* check self-inversion property */ acb_poly_binomial_transform(b, a, n, prec); acb_poly_binomial_transform(c, b, n, prec); acb_poly_set(d, a); acb_poly_truncate(d, n); if (!acb_poly_contains(c, d)) { flint_printf("FAIL (containment)\n\n"); flint_printf("n = %wd, prec = %wd\n\n", n, prec); flint_printf("a: "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b: "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("c: "); acb_poly_printd(c, 15); flint_printf("\n\n"); flint_printf("d: "); acb_poly_printd(d, 15); flint_printf("\n\n"); abort(); } acb_poly_set(d, a); acb_poly_binomial_transform(d, d, n, prec); if (!acb_poly_equal(d, b)) { flint_printf("FAIL (aliasing)\n\n"); flint_printf("a: "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b: "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("d: "); acb_poly_printd(d, 15); flint_printf("\n\n"); abort(); } /* compare with power series operations */ acb_poly_zero(d); for (j = 1; j < n; j++) acb_poly_set_coeff_si(d, j, -1); acb_poly_compose_series(c, a, d, n, prec); for (j = 0; j < n; j++) acb_poly_set_coeff_si(d, j, 1); acb_poly_mullow(c, c, d, n, prec); if (!acb_poly_overlaps(b, c)) { flint_printf("FAIL (power series)\n\n"); flint_printf("a: "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b: "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("c: "); acb_poly_printd(c, 15); flint_printf("\n\n"); abort(); } acb_poly_clear(a); acb_poly_clear(b); acb_poly_clear(c); acb_poly_clear(d); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
int main() { slong iter; flint_rand_t state; flint_printf("gamma_upper_series...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 1000 * arb_test_multiplier(); iter++) { slong m, n1, n2, bits1, bits2, bits3; acb_poly_t S, A, B, C; acb_t s, t, c; int regularized; regularized = n_randint(state, 3); bits1 = 2 + n_randint(state, 200); bits2 = 2 + n_randint(state, 200); bits3 = 2 + n_randint(state, 200); m = 1 + n_randint(state, 10); n1 = 1 + n_randint(state, 10); n2 = 1 + n_randint(state, 10); acb_poly_init(S); acb_poly_init(A); acb_poly_init(B); acb_poly_init(C); acb_init(s); acb_init(t); acb_init(c); acb_poly_randtest(S, state, m, bits1, 3); acb_poly_randtest(A, state, m, bits1, 3); acb_poly_randtest(B, state, m, bits1, 3); acb_randtest(s, state, bits1, 3); acb_hypgeom_gamma_upper_series(A, s, S, regularized, n1, bits2); acb_hypgeom_gamma_upper_series(B, s, S, regularized, n2, bits3); acb_poly_set(C, A); acb_poly_truncate(C, FLINT_MIN(n1, n2)); acb_poly_truncate(B, FLINT_MIN(n1, n2)); if (!acb_poly_overlaps(B, C)) { flint_printf("FAIL (consistency)\n\n"); flint_printf("regularized = %d\n\n", regularized); flint_printf("S = "); acb_poly_printd(S, 15); flint_printf("\n\n"); flint_printf("A = "); acb_poly_printd(A, 15); flint_printf("\n\n"); flint_printf("B = "); acb_poly_printd(B, 15); flint_printf("\n\n"); flint_printf("C = "); acb_poly_printd(C, 15); flint_printf("\n\n"); flint_abort(); } /* f(h(x)) = -exp(-h(x)) h(x)^(s-1) */ acb_poly_neg(C, S); acb_poly_exp_series(C, C, n1, bits2); acb_sub_ui(t, s, 1, bits2); acb_poly_pow_acb_series(B, S, t, n1, bits2); acb_poly_mullow(C, C, B, n1, bits2); acb_poly_neg(C, C); if (regularized == 0) { /* integral(f(h(x)) h'(x))' = f(h(x)) h'(x) */ acb_poly_derivative(B, S, bits2); acb_poly_mullow(C, C, B, n1, bits2); acb_poly_truncate(C, n1 - 1); } else if (regularized == 1) { /* (integral(f(h(x)) h'(x)) / c)' = (f(h(x)) h'(x)) / c */ acb_poly_derivative(B, S, bits2); acb_poly_mullow(C, C, B, n1, bits2); acb_gamma(c, s, bits2); acb_poly_scalar_div(C, C, c, bits2); acb_poly_truncate(C, n1 - 1); } else if (regularized == 2) { /* (h(x)^-s integral(f(h(x)) h'(x)))' = * h(x)^-(s+1) (h(x) f(h(x)) - s integral(f(h(x)) h'(x))) h'(x) */ acb_poly_t D; acb_poly_init(D); acb_poly_derivative(B, S, bits2); acb_poly_mullow(D, C, B, n1, bits2); acb_poly_integral(D, D, bits2); acb_poly_scalar_mul(D, D, s, bits2); acb_poly_mullow(C, C, S, n1, bits2); acb_poly_sub(D, C, D, bits2); acb_add_ui(t, s, 1, bits2); acb_neg(t, t); acb_poly_pow_acb_series(B, S, t, n1, bits2); acb_poly_mullow(C, D, B, n1, bits2); acb_poly_derivative(B, S, bits2); acb_poly_mullow(C, C, B, n1, bits2); acb_poly_truncate(C, n1 - 1); acb_poly_clear(D); } acb_poly_derivative(B, A, bits2); if (!acb_poly_overlaps(B, C)) { flint_printf("FAIL (derivative)\n\n"); flint_printf("regularized = %d\n\n", regularized); flint_printf("S = "); acb_poly_printd(S, 15); flint_printf("\n\n"); flint_printf("A = "); acb_poly_printd(A, 15); flint_printf("\n\n"); flint_printf("B = "); acb_poly_printd(B, 15); flint_printf("\n\n"); flint_printf("C = "); acb_poly_printd(C, 15); flint_printf("\n\n"); flint_abort(); } acb_hypgeom_gamma_upper_series(S, s, S, regularized, n1, bits2); if (!acb_poly_overlaps(A, S)) { flint_printf("FAIL (aliasing)\n\n"); flint_printf("regularized = %d\n\n", regularized); flint_printf("S = "); acb_poly_printd(S, 15); flint_printf("\n\n"); flint_printf("A = "); acb_poly_printd(A, 15); flint_printf("\n\n"); flint_abort(); } acb_poly_clear(S); acb_poly_clear(A); acb_poly_clear(B); acb_poly_clear(C); acb_clear(s); acb_clear(t); acb_clear(c); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
void _acb_hypgeom_2f1_transform_limit(acb_t res, const acb_poly_t a, const acb_poly_t b, const acb_poly_t c, const acb_poly_t z, int which, slong prec) { acb_poly_t ba, ca, cb, cab, ac1, bc1, ab1, ba1, w, t, u, v, s; acb_t tt; acb_poly_init(ba); acb_poly_init(ca); acb_poly_init(cb); acb_poly_init(cab); acb_poly_init(ac1); acb_poly_init(bc1); acb_poly_init(ab1); acb_poly_init(ba1); acb_poly_init(w); acb_poly_init(t); acb_poly_init(u); acb_poly_init(v); acb_poly_init(s); acb_init(tt); acb_poly_add_si(s, z, -1, prec); /* s = 1 - z */ acb_poly_neg(s, s); acb_poly_sub(ba, b, a, prec); /* ba = b - a */ acb_poly_sub(ca, c, a, prec); /* ca = c - a */ acb_poly_sub(cb, c, b, prec); /* cb = c - b */ acb_poly_sub(cab, ca, b, prec); /* cab = c - a - b */ acb_poly_add_si(ac1, ca, -1, prec); acb_poly_neg(ac1, ac1); /* ac1 = a - c + 1 */ acb_poly_add_si(bc1, cb, -1, prec); acb_poly_neg(bc1, bc1); /* bc1 = b - c + 1 */ acb_poly_add_si(ab1, ba, -1, prec); acb_poly_neg(ab1, ab1); /* ab1 = a - b + 1 */ acb_poly_add_si(ba1, ba, 1, prec); /* ba1 = b - a + 1 */ /* t = left term, u = right term (DLMF 15.8.1 - 15.8.5) */ if (which == 2) { acb_poly_inv_series(w, z, 2, prec); /* w = 1/z */ acb_hypgeom_2f1_series_direct(t, a, ac1, ab1, w, 1, 2, prec); acb_hypgeom_2f1_series_direct(u, b, bc1, ba1, w, 1, 2, prec); } else if (which == 3) { acb_poly_inv_series(w, s, 2, prec); /* w = 1/(1-z) */ acb_hypgeom_2f1_series_direct(t, a, cb, ab1, w, 1, 2, prec); acb_hypgeom_2f1_series_direct(u, b, ca, ba1, w, 1, 2, prec); } else if (which == 4) { acb_poly_set(w, s); /* w = 1-z */ acb_poly_add(v, ac1, b, prec); /* v = a+b-c+1 */ acb_hypgeom_2f1_series_direct(t, a, b, v, w, 1, 2, prec); acb_poly_add_si(v, cab, 1, prec); /* v = c-a-b+1 */ acb_hypgeom_2f1_series_direct(u, ca, cb, v, w, 1, 2, prec); } else if (which == 5) { acb_poly_inv_series(w, z, 2, prec); /* w = 1-1/z */ acb_poly_neg(w, w); acb_poly_add_si(w, w, 1, prec); acb_poly_add(v, ac1, b, prec); /* v = a+b-c+1 */ acb_hypgeom_2f1_series_direct(t, a, ac1, v, w, 1, 2, prec); acb_poly_add_si(v, cab, 1, prec); /* v = c-a-b+1 */ acb_poly_add_si(u, a, -1, prec); /* u = 1-a */ acb_poly_neg(u, u); acb_hypgeom_2f1_series_direct(u, ca, u, v, w, 1, 2, prec); } else { flint_printf("invalid transformation!\n"); flint_abort(); } /* gamma factors */ acb_poly_rgamma_series(v, a, 2, prec); acb_poly_mullow(u, u, v, 2, prec); acb_poly_rgamma_series(v, ca, 2, prec); acb_poly_mullow(t, t, v, 2, prec); acb_poly_rgamma_series(v, b, 2, prec); if (which == 2 || which == 3) acb_poly_mullow(t, t, v, 2, prec); else acb_poly_mullow(u, u, v, 2, prec); acb_poly_rgamma_series(v, cb, 2, prec); if (which == 2 || which == 3) acb_poly_mullow(u, u, v, 2, prec); else acb_poly_mullow(t, t, v, 2, prec); if (which == 2 || which == 3) { if (which == 2) acb_poly_neg(s, z); /* -z, otherwise 1-z since before */ acb_poly_neg(v, a); acb_poly_pow_series(v, s, v, 2, prec); acb_poly_mullow(t, t, v, 2, prec); acb_poly_neg(v, b); acb_poly_pow_series(v, s, v, 2, prec); acb_poly_mullow(u, u, v, 2, prec); } else { acb_poly_pow_series(v, s, cab, 2, prec); acb_poly_mullow(u, u, v, 2, prec); if (which == 5) { acb_poly_neg(v, a); acb_poly_pow_series(v, z, v, 2, prec); acb_poly_mullow(t, t, v, 2, prec); acb_poly_neg(v, ca); acb_poly_pow_series(v, z, v, 2, prec); acb_poly_mullow(u, u, v, 2, prec); } } acb_poly_sub(t, t, u, prec); if (which == 2 || which == 3) acb_poly_sin_pi_series(v, ba, 2, prec); else acb_poly_sin_pi_series(v, cab, 2, prec); acb_poly_get_coeff_acb(tt, t, 1); acb_poly_get_coeff_acb(res, v, 1); acb_div(res, tt, res, prec); acb_const_pi(tt, prec); acb_mul(res, res, tt, prec); acb_poly_clear(ba); acb_poly_clear(ca); acb_poly_clear(cb); acb_poly_clear(cab); acb_poly_clear(ac1); acb_poly_clear(bc1); acb_poly_clear(ab1); acb_poly_clear(ba1); acb_poly_clear(w); acb_poly_clear(t); acb_poly_clear(u); acb_poly_clear(v); acb_poly_clear(s); acb_clear(tt); }
int main() { slong iter; flint_rand_t state; flint_printf("sin_cos_series_basecase...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 1000 * arb_test_multiplier(); iter++) { slong m, n, rbits1, rbits2; fmpq_poly_t B; acb_poly_t a, b, c, d, e; int times_pi; rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); m = 1 + n_randint(state, 30); n = 1 + n_randint(state, 30); times_pi = n_randint(state, 2); fmpq_poly_init(B); acb_poly_init(a); acb_poly_init(b); acb_poly_init(c); acb_poly_init(d); acb_poly_init(e); acb_poly_randtest(a, state, m, rbits1, 10); acb_poly_sin_cos_series_basecase(b, c, a, n, rbits2, times_pi); /* Check sin(x)^2 + cos(x)^2 = 1 */ acb_poly_mullow(d, b, b, n, rbits2); acb_poly_mullow(e, c, c, n, rbits2); acb_poly_add(d, d, e, rbits2); fmpq_poly_one(B); if (!acb_poly_contains_fmpq_poly(d, B)) { flint_printf("FAIL\n\n"); flint_printf("bits2 = %wd\n", rbits2); flint_printf("a = "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b = "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("c = "); acb_poly_printd(c, 15); flint_printf("\n\n"); flint_printf("d = "); acb_poly_printd(d, 15); flint_printf("\n\n"); abort(); } acb_poly_set(d, a); acb_poly_sin_cos_series_basecase(d, c, d, n, rbits2, times_pi); if (!acb_poly_equal(b, d)) { flint_printf("FAIL (aliasing 1)\n\n"); abort(); } acb_poly_set(d, a); acb_poly_sin_cos_series_basecase(b, d, d, n, rbits2, times_pi); if (!acb_poly_equal(c, d)) { flint_printf("FAIL (aliasing 2)\n\n"); abort(); } fmpq_poly_clear(B); acb_poly_clear(a); acb_poly_clear(b); acb_poly_clear(c); acb_poly_clear(d); acb_poly_clear(e); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
int main() { slong iter; flint_rand_t state; flint_printf("tan_series...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 2000 * arb_test_multiplier(); iter++) { slong m, n, rbits1, rbits2; acb_poly_t a, b, c, d, e; rbits1 = 2 + n_randint(state, 100); rbits2 = 2 + n_randint(state, 100); if (n_randint(state, 10) == 0) { m = 1 + n_randint(state, 50); n = 1 + n_randint(state, 50); } else { m = 1 + n_randint(state, 20); n = 1 + n_randint(state, 20); } acb_poly_init(a); acb_poly_init(b); acb_poly_init(c); acb_poly_init(d); acb_poly_init(e); acb_poly_randtest(a, state, m, rbits1, 10); acb_poly_tan_series(b, a, n, rbits2); /* check tan(x) = 2*tan(x/2)/(1-tan(x/2)^2) */ acb_poly_scalar_mul_2exp_si(c, a, -1); acb_poly_tan_series(c, c, n, rbits2); acb_poly_mullow(d, c, c, n, rbits2); acb_poly_one(e); acb_poly_sub(e, e, d, rbits2); acb_poly_div_series(c, c, e, n, rbits2); acb_poly_scalar_mul_2exp_si(c, c, 1); if (!acb_poly_overlaps(b, c)) { flint_printf("FAIL\n\n"); flint_printf("bits2 = %wd\n", rbits2); flint_printf("a = "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b = "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("c = "); acb_poly_printd(c, 15); flint_printf("\n\n"); abort(); } acb_poly_tan_series(a, a, n, rbits2); if (!acb_poly_equal(a, b)) { flint_printf("FAIL (aliasing)\n\n"); abort(); } acb_poly_clear(a); acb_poly_clear(b); acb_poly_clear(c); acb_poly_clear(d); acb_poly_clear(e); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
int main() { slong iter; flint_rand_t state; flint_printf("sinc_series...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 200 * arb_test_multiplier(); iter++) { slong m, n1, n2, rbits1, rbits2, rbits3; acb_poly_t a, b, c, d; rbits1 = 2 + n_randint(state, 300); rbits2 = 2 + n_randint(state, 300); rbits3 = 2 + n_randint(state, 300); m = n_randint(state, 15); n1 = n_randint(state, 15); n2 = n_randint(state, 15); acb_poly_init(a); acb_poly_init(b); acb_poly_init(c); acb_poly_init(d); acb_poly_randtest(a, state, m, rbits1, 10); acb_poly_randtest(b, state, 10, rbits1, 10); acb_poly_randtest(c, state, 10, rbits1, 10); acb_poly_sinc_series(b, a, n1, rbits2); acb_poly_sinc_series(c, a, n2, rbits3); acb_poly_set(d, b); acb_poly_truncate(d, FLINT_MIN(n1, n2)); acb_poly_truncate(c, FLINT_MIN(n1, n2)); if (!acb_poly_overlaps(c, d)) { flint_printf("FAIL\n\n"); flint_printf("n1 = %wd, n2 = %wd, bits2 = %wd, bits3 = %wd\n", n1, n2, rbits2, rbits3); flint_printf("a = "); acb_poly_printd(a, 50); flint_printf("\n\n"); flint_printf("b = "); acb_poly_printd(b, 50); flint_printf("\n\n"); flint_printf("c = "); acb_poly_printd(c, 50); flint_printf("\n\n"); flint_abort(); } /* check x sinc(x) = sin(x) */ acb_poly_mullow(c, b, a, n1, rbits2); acb_poly_sin_series(d, a, n1, rbits2); if (!acb_poly_overlaps(c, d)) { flint_printf("FAIL (functional equation)\n\n"); flint_printf("a = "); acb_poly_printd(a, 15); flint_printf("\n\n"); flint_printf("b = "); acb_poly_printd(b, 15); flint_printf("\n\n"); flint_printf("c = "); acb_poly_printd(c, 15); flint_printf("\n\n"); flint_printf("d = "); acb_poly_printd(d, 15); flint_printf("\n\n"); flint_abort(); } acb_poly_sinc_series(a, a, n1, rbits2); if (!acb_poly_overlaps(a, b)) { flint_printf("FAIL (aliasing)\n\n"); flint_abort(); } acb_poly_clear(a); acb_poly_clear(b); acb_poly_clear(c); acb_poly_clear(d); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }
void acb_hypgeom_u_1f1_series(acb_poly_t res, const acb_poly_t a, const acb_poly_t b, const acb_poly_t z, long len, long prec) { acb_poly_t s, u, A, B; acb_poly_struct aa[3]; arb_t c; long wlen; int singular; acb_poly_init(s); acb_poly_init(u); acb_poly_init(A); acb_poly_init(B); acb_poly_init(aa + 0); acb_poly_init(aa + 1); acb_poly_init(aa + 2); arb_init(c); singular = (b->length == 0) || acb_is_int(b->coeffs); wlen = len + (singular != 0); /* A = rgamma(a-b+1) * 1F~1(a,b,z) */ acb_poly_sub(u, a, b, prec); acb_poly_add_si(u, u, 1, prec); acb_poly_rgamma_series(A, u, wlen, prec); /* todo: handle a = 1 efficiently */ acb_poly_set(aa, a); acb_poly_set(aa + 1, b); acb_poly_one(aa + 2); acb_hypgeom_pfq_series_direct(s, aa, 1, aa + 1, 2, z, 1, -1, wlen, prec); acb_poly_mullow(A, A, s, wlen, prec); /* B = rgamma(a) * 1F~1(a-b+1,2-b,z) * z^(1-b) */ acb_poly_set(aa, u); acb_poly_add_si(aa + 1, b, -2, prec); acb_poly_neg(aa + 1, aa + 1); acb_hypgeom_pfq_series_direct(s, aa, 1, aa + 1, 2, z, 1, -1, wlen, prec); acb_poly_rgamma_series(B, a, wlen, prec); acb_poly_mullow(B, B, s, wlen, prec); acb_poly_add_si(u, b, -1, prec); acb_poly_neg(u, u); acb_poly_pow_series(s, z, u, wlen, prec); acb_poly_mullow(B, B, s, wlen, prec); acb_poly_sub(A, A, B, prec); /* multiply by pi csc(pi b) */ acb_poly_sin_pi_series(B, b, wlen, prec); if (singular) { acb_poly_shift_right(A, A, 1); acb_poly_shift_right(B, B, 1); } acb_poly_div_series(res, A, B, len, prec); arb_const_pi(c, prec); _acb_vec_scalar_mul_arb(res->coeffs, res->coeffs, res->length, c, prec); acb_poly_clear(s); acb_poly_clear(u); acb_poly_clear(A); acb_poly_clear(B); acb_poly_clear(aa + 0); acb_poly_clear(aa + 1); acb_poly_clear(aa + 2); arb_clear(c); }