/*
Copyright (C) 2011 Sebastian Pancratz
Copyright (C) 2013 Mike Hansen
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 "fmpz_vec.h"
#include "padic.h"
#include "qadic.h"
int flint_conway_polynomials [] = {
#include "CPimport.h"
0
};
void qadic_ctx_init_conway(qadic_ctx_t ctx,
const fmpz_t p, slong d, slong min, slong max,
const char *var, enum padic_print_mode mode)
{
unsigned int position;
if (fmpz_cmp_ui(p, 109987) > 0)
{
flint_printf("Exception (qadic_ctx_init_conway). Conway polynomials \n");
flint_printf("are only available for primes up to 109987.\n");
flint_abort();
}
for (position = 0; flint_conway_polynomials[position] != 0; position += 3+flint_conway_polynomials[position+1])
{
/* Different prime? */
if (fmpz_cmp_ui(p, flint_conway_polynomials[position]))
continue;
/* Same degree? */
if (d == flint_conway_polynomials[position+1])
{
slong i, j;
/* Find number of non-zero coefficients */
ctx->len = 1;
for (i = 0; i < d; i++)
{
if (flint_conway_polynomials[position+2+i])
ctx->len ++;
}
ctx->a = _fmpz_vec_init(ctx->len);
ctx->j = flint_malloc(ctx->len * sizeof(slong));
/* Copy the polynomial */
j = 0;
for (i = 0; i < d; i++)
{
int coeff = flint_conway_polynomials[position+2+i];
if (coeff)
{
fmpz_set_ui(ctx->a + j, coeff);
ctx->j[j] = i;
j++;
}
}
fmpz_set_ui(ctx->a + j, 1);
ctx->j[j] = d;
/* Complete the initialisation of the context */
padic_ctx_init(&ctx->pctx, p, min, max, mode);
ctx->var = flint_malloc(strlen(var) + 1);
strcpy(ctx->var, var);
return;
}
}
flint_printf("Exception (qadic_ctx_init_conway). The polynomial for \n");
flint_printf("(p,d) = (%wd,%wd) is not present in the database.\n", *p, d);
flint_abort();
}