void acb_poly_sin_cos_series_tangent(acb_poly_t s, acb_poly_t c, const acb_poly_t h, slong n, slong prec, int times_pi) { slong hlen = h->length; if (n == 0) { acb_poly_zero(s); acb_poly_zero(c); return; } if (hlen == 0) { acb_poly_zero(s); acb_poly_one(c); return; } acb_poly_fit_length(s, n); acb_poly_fit_length(c, n); _acb_poly_sin_cos_series_tangent(s->coeffs, c->coeffs, h->coeffs, hlen, n, prec, times_pi); _acb_poly_set_length(s, n); _acb_poly_normalise(s); _acb_poly_set_length(c, n); _acb_poly_normalise(c); }
void acb_poly_sin_cos_pi_series(acb_poly_t s, acb_poly_t c, const acb_poly_t h, slong n, slong prec) { slong hlen = h->length; if (n == 0) { acb_poly_zero(s); acb_poly_zero(c); return; } if (hlen == 0) { acb_poly_zero(s); acb_poly_one(c); return; } if (hlen == 1) n = 1; acb_poly_fit_length(s, n); acb_poly_fit_length(c, n); _acb_poly_sin_cos_pi_series(s->coeffs, c->coeffs, h->coeffs, hlen, n, prec); _acb_poly_set_length(s, n); _acb_poly_normalise(s); _acb_poly_set_length(c, n); _acb_poly_normalise(c); }
void acb_hypgeom_coulomb_series(acb_poly_t F, acb_poly_t G, acb_poly_t Hpos, acb_poly_t Hneg, const acb_t l, const acb_t eta, const acb_poly_t z, slong len, slong prec) { acb_srcptr zptr; slong zlen; acb_t t; if (len == 0) { if (F != NULL) acb_poly_zero(F); if (G != NULL) acb_poly_zero(G); if (Hpos != NULL) acb_poly_zero(Hpos); if (Hneg != NULL) acb_poly_zero(Hneg); return; } zlen = z->length; if (zlen <= 1) len = 1; if (F != NULL) acb_poly_fit_length(F, len); if (G != NULL) acb_poly_fit_length(G, len); if (Hpos != NULL) acb_poly_fit_length(Hpos, len); if (Hneg != NULL) acb_poly_fit_length(Hneg, len); if (zlen == 0) { acb_init(t); zptr = t; zlen = 1; } else { zptr = z->coeffs; } _acb_hypgeom_coulomb_series( F ? F->coeffs : NULL, G ? G->coeffs : NULL, Hpos ? Hpos->coeffs : NULL, Hneg ? Hneg->coeffs : NULL, l, eta, zptr, zlen, len, prec); if (F != NULL) _acb_poly_set_length(F, len); if (G != NULL) _acb_poly_set_length(G, len); if (Hpos != NULL) _acb_poly_set_length(Hpos, len); if (Hneg != NULL) _acb_poly_set_length(Hneg, len); if (F != NULL) _acb_poly_normalise(F); if (G != NULL) _acb_poly_normalise(G); if (Hpos != NULL) _acb_poly_normalise(Hpos); if (Hneg != NULL) _acb_poly_normalise(Hneg); }
void acb_poly_zeta_series(acb_poly_t res, const acb_poly_t f, const acb_t a, int deflate, slong n, slong prec) { if (n == 0) { acb_poly_zero(res); return; } acb_poly_fit_length(res, n); if (f->length == 0) { acb_t t; acb_init(t); _acb_poly_zeta_series(res->coeffs, t, 1, a, deflate, n, prec); acb_clear(t); } else { _acb_poly_zeta_series(res->coeffs, f->coeffs, f->length, a, deflate, n, prec); } _acb_poly_set_length(res, n); _acb_poly_normalise(res); }
void acb_poly_binomial_transform(acb_poly_t b, const acb_poly_t a, slong len, slong prec) { if (len == 0 || a->length == 0) { acb_poly_zero(b); return; } if (b == a) { acb_poly_t c; acb_poly_init2(c, len); _acb_poly_binomial_transform(c->coeffs, a->coeffs, a->length, len, prec); acb_poly_swap(b, c); acb_poly_clear(c); } else { acb_poly_fit_length(b, len); _acb_poly_binomial_transform(b->coeffs, a->coeffs, a->length, len, prec); } _acb_poly_set_length(b, len); _acb_poly_normalise(b); }
void acb_poly_mul(acb_poly_t res, const acb_poly_t poly1, const acb_poly_t poly2, slong prec) { slong len_out; if ((poly1->length == 0) || (poly2->length == 0)) { acb_poly_zero(res); return; } len_out = poly1->length + poly2->length - 1; if (res == poly1 || res == poly2) { acb_poly_t temp; acb_poly_init2(temp, len_out); _acb_poly_mul(temp->coeffs, poly1->coeffs, poly1->length, poly2->coeffs, poly2->length, prec); acb_poly_swap(res, temp); acb_poly_clear(temp); } else { acb_poly_fit_length(res, len_out); _acb_poly_mul(res->coeffs, poly1->coeffs, poly1->length, poly2->coeffs, poly2->length, prec); } _acb_poly_set_length(res, len_out); _acb_poly_normalise(res); }
void acb_poly_inv_series(acb_poly_t Qinv, const acb_poly_t Q, slong n, slong prec) { if (n == 0) { acb_poly_zero(Qinv); return; } if (Q->length == 0) { acb_poly_fit_length(Qinv, n); _acb_vec_indeterminate(Qinv->coeffs, n); _acb_poly_set_length(Qinv, n); return; } if (Qinv == Q) { acb_poly_t t; acb_poly_init(t); acb_poly_inv_series(t, Q, n, prec); acb_poly_swap(Qinv, t); acb_poly_clear(t); return; } acb_poly_fit_length(Qinv, n); _acb_poly_inv_series(Qinv->coeffs, Q->coeffs, Q->length, n, prec); _acb_poly_set_length(Qinv, n); _acb_poly_normalise(Qinv); }
void acb_poly_sqrt_series(acb_poly_t g, const acb_poly_t h, slong n, slong prec) { if (n == 0) { acb_poly_zero(g); return; } if (g == h) { acb_poly_t t; acb_poly_init(t); acb_poly_sqrt_series(t, h, n, prec); acb_poly_swap(g, t); acb_poly_clear(t); return; } acb_poly_fit_length(g, n); if (h->length == 0) _acb_vec_indeterminate(g->coeffs, n); else _acb_poly_sqrt_series(g->coeffs, h->coeffs, h->length, n, prec); _acb_poly_set_length(g, n); _acb_poly_normalise(g); }
void acb_poly_agm1_series(acb_poly_t res, const acb_poly_t z, long n, long prec) { if (n == 0) { acb_poly_zero(res); return; } acb_poly_fit_length(res, n); if (z->length == 0) { acb_t t; acb_init(t); _acb_poly_agm1_series(res->coeffs, t, 1, n, prec); acb_clear(t); } else { _acb_poly_agm1_series(res->coeffs, z->coeffs, z->length, n, prec); } _acb_poly_set_length(res, n); _acb_poly_normalise(res); }
void acb_dirichlet_hardy_z_series(acb_poly_t res, const acb_poly_t s, const dirichlet_group_t G, const dirichlet_char_t chi, slong len, slong prec) { if (len == 0) { acb_poly_zero(res); return; } acb_poly_fit_length(res, len); if (s->length == 0) { acb_t t; acb_init(t); _acb_dirichlet_hardy_z_series(res->coeffs, t, 1, G, chi, len, prec); acb_clear(t); } else { _acb_dirichlet_hardy_z_series(res->coeffs, s->coeffs, s->length, G, chi, len, prec); } _acb_poly_set_length(res, len); _acb_poly_normalise(res); }
void acb_poly_compose_series(acb_poly_t res, const acb_poly_t poly1, const acb_poly_t poly2, slong n, slong prec) { slong len1 = poly1->length; slong len2 = poly2->length; slong lenr; if (len2 != 0 && !acb_is_zero(poly2->coeffs)) { flint_printf("exception: compose_series: inner " "polynomial must have zero constant term\n"); abort(); } if (len1 == 0 || n == 0) { acb_poly_zero(res); return; } if (len2 == 0 || len1 == 1) { acb_poly_set_acb(res, poly1->coeffs); return; } lenr = FLINT_MIN((len1 - 1) * (len2 - 1) + 1, n); len1 = FLINT_MIN(len1, lenr); len2 = FLINT_MIN(len2, lenr); if ((res != poly1) && (res != poly2)) { acb_poly_fit_length(res, lenr); _acb_poly_compose_series(res->coeffs, poly1->coeffs, len1, poly2->coeffs, len2, lenr, prec); _acb_poly_set_length(res, lenr); _acb_poly_normalise(res); } else { acb_poly_t t; acb_poly_init2(t, lenr); _acb_poly_compose_series(t->coeffs, poly1->coeffs, len1, poly2->coeffs, len2, lenr, prec); _acb_poly_set_length(t, lenr); _acb_poly_normalise(t); acb_poly_swap(res, t); acb_poly_clear(t); } }
void acb_poly_rgamma_series(acb_poly_t res, const acb_poly_t f, slong n, slong prec) { if (f->length == 0 || n == 0) { acb_poly_zero(res); } else { acb_poly_fit_length(res, n); _acb_poly_rgamma_series(res->coeffs, f->coeffs, f->length, n, prec); _acb_poly_set_length(res, n); _acb_poly_normalise(res); } }
void acb_poly_interpolate_fast(acb_poly_t poly, acb_srcptr xs, acb_srcptr ys, slong n, slong prec) { if (n == 0) { acb_poly_zero(poly); } else { acb_poly_fit_length(poly, n); _acb_poly_set_length(poly, n); _acb_poly_interpolate_fast(poly->coeffs, xs, ys, n, prec); _acb_poly_normalise(poly); } }
void acb_poly_atan_series(acb_poly_t g, const acb_poly_t h, slong n, slong prec) { slong hlen = h->length; if (hlen == 0 || n == 0) { acb_poly_zero(g); return; } acb_poly_fit_length(g, n); _acb_poly_atan_series(g->coeffs, h->coeffs, hlen, n, prec); _acb_poly_set_length(g, n); _acb_poly_normalise(g); }
void acb_poly_shift_left(acb_poly_t res, const acb_poly_t poly, long n) { if (n == 0) { acb_poly_set(res, poly); return; } if (poly->length == 0) { acb_poly_zero(res); return; } acb_poly_fit_length(res, poly->length + n); _acb_poly_shift_left(res->coeffs, poly->coeffs, poly->length, n); _acb_poly_set_length(res, poly->length + n); }
void acb_poly_pow_ui_trunc_binexp(acb_poly_t res, const acb_poly_t poly, ulong exp, long len, long prec) { long flen, rlen; flen = poly->length; if (exp == 0 && len != 0) { acb_poly_one(res); } else if (flen == 0 || len == 0) { acb_poly_zero(res); } else { rlen = poly_pow_length(flen, exp, len); if (res != poly) { acb_poly_fit_length(res, rlen); _acb_poly_pow_ui_trunc_binexp(res->coeffs, poly->coeffs, flen, exp, rlen, prec); _acb_poly_set_length(res, rlen); _acb_poly_normalise(res); } else { acb_poly_t t; acb_poly_init2(t, rlen); _acb_poly_pow_ui_trunc_binexp(t->coeffs, poly->coeffs, flen, exp, rlen, prec); _acb_poly_set_length(t, rlen); _acb_poly_normalise(t); acb_poly_swap(res, t); acb_poly_clear(t); } } }
void acb_poly_pow_ui(acb_poly_t res, const acb_poly_t poly, ulong exp, slong prec) { slong flen, rlen; flen = poly->length; if (exp == 0) { acb_poly_one(res); } else if (flen == 0) { acb_poly_zero(res); } else { rlen = exp * (flen - 1) + 1; if (res != poly) { acb_poly_fit_length(res, rlen); _acb_poly_pow_ui(res->coeffs, poly->coeffs, flen, exp, prec); _acb_poly_set_length(res, rlen); _acb_poly_normalise(res); } else { acb_poly_t t; acb_poly_init2(t, rlen); _acb_poly_pow_ui(t->coeffs, poly->coeffs, flen, exp, prec); _acb_poly_set_length(t, rlen); _acb_poly_normalise(t); acb_poly_swap(res, t); acb_poly_clear(t); } } }
void acb_poly_mullow(acb_poly_t res, const acb_poly_t poly1, const acb_poly_t poly2, slong n, slong prec) { slong len1, len2; len1 = poly1->length; len2 = poly2->length; if (len1 == 0 || len2 == 0 || n == 0) { acb_poly_zero(res); return; } n = FLINT_MIN((len1 + len2 - 1), n); len1 = FLINT_MIN(len1, n); len2 = FLINT_MIN(len2, n); if (res == poly1 || res == poly2) { acb_poly_t t; acb_poly_init2(t, n); _acb_poly_mullow(t->coeffs, poly1->coeffs, len1, poly2->coeffs, len2, n, prec); acb_poly_swap(res, t); acb_poly_clear(t); } else { acb_poly_fit_length(res, n); _acb_poly_mullow(res->coeffs, poly1->coeffs, len1, poly2->coeffs, len2, n, prec); } _acb_poly_set_length(res, n); _acb_poly_normalise(res); }
void acb_poly_compose(acb_poly_t res, const acb_poly_t poly1, const acb_poly_t poly2, slong prec) { const slong len1 = poly1->length; const slong len2 = poly2->length; if (len1 == 0) { acb_poly_zero(res); } else if (len1 == 1 || len2 == 0) { acb_poly_set_acb(res, poly1->coeffs); } else { const slong lenr = (len1 - 1) * (len2 - 1) + 1; if (res != poly1 && res != poly2) { acb_poly_fit_length(res, lenr); _acb_poly_compose(res->coeffs, poly1->coeffs, len1, poly2->coeffs, len2, prec); } else { acb_poly_t t; acb_poly_init2(t, lenr); _acb_poly_compose(t->coeffs, poly1->coeffs, len1, poly2->coeffs, len2, prec); acb_poly_swap(res, t); acb_poly_clear(t); } _acb_poly_set_length(res, lenr); _acb_poly_normalise(res); } }
void acb_poly_mullow_classical(acb_poly_t res, const acb_poly_t poly1, const acb_poly_t poly2, slong n, slong prec) { slong len_out; if (poly1->length == 0 || poly2->length == 0 || n == 0) { acb_poly_zero(res); return; } len_out = poly1->length + poly2->length - 1; if (n > len_out) n = len_out; if (res == poly1 || res == poly2) { acb_poly_t t; acb_poly_init2(t, n); _acb_poly_mullow_classical(t->coeffs, poly1->coeffs, poly1->length, poly2->coeffs, poly2->length, n, prec); acb_poly_swap(res, t); acb_poly_clear(t); } else { acb_poly_fit_length(res, n); _acb_poly_mullow_classical(res->coeffs, poly1->coeffs, poly1->length, poly2->coeffs, poly2->length, n, prec); } _acb_poly_set_length(res, n); _acb_poly_normalise(res); }
void acb_hypgeom_pfq_series_sum_forward(acb_poly_t s, acb_poly_t t, const acb_poly_struct * a, long p, const acb_poly_struct * b, long q, const acb_poly_t z, int regularized, long n, long len, long prec) { acb_poly_t u, v; acb_poly_t tmp; long k, i; acb_poly_init(u); acb_poly_init(v); acb_poly_init(tmp); if (!regularized) { acb_poly_zero(s); acb_poly_one(t); for (k = 0; k < n && acb_poly_length(t) != 0; k++) { acb_poly_add(s, s, t, prec); if (p > 0) { acb_poly_add_si(u, a, k, prec); for (i = 1; i < p; i++) { acb_poly_add_si(v, a + i, k, prec); acb_poly_mullow(u, u, v, len, prec); } acb_poly_mullow(t, t, u, len, prec); } if (q > 0) { acb_poly_add_si(u, b, k, prec); for (i = 1; i < q; i++) { acb_poly_add_si(v, b + i, k, prec); acb_poly_mullow(u, u, v, len, prec); } acb_poly_div_series(t, t, u, len, prec); } acb_poly_mullow(t, t, z, len, prec); } } else { acb_poly_zero(s); for (i = 0; i < q; i++) { if (i == 0) { acb_poly_rgamma_series(t, b + i, len, prec); } else { acb_poly_rgamma_series(u, b + i, len, prec); acb_poly_mullow(tmp, t, u, len, prec); acb_poly_swap(tmp, t); } } for (k = 0; k < n; k++) { acb_poly_add(s, s, t, prec); if (p > 0) { acb_poly_add_si(u, a, k, prec); for (i = 1; i < p; i++) { acb_poly_add_si(v, a + i, k, prec); acb_poly_mullow(tmp, u, v, len, prec); acb_poly_swap(tmp, u); } acb_poly_mullow(tmp, t, u, len, prec); acb_poly_swap(tmp, t); } if (q > 0) { acb_poly_add_si(u, b, k, prec); for (i = 1; i < q; i++) { acb_poly_add_si(v, b + i, k, prec); acb_poly_mullow(tmp, u, v, len, prec); acb_poly_swap(tmp, u); } if (acb_poly_length(u) > 0 && !acb_contains_zero(u->coeffs)) { acb_poly_div_series(tmp, t, u, len, prec); acb_poly_mullow(t, tmp, z, len, prec); } else { /* compute term from scratch */ acb_poly_one(t); for (i = 0; i < p; i++) { acb_poly_rising_ui_series(v, a + i, k + 1, len, prec); acb_poly_mullow(t, t, v, len, prec); } for (i = 0; i < q; i++) { acb_poly_add_si(v, b + i, k + 1, prec); acb_poly_rgamma_series(v, v, len, prec); acb_poly_mullow(t, t, v, len, prec); } acb_poly_pow_ui_trunc_binexp(v, z, k + 1, len, prec); acb_poly_mullow(t, t, v, len, prec); } } else { acb_poly_mullow(tmp, t, z, len, prec); acb_poly_swap(tmp, t); } } } acb_poly_clear(u); acb_poly_clear(v); acb_poly_clear(tmp); }
int main() { slong iter; flint_rand_t state; flint_printf("binomial_transform...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 500 * arb_test_multiplier(); iter++) { acb_poly_t a, b, c, d; slong j, n, prec; acb_poly_init(a); acb_poly_init(b); acb_poly_init(c); acb_poly_init(d); n = n_randint(state, 20); prec = 2 + n_randint(state, 200); acb_poly_randtest(a, state, n, prec, 10); acb_poly_randtest(b, state, n, prec, 10); acb_poly_randtest(c, state, n, prec, 10); /* check self-inversion property */ acb_poly_binomial_transform(b, a, n, prec); acb_poly_binomial_transform(c, b, n, prec); acb_poly_set(d, a); acb_poly_truncate(d, n); if (!acb_poly_contains(c, d)) { flint_printf("FAIL (containment)\n\n"); flint_printf("n = %wd, prec = %wd\n\n", n, prec); 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"); flint_printf("d: "); acb_poly_printd(d, 15); flint_printf("\n\n"); abort(); } acb_poly_set(d, a); acb_poly_binomial_transform(d, d, n, prec); if (!acb_poly_equal(d, b)) { flint_printf("FAIL (aliasing)\n\n"); 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("d: "); acb_poly_printd(d, 15); flint_printf("\n\n"); abort(); } /* compare with power series operations */ acb_poly_zero(d); for (j = 1; j < n; j++) acb_poly_set_coeff_si(d, j, -1); acb_poly_compose_series(c, a, d, n, prec); for (j = 0; j < n; j++) acb_poly_set_coeff_si(d, j, 1); acb_poly_mullow(c, c, d, n, prec); if (!acb_poly_overlaps(b, c)) { flint_printf("FAIL (power series)\n\n"); 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_clear(a); acb_poly_clear(b); acb_poly_clear(c); acb_poly_clear(d); } flint_randclear(state); flint_cleanup(); flint_printf("PASS\n"); return EXIT_SUCCESS; }