#include "ulong_extras.h"
#include "nmod_poly.h"
#include "fmpz.h"
#include "fq_nmod.h"
int _fq_nmod_ctx_init_conway_ui(fq_nmod_ctx_t ctx, ulong p, slong d, const char * var)
{
int ret;
ulong conway_poly[410];
nmod_poly_struct tmp;
ret = _nmod_poly_conway(conway_poly, p, d);
if (!ret)
return 0;
nmod_poly_init(&tmp, p);
tmp.coeffs = conway_poly;
tmp.length = d + 1;
fq_nmod_ctx_init_modulus(ctx, &tmp, var);
return 1;
}
void fq_nmod_ctx_init_conway_ui(fq_nmod_ctx_t ctx, ulong p, slong d, const char * var)
{
if (!_fq_nmod_ctx_init_conway_ui(ctx, p, d, var))
flint_throw(FLINT_ERROR,
"Exception (fq_nmod_ctx_init_conway_ui). "
"The polynomial for (p, d) = (%wu, %wd) is not present in the "
"database.\n", p, d);
ctx->is_conway = 1;
}
void fq_nmod_ctx_init_minimal_weight_ui(fq_nmod_ctx_t ctx, ulong p, slong d, const char *var)
{
nmod_poly_t poly;
ctx->is_conway = 0;
nmod_poly_init2(poly, p, d + 1);
nmod_poly_minimal_irreducible(poly, d);
fq_nmod_ctx_init_modulus(ctx, poly, var);
nmod_poly_clear(poly);
}
void fq_nmod_ctx_init_ui(fq_nmod_ctx_t ctx, ulong p, slong d, const char *var)
{
if (_fq_nmod_ctx_init_conway_ui(ctx, p, d, var))
{
ctx->is_conway = 1;
}
else
{
fq_nmod_ctx_init_minimal_weight_ui(ctx, p, d, var);
}
}
void
fq_nmod_ctx_init_randtest(fq_nmod_ctx_t ctx, flint_rand_t state, int type)
{
ulong prime;
slong degree;
prime = _nmod_poly_conway_rand(°ree, state, type);
fq_nmod_ctx_init_conway_ui(ctx, prime, degree, "a");
if (n_randint(state, 2))
{
nmod_poly_t modulus;
ulong x;
nmod_poly_init(modulus, ctx->mod.n);
nmod_poly_set(modulus, ctx->modulus);
x = n_randint(state, ctx->mod.n - 1) + 1;
nmod_poly_scalar_mul_nmod(modulus, modulus, x);
fq_nmod_ctx_clear(ctx);
fq_nmod_ctx_init_modulus(ctx, modulus, "a");
nmod_poly_clear(modulus);
}
}
void
fq_nmod_ctx_init_randtest_reducible(fq_nmod_ctx_t ctx, flint_rand_t state, int type)
{
ulong prime;
slong deg;
nmod_poly_t mod;
switch (type)
{
case 0:
prime = n_randprime(state, 2 + n_randint(state, 19), 1);
deg = 1 + n_randint(state, 30);
break;
case 1:
prime = n_randprime(state, 2 + n_randint(state, 19), 1);
deg = 1 + n_randint(state, 15);
break;
case 2:
prime = n_randprime(state, 2 + n_randint(state, 9), 1);
deg = 1 + n_randint(state, 30);
break;
case 3:
prime = n_randprime(state, 2 + n_randint(state, 9), 1);
deg = 1 + n_randint(state, 15);
break;
default: FLINT_UNREACHABLE;
}
nmod_poly_init(mod, prime);
nmod_poly_randtest_monic(mod, state, deg + 1);
fq_nmod_ctx_init_modulus(ctx, mod, "a");
nmod_poly_clear(mod);
}
void fq_nmod_ctx_init(fq_nmod_ctx_t ctx, fmpz_t p, slong d, const char * var) { fq_nmod_ctx_init_ui(ctx, fmpz_get_ui(p), d, var); }
int _fq_nmod_ctx_init_conway(fq_nmod_ctx_t ctx, fmpz_t p, slong d, const char * var) { return _fq_nmod_ctx_init_conway_ui(ctx, fmpz_get_ui(p), d, var); }
void fq_nmod_ctx_init_conway(fq_nmod_ctx_t ctx, fmpz_t p, slong d, const char * var) { fq_nmod_ctx_init_conway_ui(ctx, fmpz_get_ui(p), d, var); }