/* Copyright (C) 2020 Daniel Schultz This file is part of FLINT. FLINT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. See . */ #include #include #include "flint.h" #include "fmpz_poly.h" #include "profiler.h" static slong count_omega(const fmpz_poly_factor_t fac) { slong i, omega = 0; for (i = 0; i < fac->num; i++) omega += fac->exp[i]; return omega; } int main(void) { flint_bitcnt_t max_bits; slong it, i, j, omega; ulong tab[11][20]; timeit_t timer; FLINT_TEST_INIT(state); printf(" bits : "); omega = 0; for (max_bits = 10, it = 0; max_bits <= 3000; max_bits *= 2, it++) { fmpz_t d; fmpz_poly_t g; fmpz_poly_struct * f; fmpz_poly_factor_t fac; slong reps = 1000000/(max_bits + 100); slong outer_reps = 10; f = flint_malloc(reps * sizeof(fmpz_poly_struct)); for (i = 0; i < reps; i++) fmpz_poly_init(f + i); fmpz_poly_init(g); fmpz_poly_factor_init(fac); fmpz_init(d); tab[0][it] = max_bits; flint_printf(" %06wu", tab[0][it]); fflush(stdout); /* (degree 1)^2 */ for (i = 0; i < reps; i++) { do { fmpz_poly_randtest(g, state, 2, n_randint(state, max_bits) + 2); } while (g->length != 2); fmpz_poly_pow(f + i, g, 2); } timeit_start(timer); for (j = 0; j < outer_reps; j++) for (i = 0; i < reps; i++) fmpz_poly_factor(fac, f + i); timeit_stop(timer); tab[1][it] = timer->cpu; /* (degree 1)*(degree 1) */ for (i = 0; i < reps; i++) { do { fmpz_poly_randtest(g, state, 2, n_randint(state, max_bits) + 2); } while (g->length != 2); fmpz_poly_set(f + i, g); do { fmpz_poly_randtest(g, state, 2, n_randint(state, max_bits) + 2); } while (g->length != 2); fmpz_poly_mul(f + i, f + i, g); } timeit_start(timer); for (i = 0; i < reps; i++) { fmpz_poly_factor(fac, f + i); omega += count_omega(fac); } for (j = 0; j < outer_reps; j++) for (i = 0; i < reps; i++) fmpz_poly_factor(fac, f + i); timeit_stop(timer); tab[2][it] = timer->cpu; /* (degree 2 +) */ for (i = 0; i < reps; i++) { do { fmpz_poly_randtest(g, state, 3, n_randint(state, max_bits) + 2); } while (g->length != 3 || (fmpz_poly_discriminant(d, g), fmpz_sgn(d) < 0)); fmpz_poly_set(f + i, g); } timeit_start(timer); for (i = 0; i < reps; i++) { fmpz_poly_factor(fac, f + i); omega += count_omega(fac); } for (j = 0; j < outer_reps; j++) for (i = 0; i < reps; i++) fmpz_poly_factor(fac, f + i); timeit_stop(timer); tab[3][it] = timer->cpu; /* (degree 2 -) */ for (i = 0; i < reps; i++) { do { fmpz_poly_randtest(g, state, 3, n_randint(state, max_bits) + 2); } while (g->length != 3 || (fmpz_poly_discriminant(d, g), fmpz_sgn(d) > 0)); fmpz_poly_set(f + i, g); } timeit_start(timer); for (i = 0; i < reps; i++) { fmpz_poly_factor(fac, f + i); omega += count_omega(fac); } for (j = 0; j < outer_reps; j++) for (i = 0; i < reps; i++) fmpz_poly_factor(fac, f + i); timeit_stop(timer); tab[4][it] = timer->cpu; /* (degree 1)^3 */ for (i = 0; i< reps; i++) { do { fmpz_poly_randtest(g, state, 2, n_randint(state, max_bits) + 2); } while (g->length != 2); fmpz_poly_pow(f + i, g, 3); } timeit_start(timer); for (i = 0; i < reps; i++) { fmpz_poly_factor(fac, f + i); omega += count_omega(fac); } for (j = 0; j < outer_reps; j++) for (i = 0; i < reps; i++) fmpz_poly_factor(fac, f + i); timeit_stop(timer); tab[5][it] = timer->cpu; /* (degree 1)*(degree 1)^2 */ for (i = 0; i < reps; i++) { do { fmpz_poly_randtest(g, state, 2, n_randint(state, max_bits) + 2); } while (g->length != 2); fmpz_poly_pow(f + i, g, 2); do { fmpz_poly_randtest(g, state, 2, n_randint(state, max_bits) + 2); } while (g->length != 2); fmpz_poly_mul(f + i, f + i, g); } timeit_start(timer); for (i = 0; i < reps; i++) { fmpz_poly_factor(fac, f + i); omega += count_omega(fac); } for (j = 0; j < outer_reps; j++) for (i = 0; i < reps; i++) fmpz_poly_factor(fac, f + i); timeit_stop(timer); tab[6][it] = timer->cpu; /* (degree 1)*(degree 1)*(degree 1) */ for (i = 0; i < reps; i++) { do { fmpz_poly_randtest(g, state, 2, n_randint(state, max_bits) + 2); } while (g->length != 2); fmpz_poly_set(f + i, g); do { fmpz_poly_randtest(g, state, 2, n_randint(state, max_bits) + 2); } while (g->length != 2); fmpz_poly_mul(f + i, f + i, g); do { fmpz_poly_randtest(g, state, 2, n_randint(state, max_bits) + 2); } while (g->length != 2); fmpz_poly_mul(f + i, f + i, g); } timeit_start(timer); for (i = 0; i < reps; i++) { fmpz_poly_factor(fac, f + i); omega += count_omega(fac); } for (j = 0; j < outer_reps; j++) for (i = 0; i < reps; i++) fmpz_poly_factor(fac, f + i); timeit_stop(timer); tab[7][it] = timer->cpu; /* (degree 1)*(degree 2 +) */ for (i = 0; i < reps; i++) { do { fmpz_poly_randtest(g, state, 2, n_randint(state, max_bits) + 2); } while (g->length != 2); fmpz_poly_set(f + i, g); do { fmpz_poly_randtest(g, state, 3, n_randint(state, max_bits) + 2); } while (g->length != 3 || (fmpz_poly_discriminant(d, g), fmpz_sgn(d) < 0)); fmpz_poly_mul(f + i, f + i, g); } timeit_start(timer); for (i = 0; i < reps; i++) { fmpz_poly_factor(fac, f + i); omega += count_omega(fac); } for (j = 0; j < outer_reps; j++) for (i = 0; i < reps; i++) fmpz_poly_factor(fac, f + i); timeit_stop(timer); tab[8][it] = timer->cpu; /* (degree 1)*(degree 2 -) */ for (i = 0; i < reps; i++) { do { fmpz_poly_randtest(g, state, 2, n_randint(state, max_bits) + 2); } while (g->length != 2); fmpz_poly_set(f + i, g); do { fmpz_poly_randtest(g, state, 3, n_randint(state, max_bits) + 2); } while (g->length != 3 || (fmpz_poly_discriminant(d, g), fmpz_sgn(d) > 0)); fmpz_poly_mul(f + i, f + i, g); } timeit_start(timer); for (i = 0; i < reps; i++) { fmpz_poly_factor(fac, f + i); omega += count_omega(fac); } for (j = 0; j < outer_reps; j++) for (i = 0; i < reps; i++) fmpz_poly_factor(fac, f + i); timeit_stop(timer); tab[9][it] = timer->cpu; /* (degree 3) */ for (i = 0; i < reps; i++) { do { fmpz_poly_randtest(g, state, 4, n_randint(state, max_bits) + 2); } while (g->length != 4); fmpz_poly_set(f + i, g); } timeit_start(timer); for (i = 0; i < reps; i++) { fmpz_poly_factor(fac, f + i); omega += count_omega(fac); } for (j = 0; j < outer_reps; j++) for (i = 0; i < reps; i++) fmpz_poly_factor(fac, f + i); timeit_stop(timer); tab[10][it] = timer->cpu; for (i = 0; i < reps; i++) fmpz_poly_clear(f + i); flint_free(f); fmpz_poly_clear(g); fmpz_poly_factor_clear(fac); fmpz_clear(d); } flint_printf("\n", max_bits); printf("---------------"); for (i = 0; i < it; i++) flint_printf("-------"); printf("\n"); printf(" (d1)^2 : "); for (i = 0; i < it; i++) flint_printf(" %06wu", tab[1][i]); printf("\n"); printf(" (d1)(d1) : "); for (i = 0; i < it; i++) flint_printf(" %06wu", tab[2][i]); printf("\n"); printf(" (d2+) : "); for (i = 0; i < it; i++) flint_printf(" %06wu", tab[3][i]); printf("\n"); printf(" (d2-) : "); for (i = 0; i < it; i++) flint_printf(" %06wu", tab[4][i]); printf("\n"); printf(" (d1)^3 : "); for (i = 0; i < it; i++) flint_printf(" %06wu", tab[5][i]); printf("\n"); printf(" (d1)(d1)^2 : "); for (i = 0; i < it; i++) flint_printf(" %06wu", tab[6][i]); printf("\n"); printf("(d1)(d1)(d1) : "); for (i = 0; i < it; i++) flint_printf(" %06wu", tab[7][i]); printf("\n"); printf(" (d1)(d2+) : "); for (i = 0; i < it; i++) flint_printf(" %06wu", tab[8][i]); printf("\n"); printf(" (d1)(d2-) : "); for (i = 0; i < it; i++) flint_printf(" %06wu", tab[9][i]); printf("\n"); printf(" (d3) : "); for (i = 0; i < it; i++) flint_printf(" %06wu", tab[10][i]); printf("\n"); FLINT_TEST_CLEANUP(state); flint_printf("factors found: %wd\n", omega); return 0; }