/*
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 FMPZ_MOD_MPOLY_FACTOR_H
#define FMPZ_MOD_MPOLY_FACTOR_H
#ifdef FMPZ_MOD_MPOLY_FACTOR_INLINES_C
#define FMPZ_MOD_MPOLY_FACTOR_INLINE FLINT_DLL
#else
#define FMPZ_MOD_MPOLY_FACTOR_INLINE static __inline__
#endif
#undef ulong
#define ulong ulongxx /* interferes with system includes */
#include
#undef ulong
#include
#define ulong mp_limb_t
#include "n_poly.h"
#include "nmod_mpoly_factor.h"
#include "fmpz_mod_mpoly.h"
#ifdef __cplusplus
extern "C" {
#endif
/* type definitions **********************************************************/
typedef struct {
fmpz_t constant;
fmpz_mod_mpoly_struct * poly;
fmpz * exp;
slong num;
slong alloc;
} fmpz_mod_mpoly_factor_struct;
typedef fmpz_mod_mpoly_factor_struct fmpz_mod_mpoly_factor_t[1];
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_mpoly_factor_init(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_ctx_t ctx)
{
fmpz_init_set_ui(f->constant, 1);
f->poly = NULL;
f->exp = NULL;
f->num = 0;
f->alloc = 0;
}
FLINT_DLL void fmpz_mod_mpoly_factor_init2(fmpz_mod_mpoly_factor_t f,
slong alloc, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_factor_realloc(fmpz_mod_mpoly_factor_t f,
slong alloc, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_factor_fit_length(fmpz_mod_mpoly_factor_t f,
slong len, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_factor_clear(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_ctx_t ctx);
FMPZ_MOD_MPOLY_FACTOR_INLINE
slong fmpz_mod_mpoly_factor_length(const fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_ctx_t ctx)
{
return f->num;
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_mpoly_factor_get_constant_fmpz(fmpz_t c,
const fmpz_mod_mpoly_factor_t f, const fmpz_mod_mpoly_ctx_t ctx)
{
fmpz_set(c, f->constant);
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_mpoly_factor_get_base(fmpz_mod_mpoly_t p,
const fmpz_mod_mpoly_factor_t f, slong i, const fmpz_mod_mpoly_ctx_t ctx)
{
FLINT_ASSERT(i < (ulong) f->num);
fmpz_mod_mpoly_set(p, f->poly + i, ctx);
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_mpoly_factor_swap_base(fmpz_mod_mpoly_t p,
fmpz_mod_mpoly_factor_t f, slong i, const fmpz_mod_mpoly_ctx_t ctx)
{
FLINT_ASSERT(i < (ulong) f->num);
fmpz_mod_mpoly_swap(p, f->poly + i, ctx);
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
slong fmpz_mod_mpoly_factor_get_exp_si(fmpz_mod_mpoly_factor_t f,
slong i, const fmpz_mod_mpoly_ctx_t ctx)
{
FLINT_ASSERT(i < (ulong) f->num);
return fmpz_get_si(f->exp + i);
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_mpoly_factor_swap(fmpz_mod_mpoly_factor_t f,
fmpz_mod_mpoly_factor_t g, const fmpz_mod_mpoly_ctx_t ctx)
{
fmpz_mod_mpoly_factor_struct t = *f;
*f = *g;
*g = t;
}
FLINT_DLL void fmpz_mod_mpoly_factor_set(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_factor_t g, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_factor_print_pretty(const fmpz_mod_mpoly_factor_t f,
const char ** vars, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpoly_factor_content(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpoly_factor_squarefree(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpoly_factor(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_factor_sort(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpoly_factor_cmp(const fmpz_mod_mpoly_factor_t A,
const fmpz_mod_mpoly_factor_t B, const fmpz_mod_mpoly_ctx_t ctx);
/******************************************************************************
Internal functions (guaranteed to change without notice)
******************************************************************************/
/* fmpz_mod_poly extras ******************************************************/
FMPZ_MOD_MPOLY_FACTOR_INLINE
slong _fmpz_mod_poly_degree(const fmpz_mod_poly_t a)
{
return a->length - 1;
}
FLINT_DLL void fmpz_mod_poly_scalar_addmul_fmpz_mod(fmpz_mod_poly_t A,
const fmpz_mod_poly_t B, const fmpz_mod_poly_t C, const fmpz_t d0,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_poly_addmul_linear(fmpz_mod_poly_t A,
const fmpz_mod_poly_t B, const fmpz_mod_poly_t C,
const fmpz_t d1, const fmpz_t d0, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_poly_shift_left_scalar_addmul_fmpz_mod(
fmpz_mod_poly_t A, slong k, const fmpz_t c, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_poly_eval_pow(fmpz_t eval, const fmpz_mod_poly_t P,
fmpz_mod_poly_t alphapow, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_poly_eval2_pow(fmpz_t evalp, fmpz_t evalm,
const fmpz_mod_poly_t P, fmpz_mod_poly_t alphapow,
const fmpz_mod_ctx_t ctx);
/* fmpz_mod_mat extras *******************************************************/
FLINT_DLL int fmpz_mod_mat_is_reduced(const fmpz_mod_mat_t N);
FLINT_DLL void fmpz_mod_mat_init_nullspace_tr(fmpz_mod_mat_t X,
fmpz_mod_mat_t tmp, const fmpz_mod_ctx_t ctx);
/*****************************************************************************/
typedef struct
{
fmpz_mod_poly_struct * coeffs;
slong alloc;
slong length;
} fmpz_mod_bpoly_struct;
typedef fmpz_mod_bpoly_struct fmpz_mod_bpoly_t[1];
typedef struct
{
fmpz_mod_bpoly_struct * coeffs;
slong alloc;
slong length;
} fmpz_mod_tpoly_struct;
typedef fmpz_mod_tpoly_struct fmpz_mod_tpoly_t[1];
typedef struct
{
ulong * exps;
fmpz * coeffs;
slong length;
slong alloc;
} fmpz_mod_polyu_struct;
typedef fmpz_mod_polyu_struct fmpz_mod_polyu_t[1];
typedef struct
{
fmpz_mod_poly_struct * coeffs;
ulong * exps;
slong alloc;
slong length;
} fmpz_mod_polyun_struct;
typedef fmpz_mod_polyun_struct fmpz_mod_polyun_t[1];
/*
fmpz_mod_mpolyu_t
sparse univariates with fmpz_mod_mpoly_t coefficients
with uniform bits and LEX ordering
*/
typedef struct
{
fmpz_mod_mpoly_struct * coeffs;
ulong * exps;
slong alloc;
slong length;
flint_bitcnt_t bits; /* default bits to construct coeffs */
} fmpz_mod_mpolyu_struct;
typedef fmpz_mod_mpolyu_struct fmpz_mod_mpolyu_t[1];
/*
fmpz_mod_mpolyn_t
sparse multivariates with fmpz_mod_poly_t coefficients
with LEX ordering
*/
typedef struct
{
fmpz_mod_poly_struct * coeffs;
ulong * exps;
slong alloc;
slong length;
slong bits;
} fmpz_mod_mpolyn_struct;
typedef fmpz_mod_mpolyn_struct fmpz_mod_mpolyn_t[1];
/*****************************************************************************/
FLINT_DLL int fmpz_mod_mpoly_factor_separable(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx, int sep);
FLINT_DLL int fmpz_mod_mpoly_factor_expand(fmpz_mod_mpoly_t A,
const fmpz_mod_mpoly_factor_t f, const fmpz_mod_mpoly_ctx_t ctx);
FMPZ_MOD_MPOLY_FACTOR_INLINE
int fmpz_mod_mpoly_factor_matches(const fmpz_mod_mpoly_t a,
const fmpz_mod_mpoly_factor_t f, const fmpz_mod_mpoly_ctx_t ctx)
{
int matches;
fmpz_mod_mpoly_t t;
fmpz_mod_mpoly_init(t, ctx);
fmpz_mod_mpoly_factor_expand(t, f, ctx);
matches = fmpz_mod_mpoly_equal(t, a, ctx);
fmpz_mod_mpoly_clear(t, ctx);
return matches;
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_mpoly_factor_append_fmpz_swap(fmpz_mod_mpoly_factor_t f,
fmpz_mod_mpoly_t A, const fmpz_t e, const fmpz_mod_mpoly_ctx_t ctx)
{
slong i = f->num;
fmpz_mod_mpoly_factor_fit_length(f, i + 1, ctx);
fmpz_mod_mpoly_swap(f->poly + i, A, ctx);
fmpz_set(f->exp + i, e);
f->num = i + 1;
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_mpoly_factor_one(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_ctx_t ctx)
{
fmpz_one(f->constant);
f->num = 0;
}
FLINT_DLL void _fmpz_mod_mpoly_get_lead0(
fmpz_mod_mpoly_t c,
const fmpz_mod_mpoly_t A,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void _fmpz_mod_mpoly_set_lead0(
fmpz_mod_mpoly_t A,
const fmpz_mod_mpoly_t B,
const fmpz_mod_mpoly_t c,
const fmpz_mod_mpoly_ctx_t ctx);
/*****************************************************************************/
void _fmpz_mod_mpoly_factor_set_nmod_mpoly_factor(
fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_ctx_t ctx,
const nmod_mpoly_factor_t nf,
const nmod_mpoly_ctx_t nctx);
/* stack *********************************************************************/
typedef struct
{
fmpz_mod_poly_struct ** array;
slong alloc;
slong top;
} fmpz_mod_poly_stack_struct;
typedef fmpz_mod_poly_stack_struct fmpz_mod_poly_stack_t[1];
typedef struct
{
fmpz_mod_bpoly_struct ** array;
slong alloc;
slong top;
} fmpz_mod_bpoly_stack_struct;
typedef fmpz_mod_bpoly_stack_struct fmpz_mod_bpoly_stack_t[1];
typedef struct
{
fmpz_mod_polyun_struct ** array;
slong alloc;
slong top;
} fmpz_mod_polyun_stack_struct;
typedef fmpz_mod_polyun_stack_struct fmpz_mod_polyun_stack_t[1];
typedef struct
{
fmpz_mod_mpolyn_struct ** array;
slong alloc;
slong top;
flint_bitcnt_t bits;
} fmpz_mod_mpolyn_stack_struct;
typedef fmpz_mod_mpolyn_stack_struct fmpz_mod_mpolyn_stack_t[1];
typedef struct {
fmpz_mod_poly_stack_t poly_stack;
fmpz_mod_bpoly_stack_t bpoly_stack;
} fmpz_mod_poly_bpoly_stack_struct;
typedef fmpz_mod_poly_bpoly_stack_struct fmpz_mod_poly_bpoly_stack_t[1];
typedef struct {
fmpz_mod_poly_stack_t poly_stack;
fmpz_mod_polyun_stack_t polyun_stack;
} fmpz_mod_poly_polyun_stack_struct;
typedef fmpz_mod_poly_polyun_stack_struct fmpz_mod_poly_polyun_stack_t[1];
typedef struct {
fmpz_mod_poly_stack_t poly_stack;
fmpz_mod_polyun_stack_t polyun_stack;
fmpz_mod_mpolyn_stack_t mpolyn_stack;
} fmpz_mod_poly_polyun_mpolyn_stack_struct;
typedef fmpz_mod_poly_polyun_mpolyn_stack_struct
fmpz_mod_poly_polyun_mpolyn_stack_t[1];
FLINT_DLL void fmpz_mod_poly_stack_init(fmpz_mod_poly_stack_t S);
FLINT_DLL void fmpz_mod_poly_stack_clear(fmpz_mod_poly_stack_t S);
FLINT_DLL fmpz_mod_poly_struct ** fmpz_mod_poly_stack_fit_request(
fmpz_mod_poly_stack_t S, slong k);
FMPZ_MOD_MPOLY_INLINE
fmpz_mod_poly_struct ** fmpz_mod_poly_stack_request(
fmpz_mod_poly_stack_t S, slong k)
{
fmpz_mod_poly_struct ** poly_top;
poly_top = fmpz_mod_poly_stack_fit_request(S, k);
S->top += k;
return poly_top;
}
FMPZ_MOD_MPOLY_INLINE
fmpz_mod_poly_struct * fmpz_mod_poly_stack_take_top(fmpz_mod_poly_stack_t S)
{
/* assume the request for 1 has already been fitted */
fmpz_mod_poly_struct ** poly_top;
FLINT_ASSERT(S->top + 1 <= S->alloc);
poly_top = S->array + S->top;
S->top += 1;
return poly_top[0];
}
FMPZ_MOD_MPOLY_INLINE
void fmpz_mod_poly_stack_give_back(fmpz_mod_poly_stack_t S, slong k)
{
FLINT_ASSERT(S->top >= k);
S->top -= k;
}
FMPZ_MOD_MPOLY_INLINE
slong fmpz_mod_poly_stack_size(const fmpz_mod_poly_stack_t S)
{
return S->top;
}
FLINT_DLL void fmpz_mod_bpoly_stack_init(fmpz_mod_bpoly_stack_t S);
FLINT_DLL void fmpz_mod_bpoly_stack_clear(fmpz_mod_bpoly_stack_t S);
FLINT_DLL fmpz_mod_bpoly_struct ** fmpz_mod_bpoly_stack_fit_request(
fmpz_mod_bpoly_stack_t S, slong k);
FMPZ_MOD_MPOLY_INLINE
fmpz_mod_bpoly_struct ** fmpz_mod_bpoly_stack_request(
fmpz_mod_bpoly_stack_t S, slong k)
{
fmpz_mod_bpoly_struct ** bpoly_top;
bpoly_top = fmpz_mod_bpoly_stack_fit_request(S, k);
S->top += k;
return bpoly_top;
}
FMPZ_MOD_MPOLY_INLINE
fmpz_mod_bpoly_struct * fmpz_mod_bpoly_stack_take_top(fmpz_mod_bpoly_stack_t S)
{
/* assume the request for 1 has already been fitted */
fmpz_mod_bpoly_struct ** bpoly_top;
FLINT_ASSERT(S->top + 1 <= S->alloc);
bpoly_top = S->array + S->top;
S->top += 1;
return bpoly_top[0];
}
FMPZ_MOD_MPOLY_INLINE
void fmpz_mod_bpoly_stack_give_back(fmpz_mod_bpoly_stack_t S, slong k)
{
FLINT_ASSERT(S->top >= k);
S->top -= k;
}
FMPZ_MOD_MPOLY_INLINE
slong fmpz_mod_bpoly_stack_size(const fmpz_mod_bpoly_stack_t S)
{
return S->top;
}
FLINT_DLL void fmpz_mod_polyun_stack_init(fmpz_mod_polyun_stack_t S);
FLINT_DLL void fmpz_mod_polyun_stack_clear(fmpz_mod_polyun_stack_t S);
FLINT_DLL fmpz_mod_polyun_struct ** fmpz_mod_polyun_stack_fit_request(
fmpz_mod_polyun_stack_t S, slong k);
FMPZ_MOD_MPOLY_INLINE
fmpz_mod_polyun_struct ** fmpz_mod_polyun_stack_request(
fmpz_mod_polyun_stack_t S, slong k)
{
fmpz_mod_polyun_struct ** polyun_top;
polyun_top = fmpz_mod_polyun_stack_fit_request(S, k);
S->top += k;
return polyun_top;
}
FMPZ_MOD_MPOLY_INLINE
fmpz_mod_polyun_struct * fmpz_mod_polyun_stack_take_top(fmpz_mod_polyun_stack_t S)
{
/* assume the request for 1 has already been fitted */
fmpz_mod_polyun_struct ** polyun_top;
FLINT_ASSERT(S->top + 1 <= S->alloc);
polyun_top = S->array + S->top;
S->top += 1;
return polyun_top[0];
}
FMPZ_MOD_MPOLY_INLINE
void fmpz_mod_polyun_stack_give_back(fmpz_mod_polyun_stack_t S, slong k)
{
FLINT_ASSERT(S->top >= k);
S->top -= k;
}
FMPZ_MOD_MPOLY_INLINE
slong fmpz_mod_polyun_stack_size(const fmpz_mod_polyun_stack_t S)
{
return S->top;
}
FLINT_DLL void fmpz_mod_mpolyn_stack_init(fmpz_mod_mpolyn_stack_t S,
flint_bitcnt_t bits, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyn_stack_clear(fmpz_mod_mpolyn_stack_t S,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL fmpz_mod_mpolyn_struct ** fmpz_mod_mpolyn_stack_fit_request(
fmpz_mod_mpolyn_stack_t S, slong k, const fmpz_mod_mpoly_ctx_t ctx);
FMPZ_MOD_MPOLY_INLINE
fmpz_mod_mpolyn_struct ** fmpz_mod_mpolyn_stack_request(
fmpz_mod_mpolyn_stack_t S, slong k, const fmpz_mod_mpoly_ctx_t ctx)
{
fmpz_mod_mpolyn_struct ** mpolyn_top;
mpolyn_top = fmpz_mod_mpolyn_stack_fit_request(S, k, ctx);
S->top += k;
return mpolyn_top;
}
FMPZ_MOD_MPOLY_INLINE
fmpz_mod_mpolyn_struct * fmpz_mod_mpolyn_stack_take_top(fmpz_mod_mpolyn_stack_t S)
{
/* assume the request for 1 has already been fitted */
fmpz_mod_mpolyn_struct ** mpolyn_top;
FLINT_ASSERT(S->top + 1 <= S->alloc);
mpolyn_top = S->array + S->top;
S->top += 1;
return mpolyn_top[0];
}
FMPZ_MOD_MPOLY_INLINE
void fmpz_mod_mpolyn_stack_give_back(fmpz_mod_mpolyn_stack_t S, slong k)
{
FLINT_ASSERT(S->top >= k);
S->top -= k;
}
FMPZ_MOD_MPOLY_INLINE
slong fmpz_mod_mpolyn_stack_size(const fmpz_mod_mpolyn_stack_t S)
{
return S->top;
}
/* poly_vec ******************************************************************/
FLINT_DLL slong _fmpz_mod_poly_vec_max_degree(const fmpz_mod_poly_struct * A,
slong Alen, const fmpz_mod_ctx_t ctx);
FLINT_DLL void _fmpz_mod_poly_vec_content(fmpz_mod_poly_t g,
const fmpz_mod_poly_struct * A, slong Alen, const fmpz_mod_ctx_t ctx);
FLINT_DLL void _fmpz_mod_poly_vec_remove_content(fmpz_mod_poly_t g,
fmpz_mod_poly_struct * A, slong Alen, const fmpz_mod_ctx_t ctx);
FLINT_DLL void _fmpz_mod_poly_vec_mul_poly(fmpz_mod_poly_struct * A,
slong Alen, const fmpz_mod_poly_t g, const fmpz_mod_ctx_t ctx);
FLINT_DLL void _fmpz_mod_poly_vec_divexact_poly(fmpz_mod_poly_struct * A,
slong Alen, const fmpz_mod_poly_t g, const fmpz_mod_ctx_t ctx);
FLINT_DLL void _fmpz_mod_poly_vec_mul_fmpz_mod(fmpz_mod_poly_struct * A,
slong Alen, const fmpz_t g, const fmpz_mod_ctx_t ctx);
/* polyun ********************************************************************/
FMPZ_MOD_MPOLY_FACTOR_INLINE
ulong fmpz_mod_polyu1n_bidegree(const fmpz_mod_polyun_t A)
{
ulong x, y;
FLINT_ASSERT(A->length > 0);
x = A->exps[0];
y = A->coeffs[0].length - 1;
return (x << (FLINT_BITS/2)) + y;
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
const fmpz * fmpz_mod_polyun_leadcoeff(const fmpz_mod_polyun_t A)
{
FLINT_ASSERT(A->length > 0);
FLINT_ASSERT(A->coeffs[0].length > 0);
return A->coeffs[0].coeffs + A->coeffs[0].length - 1;
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_polyun_swap(fmpz_mod_polyun_t A, fmpz_mod_polyun_t B)
{
fmpz_mod_polyun_struct t = *A;
*A = *B;
*B = t;
}
FLINT_DLL int fmpz_mod_polyun_is_canonical(const fmpz_mod_polyun_t A,
const fmpz_mod_ctx_t ctx);
FMPZ_MOD_MPOLY_INLINE
void fmpz_mod_polyun_init(fmpz_mod_polyun_t A, const fmpz_mod_ctx_t ctx)
{
A->length = 0;
A->alloc = 0;
A->coeffs = NULL;
A->exps = NULL;
}
FLINT_DLL void fmpz_mod_polyun_clear(fmpz_mod_polyun_t A,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_polyun_realloc(fmpz_mod_polyun_t A,
slong len, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_polyu2n_print_pretty(const fmpz_mod_polyun_t A,
const char * var0, const char * var1, const char * varlast,
const fmpz_mod_ctx_t ctx);
FLINT_DLL int fmpz_mod_polyun_equal(fmpz_mod_polyun_t A,
const fmpz_mod_polyun_t B, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_polyun_set(fmpz_mod_polyun_t A,
const fmpz_mod_polyun_t B, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_polyu3n_print_pretty( const fmpz_mod_polyun_t A,
const char * var0, const char * var1, const char * var2,
const char * varlast, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_polyu1n_print_pretty(const fmpz_mod_polyun_t A,
const char * var0, const char * varlast, const fmpz_mod_ctx_t ctx);
FMPZ_MOD_MPOLY_INLINE
void fmpz_mod_polyun_fit_length(fmpz_mod_polyun_t A, slong len,
const fmpz_mod_ctx_t ctx)
{
if (len > A->alloc)
fmpz_mod_polyun_realloc(A, len, ctx);
}
FLINT_DLL void fmpz_mod_polyun_one(fmpz_mod_polyun_t A, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_get_polyu1n(fmpz_mod_polyun_t A,
const fmpz_mod_mpoly_t B, slong varx, slong vary,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_set_polyu1n(fmpz_mod_mpoly_t B,
const fmpz_mod_polyun_t A, slong varx, slong vary,
const fmpz_mod_mpoly_ctx_t ctx);
/* mpolyn ********************************************************************/
FLINT_DLL void fmpz_mod_mpolyn_init(fmpz_mod_mpolyn_t A, flint_bitcnt_t bits,
const fmpz_mod_mpoly_ctx_t ctx);
FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpolyn_swap(fmpz_mod_mpolyn_t A,
fmpz_mod_mpolyn_t B, const fmpz_mod_mpoly_ctx_t ctx)
{
fmpz_mod_mpolyn_struct t = *A;
*A = *B;
*B = t;
}
FLINT_DLL void fmpz_mod_mpolyn_fit_length(fmpz_mod_mpolyn_t A,
slong length, const fmpz_mod_mpoly_ctx_t ctx);
FMPZ_MOD_MPOLY_FACTOR_INLINE
const fmpz * fmpz_mod_mpolyn_leadcoeff(const fmpz_mod_mpolyn_t A)
{
FLINT_ASSERT(A->length > 0);
FLINT_ASSERT(A->coeffs[0].length > 0);
return A->coeffs[0].coeffs + A->coeffs[0].length - 1;
}
FLINT_DLL int fmpz_mod_mpolyn_is_canonical(const fmpz_mod_mpolyn_t A,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL slong fmpz_mod_mpolyn_lastdeg(const fmpz_mod_mpolyn_t A,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyn_clear(fmpz_mod_mpolyn_t A,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyn_one(fmpz_mod_mpolyn_t A,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyn_scalar_mul_fmpz_mod(fmpz_mod_mpolyn_t A,
const fmpz_t c, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpolyn_equal(const fmpz_mod_mpolyn_t A,
const fmpz_mod_mpolyn_t B, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyn_print_pretty(const fmpz_mod_mpolyn_t poly,
const char ** x, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_cvtfrom_mpolyn(
fmpz_mod_mpoly_t A,
const fmpz_mod_mpolyn_t B,
slong var,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_cvtto_mpolyn(
fmpz_mod_mpolyn_t A,
const fmpz_mod_mpoly_t B,
slong var,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_to_mpolyn_perm_deflate(
fmpz_mod_mpolyn_t A,
const fmpz_mod_mpoly_ctx_t nctx,
const fmpz_mod_mpoly_t B,
const fmpz_mod_mpoly_ctx_t ctx,
const slong * perm,
const ulong * shift,
const ulong * stride);
FLINT_DLL void fmpz_mod_mpoly_from_mpolyn_perm_inflate(
fmpz_mod_mpoly_t A,
flint_bitcnt_t Abits,
const fmpz_mod_mpoly_ctx_t ctx,
const fmpz_mod_mpolyn_t B,
const fmpz_mod_mpoly_ctx_t nctx,
const slong * perm,
const ulong * shift,
const ulong * stride);
FLINT_DLL void fmpz_mod_mpolyn_set(
fmpz_mod_mpolyn_t A,
const fmpz_mod_mpolyn_t B,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpolyn_is_nonzero_fmpz(
const fmpz_mod_mpolyn_t A,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpolyn_divides(
fmpz_mod_mpolyn_t Q,
const fmpz_mod_mpolyn_t A,
const fmpz_mod_mpolyn_t B,
const fmpz_mod_mpoly_ctx_t ctx);
/* interp ********************************************************************/
FLINT_DLL void fmpz_mod_polyu1n_interp_reduce_2sm_poly(
fmpz_mod_poly_t E,
fmpz_mod_poly_t F,
const fmpz_mod_polyun_t A,
fmpz_mod_poly_t alphapow,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_polyu1n_interp_lift_2sm_poly(
slong * lastdeg,
fmpz_mod_polyun_t F,
const fmpz_mod_poly_t A,
const fmpz_mod_poly_t B,
const fmpz_t alpha,
const fmpz_mod_ctx_t ctx);
FLINT_DLL int fmpz_mod_polyu1n_interp_crt_2sm_poly(
slong * lastdeg,
fmpz_mod_polyun_t F,
fmpz_mod_polyun_t T,
const fmpz_mod_poly_t A,
const fmpz_mod_poly_t B,
const fmpz_mod_poly_t modulus,
fmpz_mod_poly_t alphapow,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyn_interp_reduce_sm_poly(
fmpz_mod_poly_t E,
const fmpz_mod_mpolyn_t A,
const fmpz_t alpha,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyn_interp_lift_sm_poly(
fmpz_mod_mpolyn_t A,
const fmpz_mod_poly_t B,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpolyn_interp_crt_sm_poly(
slong * lastdeg_,
fmpz_mod_mpolyn_t F,
fmpz_mod_mpolyn_t T,
const fmpz_mod_poly_t A,
const fmpz_mod_poly_t modulus,
const fmpz_t alpha,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyn_interp_reduce_2sm_mpolyn(
fmpz_mod_mpolyn_t E,
fmpz_mod_mpolyn_t F,
fmpz_mod_mpolyn_t A,
slong var,
fmpz_mod_poly_t alphapow,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyn_interp_lift_2sm_mpolyn(
slong * lastdeg,
fmpz_mod_mpolyn_t T,
fmpz_mod_mpolyn_t A,
fmpz_mod_mpolyn_t B,
slong var,
const fmpz_t alpha,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpolyn_interp_crt_2sm_mpolyn(
slong * lastdeg,
fmpz_mod_mpolyn_t F,
fmpz_mod_mpolyn_t T,
fmpz_mod_mpolyn_t A,
fmpz_mod_mpolyn_t B,
slong var,
fmpz_mod_poly_t modulus,
fmpz_mod_poly_t alphapow,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyn_interp_lift_sm_mpoly(
fmpz_mod_mpolyn_t A,
const fmpz_mod_mpoly_t B,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpolyn_interp_crt_sm_mpoly(
slong * lastdeg,
fmpz_mod_mpolyn_t F,
fmpz_mod_mpolyn_t T,
fmpz_mod_mpoly_t A,
fmpz_mod_poly_t modulus,
fmpz_mod_poly_t alphapow,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpolyn_interp_mcrt_sm_mpoly(
slong * lastdeg,
fmpz_mod_mpolyn_t F,
const fmpz_mod_mpoly_t A,
const fmpz_mod_poly_t modulus,
fmpz_mod_poly_t alphapow,
const fmpz_mod_mpoly_ctx_t ctx);
/* polyu *********************************************************************/
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_polyu_swap(
fmpz_mod_polyu_t A,
fmpz_mod_polyu_t B)
{
fmpz_mod_polyu_struct t = *A;
*A = *B;
*B = t;
}
FLINT_DLL void fmpz_mod_polyu_init(fmpz_mod_polyu_t A);
FLINT_DLL void fmpz_mod_polyu_clear(fmpz_mod_polyu_t A);
FLINT_DLL void fmpz_mod_polyu_realloc(fmpz_mod_polyu_t A, slong len);
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_polyu_fit_length(
fmpz_mod_polyu_t a,
slong len,
const fmpz_mod_ctx_t ctx)
{
if (len > a->alloc)
fmpz_mod_polyu_realloc(a, len);
}
FLINT_DLL void fmpz_mod_polyu3_degrees(
slong * deg0,
slong * deg1,
slong * deg2,
const fmpz_mod_polyu_t A);
FLINT_DLL void fmpz_mod_polyu3_print_pretty(
const fmpz_mod_polyu_t A,
const char * var0,
const char * var1,
const char * var2,
const fmpz_mod_ctx_t ctx);
/* mpolyu ********************************************************************/
FLINT_DLL int fmpz_mod_mpolyu_is_canonical(const fmpz_mod_mpolyu_t A,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyu3_print_pretty(const fmpz_mod_mpolyu_t A,
const char * var0, const char * var1, const char * var2,
const char ** vars, const fmpz_mod_mpoly_ctx_t ctx);
/* bpoly *********************************************************************/
FLINT_DLL int fmpz_mod_bpoly_is_canonical(const fmpz_mod_bpoly_t A,
const fmpz_mod_ctx_t ctx);
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_bpoly_init(fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx)
{
A->coeffs = NULL;
A->alloc = 0;
A->length = 0;
}
FLINT_DLL void fmpz_mod_bpoly_clear(fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx);
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_bpoly_swap(fmpz_mod_bpoly_t A, fmpz_mod_bpoly_t B,
const fmpz_mod_ctx_t ctx)
{
fmpz_mod_bpoly_struct t = *A;
*A = *B;
*B = t;
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_bpoly_get_coeff(fmpz_t c, const fmpz_mod_bpoly_t A,
slong e0, slong e1, const fmpz_mod_ctx_t ctx)
{
if (e0 >= A->length)
fmpz_zero(c);
else
fmpz_mod_poly_get_coeff_fmpz(c, A->coeffs + e0, e1, ctx);
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
slong fmpz_mod_bpoly_degree0(const fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx)
{
return A->length - 1;
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_bpoly_normalise(fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx)
{
while (A->length > 0 && fmpz_mod_poly_is_zero(A->coeffs + A->length - 1, ctx))
A->length--;
}
FLINT_DLL int fmpz_mod_bpoly_equal(
const fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_set(
fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_set_poly_gen1(
fmpz_mod_bpoly_t A,
const fmpz_mod_poly_t B,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_set_poly_gen0(
fmpz_mod_bpoly_t A,
const fmpz_mod_poly_t B,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_one(fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx);
FMPZ_MOD_MPOLY_FACTOR_INLINE
int fmpz_mod_bpoly_is_one(const fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx)
{
return A->length == 1 && fmpz_mod_poly_is_one(A->coeffs + 0, ctx);
}
FLINT_DLL slong fmpz_mod_bpoly_degree1(const fmpz_mod_bpoly_t A,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_print_pretty(const fmpz_mod_bpoly_t A,
const char * xvar, const char * yvar, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_fit_length(fmpz_mod_bpoly_t A, slong len,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_set_coeff(fmpz_mod_bpoly_t A, slong xi, slong yi,
const fmpz_t c, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_zero(fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_reverse_vars(fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_taylor_shift_gen1(
fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B,
const fmpz_t c,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_sub(
fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B,
const fmpz_mod_bpoly_t C,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_add(
fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B,
const fmpz_mod_bpoly_t C,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_make_primitive(
fmpz_mod_poly_t g,
fmpz_mod_bpoly_t A,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_mul(
fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B,
const fmpz_mod_bpoly_t C,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_mul_series(
fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B,
const fmpz_mod_bpoly_t C,
slong order,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_divrem_series(
fmpz_mod_bpoly_t Q,
fmpz_mod_bpoly_t R,
const fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B,
slong order,
const fmpz_mod_ctx_t ctx);
FLINT_DLL int fmpz_mod_bpoly_divides(
fmpz_mod_bpoly_t Q,
const fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_taylor_shift_gen0(
fmpz_mod_bpoly_t A,
const fmpz_t alpha,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_derivative_gen0(
fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_bpoly_make_monic_series(
fmpz_mod_bpoly_t A,
const fmpz_mod_bpoly_t B,
slong order,
const fmpz_mod_ctx_t ctx);
FMPZ_MOD_MPOLY_INLINE
void fmpz_mod_tpoly_init(fmpz_mod_tpoly_t A, const fmpz_mod_ctx_t ctx)
{
A->coeffs = NULL;
A->alloc = 0;
A->length = 0;
}
FMPZ_MOD_MPOLY_INLINE
void fmpz_mod_tpoly_swap(fmpz_mod_tpoly_t A, fmpz_mod_tpoly_t B,
const fmpz_mod_ctx_t ctx)
{
fmpz_mod_tpoly_struct t = *A;
*A = *B;
*B = t;
}
FLINT_DLL void fmpz_mod_tpoly_fit_length(fmpz_mod_tpoly_t A, slong len,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_tpoly_clear(fmpz_mod_tpoly_t A, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_get_fmpz_mod_bpoly(fmpz_mod_bpoly_t A,
const fmpz_mod_mpoly_t B, slong var0, slong var1,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_set_fmpz_mod_bpoly(fmpz_mod_mpoly_t A,
flint_bitcnt_t Abits, const fmpz_mod_bpoly_t B, slong var0, slong var1,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_bpoly_factor_smprime(fmpz_mod_poly_t c,
fmpz_mod_tpoly_t F, fmpz_mod_bpoly_t B, int allow_shift,
const fmpz_mod_ctx_t ctx);
/*****************************************************************************/
FLINT_DLL int _fmpz_mod_zip_vand_solve(
fmpz * coeffs, /* in Fp: size mlength */
const fmpz * monomials, /* in Fp: size mlength */
slong mlength,
const fmpz * evals, /* in Fp: size elength */
slong elength,
const fmpz * master, /* in Fp: size mlength + 1 */
fmpz * scratch, /* in Fp: size mlength */
const fmpz_mod_ctx_t ctx);
FLINT_DLL void _fmpz_mod_zip_eval_step(
fmpz_t ev,
fmpz * cur, /* in Fp */
const fmpz * inc, /* in Fp */
const fmpz * coeffs, /* in Fp */
slong length,
const fmpz_mod_ctx_t ctx);
/*****************************************************************************/
typedef struct
{
fmpz_mod_mpoly_struct * coeffs;
slong alloc;
slong length;
} fmpz_mod_mpolyv_struct;
typedef fmpz_mod_mpolyv_struct fmpz_mod_mpolyv_t[1];
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_mpolyv_init(fmpz_mod_mpolyv_t A, const fmpz_mod_mpoly_ctx_t ctx)
{
A->coeffs = NULL;
A->alloc = 0;
A->length = 0;
}
FMPZ_MOD_MPOLY_FACTOR_INLINE
void fmpz_mod_mpolyv_swap(fmpz_mod_mpolyv_t A, fmpz_mod_mpolyv_t B,
const fmpz_mod_mpoly_ctx_t ctx)
{
fmpz_mod_mpolyv_struct t = *A;
*A = *B;
*B = t;
}
FLINT_DLL void fmpz_mod_mpolyv_clear(fmpz_mod_mpolyv_t A,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyv_print_pretty(const fmpz_mod_mpolyv_t poly,
const char ** x, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyv_fit_length(fmpz_mod_mpolyv_t A, slong length,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpolyv_set_coeff(fmpz_mod_mpolyv_t A, slong i,
fmpz_mod_mpoly_t c, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_to_mpolyv(fmpz_mod_mpolyv_t A,
const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_t xalpha,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_from_mpolyv(fmpz_mod_mpoly_t A,
flint_bitcnt_t Abits, const fmpz_mod_mpolyv_t B,
const fmpz_mod_mpoly_t xalpha, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int _fmpz_mod_mpoly_vec_content_mpoly(fmpz_mod_mpoly_t g,
const fmpz_mod_mpoly_struct * A, slong Alen,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void _fmpz_mod_mpoly_vec_divexact_mpoly(fmpz_mod_mpoly_struct * A,
slong Alen, const fmpz_mod_mpoly_t c, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void _fmpz_mod_mpoly_vec_mul_mpoly(fmpz_mod_mpoly_struct * A,
slong Alen, const fmpz_mod_mpoly_t c, const fmpz_mod_mpoly_ctx_t ctx);
/*****************************************************************************/
FLINT_DLL int _fmpz_mod_mpoly_factor_separable(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx, int sep);
FLINT_DLL int fmpz_mod_mpoly_factor_lcc_wang(fmpz_mod_mpoly_struct * lc_divs,
const fmpz_mod_mpoly_factor_t lcAfac, const fmpz_mod_poly_t Auc,
const fmpz_mod_bpoly_struct * Auf, slong r,
const fmpz_mod_poly_struct * alpha, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpoly_factor_irred_smprime_zassenhaus(
fmpz_mod_mpolyv_t fac, const fmpz_mod_mpoly_t A,
const fmpz_mod_mpoly_ctx_t ctx, flint_rand_t state);
FLINT_DLL int fmpz_mod_mpoly_factor_irred_smprime_wang(fmpz_mod_mpolyv_t fac,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_factor_t lcAfac,
const fmpz_mod_mpoly_t lcA, const fmpz_mod_mpoly_ctx_t ctx,
flint_rand_t state);
FLINT_DLL int fmpz_mod_mpoly_factor_irred_smprime_zippel(fmpz_mod_mpolyv_t fac,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_factor_t lcAfac,
const fmpz_mod_mpoly_t lcA, const fmpz_mod_mpoly_ctx_t ctx,
flint_rand_t state);
/*****************************************************************************/
FLINT_DLL void fmpz_mod_mpoly_compression_do(fmpz_mod_mpoly_t L,
const fmpz_mod_mpoly_ctx_t Lctx, fmpz * Acoeffs, slong Alen,
mpoly_compression_t M);
FLINT_DLL void fmpz_mod_mpoly_compression_undo(fmpz_mod_mpoly_t A,
flint_bitcnt_t Abits, const fmpz_mod_mpoly_ctx_t Actx, fmpz_mod_mpoly_t L,
const fmpz_mod_mpoly_ctx_t Lctx, mpoly_compression_t M);
/*****************************************************************************/
typedef struct {
flint_bitcnt_t bits;
slong w;
slong r;
fmpz_mod_poly_struct * inv_prod_dbetas;
fmpz_mod_mpoly_struct * inv_prod_dbetas_mvar;
fmpz_mod_poly_struct * dbetas;
fmpz_mod_mpoly_struct * dbetas_mvar;
fmpz_mod_mpoly_struct * prod_mbetas;
fmpz_mod_mpolyv_struct * prod_mbetas_coeffs;
fmpz_mod_mpoly_struct * mbetas;
fmpz_mod_mpoly_struct * deltas;
fmpz_mod_mpoly_struct * xalpha;
fmpz_mod_mpoly_struct * q;
fmpz_mod_mpoly_geobucket_struct * G;
fmpz_mod_mpoly_struct * qt;
fmpz_mod_mpoly_struct * newt;
fmpz_mod_mpolyv_struct * delta_coeffs;
fmpz_mod_mpoly_t T;
fmpz_mod_mpoly_t Q;
fmpz_mod_mpoly_t R;
} fmpz_mod_mpoly_pfrac_struct;
typedef fmpz_mod_mpoly_pfrac_struct fmpz_mod_mpoly_pfrac_t[1];
FLINT_DLL int fmpz_mod_mpoly_pfrac_init(fmpz_mod_mpoly_pfrac_t I,
flint_bitcnt_t bits, slong l, slong r, const fmpz_mod_mpoly_struct * betas,
const fmpz * alpha, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void fmpz_mod_mpoly_pfrac_clear(fmpz_mod_mpoly_pfrac_t I,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpoly_pfrac(slong r, fmpz_mod_mpoly_t t, const slong * deg,
fmpz_mod_mpoly_pfrac_t I, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpoly_hlift(slong m, fmpz_mod_mpoly_struct * f, slong r,
const fmpz * alpha, const fmpz_mod_mpoly_t A, const slong * degs,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_bpoly_pfrac(slong r, fmpz_mod_bpoly_struct * C,
slong * C_deg1_bound, fmpz_mod_bpoly_t A, fmpz_mod_bpoly_struct * B,
const fmpz_mod_ctx_t ctx);
FLINT_DLL int fmpz_mod_bpoly_hlift2(fmpz_mod_bpoly_t A, fmpz_mod_bpoly_t B0,
fmpz_mod_bpoly_t B1, const fmpz_t alpha, slong degree_inner,
const fmpz_mod_ctx_t ctx, fmpz_mod_poly_bpoly_stack_t St);
FLINT_DLL int fmpz_mod_bpoly_hlift(slong r, fmpz_mod_bpoly_t A,
fmpz_mod_bpoly_struct * B, const fmpz_t alpha, slong degree_inner,
const fmpz_mod_ctx_t ctx, fmpz_mod_poly_bpoly_stack_t St);
FLINT_DLL int fmpz_mod_polyu3_hlift(slong r, fmpz_mod_polyun_struct * BB,
fmpz_mod_polyu_t A, fmpz_mod_polyu_struct * B, const fmpz_t beta,
slong degree_inner, const fmpz_mod_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpoly_hlift_zippel(slong m, fmpz_mod_mpoly_struct * B,
slong r, const fmpz * alpha, const fmpz_mod_mpoly_t A, const slong * degs,
const fmpz_mod_mpoly_ctx_t ctx, flint_rand_t state);
FLINT_DLL int fmpz_mod_mpoly_factor_algo(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx,
unsigned int algo);
FLINT_DLL int fmpz_mod_mpoly_factor_zassenhaus(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpoly_factor_wang(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpoly_factor_zippel(fmpz_mod_mpoly_factor_t f,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int _fmpz_mod_mpoly_evaluate_rest_fmpz_mod_poly(fmpz_mod_poly_struct * E,
slong * starts, slong * ends, slong * stops, ulong * es,
const fmpz * Acoeffs, const ulong * Aexps, slong Alen, slong var,
const fmpz_mod_poly_struct * alphas,
const slong * offsets, const slong * shifts,
slong N, ulong mask, slong nvars, const fmpz_mod_ctx_t ctx);
FLINT_DLL void _fmpz_mod_mpoly_eval_rest_to_fmpz_mod_bpoly(fmpz_mod_bpoly_t E,
const fmpz_mod_mpoly_t A, const fmpz_mod_poly_struct * alphabetas,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL void _fmpz_mod_mpoly_set_fmpz_mod_bpoly_var1_zero(fmpz_mod_mpoly_t A,
flint_bitcnt_t Abits, const fmpz_mod_bpoly_t B, slong var,
const fmpz_mod_mpoly_ctx_t ctx);
/* gcd ***********************************************************************/
FLINT_DLL int _fmpz_mod_mpoly_gcd_algo(fmpz_mod_mpoly_t G,
fmpz_mod_mpoly_t Abar, fmpz_mod_mpoly_t Bbar,
const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B,
const fmpz_mod_mpoly_ctx_t ctx, unsigned int algo);
FLINT_DLL int fmpz_mod_polyu1n_gcd_brown_smprime(
fmpz_mod_polyun_t G,
fmpz_mod_polyun_t Abar,
fmpz_mod_polyun_t Bbar,
fmpz_mod_polyun_t A,
fmpz_mod_polyun_t B,
const fmpz_mod_ctx_t ctx,
fmpz_mod_poly_stack_t St_poly,
fmpz_mod_polyun_stack_t St_polyun);
FLINT_DLL int fmpz_mod_mpolyn_gcd_brown_smprime(
fmpz_mod_mpolyn_t G,
fmpz_mod_mpolyn_t Abar,
fmpz_mod_mpolyn_t Bbar,
fmpz_mod_mpolyn_t A,
fmpz_mod_mpolyn_t B,
slong var,
const fmpz_mod_mpoly_ctx_t ctx,
const mpoly_gcd_info_t I,
fmpz_mod_poly_polyun_mpolyn_stack_t St);
FLINT_DLL int fmpz_mod_mpolyl_gcdp_zippel(
fmpz_mod_mpoly_t G,
fmpz_mod_mpoly_t Abar,
fmpz_mod_mpoly_t Bbar,
fmpz_mod_mpoly_t A,
fmpz_mod_mpoly_t B,
slong var,
const fmpz_mod_mpoly_ctx_t ctx,
flint_rand_t state);
FLINT_DLL int fmpz_mod_mpolyl_gcd_zippel2_smprime(
fmpz_mod_mpoly_t rG, const slong * rGdegs,
fmpz_mod_mpoly_t rAbar,
fmpz_mod_mpoly_t rBbar,
const fmpz_mod_mpoly_t A, const slong * Adegs,
const fmpz_mod_mpoly_t B, const slong * Bdegs,
const fmpz_mod_mpoly_t gamma, const slong * gammadegs,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL int fmpz_mod_mpolyl_gcd_hensel_smprime(
fmpz_mod_mpoly_t G, slong Gdeg,
fmpz_mod_mpoly_t Abar,
fmpz_mod_mpoly_t Bbar,
const fmpz_mod_mpoly_t A,
const fmpz_mod_mpoly_t B,
const fmpz_mod_mpoly_ctx_t ctx);
/* pow_cache */
FLINT_DLL void fmpz_mod_pow_cache_start(const fmpz_t b,
fmpz_mod_poly_t c, const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_pow_cache_mulpow_ui(fmpz_t a, const fmpz_t b,
ulong e, fmpz_mod_poly_t c, const fmpz_mod_ctx_t ctx);
/* zip helpers */
FLINT_DLL void mpoly_monomial_evals_fmpz_mod(
fmpz_mod_poly_t EH,
const ulong * Aexps, slong Alen, flint_bitcnt_t Abits,
fmpz_mod_poly_struct * alpha_caches,
slong start,
slong stop,
const mpoly_ctx_t mctx,
const fmpz_mod_ctx_t fpctx);
FLINT_DLL void mpoly1_monomial_evals_fmpz_mod(
fmpz_mod_polyun_t EH,
const ulong * Aexps, flint_bitcnt_t Abits,
const ulong * Amarks, slong Amarkslen,
fmpz_mod_poly_struct * alpha_caches,
slong m,
const mpoly_ctx_t mctx,
const fmpz_mod_ctx_t fpctx);
FLINT_DLL void mpoly2_monomial_evals_fmpz_mod(
fmpz_mod_polyun_t EH,
const ulong * Aexps, flint_bitcnt_t Abits,
ulong * Amarks, slong Amarkslen,
fmpz_mod_poly_struct * alpha_caches,
slong m,
const mpoly_ctx_t mctx,
const fmpz_mod_ctx_t fpctx);
FLINT_DLL void fmpz_mod_mpoly_mock_eval_coeff(
fmpz_mod_polyun_t mock,
const fmpz_mod_mpoly_t A,
const fmpz_mod_polyun_t Aeh_inc,
const fmpz_mod_mpoly_ctx_t ctx);
FLINT_DLL slong fmpz_mod_polyun_product_roots(
fmpz_mod_polyun_t M,
const fmpz_mod_polyun_t H,
const fmpz_mod_ctx_t ctx);
FLINT_DLL void fmpz_mod_polyun_zip_start(
fmpz_mod_polyun_t Z,
fmpz_mod_polyun_t H,
slong req_images,
const fmpz_mod_ctx_t fctx);
FLINT_DLL void fmpz_mod_polyu2n_zip_eval_cur_inc_coeff(
fmpz_mod_polyun_t E,
fmpz_mod_polyun_t Acur,
const fmpz_mod_polyun_t Ainc,
const fmpz_mod_polyun_t Acoeff,
const fmpz_mod_ctx_t ctx);
FLINT_DLL int fmpz_mod_polyun_zip_solve(
fmpz_mod_mpoly_t A,
fmpz_mod_polyun_t Z,
fmpz_mod_polyun_t H,
fmpz_mod_polyun_t M,
const fmpz_mod_mpoly_ctx_t ctx);
#ifdef __cplusplus
}
#endif
#endif