/*
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
#include "flint.h"
#include "fmpz.h"
#include "mpoly.h"
#include "fmpz_mpoly.h"
#include "profiler.h"
int
main(void)
{
slong i, j, k, total_time;
timeit_t timer;
flint_rand_t state;
flint_randinit(state);
flint_printf("------------------------------\n");
total_time = 0;
timeit_start(timer);
for (i = 0; i < 20000; i++)
{
fmpz_mpoly_ctx_t ctx;
fmpz_mpoly_t f, g, h;
slong len1, len2;
flint_bitcnt_t bits1, bits2;
if (0 == i%1000)
{
flint_printf("%wd ", i);
fflush(stdout);
}
fmpz_mpoly_ctx_init_rand(ctx, state, 10);
fmpz_mpoly_init(f, ctx);
fmpz_mpoly_init(g, ctx);
fmpz_mpoly_init(h, ctx);
len1 = n_randint(state, 10) + 2;
len2 = n_randint(state, 10) + 2;
bits1 = n_randint(state, 9) + 1;
bits2 = n_randint(state, 9) + 1;
fmpz_mpoly_randtest_bits(h, state, len1, 10, bits1, ctx);
fmpz_mpoly_randtest_bits(g, state, len2, 10, bits2, ctx);
fmpz_mpoly_mul(f, h, g, ctx);
if (mpoly_test_irreducible(f->exps, f->bits, f->length, ctx->minfo) &&
h->length > 1 && g->length > 1)
{
flint_printf("FAIL: check reducible input\n");
flint_printf("f: "); fmpz_mpoly_print_pretty(f, NULL, ctx); flint_printf("\n");
flint_printf("g: "); fmpz_mpoly_print_pretty(g, NULL, ctx); flint_printf("\n");
flint_printf("h: "); fmpz_mpoly_print_pretty(h, NULL, ctx); flint_printf("\n");
flint_abort();
}
fmpz_mpoly_clear(f, ctx);
fmpz_mpoly_clear(g, ctx);
fmpz_mpoly_clear(h, ctx);
fmpz_mpoly_ctx_clear(ctx);
}
timeit_stop(timer);
total_time += timer->wall;
flint_printf("\nreducible time: %wd ms\n\n", timer->wall);
flint_printf("------------------------------\n");
total_time = 0;
for (i = 2; i <= 16; i++)
{
fmpz_mpoly_ctx_t ctx;
fmpz_mpoly_t f;
slong tot = 0, pos = 0;
ulong * bounds = FLINT_ARRAY_ALLOC(i, ulong);
fmpz_mpoly_ctx_init(ctx, i, ORD_LEX);
fmpz_mpoly_init(f, ctx);
timeit_start(timer);
for (j = 0; j < 1000; j++)
{
flint_bitcnt_t bits = n_randint(state, 5) + 3;
slong len = 10;
for (k = 0; k < i; k++)
{
bounds[k] = n_urandint(state, UWORD(1) << bits) + 2;
len += 3 + n_urandint(state, 2*bounds[k]);
}
fmpz_mpoly_randtest_bounds(f, state, len, 10, bounds, ctx);
tot += 1;
pos += mpoly_test_irreducible(f->exps, f->bits, f->length, ctx->minfo);
}
timeit_stop(timer);
total_time += timer->wall;
flint_printf("%wd vars: %f percent %wd ms\n", i,
(double)(pos)/(double)(tot)*100, timer->wall);
flint_free(bounds);
fmpz_mpoly_clear(f, ctx);
fmpz_mpoly_ctx_clear(ctx);
}
flint_printf("irreducible time: %wd ms\n\n", total_time);
flint_randclear(state);
return 0;
}