void hypgeom_precompute(hypgeom_t hyp) { if (fmpz_poly_is_one(hyp->A) && fmpz_poly_is_one(hyp->B)) { _hypgeom_precompute(hyp, hyp->P, hyp->Q); } else { fmpz_poly_t P2, Q2; fmpz_poly_init(P2); fmpz_poly_init(Q2); hypgeom_standardize(P2, Q2, hyp->A, hyp->B, hyp->P, hyp->Q); _hypgeom_precompute(hyp, P2, Q2); { fmpz_t t; fmpz_init(t); fmpz_poly_evaluate_si(t, hyp->A, 0); mag_mul_fmpz(hyp->MK, hyp->MK, t); fmpz_poly_evaluate_si(t, hyp->B, 0); mag_div_fmpz(hyp->MK, hyp->MK, t); fmpz_clear(t); } fmpz_poly_clear(P2); fmpz_poly_clear(Q2); } }
static void bsplit_recursive_fmpz(fmpz_t P, fmpz_t Q, fmpz_t B, fmpz_t T, const hypgeom_t hyp, long a, long b, int cont) { if (b - a == 1) { if (a == 0) { fmpz_one(P); fmpz_one(Q); } else { fmpz_poly_evaluate_si(P, hyp->P, a); fmpz_poly_evaluate_si(Q, hyp->Q, a); } fmpz_poly_evaluate_si(B, hyp->B, a); fmpz_poly_evaluate_si(T, hyp->A, a); fmpz_mul(T, T, P); } else { long m; fmpz_t P2, Q2, B2, T2; m = (a + b) / 2; fmpz_init(P2); fmpz_init(Q2); fmpz_init(B2); fmpz_init(T2); bsplit_recursive_fmpz(P, Q, B, T, hyp, a, m, 1); bsplit_recursive_fmpz(P2, Q2, B2, T2, hyp, m, b, 1); if (fmpz_is_one(B) && fmpz_is_one(B2)) { fmpz_mul(T, T, Q2); fmpz_addmul(T, P, T2); } else { fmpz_mul(T, T, B2); fmpz_mul(T, T, Q2); fmpz_mul(T2, T2, B); fmpz_addmul(T, P, T2); } fmpz_mul(B, B, B2); fmpz_mul(Q, Q, Q2); if (cont) fmpz_mul(P, P, P2); fmpz_clear(P2); fmpz_clear(Q2); fmpz_clear(B2); fmpz_clear(T2); } }
void _hypgeom_precompute(hypgeom_t hyp, const fmpz_poly_t P, const fmpz_poly_t Q) { slong k; fmpz_t t; fmpz_init(t); hyp->r = fmpz_poly_degree(Q) - fmpz_poly_degree(P); hyp->boundC = hypgeom_root_norm(P); hyp->boundD = hypgeom_root_norm(Q); hyp->boundK = 1 + FLINT_MAX(hyp->boundC, 2 * hyp->boundD); mag_one(hyp->MK); for (k = 1; k <= hyp->boundK; k++) { fmpz_poly_evaluate_si(t, P, k); mag_mul_fmpz(hyp->MK, hyp->MK, t); fmpz_poly_evaluate_si(t, Q, k); mag_div_fmpz(hyp->MK, hyp->MK, t); } fmpz_clear(t); }