/*
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 .
*/
#ifndef FQ_ZECH_MPOLY_H
#define FQ_ZECH_MPOLY_H
#ifdef FQ_ZECH_MPOLY_INLINES_C
#define FQ_ZECH_MPOLY_INLINE FLINT_DLL
#else
#define FQ_ZECH_MPOLY_INLINE static __inline__
#endif
#undef ulong
#define ulong ulongxx /* interferes with system includes */
#include
#undef ulong
#include
#define ulong mp_limb_t
#include "flint.h"
#include "nmod_vec.h"
#include "nmod_mat.h"
#include "nmod_poly.h"
#include "ulong_extras.h"
#include "fmpz.h"
#include "fmpz_vec.h"
#include "mpoly.h"
#include "fq_zech.h"
#include "fq_zech_poly.h"
#include "fq_nmod_mpoly.h"
#ifdef __cplusplus
extern "C" {
#endif
FQ_ZECH_MPOLY_INLINE
nmod_t fq_zech_ctx_mod(const fq_zech_ctx_t ctx)
{
return ctx->fq_nmod_ctx->mod;
}
/* Type definitions *********************************************************/
/*
context object for fq_zech_mpoly
*/
typedef struct
{
mpoly_ctx_t minfo;
fq_zech_ctx_t fqctx;
} fq_zech_mpoly_ctx_struct;
typedef fq_zech_mpoly_ctx_struct fq_zech_mpoly_ctx_t[1];
/*
fq_zech_mpoly_t
sparse multivariates with fq_zech coefficients
*/
typedef struct
{
fq_zech_struct * coeffs;
ulong * exps;
slong alloc;
slong length;
flint_bitcnt_t bits; /* number of bits per exponent */
} fq_zech_mpoly_struct;
typedef fq_zech_mpoly_struct fq_zech_mpoly_t[1];
/* Internal type definitions *************************************************/
/*
fq_zech_mpoly_univar_t
sparse univariates with multivariate coefficients
*/
typedef struct
{
fq_zech_mpoly_struct * coeffs; /* multivariate coefficients */
fmpz * exps;
slong alloc;
slong length;
} fq_zech_mpoly_univar_struct;
typedef fq_zech_mpoly_univar_struct fq_zech_mpoly_univar_t[1];
/*
fq_zech_mpolyu_t
sparse univariates with fq_zech_mpoly_t coefficients
with uniform bits and LEX ordering
*/
typedef struct
{
fq_zech_mpoly_struct * coeffs;
ulong * exps;
slong alloc;
slong length;
flint_bitcnt_t bits; /* default bits to construct coeffs */
} fq_zech_mpolyu_struct;
typedef fq_zech_mpolyu_struct fq_zech_mpolyu_t[1];
/*
fq_zech_mpolyn_t
multivariates with fq_zech_poly_t coefficients
*/
typedef struct
{
fq_zech_poly_struct * coeffs;
ulong * exps;
slong alloc;
slong length;
slong bits;
} fq_zech_mpolyn_struct;
typedef fq_zech_mpolyn_struct fq_zech_mpolyn_t[1];
/*
fq_zech_mpolyun_t
sparse univariates with fq_zech_mpolyn_t coefficients
with uniform bits and LEX ordering
*/
typedef struct
{
fq_zech_mpolyn_struct * coeffs;
ulong * exps;
slong alloc;
slong length;
flint_bitcnt_t bits; /* default bits to construct coeffs */
} fq_zech_mpolyun_struct;
typedef fq_zech_mpolyun_struct fq_zech_mpolyun_t[1];
/*
fq_zech_mpoly_geobucket_t
power of 4 increment
*/
typedef struct fq_zech_mpoly_geobucket
{
fq_zech_mpoly_struct polys[FLINT_BITS/2];
slong length;
} fq_zech_mpoly_geobucket_struct;
typedef fq_zech_mpoly_geobucket_struct fq_zech_mpoly_geobucket_t[1];
/* Context object ************************************************************/
FLINT_DLL void fq_zech_mpoly_ctx_init_deg(fq_zech_mpoly_ctx_t ctx, slong nvars,
const ordering_t ord, mp_limb_t p, slong deg);
FLINT_DLL void fq_zech_mpoly_ctx_init(fq_zech_mpoly_ctx_t ctx, slong nvars,
const ordering_t ord, const fq_zech_ctx_t fqctx);
FLINT_DLL void fq_zech_mpoly_ctx_clear(fq_zech_mpoly_ctx_t ctx);
FQ_ZECH_MPOLY_INLINE
slong fq_zech_mpoly_ctx_nvars(const fq_zech_mpoly_ctx_t ctx)
{
return ctx->minfo->nvars;
}
FQ_ZECH_MPOLY_INLINE
ordering_t fq_zech_mpoly_ctx_ord(const fq_zech_mpoly_ctx_t ctx)
{
return ctx->minfo->ord;
}
/* Memory management ********************************************************/
FLINT_DLL void fq_zech_mpoly_init(fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_init2(fq_zech_mpoly_t A, slong alloc,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_init3(fq_zech_mpoly_t A, slong alloc,
flint_bitcnt_t bits, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_realloc(fq_zech_mpoly_t A,
slong alloc, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_fit_length(fq_zech_mpoly_t A, slong length,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void _fq_zech_mpoly_fit_length(fq_zech_struct ** coeff,
ulong ** exps, slong * alloc, slong len, slong N,
const fq_zech_ctx_t fqctx);
FLINT_DLL void fq_zech_mpoly_fit_length_reset_bits(fq_zech_mpoly_t A,
slong len, flint_bitcnt_t bits, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_clear(fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx);
FQ_ZECH_MPOLY_INLINE
void _fq_zech_mpoly_set_length(fq_zech_mpoly_t A, slong newlen,
const fq_zech_mpoly_ctx_t ctx)
{
FLINT_ASSERT(newlen <= A->alloc);
A->length = newlen;
}
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_truncate(fq_zech_mpoly_t A, slong newlen,
const fq_zech_mpoly_ctx_t ctx)
{
if (A->length > newlen)
{
A->length = newlen;
}
}
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_fit_bits(fq_zech_mpoly_t A, slong bits,
const fq_zech_mpoly_ctx_t ctx)
{
if (A->bits < bits)
{
if (A->alloc != 0)
{
slong N = mpoly_words_per_exp(bits, ctx->minfo);
ulong * t = (ulong *) flint_malloc(N*A->alloc*sizeof(ulong));
mpoly_repack_monomials(t, bits, A->exps, A->bits, A->length,
ctx->minfo);
flint_free(A->exps);
A->exps = t;
}
A->bits = bits;
}
}
/* Input/output **************************************************************/
FLINT_DLL int fq_zech_mpoly_set_str_pretty(fq_zech_mpoly_t A, const char * str,
const char ** x, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL char * fq_zech_mpoly_get_str_pretty(const fq_zech_mpoly_t A,
const char ** x, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int fq_zech_mpoly_fprint_pretty(FILE * file,
const fq_zech_mpoly_t A, const char ** x, const fq_zech_mpoly_ctx_t ctx);
FQ_ZECH_MPOLY_INLINE
int fq_zech_mpoly_print_pretty(const fq_zech_mpoly_t A,
const char ** x, const fq_zech_mpoly_ctx_t ctx)
{
return fq_zech_mpoly_fprint_pretty(stdout, A, x, ctx);
}
/* Basic manipulation *******************************************************/
FLINT_DLL void fq_zech_mpoly_gen(fq_zech_mpoly_t A, slong var,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int fq_zech_mpoly_is_gen(const fq_zech_mpoly_t A,
slong var, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_set(fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int fq_zech_mpoly_equal(const fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctx);
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_swap(fq_zech_mpoly_t A, fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctx)
{
fq_zech_mpoly_struct t = *A;
*A = *B;
*B = t;
}
/* Constants *****************************************************************/
FLINT_DLL int fq_zech_mpoly_is_fq_zech(const fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_get_fq_zech(fq_zech_t c, const fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_set_fq_zech(fq_zech_mpoly_t A,
const fq_zech_t c, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_set_ui(fq_zech_mpoly_t A, ulong c,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_set_fq_zech_gen(fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int fq_zech_mpoly_equal_fq_zech(const fq_zech_mpoly_t A,
const fq_zech_t c, const fq_zech_mpoly_ctx_t ctx);
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_zero(fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx)
{
_fq_zech_mpoly_set_length(A, 0, ctx);
}
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_one(fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx)
{
fq_zech_mpoly_set_ui(A, 1, ctx);
}
FQ_ZECH_MPOLY_INLINE
int fq_zech_mpoly_is_zero(const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx)
{
return A->length == 0;
}
FLINT_DLL int fq_zech_mpoly_is_one(const fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx);
/* Degrees *******************************************************************/
FQ_ZECH_MPOLY_INLINE
int fq_zech_mpoly_degrees_fit_si(const fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx)
{
return A->bits <= FLINT_BITS ? 1
: mpoly_degrees_fit_si(A->exps, A->length, A->bits, ctx->minfo);
}
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_degrees_fmpz(fmpz ** degs, const fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx)
{
mpoly_degrees_pfmpz(degs, A->exps, A->length, A->bits, ctx->minfo);
}
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_degrees_si(slong * degs, const fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx)
{
mpoly_degrees_si(degs, A->exps, A->length, A->bits, ctx->minfo);
}
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_degree_fmpz(fmpz_t deg, const fq_zech_mpoly_t A, slong var,
const fq_zech_mpoly_ctx_t ctx)
{
mpoly_degree_fmpz(deg, A->exps, A->length, A->bits, var, ctx->minfo);
}
FQ_ZECH_MPOLY_INLINE
slong fq_zech_mpoly_degree_si(const fq_zech_mpoly_t A, slong var,
const fq_zech_mpoly_ctx_t ctx)
{
return mpoly_degree_si(A->exps, A->length, A->bits, var, ctx->minfo);
}
FQ_ZECH_MPOLY_INLINE
int fq_zech_mpoly_total_degree_fits_si(const fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx)
{
return mpoly_total_degree_fits_si(A->exps, A->length, A->bits, ctx->minfo);
}
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_total_degree_fmpz(fmpz_t td, const fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx)
{
mpoly_total_degree_fmpz(td, A->exps, A->length, A->bits, ctx->minfo);
}
FQ_ZECH_MPOLY_INLINE
slong fq_zech_mpoly_total_degree_si(const fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx)
{
return mpoly_total_degree_si(A->exps, A->length, A->bits, ctx->minfo);
}
/* Coefficients **************************************************************/
FLINT_DLL void fq_zech_mpoly_get_coeff_fq_zech_monomial(fq_zech_t c,
const fq_zech_mpoly_t A, const fq_zech_mpoly_t M,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_set_coeff_fq_zech_monomial(fq_zech_mpoly_t A,
const fq_zech_t c, const fq_zech_mpoly_t M,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_get_coeff_fq_zech_fmpz(fq_zech_t c,
const fq_zech_mpoly_t A, fmpz * const * exp,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_get_coeff_fq_zech_ui(fq_zech_t c,
const fq_zech_mpoly_t A, const ulong * exp,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void _fq_zech_mpoly_set_coeff_fq_zech_fmpz(fq_zech_mpoly_t A,
const fq_zech_t c, const fmpz * exp,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_set_coeff_fq_zech_fmpz(fq_zech_mpoly_t A,
const fq_zech_t c, fmpz * const * exp,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_set_coeff_fq_zech_ui(fq_zech_mpoly_t A,
const fq_zech_t c, const ulong * exp,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_get_coeff_vars_ui(fq_zech_mpoly_t C,
const fq_zech_mpoly_t A, const slong * vars, const ulong * exps,
slong length, const fq_zech_mpoly_ctx_t ctx);
FQ_ZECH_MPOLY_INLINE fq_zech_struct * fq_zech_mpoly_leadcoeff(
const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx)
{
FLINT_ASSERT(A->length > 0);
return A->coeffs + 0;
}
/* comparison ****************************************************************/
FLINT_DLL int fq_zech_mpoly_cmp(const fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctx);
/* container operations ******************************************************/
FLINT_DLL int fq_zech_mpoly_is_canonical(const fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx);
FQ_ZECH_MPOLY_INLINE
slong fq_zech_mpoly_length(const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx)
{
return A->length;
}
FLINT_DLL void fq_zech_mpoly_resize(fq_zech_mpoly_t A, slong new_length,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_get_term_coeff_fq_zech(fq_zech_t c,
const fq_zech_mpoly_t A, slong i, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_set_term_coeff_fq_zech(fq_zech_mpoly_t A,
slong i, const fq_zech_t c, const fq_zech_mpoly_ctx_t ctx);
FQ_ZECH_MPOLY_INLINE
int fq_zech_mpoly_term_exp_fits_ui(const fq_zech_mpoly_t A, slong i,
const fq_zech_mpoly_ctx_t ctx)
{
return A->bits <= FLINT_BITS ? 1
: mpoly_term_exp_fits_ui(A->exps, A->bits, i, ctx->minfo);
}
FQ_ZECH_MPOLY_INLINE
int fq_zech_mpoly_term_exp_fits_si(const fq_zech_mpoly_t A, slong i,
const fq_zech_mpoly_ctx_t ctx)
{
return A->bits <= FLINT_BITS ? 1
: mpoly_term_exp_fits_si(A->exps, A->bits, i, ctx->minfo);
}
FLINT_DLL void fq_zech_mpoly_get_term_exp_fmpz(fmpz ** exp,
const fq_zech_mpoly_t A, slong i, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_get_term_exp_ui(ulong * exp,
const fq_zech_mpoly_t A, slong i, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_get_term_exp_si(slong * exp,
const fq_zech_mpoly_t A, slong i, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL ulong fq_zech_mpoly_get_term_var_exp_ui(const fq_zech_mpoly_t A,
slong i, slong var, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL slong fq_zech_mpoly_get_term_var_exp_si(const fq_zech_mpoly_t A,
slong i, slong var, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_set_term_exp_fmpz(fq_zech_mpoly_t A,
slong i, fmpz * const * exp, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_set_term_exp_ui(fq_zech_mpoly_t A,
slong i, const ulong * exp, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_get_term(fq_zech_mpoly_t M, const fq_zech_mpoly_t A,
slong i, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_get_term_monomial(fq_zech_mpoly_t M,
const fq_zech_mpoly_t A, slong i, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_push_term_fq_zech_fmpz(fq_zech_mpoly_t A,
const fq_zech_t c, fmpz * const * exp, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_push_term_fq_zech_ui(fq_zech_mpoly_t A,
const fq_zech_t c, const ulong * exp, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_sort_terms(fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_combine_like_terms(fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_reverse(fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_assert_canonical(const fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void _fq_zech_mpoly_radix_sort1(fq_zech_mpoly_t A, slong left,
slong right, flint_bitcnt_t pos, ulong cmpmask, ulong totalmask);
FLINT_DLL void _fq_zech_mpoly_radix_sort(fq_zech_mpoly_t A, slong left,
slong right, flint_bitcnt_t pos, slong N, ulong * cmpmask);
FLINT_DLL void _fq_zech_mpoly_push_exp_ffmpz(fq_zech_mpoly_t A,
const fmpz * exp, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void _fq_zech_mpoly_push_exp_pfmpz(fq_zech_mpoly_t A,
fmpz * const * exp, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void _fq_zech_mpoly_push_exp_ui(fq_zech_mpoly_t A,
const ulong * exp, const fq_zech_mpoly_ctx_t ctx);
/* Random generation *********************************************************/
FLINT_DLL void fq_zech_mpoly_randtest_bound(fq_zech_mpoly_t A, flint_rand_t state,
slong length, ulong exp_bound, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_randtest_bounds(fq_zech_mpoly_t A, flint_rand_t state,
slong length, ulong * exp_bounds, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_randtest_bits(fq_zech_mpoly_t A, flint_rand_t state,
slong length, flint_bitcnt_t exp_bits, const fq_zech_mpoly_ctx_t ctx);
/* Addition/Subtraction ******************************************************/
FLINT_DLL slong _fq_zech_mpoly_add(
fq_zech_struct * coeff1, ulong * exp1,
fq_zech_struct * coeff2, const ulong * exp2, slong len2,
fq_zech_struct * coeff3, const ulong * exp3, slong len3,
slong N, const ulong * cmpmask, const fq_zech_ctx_t fqctx);
FLINT_DLL void fq_zech_mpoly_add_fq_zech(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fq_zech_t C,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_sub_fq_zech(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fq_zech_t C,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_add(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fq_zech_mpoly_t C,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_sub(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fq_zech_mpoly_t C,
const fq_zech_mpoly_ctx_t ctx);
/* Scalar operations *********************************************************/
FLINT_DLL void fq_zech_mpoly_neg(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_scalar_mul_fq_zech(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fq_zech_t c, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_make_monic(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_scalar_addmul_fq_zech(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fq_zech_mpoly_t C, const fq_zech_t d,
const fq_zech_mpoly_ctx_t ctx);
/* Differentiation **********************************************************/
FLINT_DLL void fq_zech_mpoly_derivative(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, slong var, const fq_zech_mpoly_ctx_t ctx);
/* Evaluation ****************************************************************/
FLINT_DLL void fq_zech_mpoly_evaluate_one_fq_zech(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, slong var, const fq_zech_t val,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void _fq_zech_mpoly_eval_all_fq_zech(fq_zech_t eval,
const fq_zech_struct * Acoeffs, const ulong * Aexps, slong Alen,
flint_bitcnt_t Abits, fq_zech_struct * const * alphas,
const mpoly_ctx_t mctx, const fq_zech_ctx_t fqctx);
FLINT_DLL void fq_zech_mpoly_evaluate_all_fq_zech(fq_zech_t ev, const fq_zech_mpoly_t A,
fq_zech_struct * const * vals, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int fq_zech_mpoly_compose_fq_zech_poly(fq_zech_poly_t A,
const fq_zech_mpoly_t B, fq_zech_poly_struct * const * C,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void _fq_zech_mpoly_compose_mat(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fmpz_mat_t M,
const fq_zech_mpoly_ctx_t ctxB, const fq_zech_mpoly_ctx_t ctxAC);
FLINT_DLL int fq_zech_mpoly_compose_fq_zech_mpoly_geobucket(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, fq_zech_mpoly_struct * const * C,
const fq_zech_mpoly_ctx_t ctxB, const fq_zech_mpoly_ctx_t ctxAC);
FLINT_DLL int fq_zech_mpoly_compose_fq_zech_mpoly_horner(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, fq_zech_mpoly_struct * const * C,
const fq_zech_mpoly_ctx_t ctxB, const fq_zech_mpoly_ctx_t ctxAC);
FLINT_DLL int fq_zech_mpoly_compose_fq_zech_mpoly(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, fq_zech_mpoly_struct * const * C,
const fq_zech_mpoly_ctx_t ctxB, const fq_zech_mpoly_ctx_t ctxAC);
FLINT_DLL void fq_zech_mpoly_compose_fq_zech_mpoly_gen(fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const slong * c,
const fq_zech_mpoly_ctx_t ctxB, const fq_zech_mpoly_ctx_t ctxAC);
/* Multiplication ************************************************************/
FLINT_DLL void fq_zech_mpoly_mul(fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fq_zech_mpoly_t C, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_mul_johnson(fq_zech_mpoly_t poly1,
const fq_zech_mpoly_t poly2, const fq_zech_mpoly_t poly3,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL slong _fq_zech_mpoly_mul_johnson(
fq_zech_struct ** coeff1, ulong ** exp1, slong * alloc,
const fq_zech_struct * coeff2, const ulong * exp2, slong len2,
const fq_zech_struct * coeff3, const ulong * exp3, slong len3,
flint_bitcnt_t bits, slong N, const ulong * cmpmask, const fq_zech_ctx_t fqctx);
/* Powering ******************************************************************/
FLINT_DLL int fq_zech_mpoly_pow_fmpz(fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fmpz_t k, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int fq_zech_mpoly_pow_ui(fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
ulong k, const fq_zech_mpoly_ctx_t ctx);
/* Division ******************************************************************/
FLINT_DLL int fq_zech_mpoly_divides(fq_zech_mpoly_t Q,
const fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_div(fq_zech_mpoly_t Q,
const fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_divrem(fq_zech_mpoly_t Q, fq_zech_mpoly_t R,
const fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_divrem_ideal(fq_zech_mpoly_struct ** Q,
fq_zech_mpoly_t R, const fq_zech_mpoly_t A,
fq_zech_mpoly_struct * const * B, slong len,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int fq_zech_mpoly_divides_monagan_pearce(fq_zech_mpoly_t poly1,
const fq_zech_mpoly_t poly2, const fq_zech_mpoly_t poly3,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_div_monagan_pearce(fq_zech_mpoly_t q,
const fq_zech_mpoly_t poly2, const fq_zech_mpoly_t poly3,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_divrem_monagan_pearce(fq_zech_mpoly_t q, fq_zech_mpoly_t r,
const fq_zech_mpoly_t poly2, const fq_zech_mpoly_t poly3,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_divrem_ideal_monagan_pearce(
fq_zech_mpoly_struct ** q, fq_zech_mpoly_t r,
const fq_zech_mpoly_t poly2, fq_zech_mpoly_struct * const * poly3,
slong len, const fq_zech_mpoly_ctx_t ctx);
/* GCD ***********************************************************************/
FLINT_DLL int fq_zech_mpoly_gcd(fq_zech_mpoly_t G, const fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int _fq_zech_mpoly_gcd(fq_zech_mpoly_t G, flint_bitcnt_t Gbits,
const fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int fq_zech_mpoly_gcd_cofactors(fq_zech_mpoly_t G,
fq_zech_mpoly_t Abar, fq_zech_mpoly_t Bbar, const fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int _fq_zech_mpoly_gcd_cofactors(
fq_zech_mpoly_t G, flint_bitcnt_t Gbits,
fq_zech_mpoly_t Abar, flint_bitcnt_t Abarbits,
fq_zech_mpoly_t Bbar, flint_bitcnt_t Bbarbits,
const fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int fq_zech_mpoly_gcd_brown(fq_zech_mpoly_t G,
const fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int fq_zech_mpoly_gcd_zippel(fq_zech_mpoly_t G, const fq_zech_mpoly_t A,
const fq_zech_mpoly_t B, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_deflation(fmpz * shift, fmpz * stride,
const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_deflate(fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fmpz * shift, const fmpz * stride, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_inflate(fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
const fmpz * shift, const fmpz * stride, const fq_zech_mpoly_ctx_t ctx);
/* Univariates ***************************************************************/
FLINT_DLL void fq_zech_mpoly_univar_init(fq_zech_mpoly_univar_t A,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_univar_clear(fq_zech_mpoly_univar_t A,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_univar_fit_length(fq_zech_mpoly_univar_t A,
slong length, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_univar_print_pretty(const fq_zech_mpoly_univar_t A,
const char ** x, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_univar_assert_canonical(fq_zech_mpoly_univar_t A,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_to_univar(fq_zech_mpoly_univar_t A,
const fq_zech_mpoly_t B, slong var, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_from_univar_bits(fq_zech_mpoly_t A, flint_bitcnt_t Abits,
const fq_zech_mpoly_univar_t B, slong var, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_from_univar(fq_zech_mpoly_t A,
const fq_zech_mpoly_univar_t B, slong var, const fq_zech_mpoly_ctx_t ctx);
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_univar_swap(fq_zech_mpoly_univar_t A,
fq_zech_mpoly_univar_t B, const fq_zech_mpoly_ctx_t ctx)
{
fq_zech_mpoly_univar_struct t = *A;
*A = *B;
*B = t;
}
FQ_ZECH_MPOLY_INLINE
int fq_zech_mpoly_univar_degree_fits_si(const fq_zech_mpoly_univar_t A,
const fq_zech_mpoly_ctx_t ctx)
{
return A->length == 0 || fmpz_fits_si(A->exps + 0);
}
FQ_ZECH_MPOLY_INLINE
slong fq_zech_mpoly_univar_length(const fq_zech_mpoly_univar_t A,
const fq_zech_mpoly_ctx_t ctx)
{
return A->length;
}
FQ_ZECH_MPOLY_INLINE
slong fq_zech_mpoly_univar_get_term_exp_si(fq_zech_mpoly_univar_t A, slong i,
const fq_zech_mpoly_ctx_t ctx)
{
FLINT_ASSERT((ulong)i < (ulong)A->length);
return fmpz_get_si(A->exps + i);
}
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_univar_get_term_coeff(fq_zech_mpoly_t c,
const fq_zech_mpoly_univar_t A, slong i, const fq_zech_mpoly_ctx_t ctx)
{
FLINT_ASSERT((ulong)i < (ulong)A->length);
fq_zech_mpoly_set(c, A->coeffs + i, ctx);
}
FQ_ZECH_MPOLY_INLINE
void fq_zech_mpoly_univar_swap_term_coeff(fq_zech_mpoly_t c,
fq_zech_mpoly_univar_t A, slong i, const fq_zech_mpoly_ctx_t ctx)
{
FLINT_ASSERT((ulong)i < (ulong)A->length);
fq_zech_mpoly_swap(c, A->coeffs + i, ctx);
}
/******************************************************************************
Internal functions (guaranteed to change without notice)
******************************************************************************/
FLINT_DLL int _fq_zech_mpoly_get_nmod_mpoly(
nmod_mpoly_t s,
const nmod_mpoly_ctx_t sctx,
const fq_zech_mpoly_t t,
const fq_zech_mpoly_ctx_t tctx);
FLINT_DLL void _fq_zech_mpoly_set_nmod_mpoly(
fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t Actx,
const nmod_mpoly_t B,
const nmod_mpoly_ctx_t Bctx);
FLINT_DLL void fq_zech_mpolyl_lead_coeff(
fq_zech_mpoly_t c,
const fq_zech_mpoly_t A,
slong num_vars,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_pow_rmul(fq_zech_mpoly_t A, const fq_zech_mpoly_t B,
ulong k, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL int fq_zech_mpoly_repack_bits_inplace(fq_zech_mpoly_t A,
flint_bitcnt_t Abits, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpoly_ctx_change_modulus(fq_zech_mpoly_ctx_t ctx,
slong deg);
FLINT_DLL void _fq_zech_mpoly_get_fq_nmod_mpoly(
fq_nmod_mpoly_t A,
const fq_nmod_mpoly_ctx_t ctxA,
const fq_zech_mpoly_t B,
const fq_zech_mpoly_ctx_t ctxB);
FLINT_DLL void _fq_zech_mpoly_set_fq_nmod_mpoly(
fq_zech_mpoly_t A,
const fq_zech_mpoly_ctx_t ctxA,
const fq_nmod_mpoly_t B,
const fq_nmod_mpoly_ctx_t ctxB);
/* mpolyu ********************************************************************/
FLINT_DLL int fq_zech_mpolyu_is_canonical(const fq_zech_mpolyu_t poly,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpolyu_init(fq_zech_mpolyu_t A, flint_bitcnt_t bits,
const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpolyu_clear(fq_zech_mpolyu_t A,
const fq_zech_mpoly_ctx_t uctx);
FLINT_DLL void fq_zech_mpolyu_swap(fq_zech_mpolyu_t A, fq_zech_mpolyu_t B);
FLINT_DLL void fq_zech_mpolyu_zero(fq_zech_mpolyu_t A,
const fq_zech_mpoly_ctx_t uctx);
FLINT_DLL int fq_zech_mpolyu_is_one(fq_zech_mpolyu_t A,
const fq_zech_mpoly_ctx_t uctx);
FLINT_DLL void fq_zech_mpolyu_print_pretty(const fq_zech_mpolyu_t poly,
const char ** x, const fq_zech_mpoly_ctx_t ctx);
FLINT_DLL void fq_zech_mpolyu_fit_length(fq_zech_mpolyu_t A, slong length,
const fq_zech_mpoly_ctx_t uctx);
FLINT_DLL void fq_zech_mpolyu_one(fq_zech_mpolyu_t A,
const fq_zech_mpoly_ctx_t uctx);
#ifdef __cplusplus
}
#endif
#endif