void _arb_poly_evaluate_rectangular(arb_t y, arb_srcptr poly, long len, const arb_t x, long prec) { long i, j, m, r; arb_ptr xs; arb_t s, t, c; if (len < 3) { if (len == 0) { arb_zero(y); } else if (len == 1) { arb_set_round(y, poly + 0, prec); } else if (len == 2) { arb_mul(y, x, poly + 1, prec); arb_add(y, y, poly + 0, prec); } return; } m = n_sqrt(len) + 1; r = (len + m - 1) / m; xs = _arb_vec_init(m + 1); arb_init(s); arb_init(t); arb_init(c); _arb_vec_set_powers(xs, x, m + 1, prec); arb_set(y, poly + (r - 1) * m); for (j = 1; (r - 1) * m + j < len; j++) arb_addmul(y, xs + j, poly + (r - 1) * m + j, prec); for (i = r - 2; i >= 0; i--) { arb_set(s, poly + i * m); for (j = 1; j < m; j++) arb_addmul(s, xs + j, poly + i * m + j, prec); arb_mul(y, y, xs + m, prec); arb_add(y, y, s, prec); } _arb_vec_clear(xs, m + 1); arb_clear(s); arb_clear(t); arb_clear(c); }
void arb_rising2_ui_rs(arb_t u, arb_t v, const arb_t x, ulong n, ulong m, slong prec) { if (n == 0) { arb_zero(v); arb_one(u); } else if (n == 1) { arb_set(u, x); arb_one(v); } else { slong wp; ulong i, j, a, b; arb_ptr xs; arb_t S, T, U, V; fmpz *A, *B; wp = ARF_PREC_ADD(prec, FLINT_BIT_COUNT(n)); if (m == 0) { ulong m1, m2; m1 = 0.6 * pow(wp, 0.4); m2 = n_sqrt(n); m = FLINT_MIN(m1, m2); } m = FLINT_MAX(m, 1); xs = _arb_vec_init(m + 1); A = _fmpz_vec_init(2 * m + 1); B = A + (m + 1); arb_init(S); arb_init(T); arb_init(U); arb_init(V); _arb_vec_set_powers(xs, x, m + 1, wp); for (i = 0; i < n; i += m) { a = i; b = FLINT_MIN(n, a + m); if (a == 0 || b != a + m) { _gamma_rf_bsplit(A, a, b); } else { fmpz tt = m; _fmpz_poly_taylor_shift(A, &tt, m + 1); } _fmpz_poly_derivative(B, A, b - a + 1); arb_set_fmpz(S, A); for (j = 1; j <= b - a; j++) arb_addmul_fmpz(S, xs + j, A + j, wp); arb_set_fmpz(T, B); for (j = 1; j < b - a; j++) arb_addmul_fmpz(T, xs + j, B + j, wp); if (i == 0) { arb_set(U, S); arb_set(V, T); } else { arb_mul(V, V, S, wp); arb_addmul(V, U, T, wp); arb_mul(U, U, S, wp); } } arb_set(u, U); arb_set(v, V); _arb_vec_clear(xs, m + 1); _fmpz_vec_clear(A, 2 * m + 1); arb_clear(S); arb_clear(T); arb_clear(U); arb_clear(V); } }