pqc/external/flint-2.4.3/fq_poly_templates.h

1136 lines
41 KiB
C

/*=============================================================================
This file is part of FLINT.
FLINT is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
FLINT is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with FLINT; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
=============================================================================*/
/******************************************************************************
Copyright (C) 2012 Andres Goens
Copyright (C) 2012 Sebastian Pancratz
Copyright (C) 2013 Mike Hansen
******************************************************************************/
#ifdef T
#ifdef __cplusplus
extern "C" {
#endif
/* Type definitions *********************************************************/
typedef struct
{
TEMPLATE(T, struct) *coeffs;
slong alloc;
slong length;
}
TEMPLATE(T, poly_struct);
typedef TEMPLATE(T, poly_struct) TEMPLATE(T, poly_t)[1];
/* Memory management ********************************************************/
void
TEMPLATE(T, poly_init)(TEMPLATE(T, poly_t) poly, const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_init2)(TEMPLATE(T, poly_t) poly, slong alloc,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_realloc)(TEMPLATE(T, poly_t) poly, slong alloc,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_truncate)(TEMPLATE(T, poly_t) poly, slong len,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_fit_length)(TEMPLATE(T, poly_t) poly, slong len,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_clear)(TEMPLATE(T, poly_t) poly,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_normalise)(TEMPLATE(T, poly_t) poly,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_normalise2)(TEMPLATE(T, struct) *poly, slong *length,
const TEMPLATE(T, ctx_t) ctx);
static __inline__ void
_TEMPLATE(T, poly_set_length)(TEMPLATE(T, poly_t) poly, slong len,
const TEMPLATE(T, ctx_t) ctx)
{
if (poly->length > len)
{
slong i;
for (i = len; i < poly->length; i++)
TEMPLATE(T, zero)(poly->coeffs + i, ctx);
}
poly->length = len;
}
/* Polynomial parameters ***************************************************/
static __inline__ slong
TEMPLATE(T, poly_length)(const TEMPLATE(T, poly_t) poly,
const TEMPLATE(T, ctx_t) ctx)
{
return poly->length;
}
static __inline__ slong
TEMPLATE(T, poly_degree)(const TEMPLATE(T, poly_t) poly,
const TEMPLATE(T, ctx_t) ctx)
{
return poly->length - 1;
}
static __inline__ TEMPLATE(T, struct) *
TEMPLATE(T, poly_lead)(const TEMPLATE(T, poly_t) poly,
const TEMPLATE(T, ctx_t) ctx)
{
return poly->length > 0 ? poly->coeffs + (poly->length - 1) : NULL;
}
/* Randomisation ***********************************************************/
void
TEMPLATE(T, poly_randtest)(TEMPLATE(T, poly_t) f, flint_rand_t state,
slong len, const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_randtest_not_zero)(TEMPLATE(T, poly_t) f, flint_rand_t state,
slong len, const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_randtest_monic) (TEMPLATE(T, poly_t) f, flint_rand_t state,
slong len, const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_randtest_irreducible) (TEMPLATE(T, poly_t) f,
flint_rand_t state, slong len,
const TEMPLATE(T, ctx_t) ctx);
/* Assignment and basic manipulation ***************************************/
void
_TEMPLATE(T, poly_set)(TEMPLATE(T, struct) *rop, const TEMPLATE(T, struct) *op,
slong len, const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_set)(TEMPLATE(T, poly_t) rop, const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE3(T, poly_set, T)(TEMPLATE(T, poly_t) poly, const TEMPLATE(T, t) c,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_swap)(TEMPLATE(T, poly_t) op1, TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx);
static __inline__ void
_TEMPLATE(T, poly_zero)(TEMPLATE(T, struct) *rop, slong len,
const TEMPLATE(T, ctx_t) ctx)
{
slong i;
for (i = 0; i < len; i++)
TEMPLATE(T, zero)(rop + i, ctx);
}
static __inline__ void
TEMPLATE(T, poly_zero)(TEMPLATE(T, poly_t) poly, const TEMPLATE(T, ctx_t) ctx)
{
_TEMPLATE(T, poly_set_length)(poly, 0, ctx);
}
void
TEMPLATE(T, poly_one)(TEMPLATE(T, poly_t) poly, const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_gen)(TEMPLATE(T, poly_t) f, const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_make_monic)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong length,
const TEMPLATE(T, ctx_t) ctx);
void TEMPLATE(T, poly_make_monic)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_reverse)(TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * poly, slong len, slong n,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_reverse)(TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly, slong n,
const TEMPLATE(T, ctx_t) ctx);
ulong
TEMPLATE(T, poly_deflation)(const TEMPLATE(T, poly_t) input,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_deflate)(TEMPLATE(T, poly_t) result,
const TEMPLATE(T, poly_t) input, ulong deflation,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_inflate)(TEMPLATE(T, poly_t) result,
const TEMPLATE(T, poly_t) input, ulong inflation,
const TEMPLATE(T, ctx_t) ctx);
/* Getting and setting coefficients ****************************************/
void
TEMPLATE(T, poly_get_coeff)(TEMPLATE(T, t) x, const TEMPLATE(T, poly_t) poly,
slong n, const TEMPLATE(T, ctx_t) ctx);
void TEMPLATE(T, poly_set_coeff)(TEMPLATE(T, poly_t) poly, slong n,
const TEMPLATE(T, t) x,
const TEMPLATE(T, ctx_t) ctx);
static __inline__ void
TEMPLATE(T, poly_set_coeff_fmpz)(TEMPLATE(T, poly_t) poly, slong n,
const fmpz_t x, const TEMPLATE(T, ctx_t) ctx)
{
TEMPLATE(T, poly_fit_length)(poly, n + 1, ctx);
TEMPLATE(T, set_fmpz)(poly->coeffs + n, x, ctx);
if (n + 1 > poly->length)
{
_TEMPLATE(T, poly_set_length)(poly, n + 1, ctx);
}
_TEMPLATE(T, poly_normalise)(poly, ctx);
}
static __inline__ int
TEMPLATE(T, poly_is_gen)(const TEMPLATE(T, poly_t) poly,
const TEMPLATE(T, ctx_t) ctx)
{
return ((poly->length == 2) &&
TEMPLATE(T, is_zero)(poly->coeffs, ctx) &&
TEMPLATE(T, is_one)(poly->coeffs + 1, ctx));
}
/* Comparison **************************************************************/
int TEMPLATE(T, poly_equal)(const TEMPLATE(T, poly_t) poly1,
const TEMPLATE(T, poly_t) poly2,
const TEMPLATE(T, ctx_t) ctx);
static __inline__ int
TEMPLATE(T, poly_is_zero)(const TEMPLATE(T, poly_t) poly,
const TEMPLATE(T, ctx_t) ctx)
{
return (poly->length == 0);
}
static __inline__ int
TEMPLATE(T, poly_is_one)(const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, ctx_t) ctx)
{
return (op->length == 1) && (TEMPLATE(T, is_one)(op->coeffs + 0, ctx));
}
static __inline__ int
TEMPLATE(T, poly_is_unit)(const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, ctx_t) ctx)
{
return (op->length == 1) && (!(TEMPLATE(T, is_zero)(op->coeffs + 0, ctx)));
}
static __inline__ int
TEMPLATE3(T, poly_equal, T)(const TEMPLATE(T, poly_t) poly,
const TEMPLATE(T, t) c,
const TEMPLATE(T, ctx_t) ctx)
{
return ((poly->length == 0) && TEMPLATE(T, is_zero)(c, ctx)) ||
((poly->length == 1) && TEMPLATE(T, equal)(poly->coeffs, c, ctx));
}
/* Addition and subtraction ************************************************/
void
_TEMPLATE(T, poly_add)(TEMPLATE(T, struct) *res,
const TEMPLATE(T, struct) *poly1, slong len1,
const TEMPLATE(T, struct) *poly2, slong len2,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_add)(TEMPLATE(T, poly_t) rop, const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_sub)(TEMPLATE(T, struct) *res,
const TEMPLATE(T, struct) *poly1, slong len1,
const TEMPLATE(T, struct) *poly2, slong len2,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_sub)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_neg)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_neg)(TEMPLATE(T, poly_t) rop, const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, ctx_t) ctx);
/* Scalar multiplication and division **************************************/
void
_TEMPLATE3(T, poly_scalar_mul, T)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
const TEMPLATE(T, t) x,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE3(T, poly_scalar_mul, T)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, t) x,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE3(T, poly_scalar_addmul, T)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
const TEMPLATE(T, t) x,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE3(T, poly_scalar_addmul, T)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, t) x,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE3(T, poly_scalar_submul, T)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
const TEMPLATE(T, t) x,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE3(T, poly_scalar_submul, T)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, t) x,
const TEMPLATE(T, ctx_t) ctx);
/* Multiplication **********************************************************/
void
_TEMPLATE(T, poly_mul_classical)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op1, slong len1,
const TEMPLATE(T, struct) *op2, slong len2,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_mul_classical)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_mul_reorder)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op1, slong len1,
const TEMPLATE(T, struct) *op2, slong len2,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_mul_reorder)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_mul_KS)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op1, slong len1,
const TEMPLATE(T, struct) *op2, slong len2,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_mul_KS)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_mul)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op1, slong len1,
const TEMPLATE(T, struct) *op2, slong len2,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_mul)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_mullow_classical)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op1, slong len1,
const TEMPLATE(T, struct) *op2, slong len2,
slong n,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_mullow_classical)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
slong n, const
TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_mullow_KS)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op1, slong len1,
const TEMPLATE(T, struct) *op2, slong len2,
slong n,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_mullow_KS)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
slong n,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_mullow)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op1, slong len1,
const TEMPLATE(T, struct) *op2, slong len2,
slong n,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_mullow)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
slong n,
const TEMPLATE(T, ctx_t) ctx);
void _TEMPLATE(T, poly_mulmod)(TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * poly1, slong len1,
const TEMPLATE(T, struct) * poly2, slong len2,
const TEMPLATE(T, struct) * f, slong lenf,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_mulmod)(TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly1,
const TEMPLATE(T, poly_t) poly2,
const TEMPLATE(T, poly_t) f,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_mulmod_preinv)(TEMPLATE(T, struct) *res,
const TEMPLATE(T, struct) *poly1, slong len1,
const TEMPLATE(T, struct) *poly2, slong len2,
const TEMPLATE(T, struct) *f, slong lenf,
const TEMPLATE(T, struct) *finv, slong lenfinv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_mulmod_preinv)(TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly1,
const TEMPLATE(T, poly_t) poly2,
const TEMPLATE(T, poly_t) f,
const TEMPLATE(T, poly_t) finv,
const TEMPLATE(T, ctx_t) ctx);
/* Squaring ******************************************************************/
void
_TEMPLATE(T, poly_sqr_classical)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_sqr_classical)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_sqr_reorder)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_sqr_reorder)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_sqr_KS)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_sqr_KS)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_sqr)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_sqr)(TEMPLATE(T, poly_t) rop, const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, ctx_t) ctx);
/* Powering ****************************************************************/
void
_TEMPLATE(T, poly_pow)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
ulong e,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_pow)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op,
ulong e,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_powmod_fmpz_binexp)(TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * poly,
const fmpz_t e,
const TEMPLATE(T, struct) * f, slong lenf,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_powmod_fmpz_binexp)(TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly,
const fmpz_t e,
const TEMPLATE(T, poly_t) f,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_powmod_fmpz_binexp_preinv)(
TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * poly,
const fmpz_t e,
const TEMPLATE(T, struct) * f, slong lenf,
const TEMPLATE(T, struct) *finv, slong lenfinv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_powmod_fmpz_binexp_preinv)(
TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly, const fmpz_t e,
const TEMPLATE(T, poly_t) f, const TEMPLATE(T, poly_t) finv,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_powmod_ui_binexp)(
TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * poly,
ulong e,
const TEMPLATE(T, struct) * f, slong lenf,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_powmod_ui_binexp)(
TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly, ulong e,
const TEMPLATE(T, poly_t) f,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_powmod_ui_binexp_preinv)(
TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * poly,
ulong e,
const TEMPLATE(T, struct) * f, slong lenf,
const TEMPLATE(T, struct) * finv, slong lenfinv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_powmod_ui_binexp_preinv)(
TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly,
ulong e,
const TEMPLATE(T, poly_t) f,
const TEMPLATE(T, poly_t) finv,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_powmod_fmpz_sliding_preinv)(
TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * poly,
const fmpz_t e, ulong k,
const TEMPLATE(T, struct) * f, slong lenf,
const TEMPLATE(T, struct) * finv, slong lenfinv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_powmod_fmpz_sliding_preinv)(
TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly,
const fmpz_t e, ulong k,
const TEMPLATE(T, poly_t) f,
const TEMPLATE(T, poly_t) finv,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_powmod_x_fmpz_preinv)(
TEMPLATE(T, struct) * res, const fmpz_t e,
const TEMPLATE(T, struct) * f, slong lenf,
const TEMPLATE(T, struct)* finv, slong lenfinv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_powmod_x_fmpz_preinv)(
TEMPLATE(T, poly_t) res, const fmpz_t e,
const TEMPLATE(T, poly_t) f,
const TEMPLATE(T, poly_t) finv,
const TEMPLATE(T, ctx_t) ctx);
/* Shifting ****************************************************************/
void
_TEMPLATE(T, poly_shift_left)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
slong n,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_shift_left)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op,
slong n,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_shift_right)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
slong n,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_shift_right)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op,
slong n,
const TEMPLATE(T, ctx_t) ctx);
/* Norms *******************************************************************/
slong
_TEMPLATE(T, poly_hamming_weight)(const TEMPLATE(T, struct) *op, slong len,
const TEMPLATE(T, ctx_t) ctx);
slong
TEMPLATE(T, poly_hamming_weight)(const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, ctx_t) ctx);
/* Greatest common divisor *************************************************/
void
TEMPLATE(T, poly_gcd_euclidean)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx);
slong
_TEMPLATE(T, poly_gcd_euclidean)(TEMPLATE(T, struct)* G,
const TEMPLATE(T, struct)* A, slong lenA,
const TEMPLATE(T, struct)* B, slong lenB,
const TEMPLATE(T, t) invB,
const TEMPLATE(T, ctx_t) ctx);
static __inline__ slong
_TEMPLATE(T, poly_gcd)(TEMPLATE(T, struct)* G,
const TEMPLATE(T, struct)* A, slong lenA,
const TEMPLATE(T, struct)* B, slong lenB,
const TEMPLATE(T, t) invB,
const TEMPLATE(T, ctx_t) ctx)
{
return _TEMPLATE(T, poly_gcd_euclidean)(G, A, lenA, B, lenB, invB, ctx);
}
static __inline__ void
TEMPLATE(T, poly_gcd)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx)
{
TEMPLATE(T, poly_gcd_euclidean)(rop, op1, op2, ctx);
}
/* Euclidean division ******************************************************/
ulong
TEMPLATE(T, poly_remove)(TEMPLATE(T, poly_t) f,
const TEMPLATE(T, poly_t) g,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_div_basecase)(TEMPLATE(T, struct) *Q, TEMPLATE(T, struct) *R,
const TEMPLATE(T, struct) *A, slong lenA,
const TEMPLATE(T, struct) *B, slong lenB,
const TEMPLATE(T, t) invB,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_div_basecase)(TEMPLATE(T, poly_t) Q,
const TEMPLATE(T, poly_t) A,
const TEMPLATE(T, poly_t) B,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_divrem_basecase)(TEMPLATE(T, struct) *Q,
TEMPLATE(T, struct) *R,
const TEMPLATE(T, struct) *A, slong lenA,
const TEMPLATE(T, struct) *B, slong lenB,
const TEMPLATE(T, t) invB,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_divrem_basecase)(TEMPLATE(T, poly_t) Q, TEMPLATE(T, poly_t) R,
const TEMPLATE(T, poly_t) A,
const TEMPLATE(T, poly_t) B,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_divrem_divconquer_recursive)(
TEMPLATE(T, struct) * Q, TEMPLATE(T, struct) * BQ,
TEMPLATE(T, struct) * W,
const TEMPLATE(T, struct) * A,
const TEMPLATE(T, struct) * B, slong lenB,
const TEMPLATE(T, t) invB,
const TEMPLATE(T, ctx_t) ctx);
void _TEMPLATE(T, poly_divrem_divconquer)(
TEMPLATE(T, struct) *Q, TEMPLATE(T, struct) *R,
const TEMPLATE(T, struct) *A, slong lenA,
const TEMPLATE(T, struct) *B, slong lenB,
const TEMPLATE(T, t) invB,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_divrem_divconquer)(TEMPLATE(T, poly_t) Q,
TEMPLATE(T, poly_t) R,
const TEMPLATE(T, poly_t) A,
const TEMPLATE(T, poly_t) B,
const TEMPLATE(T, ctx_t) ctx);
static __inline__ void
_TEMPLATE(T, poly_divrem)(TEMPLATE(T, struct) *Q, TEMPLATE(T, struct) *R,
const TEMPLATE(T, struct) *A, slong lenA,
const TEMPLATE(T, struct) *B, slong lenB,
const TEMPLATE(T, t) invB,
const TEMPLATE(T, ctx_t) ctx)
{
_TEMPLATE(T, poly_divrem_divconquer)(Q, R, A, lenA, B, lenB, invB, ctx);
}
static __inline__ void
TEMPLATE(T, poly_divrem)(TEMPLATE(T, poly_t) Q, TEMPLATE(T, poly_t) R,
const TEMPLATE(T, poly_t) A,
const TEMPLATE(T, poly_t) B,
const TEMPLATE(T, ctx_t) ctx)
{
TEMPLATE(T, poly_divrem_divconquer)(Q, R, A, B, ctx);
}
static __inline__ void
_TEMPLATE(T, poly_rem)(TEMPLATE(T, struct) *R,
const TEMPLATE(T, struct) *A, slong lenA,
const TEMPLATE(T, struct) *B, slong lenB,
const TEMPLATE(T, t) invB,
const TEMPLATE(T, ctx_t) ctx)
{
TEMPLATE(T, struct) *Q = _TEMPLATE(T, vec_init)(lenA - lenB + 1, ctx);
if (lenA < lenB)
{
_TEMPLATE(T, vec_set)(R, A, lenA, ctx);
_TEMPLATE(T, vec_zero)(R + lenA, lenB - 1 - lenA, ctx);
}
else
{
TEMPLATE(T, struct) *T = _TEMPLATE(T, vec_init)(lenA, ctx);
_TEMPLATE(T, poly_divrem_divconquer)(Q, T, A, lenA, B, lenB, invB, ctx);
_TEMPLATE(T, vec_set)(R, T, lenB - 1, ctx);
_TEMPLATE(T, vec_clear)(T, lenA, ctx);
}
_TEMPLATE(T, vec_clear)(Q, lenA - lenB + 1, ctx);
}
static __inline__ void
TEMPLATE(T, poly_rem)(TEMPLATE(T, poly_t) R,
const TEMPLATE(T, poly_t) A, const TEMPLATE(T, poly_t) B,
const TEMPLATE(T, ctx_t) ctx)
{
TEMPLATE(T, poly_t) Q;
TEMPLATE(T, poly_init)(Q, ctx);
TEMPLATE(T, poly_divrem)(Q, R, A, B, ctx);
TEMPLATE(T, poly_clear)(Q, ctx);
}
void
_TEMPLATE(T, poly_inv_series_newton)(TEMPLATE(T, struct) * Qinv,
const TEMPLATE(T, struct) * Q, slong n,
const TEMPLATE(T, t) cinv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_inv_series_newton)(TEMPLATE(T, poly_t) Qinv,
const TEMPLATE(T, poly_t) Q, slong n,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_div_newton_n_preinv) (
TEMPLATE(T, struct) *Q,
const TEMPLATE(T, struct) *A, slong lenA,
const TEMPLATE(T, struct)* B, slong lenB,
const TEMPLATE(T, struct)* Binv, slong lenBinv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_div_newton_n_preinv) (TEMPLATE(T, poly_t) Q,
const TEMPLATE(T, poly_t) A,
const TEMPLATE(T, poly_t) B,
const TEMPLATE(T, poly_t) Binv,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_divrem_newton_n_preinv) (
TEMPLATE(T, struct)* Q, TEMPLATE(T, struct)* R,
const TEMPLATE(T, struct)* A, slong lenA,
const TEMPLATE(T, struct)* B, slong lenB,
const TEMPLATE(T, struct)* Binv, slong lenBinv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_divrem_newton_n_preinv)(
TEMPLATE(T, poly_t) Q, TEMPLATE(T, poly_t) R,
const TEMPLATE(T, poly_t) A, const TEMPLATE(T, poly_t) B,
const TEMPLATE(T, poly_t) Binv, const TEMPLATE(T, ctx_t) ctx);
/* Divisibility testing ***************************************************/
int
_TEMPLATE(T, poly_divides)(TEMPLATE(T, struct) *Q,
const TEMPLATE(T, struct) *A, slong lenA,
const TEMPLATE(T, struct) *B, slong lenB,
const TEMPLATE(T, t) invB,
const TEMPLATE(T, ctx_t) ctx);
int
TEMPLATE(T, poly_divides)(TEMPLATE(T, poly_t) Q,
const TEMPLATE(T, poly_t) A, const TEMPLATE(T, poly_t) B,
const TEMPLATE(T, ctx_t) ctx);
/* Derivative **************************************************************/
void
_TEMPLATE(T, poly_derivative)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op, slong len,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_derivative)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op,
const TEMPLATE(T, ctx_t) ctx);
/* Evaluation **************************************************************/
void _TEMPLATE3(T, poly_evaluate, T)(TEMPLATE(T, t) rop,
const TEMPLATE(T, struct) *op, slong len,
const TEMPLATE(T, t) a,
const TEMPLATE(T, ctx_t) ctx);
void TEMPLATE3(T, poly_evaluate, T)(TEMPLATE(T, t) res,
const TEMPLATE(T, poly_t) f,
const TEMPLATE(T, t) a,
const TEMPLATE(T, ctx_t) ctx);
/* Composition *************************************************************/
void
_TEMPLATE(T, poly_compose_divconquer)(
TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op1, slong len1,
const TEMPLATE(T, struct) *op2, slong len2,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_compose_divconquer)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_compose_horner)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op1, slong len1,
const TEMPLATE(T, struct) *op2, slong len2,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_compose_horner)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_compose)(TEMPLATE(T, struct) *rop,
const TEMPLATE(T, struct) *op1, slong len1,
const TEMPLATE(T, struct) *op2, slong len2,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_compose)(TEMPLATE(T, poly_t) rop,
const TEMPLATE(T, poly_t) op1,
const TEMPLATE(T, poly_t) op2,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_compose_mod)(TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * f, slong lenf,
const TEMPLATE(T, struct) * g,
const TEMPLATE(T, struct) * h, slong lenh,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_compose_mod)(TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly1,
const TEMPLATE(T, poly_t) poly2,
const TEMPLATE(T, poly_t) poly3,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_compose_mod_preinv)(
TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * f, slong lenf,
const TEMPLATE(T, struct) * g,
const TEMPLATE(T, struct) * h, slong lenh,
const TEMPLATE(T, struct) * hinv, slong lenhinv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_compose_mod_preinv)(TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly1,
const TEMPLATE(T, poly_t) poly2,
const TEMPLATE(T, poly_t) poly3,
const TEMPLATE(T, poly_t) poly3inv,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_compose_mod_horner)(
TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * f, slong lenf,
const TEMPLATE(T, struct) * g,
const TEMPLATE(T, struct) * h, slong lenh,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_compose_mod_horner)(TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly1,
const TEMPLATE(T, poly_t) poly2,
const TEMPLATE(T, poly_t) poly3,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_compose_mod_horner_preinv)(
TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * f, slong lenf,
const TEMPLATE(T, struct) * g,
const TEMPLATE(T, struct) * h, slong lenh,
const TEMPLATE(T, struct) * hinv, slong lenhinv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_compose_mod_horner_preinv)(TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly1,
const TEMPLATE(T, poly_t) poly2,
const TEMPLATE(T, poly_t) poly3,
const TEMPLATE(T, poly_t) poly3inv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_compose_mod_brent_kung)(TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly1,
const TEMPLATE(T, poly_t) poly2,
const TEMPLATE(T, poly_t) poly3,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_compose_mod_brent_kung)(
TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * poly1, slong len1,
const TEMPLATE(T, struct) * poly2,
const TEMPLATE(T, struct) * poly3, slong len3,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_compose_mod_brent_kung_preinv)(
TEMPLATE(T, struct) * res,
const TEMPLATE(T, struct) * poly1, slong len1,
const TEMPLATE(T, struct) * poly2,
const TEMPLATE(T, struct) * poly3, slong len3,
const TEMPLATE(T, struct) * poly3inv, slong len3inv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_compose_mod_brent_kung_preinv)(
TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly1,
const TEMPLATE(T, poly_t) poly2,
const TEMPLATE(T, poly_t) poly3,
const TEMPLATE(T, poly_t) poly3inv,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_reduce_matrix_mod_poly) (TEMPLATE(T, mat_t) A,
const TEMPLATE(T, mat_t) B,
const TEMPLATE(T, poly_t) f,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_precompute_matrix) (
TEMPLATE(T, mat_t A),
const TEMPLATE(T, struct)* poly1,
const TEMPLATE(T, struct)* poly2, slong len2,
const TEMPLATE(T, struct)* poly2inv, slong len2inv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_precompute_matrix) (TEMPLATE(T, mat_t A),
const TEMPLATE(T, poly_t) poly1,
const TEMPLATE(T, poly_t) poly2,
const TEMPLATE(T, poly_t) poly2inv,
const TEMPLATE(T, ctx_t) ctx);
void
_TEMPLATE(T, poly_compose_mod_brent_kung_precomp_preinv)(
TEMPLATE(T, struct)* res,
const TEMPLATE(T, struct)* poly1, slong len1,
const TEMPLATE(T, mat_t) A,
const TEMPLATE(T, struct)* poly3, slong len3,
const TEMPLATE(T, struct)* poly3inv, slong len3inv,
const TEMPLATE(T, ctx_t) ctx);
void
TEMPLATE(T, poly_compose_mod_brent_kung_precomp_preinv)(
TEMPLATE(T, poly_t) res,
const TEMPLATE(T, poly_t) poly1,
const TEMPLATE(T, mat_t) A,
const TEMPLATE(T, poly_t) poly3,
const TEMPLATE(T, poly_t) poly3inv,
const TEMPLATE(T, ctx_t) ctx);
/* Input and output ********************************************************/
int
_TEMPLATE(T, poly_fprint_pretty)(FILE *file,
const TEMPLATE(T, struct) *poly, slong len,
const char *x,
const TEMPLATE(T, ctx_t) ctx);
int
TEMPLATE(T, poly_fprint_pretty)(FILE * file,
const TEMPLATE(T, poly_t) poly,
const char *x,
const TEMPLATE(T, ctx_t) ctx);
int
_TEMPLATE(T, poly_fprint)(FILE * file,
const TEMPLATE(T, struct) *poly, slong len,
const TEMPLATE(T, ctx_t) ctx);
int
TEMPLATE(T, poly_fprint)(FILE * file,
const TEMPLATE(T, poly_t) poly,
const TEMPLATE(T, ctx_t) ctx);
static __inline__ int
_TEMPLATE(T, poly_print)(const TEMPLATE(T, struct) *poly, slong len,
const TEMPLATE(T, ctx_t) ctx)
{
return _TEMPLATE(T, poly_fprint)(stdout, poly, len, ctx);
}
static __inline__ int
TEMPLATE(T, poly_print)(const TEMPLATE(T, poly_t) poly,
const TEMPLATE(T, ctx_t) ctx)
{
return TEMPLATE(T, poly_fprint)(stdout, poly, ctx);
}
static __inline__ int
_TEMPLATE(T, poly_print_pretty)(const TEMPLATE(T, struct) *poly, slong len,
const char *x, const TEMPLATE(T, ctx_t) ctx)
{
return _TEMPLATE(T, poly_fprint_pretty)(stdout, poly, len, x, ctx);
}
static __inline__ int
TEMPLATE(T, poly_print_pretty)(const TEMPLATE(T, poly_t) poly,
const char *x,
const TEMPLATE(T, ctx_t) ctx)
{
return TEMPLATE(T, poly_fprint_pretty)(stdout, poly, x, ctx);
}
char *
_TEMPLATE(T, poly_get_str_pretty)(const TEMPLATE(T, struct) * poly, slong len,
const char *x,
const TEMPLATE(T, ctx_t) ctx);
char *
TEMPLATE(T, poly_get_str_pretty)(const TEMPLATE(T, poly_t) poly,
const char *x,
const TEMPLATE(T, ctx_t) ctx);
char *
_TEMPLATE(T, poly_get_str)(const TEMPLATE(T, struct) * poly, slong len,
const TEMPLATE(T, ctx_t) ctx);
char *
TEMPLATE(T, poly_get_str)(const TEMPLATE(T, poly_t) poly,
const TEMPLATE(T, ctx_t) ctx);
#ifdef __cplusplus
}
#endif
#endif