void fmprb_sqrt_fmpz(fmprb_t z, const fmpz_t x, slong prec) { fmprb_t t; fmprb_init(t); fmprb_set_fmpz(t, x); fmprb_sqrt(z, t, prec); fmprb_clear(t); }
void fmprb_add_fmpz(fmprb_t z, const fmprb_t x, const fmpz_t y, slong prec) { fmprb_t t; fmprb_init(t); fmprb_set_fmpz(t, y); fmprb_add(z, x, t, prec); fmprb_clear(t); }
static void bsplit_recursive_fmprb(fmprb_t P, fmprb_t Q, fmprb_t B, fmprb_t T, const hypgeom_t hyp, long a, long b, int cont, long prec) { if (b - a < 4) { fmpz_t PP, QQ, BB, TT; fmpz_init(PP); fmpz_init(QQ); fmpz_init(BB); fmpz_init(TT); bsplit_recursive_fmpz(PP, QQ, BB, TT, hyp, a, b, cont); fmprb_set_fmpz(P, PP); fmprb_set_fmpz(Q, QQ); fmprb_set_fmpz(B, BB); fmprb_set_fmpz(T, TT); fmpz_clear(PP); fmpz_clear(QQ); fmpz_clear(BB); fmpz_clear(TT); } else { long m; fmprb_t P2, Q2, B2, T2; m = (a + b) / 2; fmprb_init(P2); fmprb_init(Q2); fmprb_init(B2); fmprb_init(T2); bsplit_recursive_fmprb(P, Q, B, T, hyp, a, m, 1, prec); bsplit_recursive_fmprb(P2, Q2, B2, T2, hyp, m, b, 1, prec); if (fmprb_is_one(B) && fmprb_is_one(B2)) { fmprb_mul(T, T, Q2, prec); fmprb_addmul(T, P, T2, prec); } else { fmprb_mul(T, T, B2, prec); fmprb_mul(T, T, Q2, prec); fmprb_mul(T2, T2, B, prec); fmprb_addmul(T, P, T2, prec); } fmprb_mul(B, B, B2, prec); fmprb_mul(Q, Q, Q2, prec); if (cont) fmprb_mul(P, P, P2, prec); fmprb_clear(P2); fmprb_clear(Q2); fmprb_clear(B2); fmprb_clear(T2); } }