/* Copyright (C) 2011 Sebastian Pancratz Copyright (C) 2013 Mike Hansen Copyright (C) 2020 Claus Fieker 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 "fmpz_mod_poly.h" #include "padic.h" #include "qadic.h" extern int flint_conway_polynomials []; void qadic_ctx_init(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; flint_rand_t state; fmpz_mod_poly_t poly; slong i, j; fmpz_mod_ctx_t ctxp; if (fmpz_cmp_ui(p, 109987) <= 0) { 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]) { /* 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_randinit(state); fmpz_mod_ctx_init(ctxp, p); fmpz_mod_poly_init2(poly, d + 1, ctxp); fmpz_mod_poly_randtest_sparse_irreducible(poly, state, d + 1, ctxp); flint_randclear(state); /* Find number of non-zero coefficients */ ctx->len = 1; for (i = 0; i < d; i++) { if (!fmpz_is_zero(poly->coeffs + 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++) { if (!fmpz_is_zero(poly->coeffs+i)) { fmpz_set(ctx->a + j, poly->coeffs + i); 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); fmpz_mod_poly_clear(poly, ctxp); fmpz_mod_ctx_clear(ctxp); }