#include <float.h>
#include "fmpz.h"
#include "fmpz_poly.h"
#include "ulong_extras.h"
#include "profiler.h"
#define len1lo 1
#define len1hi 30
#define len1h 1
#define len2lo 1
#define len2hi 30
#define len2h 1
#define bits 112
#define cols ((len1hi + 1 - len1lo + (len1h - 1)) / len1h)
#define rows ((len2hi + 1 - len2lo + (len2h - 1)) / len2h)
#define cpumin 10
#define ncases 1
#define nalgs 2
int
main(void)
{
int i, j, len1, len2;
int X[rows][cols];
fmpz_poly_t f, g, h;
FLINT_TEST_INIT(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++)
{
slong s[nalgs];
for (len2 = len2lo, i = 0; len2 <= len2hi; len2 += len2h, i++)
{
int c, n;
for (c = 0; c < nalgs; c++)
s[c] = WORD(0);
for (n = 0; n < ncases; n++)
{
timeit_t t[nalgs];
int l, loops = 1;
{
slong k;
for (k = 0; k < len1; k++)
fmpz_randbits(f->coeffs + k, state, bits);
if ((f->coeffs)[len1-1] == WORD(0))
fmpz_randtest_not_zero(f->coeffs + (len1 - 1), state, bits);
f->length = len1;
}
{
slong k;
for (k = 0; k < len2; k++)
fmpz_randbits(g->coeffs + k, state, bits);
if ((g->coeffs)[len2-1] == WORD(0))
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;
}
if (s[0] <= s[1])
X[i][j] = 0;
else
X[i][j] = 1;
}
flint_printf("len1 = %d, time = %wdms\n", len1, s[0] + s[1]), fflush(stdout);
}
fmpz_poly_clear(f);
fmpz_poly_clear(g);
fmpz_poly_clear(h);
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
flint_printf("%d", X[i][j]);
flint_printf("\n");
}
FLINT_TEST_CLEAR(state);
return 0;
}