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; }
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("get_unique_fmpz_poly...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 10000 * arb_test_multiplier(); iter++) { slong prec, c; fmpz_poly_t A, B, C; acb_poly_t a, b; fmpz_poly_init(A); fmpz_poly_init(B); fmpz_poly_init(C); acb_poly_init(a); acb_poly_init(b); fmpz_poly_randtest(A, state, 1 + n_randint(state, 10), 1 + n_randint(state, 1000)); fmpz_poly_randtest(B, state, 1 + n_randint(state, 10), 1 + n_randint(state, 1000)); fmpz_poly_randtest(C, state, 1 + n_randint(state, 10), 1 + n_randint(state, 1000)); c = 1 + n_randint(state, 1000); prec = 2 + n_randint(state, 100); for ( ; ; ) { acb_poly_set_fmpz_poly(a, A, prec); acb_poly_set2_fmpz_poly(b, B, C, prec); acb_poly_scalar_mul_2exp_si(b, b, -c); acb_poly_add(a, a, b, prec); acb_poly_sub(a, a, b, prec); if (acb_poly_get_unique_fmpz_poly(B, a)) { if (!fmpz_poly_equal(A, B)) { flint_printf("FAIL\n\n"); flint_printf("A = "); fmpz_poly_print(A); flint_printf("\n\n"); flint_printf("B = "); fmpz_poly_print(B); flint_printf("\n\n"); flint_printf("a = "); acb_poly_printd(a, 15); flint_printf("\n\n"); abort(); } break; } else { prec *= 2; } } fmpz_poly_clear(A); fmpz_poly_clear(B); fmpz_poly_clear(C); acb_poly_clear(a); acb_poly_clear(b); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }