int main() { long iter; flint_rand_t state; printf("exp_series...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 10000; iter++) { long m, n, bits1, bits2, bits3; fmpcb_poly_t a, b, c, d; bits1 = 2 + n_randint(state, 200); bits2 = 2 + n_randint(state, 200); bits3 = 2 + n_randint(state, 200); m = 1 + n_randint(state, 30); n = 1 + n_randint(state, 30); fmpcb_poly_init(a); fmpcb_poly_init(b); fmpcb_poly_init(c); fmpcb_poly_init(d); fmpcb_poly_randtest(a, state, m, bits1, 10); fmpcb_poly_randtest(b, state, m, bits1, 10); /* check exp(a+b) = exp(a) exp(b) */ fmpcb_poly_exp_series(c, a, n, bits2); fmpcb_poly_exp_series(d, b, n, bits2); fmpcb_poly_mullow(c, c, d, n, bits2); fmpcb_poly_add(d, a, b, bits3); fmpcb_poly_exp_series(d, d, n, bits3); /* also aliasing test */ if (!fmpcb_poly_overlaps(c, d)) { printf("FAIL\n\n"); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); printf("c = "); fmpcb_poly_printd(c, 15); printf("\n\n"); printf("d = "); fmpcb_poly_printd(d, 15); printf("\n\n"); abort(); } fmpcb_poly_clear(a); fmpcb_poly_clear(b); fmpcb_poly_clear(c); fmpcb_poly_clear(d); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
int main() { long iter; flint_rand_t state; printf("evaluate2_rectangular...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 10000; iter++) { fmpcb_poly_t f, g; fmpcb_t x, y1, z1, y2, z2; fmpcb_init(x); fmpcb_init(y1); fmpcb_init(z1); fmpcb_init(y2); fmpcb_init(z2); fmpcb_poly_init(f); fmpcb_poly_init(g); fmpcb_randtest(x, state, 2 + n_randint(state, 1000), 5); fmpcb_poly_randtest(f, state, 2 + n_randint(state, 100), 2 + n_randint(state, 1000), 5); fmpcb_poly_derivative(g, f, 2 + n_randint(state, 1000)); fmpcb_poly_evaluate2_rectangular(y1, z1, f, x, 2 + n_randint(state, 1000)); fmpcb_poly_evaluate_horner(y2, f, x, 2 + n_randint(state, 1000)); fmpcb_poly_evaluate_horner(z2, g, x, 2 + n_randint(state, 1000)); if (!fmpcb_overlaps(y1, y2) || !fmpcb_overlaps(z1, z2)) { printf("FAIL\n\n"); printf("f = "); fmpcb_poly_printd(f, 15); printf("\n\n"); printf("g = "); fmpcb_poly_printd(g, 15); printf("\n\n"); printf("x = "); fmpcb_printd(x, 15); printf("\n\n"); printf("y1 = "); fmpcb_printd(y1, 15); printf("\n\n"); printf("z1 = "); fmpcb_printd(z1, 15); printf("\n\n"); printf("y2 = "); fmpcb_printd(y2, 15); printf("\n\n"); printf("z2 = "); fmpcb_printd(z2, 15); printf("\n\n"); abort(); } fmpcb_poly_clear(f); fmpcb_poly_clear(g); fmpcb_clear(x); fmpcb_clear(y1); fmpcb_clear(z1); fmpcb_clear(y2); fmpcb_clear(z2); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
int main() { long iter; flint_rand_t state; printf("compose_series_brent_kung...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 3000; iter++) { long qbits1, qbits2, rbits1, rbits2, rbits3, n; fmpq_poly_t A, B, C; fmpcb_poly_t a, b, c, d; qbits1 = 2 + n_randint(state, 200); qbits2 = 2 + n_randint(state, 200); rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); rbits3 = 2 + n_randint(state, 200); n = 2 + n_randint(state, 25); fmpq_poly_init(A); fmpq_poly_init(B); fmpq_poly_init(C); fmpcb_poly_init(a); fmpcb_poly_init(b); fmpcb_poly_init(c); fmpcb_poly_init(d); fmpq_poly_randtest(A, state, 1 + n_randint(state, 25), qbits1); fmpq_poly_randtest(B, state, 1 + n_randint(state, 25), qbits2); fmpq_poly_set_coeff_ui(B, 0, 0); fmpq_poly_compose_series(C, A, B, n); fmpcb_poly_set_fmpq_poly(a, A, rbits1); fmpcb_poly_set_fmpq_poly(b, B, rbits2); fmpcb_poly_compose_series_brent_kung(c, a, b, n, rbits3); if (!fmpcb_poly_contains_fmpq_poly(c, C)) { printf("FAIL\n\n"); printf("n = %ld, bits3 = %ld\n", n, rbits3); printf("A = "); fmpq_poly_print(A); printf("\n\n"); printf("B = "); fmpq_poly_print(B); printf("\n\n"); printf("C = "); fmpq_poly_print(C); printf("\n\n"); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); printf("c = "); fmpcb_poly_printd(c, 15); printf("\n\n"); abort(); } fmpcb_poly_set(d, a); fmpcb_poly_compose_series_brent_kung(d, d, b, n, rbits3); if (!fmpcb_poly_equal(d, c)) { printf("FAIL (aliasing 1)\n\n"); abort(); } fmpcb_poly_set(d, b); fmpcb_poly_compose_series_brent_kung(d, a, d, n, rbits3); if (!fmpcb_poly_equal(d, c)) { printf("FAIL (aliasing 2)\n\n"); abort(); } fmpq_poly_clear(A); fmpq_poly_clear(B); fmpq_poly_clear(C); fmpcb_poly_clear(a); fmpcb_poly_clear(b); fmpcb_poly_clear(c); fmpcb_poly_clear(d); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
int main() { long iter; flint_rand_t state; printf("mullow_transpose_gauss...."); fflush(stdout); flint_randinit(state); /* compare with fmpq_poly */ for (iter = 0; iter < 10000; iter++) { long qbits1, qbits2, rbits1, rbits2, rbits3, trunc; fmpq_poly_t A, B, C; fmpcb_poly_t a, b, c, d; qbits1 = 2 + n_randint(state, 200); qbits2 = 2 + n_randint(state, 200); rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); rbits3 = 2 + n_randint(state, 200); trunc = n_randint(state, 10); fmpq_poly_init(A); fmpq_poly_init(B); fmpq_poly_init(C); fmpcb_poly_init(a); fmpcb_poly_init(b); fmpcb_poly_init(c); fmpcb_poly_init(d); fmpq_poly_randtest(A, state, 1 + n_randint(state, 10), qbits1); fmpq_poly_randtest(B, state, 1 + n_randint(state, 10), qbits2); fmpq_poly_mullow(C, A, B, trunc); fmpcb_poly_set_fmpq_poly(a, A, rbits1); fmpcb_poly_set_fmpq_poly(b, B, rbits2); fmpcb_poly_mullow_transpose_gauss(c, a, b, trunc, rbits3); if (!fmpcb_poly_contains_fmpq_poly(c, C)) { printf("FAIL\n\n"); printf("bits3 = %ld\n", rbits3); printf("trunc = %ld\n", trunc); printf("A = "); fmpq_poly_print(A); printf("\n\n"); printf("B = "); fmpq_poly_print(B); printf("\n\n"); printf("C = "); fmpq_poly_print(C); printf("\n\n"); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); printf("c = "); fmpcb_poly_printd(c, 15); printf("\n\n"); abort(); } fmpcb_poly_set(d, a); fmpcb_poly_mullow_transpose_gauss(d, d, b, trunc, rbits3); if (!fmpcb_poly_equal(d, c)) { printf("FAIL (aliasing 1)\n\n"); abort(); } fmpcb_poly_set(d, b); fmpcb_poly_mullow_transpose_gauss(d, a, d, trunc, rbits3); if (!fmpcb_poly_equal(d, c)) { printf("FAIL (aliasing 2)\n\n"); abort(); } /* test squaring */ fmpcb_poly_set(b, a); fmpcb_poly_mullow_transpose_gauss(c, a, b, trunc, rbits3); fmpcb_poly_mullow_transpose_gauss(d, a, a, trunc, rbits3); if (!fmpcb_poly_overlaps(c, d)) /* not guaranteed to be identical */ { printf("FAIL (squaring)\n\n"); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); printf("c = "); fmpcb_poly_printd(c, 15); printf("\n\n"); abort(); } fmpcb_poly_mullow_transpose_gauss(a, a, a, trunc, rbits3); if (!fmpcb_poly_equal(d, a)) { printf("FAIL (aliasing, squaring)\n\n"); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); printf("d = "); fmpcb_poly_printd(d, 15); printf("\n\n"); abort(); } fmpq_poly_clear(A); fmpq_poly_clear(B); fmpq_poly_clear(C); fmpcb_poly_clear(a); fmpcb_poly_clear(b); fmpcb_poly_clear(c); fmpcb_poly_clear(d); } /* compare with classical */ for (iter = 0; iter < 10000; iter++) { long bits, trunc; fmpcb_poly_t a, b, ab, ab2; bits = 2 + n_randint(state, 200); trunc = n_randint(state, 10); fmpcb_poly_init(a); fmpcb_poly_init(b); fmpcb_poly_init(ab); fmpcb_poly_init(ab2); fmpcb_poly_randtest(a, state, 1 + n_randint(state, 10), bits, 5); fmpcb_poly_randtest(b, state, 1 + n_randint(state, 10), bits, 5); fmpcb_poly_mullow_classical(ab, a, b, trunc, bits); fmpcb_poly_mullow_transpose_gauss(ab2, a, b, trunc, bits); if (!fmpcb_poly_overlaps(ab, ab2)) { printf("FAIL\n\n"); printf("bits = %ld\n", bits); printf("trunc = %ld\n", trunc); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); printf("ab = "); fmpcb_poly_printd(ab, 15); printf("\n\n"); printf("ab2 = "); fmpcb_poly_printd(ab2, 15); printf("\n\n"); abort(); } fmpcb_poly_clear(a); fmpcb_poly_clear(b); fmpcb_poly_clear(ab); fmpcb_poly_clear(ab2); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
int main() { long iter; flint_rand_t state; printf("lgamma_series...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 500; iter++) { long m, n1, n2, rbits1, rbits2, rbits3; fmpcb_poly_t a, b, c, d; rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); rbits3 = 2 + n_randint(state, 200); m = 1 + n_randint(state, 30); n1 = 1 + n_randint(state, 30); n2 = 1 + n_randint(state, 30); fmpcb_poly_init(a); fmpcb_poly_init(b); fmpcb_poly_init(c); fmpcb_poly_init(d); fmpcb_poly_randtest(a, state, m, rbits1, 3); fmpcb_poly_lgamma_series(b, a, n1, rbits2); fmpcb_poly_lgamma_series(c, a, n2, rbits3); fmpcb_poly_set(d, b); fmpcb_poly_truncate(d, FLINT_MIN(n1, n2)); fmpcb_poly_truncate(c, FLINT_MIN(n1, n2)); if (!fmpcb_poly_overlaps(c, d)) { printf("FAIL\n\n"); printf("n1 = %ld, n2 = %ld, bits2 = %ld, bits3 = %ld\n", n1, n2, rbits2, rbits3); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); printf("c = "); fmpcb_poly_printd(c, 15); printf("\n\n"); abort(); } /* check loggamma(a) + log(a) = loggamma(a+1) */ fmpcb_poly_log_series(c, a, n1, rbits2); fmpcb_poly_add(c, b, c, rbits2); fmpcb_poly_set(d, a); fmpcb_add_ui(d->coeffs, d->coeffs, 1, rbits2); fmpcb_poly_lgamma_series(d, d, n1, rbits2); if (!fmpcb_poly_overlaps(c, d)) { printf("FAIL (functional equation)\n\n"); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); printf("c = "); fmpcb_poly_printd(c, 15); printf("\n\n"); printf("d = "); fmpcb_poly_printd(d, 15); printf("\n\n"); abort(); } fmpcb_poly_lgamma_series(a, a, n1, rbits2); if (!fmpcb_poly_overlaps(a, b)) { printf("FAIL (aliasing)\n\n"); abort(); } fmpcb_poly_clear(a); fmpcb_poly_clear(b); fmpcb_poly_clear(c); fmpcb_poly_clear(d); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
int main() { long iter; flint_rand_t state; printf("inv_series...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 10000; iter++) { long m, n, qbits, rbits1, rbits2; fmpq_poly_t A, B; fmpcb_poly_t a, b; qbits = 2 + n_randint(state, 200); rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); m = 1 + n_randint(state, 20); n = 1 + n_randint(state, 20); fmpq_poly_init(A); fmpq_poly_init(B); fmpcb_poly_init(a); fmpcb_poly_init(b); do { fmpq_poly_randtest_not_zero(A, state, m, qbits); } while (A->coeffs[0] == 0); fmpq_poly_inv_series(B, A, n); fmpcb_poly_set_fmpq_poly(a, A, rbits1); fmpcb_poly_inv_series(b, a, n, rbits2); if (!fmpcb_poly_contains_fmpq_poly(b, B)) { printf("FAIL\n\n"); printf("bits2 = %ld\n", rbits2); printf("A = "); fmpq_poly_print(A); printf("\n\n"); printf("B = "); fmpq_poly_print(B); printf("\n\n"); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); abort(); } fmpcb_poly_inv_series(a, a, n, rbits2); if (!fmpcb_poly_equal(a, b)) { printf("FAIL (aliasing)\n\n"); abort(); } fmpq_poly_clear(A); fmpq_poly_clear(B); fmpcb_poly_clear(a); fmpcb_poly_clear(b); } /* check f * f^-1 = 1 */ for (iter = 0; iter < 10000; iter++) { long bits, trunc; fmpcb_poly_t a, b, ab; fmpq_poly_t id; bits = 2 + n_randint(state, 200); trunc = 1 + n_randint(state, 10); fmpcb_poly_init(a); fmpcb_poly_init(b); fmpcb_poly_init(ab); fmpq_poly_init(id); do { fmpcb_poly_randtest(a, state, 1 + n_randint(state, 10), bits, 5); } while (a->length == 0 || fmpcb_contains_zero(a->coeffs + 0)); fmpcb_poly_inv_series(b, a, trunc, bits); fmpcb_poly_mullow(ab, a, b, trunc, bits); fmpq_poly_set_ui(id, 1); if (!fmpcb_poly_contains_fmpq_poly(ab, id)) { printf("FAIL\n\n"); printf("bits = %ld\n", bits); printf("trunc = %ld\n", trunc); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); printf("ab = "); fmpcb_poly_printd(ab, 15); printf("\n\n"); abort(); } fmpcb_poly_clear(a); fmpcb_poly_clear(b); fmpcb_poly_clear(ab); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
int main() { long iter; flint_rand_t state; printf("tan_series...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 2000; iter++) { long m, n, rbits1, rbits2; fmpcb_poly_t a, b, c, d, e; rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); m = 1 + n_randint(state, 50); n = 1 + n_randint(state, 50); fmpcb_poly_init(a); fmpcb_poly_init(b); fmpcb_poly_init(c); fmpcb_poly_init(d); fmpcb_poly_init(e); fmpcb_poly_randtest(a, state, m, rbits1, 10); fmpcb_poly_set_coeff_si(a, 0, 0); /* TODO: implement complex atan */ fmpcb_poly_tan_series(b, a, n, rbits2); /* check tan(x) = 2*tan(x/2)/(1-tan(x/2)^2) */ fmpcb_poly_scalar_mul_2exp_si(c, a, -1); fmpcb_poly_tan_series(c, c, n, rbits2); fmpcb_poly_mullow(d, c, c, n, rbits2); fmpcb_poly_one(e); fmpcb_poly_sub(e, e, d, rbits2); fmpcb_poly_div_series(c, c, e, n, rbits2); fmpcb_poly_scalar_mul_2exp_si(c, c, 1); if (!fmpcb_poly_overlaps(b, c)) { printf("FAIL\n\n"); printf("bits2 = %ld\n", rbits2); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); printf("c = "); fmpcb_poly_printd(c, 15); printf("\n\n"); abort(); } fmpcb_poly_tan_series(a, a, n, rbits2); if (!fmpcb_poly_equal(a, b)) { printf("FAIL (aliasing)\n\n"); abort(); } fmpcb_poly_clear(a); fmpcb_poly_clear(b); fmpcb_poly_clear(c); fmpcb_poly_clear(d); fmpcb_poly_clear(e); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
int main() { long iter; flint_rand_t state; printf("evaluate_vec_fast...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 10000; iter++) { long i, n, qbits1, qbits2, rbits1, rbits2, rbits3; fmpq_poly_t F; fmpq * X, * Y; fmpcb_poly_t f; fmpcb_ptr x, y; qbits1 = 2 + n_randint(state, 100); qbits2 = 2 + n_randint(state, 100); rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); rbits3 = 2 + n_randint(state, 200); n = n_randint(state, 10); fmpq_poly_init(F); X = _fmpq_vec_init(n); Y = _fmpq_vec_init(n); fmpcb_poly_init(f); x = _fmpcb_vec_init(n); y = _fmpcb_vec_init(n); fmpq_poly_randtest(F, state, 1 + n_randint(state, 20), qbits1); for (i = 0; i < n; i++) fmpq_randtest(X + i, state, qbits2); for (i = 0; i < n; i++) fmpq_poly_evaluate_fmpq(Y + i, F, X + i); fmpcb_poly_set_fmpq_poly(f, F, rbits1); for (i = 0; i < n; i++) fmpcb_set_fmpq(x + i, X + i, rbits2); fmpcb_poly_evaluate_vec_fast(y, f, x, n, rbits3); for (i = 0; i < n; i++) { if (!fmpcb_contains_fmpq(y + i, Y + i)) { printf("FAIL (%ld of %ld)\n\n", i, n); printf("F = "); fmpq_poly_print(F); printf("\n\n"); printf("X = "); fmpq_print(X + i); printf("\n\n"); printf("Y = "); fmpq_print(Y + i); printf("\n\n"); printf("f = "); fmpcb_poly_printd(f, 15); printf("\n\n"); printf("x = "); fmpcb_printd(x + i, 15); printf("\n\n"); printf("y = "); fmpcb_printd(y + i, 15); printf("\n\n"); abort(); } } fmpq_poly_clear(F); _fmpq_vec_clear(X, n); _fmpq_vec_clear(Y, n); fmpcb_poly_clear(f); _fmpcb_vec_clear(x, n); _fmpcb_vec_clear(y, n); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
int main() { long iter; flint_rand_t state; printf("revert_series_newton...."); fflush(stdout); flint_randinit(state); for (iter = 0; iter < 1000; iter++) { long qbits1, rbits1, rbits2, n; fmpq_poly_t A, B; fmpcb_poly_t a, b, c; qbits1 = 2 + n_randint(state, 200); rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); n = 2 + n_randint(state, 25); fmpq_poly_init(A); fmpq_poly_init(B); fmpcb_poly_init(a); fmpcb_poly_init(b); fmpcb_poly_init(c); do { fmpq_poly_randtest(A, state, 1 + n_randint(state, 25), qbits1); fmpq_poly_set_coeff_ui(A, 0, 0); } while (A->length < 2 || fmpz_is_zero(A->coeffs + 1)); fmpq_poly_revert_series(B, A, n); fmpcb_poly_set_fmpq_poly(a, A, rbits1); fmpcb_poly_revert_series_newton(b, a, n, rbits2); if (!fmpcb_poly_contains_fmpq_poly(b, B)) { printf("FAIL\n\n"); printf("n = %ld, bits2 = %ld\n", n, rbits2); printf("A = "); fmpq_poly_print(A); printf("\n\n"); printf("B = "); fmpq_poly_print(B); printf("\n\n"); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); abort(); } fmpcb_poly_set(c, a); fmpcb_poly_revert_series_newton(c, c, n, rbits2); if (!fmpcb_poly_equal(c, b)) { printf("FAIL (aliasing)\n\n"); abort(); } fmpq_poly_clear(A); fmpq_poly_clear(B); fmpcb_poly_clear(a); fmpcb_poly_clear(b); fmpcb_poly_clear(c); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }
int main() { long iter; flint_rand_t state; printf("log_series...."); fflush(stdout); flint_randinit(state); /* compare with fmpq_poly */ for (iter = 0; iter < 10000; iter++) { long m, n, qbits, rbits1, rbits2; fmpq_poly_t A, B; fmpcb_poly_t a, b; qbits = 2 + n_randint(state, 200); rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); m = 1 + n_randint(state, 20); n = 1 + n_randint(state, 20); fmpq_poly_init(A); fmpq_poly_init(B); fmpcb_poly_init(a); fmpcb_poly_init(b); fmpq_poly_randtest_not_zero(A, state, m, qbits); fmpq_poly_set_coeff_ui(A, 0, 1UL); fmpq_poly_log_series(B, A, n); fmpcb_poly_set_fmpq_poly(a, A, rbits1); fmpcb_poly_randtest(b, state, 1 + n_randint(state, 20), rbits1, 5); fmpcb_poly_log_series(b, a, n, rbits2); if (!fmpcb_poly_contains_fmpq_poly(b, B)) { printf("FAIL\n\n"); printf("bits2 = %ld\n", rbits2); printf("A = "); fmpq_poly_print(A); printf("\n\n"); printf("B = "); fmpq_poly_print(B); printf("\n\n"); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); abort(); } fmpq_poly_clear(A); fmpq_poly_clear(B); fmpcb_poly_clear(a); fmpcb_poly_clear(b); } /* test aliasing */ for (iter = 0; iter < 10000; iter++) { long m, n, qbits, rbits1, rbits2; fmpq_poly_t A; fmpcb_poly_t a, b; qbits = 2 + n_randint(state, 200); rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); m = 1 + n_randint(state, 20); n = 1 + n_randint(state, 20); fmpq_poly_init(A); fmpcb_poly_init(a); fmpcb_poly_init(b); do { fmpq_poly_randtest_not_zero(A, state, m, qbits); } while (fmpz_sgn(A->coeffs + 0) <= 0); fmpcb_poly_set_fmpq_poly(a, A, rbits1); fmpcb_poly_log_series(b, a, n, rbits2); fmpcb_poly_log_series(a, a, n, rbits2); if (!fmpcb_poly_equal(a, b)) { printf("FAIL\n\n"); printf("bits2 = %ld\n", rbits2); printf("A = "); fmpq_poly_print(A); printf("\n\n"); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); abort(); } fmpq_poly_clear(A); fmpcb_poly_clear(a); fmpcb_poly_clear(b); } /* test that exp(log(f)) contains f */ for (iter = 0; iter < 10000; iter++) { long m, n, qbits, rbits1, rbits2, rbits3; fmpq_poly_t A; fmpcb_poly_t a, b, c; qbits = 2 + n_randint(state, 200); rbits1 = 2 + n_randint(state, 200); rbits2 = 2 + n_randint(state, 200); rbits3 = 2 + n_randint(state, 200); m = 1 + n_randint(state, 20); n = 1 + n_randint(state, 20); fmpq_poly_init(A); fmpcb_poly_init(a); fmpcb_poly_init(b); fmpcb_poly_init(c); do { fmpq_poly_randtest_not_zero(A, state, m, qbits); } while (fmpz_sgn(A->coeffs + 0) <= 0); fmpcb_poly_set_fmpq_poly(a, A, rbits1); fmpcb_poly_randtest(b, state, 1 + n_randint(state, 20), rbits1, 5); fmpcb_poly_log_series(b, a, n, rbits2); fmpcb_poly_exp_series_basecase(c, b, n, rbits3); fmpq_poly_truncate(A, n); if (!fmpcb_poly_contains_fmpq_poly(c, A)) { printf("FAIL\n\n"); printf("bits2 = %ld\n", rbits2); printf("bits3 = %ld\n", rbits3); printf("A = "); fmpq_poly_print(A); printf("\n\n"); printf("a = "); fmpcb_poly_printd(a, 15); printf("\n\n"); printf("b = "); fmpcb_poly_printd(b, 15); printf("\n\n"); printf("c = "); fmpcb_poly_printd(c, 15); printf("\n\n"); abort(); } fmpq_poly_clear(A); fmpcb_poly_clear(a); fmpcb_poly_clear(b); fmpcb_poly_clear(c); } flint_randclear(state); flint_cleanup(); printf("PASS\n"); return EXIT_SUCCESS; }