void _arb_poly_log1p_series(arb_ptr res, arb_srcptr f, slong flen, slong n, slong prec) { arb_t a; flen = FLINT_MIN(flen, n); arb_init(a); arb_log1p(a, f, prec); if (flen == 1) { _arb_vec_zero(res + 1, n - 1); } else if (n == 2) { arb_add_ui(res, f + 0, 1, prec); arb_div(res + 1, f + 1, res + 0, prec); } else if (_arb_vec_is_zero(f + 1, flen - 2)) /* f = a + bx^d */ { slong i, j, d = flen - 1; arb_add_ui(res, f + 0, 1, prec); for (i = 1, j = d; j < n; j += d, i++) { if (i == 1) arb_div(res + j, f + d, res, prec); else arb_mul(res + j, res + j - d, res + d, prec); _arb_vec_zero(res + j - d + 1, flen - 2); } _arb_vec_zero(res + j - d + 1, n - (j - d + 1)); for (i = 2, j = 2 * d; j < n; j += d, i++) arb_div_si(res + j, res + j, i % 2 ? i : -i, prec); } else { arb_ptr f_diff, f_inv; slong alloc; alloc = n + flen; f_inv = _arb_vec_init(alloc); f_diff = f_inv + n; arb_add_ui(f_diff, f, 1, prec); _arb_vec_set(f_diff + 1, f + 1, flen - 1); _arb_poly_inv_series(f_inv, f_diff, flen, n, prec); _arb_poly_derivative(f_diff, f, flen, prec); _arb_poly_mullow(res, f_inv, n - 1, f_diff, flen - 1, n - 1, prec); _arb_poly_integral(res, res, n, prec); _arb_vec_clear(f_inv, alloc); } arb_swap(res, a); arb_clear(a); }
void custom_rate_mixture_expectation(arb_t rate, const custom_rate_mixture_t x, slong prec) { if (x->mode == RATE_MIXTURE_UNDEFINED) { flint_fprintf(stderr, "internal error: undefined rate mixture\n"); abort(); } else if (x->mode == RATE_MIXTURE_NONE) { arb_one(rate); } else if (x->mode == RATE_MIXTURE_UNIFORM || x->mode == RATE_MIXTURE_CUSTOM) { slong i; arb_t tmp, tmpb; arb_init(tmp); arb_init(tmpb); arb_zero(rate); if (x->mode == RATE_MIXTURE_UNIFORM) { for (i = 0; i < x->n; i++) { arb_set_d(tmp, x->rates[i]); arb_add(rate, rate, tmp, prec); } arb_div_si(rate, rate, x->n, prec); } else if (x->mode == RATE_MIXTURE_CUSTOM) { for (i = 0; i < x->n; i++) { arb_set_d(tmp, x->rates[i]); arb_set_d(tmpb, x->prior[i]); arb_addmul(rate, tmp, tmpb, prec); } } arb_clear(tmp); arb_clear(tmpb); } else { flint_fprintf(stderr, "internal error: " "unrecognized rate mixture mode\n"); abort(); } }
void Lib_Arb_Div_Si(ArbPtr f, ArbPtr g, int32_t x, int32_t prec) { arb_div_si( (arb_ptr) f, (arb_ptr) g, x, prec); }
int main() { long iter; flint_rand_t state; printf("div_si...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 10000; iter++) { arb_t a, b, c, d; long x; long prec; arb_init(a); arb_init(b); arb_init(c); arb_init(d); arb_randtest_special(a, state, 1 + n_randint(state, 2000), 100); arb_randtest_special(b, state, 1 + n_randint(state, 2000), 100); arb_randtest_special(c, state, 1 + n_randint(state, 2000), 100); x = z_randtest(state); prec = 2 + n_randint(state, 2000); arb_set_si(b, x); arb_div_si(c, a, x, prec); arb_div(d, a, b, prec); if (!arb_equal(c, d)) { printf("FAIL\n\n"); printf("a = "); arb_print(a); printf("\n\n"); printf("b = "); arb_print(b); printf("\n\n"); printf("c = "); arb_print(c); printf("\n\n"); printf("d = "); arb_print(d); printf("\n\n"); abort(); } arb_clear(a); arb_clear(b); arb_clear(c); arb_clear(d); } /* aliasing */ for (iter = 0; iter < 10000; iter++) { arb_t a, b, c; long x; long prec; arb_init(a); arb_init(b); arb_init(c); arb_randtest_special(a, state, 1 + n_randint(state, 2000), 100); arb_randtest_special(b, state, 1 + n_randint(state, 2000), 100); arb_randtest_special(c, state, 1 + n_randint(state, 2000), 100); x = z_randtest(state); prec = 2 + n_randint(state, 2000); arb_set_si(b, x); arb_div_si(c, a, x, prec); arb_div_si(a, a, x, prec); if (!arb_equal(a, c)) { printf("FAIL (aliasing)\n\n"); printf("a = "); arb_print(a); printf("\n\n"); printf("b = "); arb_print(b); printf("\n\n"); printf("c = "); arb_print(c); printf("\n\n"); abort(); } arb_clear(a); arb_clear(b); arb_clear(c); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
void gamma_rate_mixture_summarize( arb_ptr rate_mix_prior, arb_ptr rate_mix_rates, arb_ptr rate_mix_expect, const gamma_rate_mixture_t x, enum rate_mixture_mode mode, slong prec) { slong i; arb_ptr r; arb_t p, q; arb_init(p); arb_init(q); arb_set_d(p, x->invariable_prior); arb_sub_si(q, p, 1, prec); arb_neg(q, q); /* the expectation is designed to be 1 */ arb_one(rate_mix_expect); /* probabilities corresponding to gamma rate categories */ for (i = 0; i < x->gamma_categories; i++) { r = rate_mix_prior + i; arb_div_si(r, q, x->gamma_categories, prec); } /* optional probability corresponding to the invariable category */ if (x->invariable_prior) { r = rate_mix_prior + x->gamma_categories; arb_set(r, p); } /* set the discretized gamma rates */ { arb_t s; arb_init(s); arb_set_d(s, x->gamma_shape); if (mode == RATE_MIXTURE_GAMMA) { gamma_rates( rate_mix_rates, x->gamma_categories, s, prec); } else if (mode == RATE_MIXTURE_GAMMA_MEDIAN) { normalized_median_gamma_rates( rate_mix_rates, x->gamma_categories, s, prec); } else { abort(); /* assert */ } arb_clear(s); } /* normalize the rates to account for a possible invariable category */ for (i = 0; i < x->gamma_categories; i++) { r = rate_mix_rates + i; arb_div(r, r, q, prec); } arb_clear(p); arb_clear(q); }