int main(void) { int i, result; FLINT_TEST_INIT(state); flint_printf("compose_horner...."); fflush(stdout); /* Check aliasing of the first argument */ for (i = 0; i < 8 * flint_test_multiplier(); i++) { fmpz_poly_t f, g, h; fmpz_poly_init(f); fmpz_poly_init(g); fmpz_poly_init(h); fmpz_poly_randtest(g, state, n_randint(state, 40), 80); fmpz_poly_randtest(h, state, n_randint(state, 20), 50); fmpz_poly_compose_horner(f, g, h); fmpz_poly_compose_horner(g, g, h); result = (fmpz_poly_equal(f, g)); if (!result) { flint_printf("FAIL:\n"); fmpz_poly_print(f), flint_printf("\n\n"); fmpz_poly_print(g), flint_printf("\n\n"); abort(); } fmpz_poly_clear(f); fmpz_poly_clear(g); fmpz_poly_clear(h); } /* Check aliasing of the second argument */ for (i = 0; i < 8 * flint_test_multiplier(); i++) { fmpz_poly_t f, g, h; fmpz_poly_init(f); fmpz_poly_init(g); fmpz_poly_init(h); fmpz_poly_randtest(g, state, n_randint(state, 40), 80); fmpz_poly_randtest(h, state, n_randint(state, 20), 50); fmpz_poly_compose_horner(f, g, h); fmpz_poly_compose_horner(h, g, h); result = (fmpz_poly_equal(f, h)); if (!result) { flint_printf("FAIL:\n"); fmpz_poly_print(f), flint_printf("\n\n"); fmpz_poly_print(h), flint_printf("\n\n"); abort(); } fmpz_poly_clear(f); fmpz_poly_clear(g); fmpz_poly_clear(h); } /* Compare with the default method */ for (i = 0; i < 8 * flint_test_multiplier(); i++) { fmpz_poly_t f1, f2, g, h; fmpz_poly_init(f1); fmpz_poly_init(f2); fmpz_poly_init(g); fmpz_poly_init(h); fmpz_poly_randtest(g, state, n_randint(state, 40), 80); fmpz_poly_randtest(h, state, n_randint(state, 20), 50); fmpz_poly_compose_horner(f1, g, h); fmpz_poly_compose(f2, g, h); result = (fmpz_poly_equal(f1, f2)); if (!result) { flint_printf("FAIL:\n"); fmpz_poly_print(f1), flint_printf("\n\n"); fmpz_poly_print(f2), flint_printf("\n\n"); abort(); } fmpz_poly_clear(f1); fmpz_poly_clear(f2); fmpz_poly_clear(g); fmpz_poly_clear(h); } FLINT_TEST_CLEANUP(state); flint_printf("PASS\n"); return 0; }
int main(void) { int i, j, len1, len2; int X[rows][cols]; double T[rows][cols][nalgs]; fmpz_poly_t f, g, h; flint_rand_t state; flint_randinit(state); fmpz_poly_init2(f, len1hi); fmpz_poly_init2(g, len2hi); fmpz_poly_init2(h, (len1hi-1) * (len2hi-1) + 1); for (len1 = len1lo, j = 0; len1 <= len1hi; len1 += len1h, j++) { long s[nalgs]; for (len2 = len2lo, i = 0; len2 <= len2hi; len2 += len2h, i++) { int c, n, reps = 0; for (c = 0; c < nalgs; c++) s[c] = 0L; for (n = 0; n < ncases; n++) { timeit_t t[nalgs]; int l, loops = 1; /* Construct random polynomials f and g */ { long k; for (k = 0; k < len1; k++) fmpz_randbits(f->coeffs + k, state, bits); if ((f->coeffs)[len1-1] == 0L) fmpz_randtest_not_zero(f->coeffs + (len1 - 1), state, bits); f->length = len1; } { long k; for (k = 0; k < len2; k++) fmpz_randbits(g->coeffs + k, state, bits); if ((g->coeffs)[len2-1] == 0L) fmpz_randtest_not_zero(g->coeffs + (len2 - 1), state, bits); g->length = len2; } loop: timeit_start(t[0]); for (l = 0; l < loops; l++) fmpz_poly_compose_horner(h, f, g); timeit_stop(t[0]); timeit_start(t[1]); for (l = 0; l < loops; l++) fmpz_poly_compose_divconquer(h, f, g); timeit_stop(t[1]); for (c = 0; c < nalgs; c++) if (t[c]->cpu <= cpumin) { loops *= 10; goto loop; } for (c = 0; c < nalgs; c++) s[c] += t[c]->cpu; reps += loops; } for (c = 0; c < nalgs; c++) T[i][j][c] = s[c] / (double) reps; if (s[0] <= s[1]) X[i][j] = 0; else X[i][j] = 1; } printf("len1 = %d, time = %ldms\n", len1, s[0] + s[1]), fflush(stdout); } fmpz_poly_clear(f); fmpz_poly_clear(g); fmpz_poly_clear(h); /* Print 2-D ASCII image of the winning algorithms */ for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) printf("%d", X[i][j]); printf("\n"); } flint_randclear(state); }