/* 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_FACTOR_H #define FQ_ZECH_MPOLY_FACTOR_H #ifdef FQ_ZECH_MPOLY_FACTOR_INLINES_C #define FQ_ZECH_MPOLY_FACTOR_INLINE FLINT_DLL #else #define FQ_ZECH_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 "fq_zech_mpoly.h" #include "nmod_mpoly_factor.h" #ifdef __cplusplus extern "C" { #endif typedef struct { fq_zech_poly_struct * coeffs; slong alloc; slong length; } fq_zech_bpoly_struct; typedef fq_zech_bpoly_struct fq_zech_bpoly_t[1]; typedef struct { fq_zech_bpoly_struct * coeffs; slong alloc; slong length; } fq_zech_tpoly_struct; typedef fq_zech_tpoly_struct fq_zech_tpoly_t[1]; typedef struct { ulong * exps; fq_zech_struct * coeffs; slong length; slong alloc; } fq_zech_polyu_struct; typedef fq_zech_polyu_struct fq_zech_polyu_t[1]; typedef struct { fq_zech_poly_struct * coeffs; ulong * exps; slong length; slong alloc; } fq_zech_polyun_struct; typedef fq_zech_polyun_struct fq_zech_polyun_t[1]; /*****************************************************************************/ FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_bpoly_init(fq_zech_bpoly_t A, const fq_zech_ctx_t ctx) { A->coeffs = NULL; A->alloc = 0; A->length = 0; } FLINT_DLL void fq_zech_bpoly_clear(fq_zech_bpoly_t A, const fq_zech_ctx_t ctx); FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_bpoly_swap(fq_zech_bpoly_t A, fq_zech_bpoly_t B, const fq_zech_ctx_t ctx) { fq_zech_bpoly_struct t = *A; *A = *B; *B = t; } FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_bpoly_normalise(fq_zech_bpoly_t A, const fq_zech_ctx_t ctx) { while (A->length > 0 && fq_zech_poly_is_zero(A->coeffs + A->length - 1, ctx)) A->length--; } FLINT_DLL void fq_zech_bpoly_realloc(fq_zech_bpoly_t A, slong len, const fq_zech_ctx_t ctx); FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_bpoly_fit_length(fq_zech_bpoly_t A, slong len, const fq_zech_ctx_t ctx) { if (len > A->alloc) fq_zech_bpoly_realloc(A, len, ctx); } FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_bpoly_zero(fq_zech_bpoly_t A, const fq_zech_ctx_t ctx) { A->length = 0; } FQ_ZECH_MPOLY_FACTOR_INLINE int fq_zech_bpoly_is_zero(const fq_zech_bpoly_t A, const fq_zech_ctx_t ctx) { return A->length == 0; } FLINT_DLL int fq_zech_bpoly_equal(const fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_ctx_t ctx); FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_bpoly_get_coeff(fq_zech_t c, const fq_zech_bpoly_t A, slong e0, slong e1, const fq_zech_ctx_t ctx) { if (e0 >= A->length) fq_zech_zero(c, ctx); else fq_zech_poly_get_coeff(c, A->coeffs + e0, e1, ctx); } FQ_ZECH_MPOLY_FACTOR_INLINE slong fq_zech_bpoly_degree0(const fq_zech_bpoly_t A, const fq_zech_ctx_t ctx) { return A->length - 1; } FLINT_DLL slong fq_zech_bpoly_degree1(const fq_zech_bpoly_t A, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_set_poly_var1(fq_zech_bpoly_t A, const fq_zech_poly_t B, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_set_poly_var0(fq_zech_bpoly_t A, const fq_zech_poly_t B, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_print_pretty(const fq_zech_bpoly_t A, const char * var0, const char * var1, const fq_zech_ctx_t ctx); FLINT_DLL int fq_zech_bpoly_is_canonical(const fq_zech_bpoly_t A, const fq_zech_ctx_t ctx); FLINT_DLL int fq_zech_bpoly_fq_equal( const fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_set_coeff_fq_zech( fq_zech_bpoly_t A, slong xi, slong yi, const fq_zech_t c, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_set_fq_zech_poly_var0( fq_zech_bpoly_t A, const fq_zech_poly_t B, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_set_fq_zech_poly_var1( fq_zech_bpoly_t A, const fq_zech_poly_t B, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_make_monic( fq_zech_bpoly_t A, slong order, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_mul( fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_bpoly_t C, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_mul_series( fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_bpoly_t C, slong order, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_add( fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_bpoly_t C, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_one( fq_zech_bpoly_t A, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_sub( fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_bpoly_t C, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_derivative( fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_divrem_series( fq_zech_bpoly_t Q, fq_zech_bpoly_t R, const fq_zech_bpoly_t A, const fq_zech_bpoly_t B, slong order, const fq_zech_ctx_t ctx); FLINT_DLL int fq_zech_bpoly_divides( fq_zech_bpoly_t Q, const fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_set( fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_make_primitive( fq_zech_poly_t g, fq_zech_bpoly_t A, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_taylor_shift_var1( fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_t c_, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_bpoly_taylor_shift_var0( fq_zech_bpoly_t A, const fq_zech_t alpha, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_get_fq_zech_bpoly( fq_zech_bpoly_t A, const fq_zech_mpoly_t B, slong varx, slong vary, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_set_fq_zech_bpoly( fq_zech_mpoly_t A, flint_bitcnt_t Abits, const fq_zech_bpoly_t B, slong varx, slong vary, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL int fq_zech_bpoly_factor_smprime( fq_zech_poly_t c, fq_zech_tpoly_t F, fq_zech_bpoly_t B, int allow_shift, const fq_zech_ctx_t ctx); FLINT_DLL int fq_zech_bpoly_factor_lgprime( fq_zech_poly_t c, fq_zech_tpoly_t F, fq_zech_bpoly_t B, const fq_zech_ctx_t ctx, flint_rand_t state); /*****************************************************************************/ FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_tpoly_init(fq_zech_tpoly_t A, const fq_zech_ctx_t ctx) { A->coeffs = NULL; A->alloc = 0; A->length = 0; } FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_tpoly_swap(fq_zech_tpoly_t A, fq_zech_tpoly_t B, const fq_zech_ctx_t ctx) { fq_zech_tpoly_struct t = *A; *A = *B; *B = t; } FLINT_DLL void fq_zech_tpoly_fit_length(fq_zech_tpoly_t A, slong len, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_tpoly_clear(fq_zech_tpoly_t A, const fq_zech_ctx_t ctx); /*****************************************************************************/ FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_polyu_init(fq_zech_polyu_t A, const fq_zech_ctx_t ctx) { A->coeffs = NULL; A->exps = NULL; A->length = 0; A->alloc = 0; } FLINT_DLL void fq_zech_polyu_clear(fq_zech_polyu_t A, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_polyu_realloc(fq_zech_polyu_t A, slong len, const fq_zech_ctx_t ctx); FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_polyu_fit_length(fq_zech_polyu_t A, slong len, const fq_zech_ctx_t ctx) { FLINT_ASSERT(A->alloc >= 0); if (len > A->alloc) fq_zech_polyu_realloc(A, len, ctx); } FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_polyu_swap(fq_zech_polyu_t A, fq_zech_polyu_t B, const fq_zech_ctx_t ctx) { fq_zech_polyu_struct t = *B; *B = *A; *A = t; } FLINT_DLL void fq_zech_polyu3_print_pretty( const fq_zech_polyu_t A, const char * var0, const char * var1, const char * var2, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_polyu3_degrees( slong * deg0, slong * deg1, slong * deg2, const fq_zech_polyu_t A); FLINT_DLL int fq_zech_polyu_is_canonical( const fq_zech_polyu_t A, const fq_zech_ctx_t ctx); /*****************************************************************************/ FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_polyun_init(fq_zech_polyun_t A, const fq_zech_ctx_t ctx) { A->coeffs = NULL; A->exps = NULL; A->length = 0; A->alloc = 0; } FLINT_DLL void fq_zech_polyun_clear(fq_zech_polyun_t A, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_polyun_realloc(fq_zech_polyun_t A, slong len, const fq_zech_ctx_t ctx); FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_polyun_fit_length(fq_zech_polyun_t A, slong len, const fq_zech_ctx_t ctx) { if (len > A->alloc) fq_zech_polyun_realloc(A, len, ctx); } FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_polyun_swap(fq_zech_polyun_t A, fq_zech_polyun_t B, const fq_zech_ctx_t ctx) { fq_zech_polyun_struct t = *B; *B = *A; *A = t; } FLINT_DLL void fq_zech_polyu2n_print_pretty( const fq_zech_polyun_t A, const char * var0, const char * var1, const char * varlast, const fq_zech_ctx_t ctx); FLINT_DLL void fq_zech_polyu3n_print_pretty( const fq_zech_polyun_t A, const char * var0, const char * var1, const char * var2, const char * varlast, const fq_zech_ctx_t ctx); FLINT_DLL int fq_zech_polyun_is_canonical( const fq_zech_polyun_t A, const fq_zech_ctx_t ctx); /*****************************************************************************/ FLINT_DLL int fq_zech_mpoly_is_fq_zech_poly( const fq_zech_mpoly_t A, slong var, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL int fq_zech_mpoly_get_fq_zech_poly( fq_zech_poly_t A, const fq_zech_mpoly_t B, slong var, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void _fq_zech_mpoly_set_fq_zech_poly( fq_zech_mpoly_t A, flint_bitcnt_t Abits, const fq_zech_struct * Bcoeffs, slong Blen, slong var, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_set_fq_zech_poly( fq_zech_mpoly_t A, const fq_zech_poly_t B, slong var, const fq_zech_mpoly_ctx_t ctx); /*****************************************************************************/ typedef struct { fq_zech_t constant; fq_zech_mpoly_struct * poly; fmpz * exp; slong num; slong alloc; } fq_zech_mpoly_factor_struct; typedef fq_zech_mpoly_factor_struct fq_zech_mpoly_factor_t[1]; FLINT_DLL void fq_zech_mpoly_factor_init(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_factor_realloc(fq_zech_mpoly_factor_t f, slong alloc, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_factor_fit_length(fq_zech_mpoly_factor_t f, slong len, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_factor_clear(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_factor_set(fq_zech_mpoly_factor_t a, const fq_zech_mpoly_factor_t b, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_factor_print_pretty(const fq_zech_mpoly_factor_t f, const char ** vars, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_factor_append_ui(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_t A, ulong e, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_factor_append_fmpz(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_t A, const fmpz_t e, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL int fq_zech_mpoly_factor_squarefree(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL int fq_zech_mpoly_factor(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_mpoly_factor_swap(fq_zech_mpoly_factor_t A, fq_zech_mpoly_factor_t B, const fq_zech_mpoly_ctx_t ctx) { fq_zech_mpoly_factor_struct t = *A; *A = *B; *B = t; } FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_mpoly_factor_one(fq_zech_mpoly_factor_t a, const fq_zech_mpoly_ctx_t ctx) { fq_zech_one(a->constant, ctx->fqctx); a->num = 0; } FLINT_DLL int fq_zech_mpoly_factor_expand(fq_zech_mpoly_t A, const fq_zech_mpoly_factor_t f, const fq_zech_mpoly_ctx_t ctx); FQ_ZECH_MPOLY_FACTOR_INLINE int fq_zech_mpoly_factor_matches(const fq_zech_mpoly_t a, const fq_zech_mpoly_factor_t f, const fq_zech_mpoly_ctx_t ctx) { int matches; fq_zech_mpoly_t t; fq_zech_mpoly_init(t, ctx); fq_zech_mpoly_factor_expand(t, f, ctx); matches = fq_zech_mpoly_equal(t, a, ctx); fq_zech_mpoly_clear(t, ctx); return matches; } FLINT_DLL void _fq_zech_mpoly_get_lead0( fq_zech_mpoly_t c, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void _fq_zech_mpoly_set_lead0( fq_zech_mpoly_t A, const fq_zech_mpoly_t B, const fq_zech_mpoly_t c, const fq_zech_mpoly_ctx_t ctx); /*****************************************************************************/ typedef struct { fq_zech_mpoly_struct * coeffs; slong alloc; slong length; } fq_zech_mpolyv_struct; typedef fq_zech_mpolyv_struct fq_zech_mpolyv_t[1]; FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_mpolyv_init(fq_zech_mpolyv_t A, const fq_zech_mpoly_ctx_t ctx) { A->coeffs = NULL; A->alloc = 0; A->length = 0; } FQ_ZECH_MPOLY_FACTOR_INLINE void fq_zech_mpolyv_swap(fq_zech_mpolyv_t A, fq_zech_mpolyv_t B, const fq_zech_mpoly_ctx_t ctx) { fq_zech_mpolyv_struct t = *A; *A = *B; *B = t; } FLINT_DLL void fq_zech_mpolyv_clear(fq_zech_mpolyv_t A, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpolyv_print_pretty(const fq_zech_mpolyv_t poly, const char ** x, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpolyv_fit_length(fq_zech_mpolyv_t A, slong length, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpolyv_set_coeff( fq_zech_mpolyv_t A, slong i, fq_zech_mpoly_t c, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_to_mpolyv( fq_zech_mpolyv_t A, const fq_zech_mpoly_t B, const fq_zech_mpoly_t xalpha, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_from_mpolyv( fq_zech_mpoly_t A, const fq_zech_mpolyv_t B, const fq_zech_mpoly_t xalpha, const fq_zech_mpoly_ctx_t ctx); /*****************************************************************************/ FLINT_DLL int fq_zech_mpoly_univar_content_mpoly( fq_zech_mpoly_t g, const fq_zech_mpoly_univar_t A, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_univar_divexact_mpoly( fq_zech_mpoly_univar_t A, const fq_zech_mpoly_t b, const fq_zech_mpoly_ctx_t ctx); /*****************************************************************************/ FLINT_DLL int fq_zech_mpoly_factor_lcc_wang( fq_zech_mpoly_struct * lc_divs, const fq_zech_mpoly_factor_t lcAfac, const fq_zech_poly_t Auc, const fq_zech_bpoly_struct * Auf, slong r, const fq_zech_poly_struct * alpha, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL int fq_zech_mpoly_factor_irred_smprime_zassenhaus( fq_zech_mpolyv_t fac, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx, flint_rand_t state); FLINT_DLL int fq_zech_mpoly_factor_irred_lgprime_zassenhaus( fq_zech_mpolyv_t fac, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx, flint_rand_t state); FLINT_DLL int fq_zech_mpoly_factor_irred_smprime_wang( fq_zech_mpolyv_t fac, const fq_zech_mpoly_t A, const fq_zech_mpoly_factor_t lcAfac, const fq_zech_mpoly_t lcA, const fq_zech_mpoly_ctx_t ctx, flint_rand_t state); FLINT_DLL int fq_zech_mpoly_factor_irred_lgprime_wang( fq_zech_mpolyv_t Af, const fq_zech_mpoly_t A, const fq_zech_mpoly_factor_t lcAfac, const fq_zech_mpoly_t lcA, const fq_zech_mpoly_ctx_t ctx, flint_rand_t state); FLINT_DLL int fq_zech_mpoly_factor_irred_smprime_zippel( fq_zech_mpolyv_t fac, const fq_zech_mpoly_t A, const fq_zech_mpoly_factor_t lcAfac, const fq_zech_mpoly_t lcA, const fq_zech_mpoly_ctx_t ctx, flint_rand_t state); FLINT_DLL int fq_zech_mpoly_factor_irred_lgprime_zippel( fq_zech_mpolyv_t Af, const fq_zech_mpoly_t A, const fq_zech_mpoly_factor_t lcAfac, const fq_zech_mpoly_t lcA, const fq_zech_mpoly_ctx_t ctx, flint_rand_t state); /*****************************************************************************/ typedef struct { flint_bitcnt_t bits; slong w; slong r; fq_zech_poly_struct * inv_prod_dbetas; fq_zech_mpoly_struct * inv_prod_dbetas_mvar; fq_zech_poly_struct * dbetas; fq_zech_mpoly_struct * dbetas_mvar; fq_zech_mpoly_struct * prod_mbetas; fq_zech_mpolyv_struct * prod_mbetas_coeffs; fq_zech_mpoly_struct * mbetas; fq_zech_mpoly_struct * deltas; fq_zech_mpoly_struct * xalpha; fq_zech_mpoly_struct * q; fq_zech_mpoly_struct * qt; fq_zech_mpoly_struct * newt; fq_zech_mpolyv_struct * delta_coeffs; fq_zech_mpoly_t T; fq_zech_mpoly_t Q; fq_zech_mpoly_t R; } fq_zech_mpoly_pfrac_struct; typedef fq_zech_mpoly_pfrac_struct fq_zech_mpoly_pfrac_t[1]; FLINT_DLL int fq_zech_mpoly_pfrac_init( fq_zech_mpoly_pfrac_t I, flint_bitcnt_t bits, slong l, slong r, const fq_zech_mpoly_struct * betas, const fq_zech_struct * alpha, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_mpoly_pfrac_clear( fq_zech_mpoly_pfrac_t I, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL int fq_zech_mpoly_pfrac( slong r, fq_zech_mpoly_t t, const slong * deg, fq_zech_mpoly_pfrac_t I, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL int fq_zech_mpoly_hlift( slong m, fq_zech_mpoly_struct * f, /* length r */ slong r, const fq_zech_struct * alpha, const fq_zech_mpoly_t A, const slong * degs, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL int fq_zech_bpoly_hlift2( fq_zech_bpoly_t A, /* clobbered (shifted by alpha) */ fq_zech_bpoly_t B0, fq_zech_bpoly_t B1, const fq_zech_t alpha, slong degree_inner, /* required degree in x */ const fq_zech_ctx_t ctx); FLINT_DLL int fq_zech_bpoly_hlift( slong r, fq_zech_bpoly_t A, /* clobbered (shifted by alpha) */ fq_zech_bpoly_struct * B, const fq_zech_t alpha, slong degree_inner, /* required degree in x */ const fq_zech_ctx_t ctx); FLINT_DLL int fq_zech_polyu3_hlift( slong r, fq_zech_polyun_struct * BB, fq_zech_polyu_t A, fq_zech_polyu_struct * B, const fq_zech_t beta, slong degree_inner, /* required degree in x */ const fq_zech_ctx_t ctx); FLINT_DLL int fq_zech_mpoly_factor_algo(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx, unsigned int algo); FLINT_DLL int fq_zech_mpoly_factor_zassenhaus(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL int fq_zech_mpoly_factor_wang(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL int fq_zech_mpoly_factor_zippel(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void fq_zech_poly_product_roots_fq_zech( fq_zech_poly_t master, const fq_zech_struct * monomials, slong mlength, const fq_zech_ctx_t ctx); FLINT_DLL void _fq_zech_mpoly_monomial_evals( fq_zech_struct * E, const ulong * Aexps, flint_bitcnt_t Abits, slong Alen, const fq_zech_struct * alpha, slong vstart, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL int _fq_zech_mpoly_eval_rest_fq_zech_poly( fq_zech_poly_struct * E, slong * starts, slong * ends, slong * stops, ulong * es, const fq_zech_struct * Acoeffs, const ulong * Aexps, slong Alen, slong var, const fq_zech_poly_struct * alphas, const slong * offsets, const slong * shifts, slong N, ulong mask, slong nvars, const fq_zech_ctx_t ctx); FLINT_DLL void _fq_zech_mpoly_eval_to_bpoly( fq_zech_bpoly_t E, const fq_zech_mpoly_t A, const fq_zech_poly_struct * alphabetas, const fq_zech_mpoly_ctx_t ctx); FLINT_DLL void _fq_zech_mpoly_set_fq_zech_bpoly_var1_zero( fq_zech_mpoly_t A, flint_bitcnt_t Abits, const fq_zech_bpoly_t B, slong var, const fq_zech_mpoly_ctx_t ctx); #ifdef __cplusplus } #endif #endif