From 863039cab930159bc8c13782e6c2989e42efa11c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albin=20Ahlb=C3=A4ck?= Date: Tue, 14 Nov 2023 11:44:39 +0100 Subject: [PATCH] Reformat headers With these headers: thread_pool.h thread_support.h ulong_extras.h long_extras.h perm.h double_extras.h d_vec.h d_mat.h mpn_extras.h mpf_vec.h mpf_mat.h mpfr_vec.h mpfr_mat.h nmod.h nmod_vec.h nmod_mat.h nmod_poly.h fmpz.h fmpz_vec.h fmpz_mat.h fmpz_poly.h fmpz_mod.h fmpz_mod_vec.h fmpz_mod_mat.h fmpz_mod_poly.h fmpq.h fmpq_vec.h fmpq_mat.h fmpq_poly.h fq.h fq_vec.h fq_mat.h fq_poly.h fq_nmod.h fq_nmod_vec.h fq_nmod_mat.h fq_nmod_poly.h fq_zech.h fq_zech_mat.h fq_zech_poly.h fq_default.h fq_default_mat.h fq_default_poly.h fq_embed.h fq_nmod_embed.h fq_zech_embed.h padic.h padic_mat.h padic_poly.h qadic.h nmod_poly_factor.h fmpz_factor.h fmpz_poly_factor.h fmpz_mod_poly_factor.h fq_poly_factor.h fq_nmod_poly_factor.h fq_zech_poly_factor.h fq_default_poly_factor.h nmod_poly_mat.h fmpz_poly_mat.h mpoly.h nmod_mpoly.h fmpz_mpoly.h fmpz_mod_mpoly.h fmpq_mpoly.h fq_nmod_mpoly.h fq_zech_mpoly.h nmod_mpoly_factor.h fmpz_mpoly_factor.h fmpz_mod_mpoly_factor.h fmpq_mpoly_factor.h fq_nmod_mpoly_factor.h fq_zech_mpoly_factor.h fft.h fft_small.h fmpz_poly_q.h fmpz_lll.h n_poly.h arith.h qsieve.h aprcl.h nf.h nf_elem.h qfb.h --- src/aprcl.h | 22 +- src/arith.h | 18 +- src/d_mat.h | 24 +- src/d_vec.h | 19 +- src/fft.h | 434 ++++++-- src/fft_small.h | 251 ++++- src/fmpq.h | 232 +++- src/fmpq_mat.h | 124 ++- src/fmpq_mpoly.h | 16 +- src/fmpq_mpoly_factor.h | 65 +- src/fmpq_poly.h | 840 ++++++++++++-- src/fmpq_vec.h | 6 +- src/fmpz.h | 199 +++- src/fmpz_factor.h | 99 +- src/fmpz_lll.h | 198 +++- src/fmpz_mat.h | 288 ++++- src/fmpz_mod.h | 82 +- src/fmpz_mod_mat.h | 136 ++- src/fmpz_mod_mpoly.h | 1234 +++++++++++++++++---- src/fmpz_mod_mpoly_factor.h | 1197 ++++++++++++++++---- src/fmpz_mod_poly.h | 1558 +++++++++++++++++++++----- src/fmpz_mod_poly_factor.h | 168 ++- src/fmpz_mod_vec.h | 62 +- src/fmpz_mpoly.h | 1972 +++++++++++++++++++++++++++------ src/fmpz_mpoly_factor.h | 570 ++++++++-- src/fmpz_poly.h | 1211 +++++++++++++++++---- src/fmpz_poly_factor.h | 51 +- src/fmpz_poly_mat.h | 155 ++- src/fmpz_poly_q.h | 104 +- src/fmpz_vec.h | 88 +- src/fq.h | 24 +- src/fq_default.h | 59 +- src/fq_default_mat.h | 17 +- src/fq_default_poly.h | 21 +- src/fq_nmod.h | 110 +- src/fq_nmod_embed.h | 13 +- src/fq_nmod_mpoly.h | 1941 +++++++++++++++++++++++++++------ src/fq_nmod_mpoly_factor.h | 509 +++++++-- src/fq_nmod_poly_factor.h | 6 +- src/fq_poly_factor.h | 6 +- src/fq_zech.h | 167 ++- src/fq_zech_embed.h | 13 +- src/fq_zech_mpoly.h | 872 ++++++++++++--- src/fq_zech_mpoly_factor.h | 645 ++++++++--- src/fq_zech_poly_factor.h | 6 +- src/mpf_mat.h | 23 +- src/mpf_vec.h | 13 +- src/mpfr_mat.h | 12 +- src/mpfr_vec.h | 14 +- src/mpn_extras.h | 116 +- src/mpoly.h | 826 +++++++++++--- src/n_poly.h | 916 +++++++++++++--- src/nf_elem.h | 175 ++- src/nmod.h | 6 +- src/nmod_mat.h | 102 +- src/nmod_mpoly.h | 2046 +++++++++++++++++++++++++++++------ src/nmod_mpoly_factor.h | 619 +++++++++-- src/nmod_poly.h | 1349 +++++++++++++++++++---- src/nmod_poly_factor.h | 29 +- src/nmod_poly_mat.h | 165 ++- src/nmod_vec.h | 45 +- src/padic.h | 38 +- src/padic_mat.h | 116 +- src/padic_poly.h | 312 +++++- src/qadic.h | 253 ++++- src/qfb.h | 24 +- src/qsieve.h | 24 +- src/thread_pool.h | 27 +- src/thread_support.h | 14 +- src/ulong_extras.h | 88 +- 70 files changed, 19222 insertions(+), 3962 deletions(-) diff --git a/src/aprcl.h b/src/aprcl.h index 9223b5d2ae..7d1d0c4777 100644 --- a/src/aprcl.h +++ b/src/aprcl.h @@ -107,8 +107,17 @@ primality_test_status _aprcl_is_prime_jacobi(const fmpz_t n, const aprcl_config slong _aprcl_is_prime_jacobi_check_pk(const unity_zp j, const fmpz_t u, ulong v); slong _aprcl_is_prime_jacobi_check_21(ulong q, const fmpz_t n); -slong _aprcl_is_prime_jacobi_check_22(const unity_zp j, const fmpz_t u, ulong v, ulong q); -slong _aprcl_is_prime_jacobi_check_2k(const unity_zp j, const unity_zp j2_1, const unity_zp j2_2, const fmpz_t u, ulong v); +slong _aprcl_is_prime_jacobi_check_22( + const unity_zp j, + const fmpz_t u, + ulong v, + ulong q); +slong _aprcl_is_prime_jacobi_check_2k( + const unity_zp j, + const unity_zp j2_1, + const unity_zp j2_2, + const fmpz_t u, + ulong v); int _aprcl_is_prime_jacobi_additional_test(const fmpz_t n, ulong p); @@ -204,7 +213,14 @@ mp_ptr aprcl_f_table(const ulong q); void unity_zp_jacobi_sum_2q_one(unity_zp f, ulong q); void unity_zp_jacobi_sum_2q_two(unity_zp f, ulong q); -void _unity_zp_jacobi_sum_pq_general(unity_zp f, const mp_ptr table, ulong p, ulong q, ulong k, ulong a, ulong b); +void _unity_zp_jacobi_sum_pq_general( + unity_zp f, + const mp_ptr table, + ulong p, + ulong q, + ulong k, + ulong a, + ulong b); void unity_zp_jacobi_sum_pq(unity_zp f, ulong q, ulong p); diff --git a/src/arith.h b/src/arith.h index 54427a7f70..47befb2bfb 100644 --- a/src/arith.h +++ b/src/arith.h @@ -44,9 +44,21 @@ void arith_stirling_number_1u_vec(fmpz * row, ulong n, slong klen); void arith_stirling_number_1_vec(fmpz * row, ulong n, slong klen); void arith_stirling_number_2_vec(fmpz * row, ulong n, slong klen); -void arith_stirling_number_1u_vec_next(fmpz * row, const fmpz * prev, slong n, slong klen); -void arith_stirling_number_1_vec_next(fmpz * row, const fmpz * prev, slong n, slong klen); -void arith_stirling_number_2_vec_next(fmpz * row, const fmpz * prev, slong n, slong klen); +void arith_stirling_number_1u_vec_next( + fmpz * row, + const fmpz * prev, + slong n, + slong klen); +void arith_stirling_number_1_vec_next( + fmpz * row, + const fmpz * prev, + slong n, + slong klen); +void arith_stirling_number_2_vec_next( + fmpz * row, + const fmpz * prev, + slong n, + slong klen); void arith_stirling_matrix_1u(fmpz_mat_t mat); void arith_stirling_matrix_1(fmpz_mat_t mat); diff --git a/src/d_mat.h b/src/d_mat.h index b72afe7731..03b72f7504 100644 --- a/src/d_mat.h +++ b/src/d_mat.h @@ -38,8 +38,16 @@ typedef d_mat_struct d_mat_t[1]; #define d_mat_entry(mat,i,j) (*((mat)->rows[i] + (j))) -D_MAT_INLINE double * d_mat_entry_ptr(const d_mat_t mat, slong i, slong j) { return mat->rows[i] + j; } -D_MAT_INLINE double d_mat_get_entry(const d_mat_t mat, slong i, slong j) { return mat->rows[i][j]; } +D_MAT_INLINE +double * d_mat_entry_ptr(const d_mat_t mat, slong i, slong j) +{ + return mat->rows[i] + j; +} +D_MAT_INLINE +double d_mat_get_entry(const d_mat_t mat, slong i, slong j) +{ + return mat->rows[i][j]; +} D_MAT_INLINE slong d_mat_nrows(const d_mat_t mat) { return mat->r; } D_MAT_INLINE slong d_mat_ncols(const d_mat_t mat) { return mat->c; } @@ -60,7 +68,11 @@ int d_mat_approx_equal(const d_mat_t mat1, const d_mat_t mat2, double eps); int d_mat_is_zero(const d_mat_t mat); int d_mat_is_approx_zero(const d_mat_t mat, double eps); -D_MAT_INLINE int d_mat_is_empty(const d_mat_t mat) { return (mat->r == 0) || (mat->c == 0); } +D_MAT_INLINE +int d_mat_is_empty(const d_mat_t mat) +{ + return (mat->r == 0) || (mat->c == 0); +} D_MAT_INLINE int d_mat_is_square(const d_mat_t mat) { return (mat->r == mat->c); } void d_mat_zero(d_mat_t mat); @@ -84,7 +96,11 @@ void d_mat_mul_classical(d_mat_t C, const d_mat_t A, const d_mat_t B); /* Permutations *************************************************************/ -D_MAT_INLINE void d_mat_swap_rows(d_mat_t mat, slong r, slong s) { if (r != s) FLINT_SWAP(double *, mat->rows[r], mat->rows[s]); } +D_MAT_INLINE +void d_mat_swap_rows(d_mat_t mat, slong r, slong s) +{ + if (r != s) FLINT_SWAP(double *, mat->rows[r], mat->rows[s]); +} /* Gram-Schmidt Orthogonalisation and QR Decomposition **********************/ diff --git a/src/d_vec.h b/src/d_vec.h index 1058b638d8..ae6f82c6e0 100644 --- a/src/d_vec.h +++ b/src/d_vec.h @@ -31,7 +31,12 @@ void _d_vec_clear(double * vec); /* Randomisation ***********************************************************/ -void _d_vec_randtest(double * f, flint_rand_t state, slong len, slong minexp, slong maxexp); +void _d_vec_randtest( + double * f, + flint_rand_t state, + slong len, + slong minexp, + slong maxexp); /* Assignment and basic manipulation ***************************************/ @@ -56,8 +61,16 @@ void _d_vec_sub(double * res, const double * vec1, const double * vec2, slong le double _d_vec_norm(const double * vec, slong len); -double _d_vec_dot_heuristic(const double * vec1, const double * vec2, slong len2, double * err); -double _d_vec_dot_thrice(const double * vec1, const double * vec2, slong len2, double * err); +double _d_vec_dot_heuristic( + const double * vec1, + const double * vec2, + slong len2, + double * err); +double _d_vec_dot_thrice( + const double * vec1, + const double * vec2, + slong len2, + double * err); double _d_vec_dot(const double * vec1, const double * vec2, slong len2); #ifdef __cplusplus diff --git a/src/fft.h b/src/fft.h index 7d1dac7d1e..cc5f35968e 100644 --- a/src/fft.h +++ b/src/fft.h @@ -91,86 +91,394 @@ void mpn_addmod_2expp1_1(mp_limb_t * r, mp_size_t limbs, mp_limb_signed_t c) } } -void fft_combine_limbs(mp_limb_t * res, mp_limb_t ** poly, slong length, mp_size_t coeff_limbs, mp_size_t output_limbs, mp_size_t total_limbs); -void fft_combine_bits(mp_limb_t * res, mp_limb_t ** poly, slong length, flint_bitcnt_t bits, mp_size_t output_limbs, mp_size_t total_limbs); - -mp_size_t fft_split_limbs(mp_limb_t ** poly, mp_srcptr limbs, mp_size_t total_limbs, mp_size_t coeff_limbs, mp_size_t output_limbs); -mp_size_t fft_split_bits(mp_limb_t ** poly, mp_srcptr limbs, mp_size_t total_limbs, flint_bitcnt_t bits, mp_size_t output_limbs); +void fft_combine_limbs( + mp_limb_t * res, + mp_limb_t ** poly, + slong length, + mp_size_t coeff_limbs, + mp_size_t output_limbs, + mp_size_t total_limbs); +void fft_combine_bits( + mp_limb_t * res, + mp_limb_t ** poly, + slong length, + flint_bitcnt_t bits, + mp_size_t output_limbs, + mp_size_t total_limbs); + +mp_size_t fft_split_limbs( + mp_limb_t ** poly, + mp_srcptr limbs, + mp_size_t total_limbs, + mp_size_t coeff_limbs, + mp_size_t output_limbs); +mp_size_t fft_split_bits( + mp_limb_t ** poly, + mp_srcptr limbs, + mp_size_t total_limbs, + flint_bitcnt_t bits, + mp_size_t output_limbs); void fermat_to_mpz(mpz_t m, mp_limb_t * i, mp_size_t limbs); void mpn_normmod_2expp1(mp_limb_t * t, mp_size_t limbs); -void butterfly_lshB(mp_limb_t * t, mp_limb_t * u, mp_limb_t * i1, mp_limb_t * i2, mp_size_t limbs, mp_size_t x, mp_size_t y); -void butterfly_rshB(mp_limb_t * t, mp_limb_t * u, mp_limb_t * i1, mp_limb_t * i2, mp_size_t limbs, mp_size_t x, mp_size_t y); +void butterfly_lshB( + mp_limb_t * t, + mp_limb_t * u, + mp_limb_t * i1, + mp_limb_t * i2, + mp_size_t limbs, + mp_size_t x, + mp_size_t y); +void butterfly_rshB( + mp_limb_t * t, + mp_limb_t * u, + mp_limb_t * i1, + mp_limb_t * i2, + mp_size_t limbs, + mp_size_t x, + mp_size_t y); void mpn_negmod_2expp1(mp_limb_t* z, const mp_limb_t* a, mp_size_t limbs); -void mpn_mul_2expmod_2expp1(mp_limb_t * t, mp_limb_t * i1, mp_size_t limbs, flint_bitcnt_t d); -void mpn_div_2expmod_2expp1(mp_limb_t * t, mp_limb_t * i1, mp_size_t limbs, flint_bitcnt_t d); - -void fft_adjust(mp_limb_t * r, mp_limb_t * i1, mp_size_t i, mp_size_t limbs, flint_bitcnt_t w); - -void fft_butterfly(mp_limb_t * s, mp_limb_t * t, mp_limb_t * i1, mp_limb_t * i2, mp_size_t i, mp_size_t limbs, flint_bitcnt_t w); -void ifft_butterfly(mp_limb_t * s, mp_limb_t * t, mp_limb_t * i1, mp_limb_t * i2, mp_size_t i, mp_size_t limbs, flint_bitcnt_t w); - -void fft_radix2(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2); -void ifft_radix2(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2); - -void fft_truncate1(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_size_t trunc); -void fft_truncate(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_size_t trunc); -void ifft_truncate1(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_size_t trunc); -void ifft_truncate(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_size_t trunc); - -void fft_butterfly_sqrt2(mp_limb_t * s, mp_limb_t * t, mp_limb_t * i1, mp_limb_t * i2, mp_size_t i, mp_size_t limbs, flint_bitcnt_t w, mp_limb_t * temp); -void ifft_butterfly_sqrt2(mp_limb_t * s, mp_limb_t * t, mp_limb_t * i1, mp_limb_t * i2, mp_size_t i, mp_size_t limbs, flint_bitcnt_t w, mp_limb_t * temp); - -void fft_adjust_sqrt2(mp_limb_t * r, mp_limb_t * i1, mp_size_t i, mp_size_t limbs, flint_bitcnt_t w, mp_limb_t * temp); - -void fft_truncate_sqrt2(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** temp, mp_size_t trunc); -void ifft_truncate_sqrt2(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** temp, mp_size_t trunc); - -void mul_truncate_sqrt2(mp_ptr r1, mp_srcptr i1, mp_size_t n1, mp_srcptr i2, mp_size_t n2, flint_bitcnt_t depth, flint_bitcnt_t w); - -void fft_butterfly_twiddle(mp_limb_t * u, mp_limb_t * v, mp_limb_t * s, mp_limb_t * t, mp_size_t limbs, flint_bitcnt_t b1, flint_bitcnt_t b2); -void ifft_butterfly_twiddle(mp_limb_t * u, mp_limb_t * v, mp_limb_t * s, mp_limb_t * t, mp_size_t limbs, flint_bitcnt_t b1, flint_bitcnt_t b2); - -void fft_radix2_twiddle(mp_limb_t ** ii, mp_size_t is, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_size_t ws, mp_size_t r, mp_size_t c, mp_size_t rs); -void ifft_radix2_twiddle(mp_limb_t ** ii, mp_size_t is, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_size_t ws, mp_size_t r, mp_size_t c, mp_size_t rs); - -void fft_truncate1_twiddle(mp_limb_t ** ii, mp_size_t is, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_size_t ws, mp_size_t r, mp_size_t c, mp_size_t rs, mp_size_t trunc); -void ifft_truncate1_twiddle(mp_limb_t ** ii, mp_size_t is, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_size_t ws, mp_size_t r, mp_size_t c, mp_size_t rs, mp_size_t trunc); - -void fft_mfa_truncate_sqrt2(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** temp, mp_size_t n1, mp_size_t trunc); -void ifft_mfa_truncate_sqrt2(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** temp, mp_size_t n1, mp_size_t trunc); - -void mul_mfa_truncate_sqrt2(mp_ptr r1, mp_srcptr i1, mp_size_t n1, mp_srcptr i2, mp_size_t n2, flint_bitcnt_t depth, flint_bitcnt_t w); - -void fft_mfa_truncate_sqrt2_outer(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** temp, mp_size_t n1, mp_size_t trunc); -void fft_mfa_truncate_sqrt2_inner(mp_limb_t ** ii, mp_limb_t ** jj, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** temp, mp_size_t n1, mp_size_t trunc, mp_limb_t ** tt); - -void ifft_mfa_truncate_sqrt2_outer(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** temp, mp_size_t n1, mp_size_t trunc); - -void fft_negacyclic(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** temp); -void ifft_negacyclic(mp_limb_t ** ii, mp_size_t n, flint_bitcnt_t w, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** temp); +void mpn_mul_2expmod_2expp1( + mp_limb_t * t, + mp_limb_t * i1, + mp_size_t limbs, + flint_bitcnt_t d); +void mpn_div_2expmod_2expp1( + mp_limb_t * t, + mp_limb_t * i1, + mp_size_t limbs, + flint_bitcnt_t d); + +void fft_adjust( + mp_limb_t * r, + mp_limb_t * i1, + mp_size_t i, + mp_size_t limbs, + flint_bitcnt_t w); + +void fft_butterfly( + mp_limb_t * s, + mp_limb_t * t, + mp_limb_t * i1, + mp_limb_t * i2, + mp_size_t i, + mp_size_t limbs, + flint_bitcnt_t w); +void ifft_butterfly( + mp_limb_t * s, + mp_limb_t * t, + mp_limb_t * i1, + mp_limb_t * i2, + mp_size_t i, + mp_size_t limbs, + flint_bitcnt_t w); + +void fft_radix2( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2); +void ifft_radix2( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2); + +void fft_truncate1( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_size_t trunc); +void fft_truncate( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_size_t trunc); +void ifft_truncate1( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_size_t trunc); +void ifft_truncate( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_size_t trunc); + +void fft_butterfly_sqrt2( + mp_limb_t * s, + mp_limb_t * t, + mp_limb_t * i1, + mp_limb_t * i2, + mp_size_t i, + mp_size_t limbs, + flint_bitcnt_t w, + mp_limb_t * temp); +void ifft_butterfly_sqrt2( + mp_limb_t * s, + mp_limb_t * t, + mp_limb_t * i1, + mp_limb_t * i2, + mp_size_t i, + mp_size_t limbs, + flint_bitcnt_t w, + mp_limb_t * temp); + +void fft_adjust_sqrt2( + mp_limb_t * r, + mp_limb_t * i1, + mp_size_t i, + mp_size_t limbs, + flint_bitcnt_t w, + mp_limb_t * temp); + +void fft_truncate_sqrt2( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** temp, + mp_size_t trunc); +void ifft_truncate_sqrt2( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** temp, + mp_size_t trunc); + +void mul_truncate_sqrt2( + mp_ptr r1, + mp_srcptr i1, + mp_size_t n1, + mp_srcptr i2, + mp_size_t n2, + flint_bitcnt_t depth, + flint_bitcnt_t w); + +void fft_butterfly_twiddle( + mp_limb_t * u, + mp_limb_t * v, + mp_limb_t * s, + mp_limb_t * t, + mp_size_t limbs, + flint_bitcnt_t b1, + flint_bitcnt_t b2); +void ifft_butterfly_twiddle( + mp_limb_t * u, + mp_limb_t * v, + mp_limb_t * s, + mp_limb_t * t, + mp_size_t limbs, + flint_bitcnt_t b1, + flint_bitcnt_t b2); + +void fft_radix2_twiddle( + mp_limb_t ** ii, + mp_size_t is, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_size_t ws, + mp_size_t r, + mp_size_t c, + mp_size_t rs); +void ifft_radix2_twiddle( + mp_limb_t ** ii, + mp_size_t is, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_size_t ws, + mp_size_t r, + mp_size_t c, + mp_size_t rs); + +void fft_truncate1_twiddle( + mp_limb_t ** ii, + mp_size_t is, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_size_t ws, + mp_size_t r, + mp_size_t c, + mp_size_t rs, + mp_size_t trunc); +void ifft_truncate1_twiddle( + mp_limb_t ** ii, + mp_size_t is, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_size_t ws, + mp_size_t r, + mp_size_t c, + mp_size_t rs, + mp_size_t trunc); + +void fft_mfa_truncate_sqrt2( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** temp, + mp_size_t n1, + mp_size_t trunc); +void ifft_mfa_truncate_sqrt2( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** temp, + mp_size_t n1, + mp_size_t trunc); + +void mul_mfa_truncate_sqrt2( + mp_ptr r1, + mp_srcptr i1, + mp_size_t n1, + mp_srcptr i2, + mp_size_t n2, + flint_bitcnt_t depth, + flint_bitcnt_t w); + +void fft_mfa_truncate_sqrt2_outer( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** temp, + mp_size_t n1, + mp_size_t trunc); +void fft_mfa_truncate_sqrt2_inner( + mp_limb_t ** ii, + mp_limb_t ** jj, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** temp, + mp_size_t n1, + mp_size_t trunc, + mp_limb_t ** tt); + +void ifft_mfa_truncate_sqrt2_outer( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** temp, + mp_size_t n1, + mp_size_t trunc); + +void fft_negacyclic( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** temp); +void ifft_negacyclic( + mp_limb_t ** ii, + mp_size_t n, + flint_bitcnt_t w, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** temp); void fft_naive_convolution_1(mp_limb_t * r, mp_limb_t * ii, mp_limb_t * jj, mp_size_t m); -void _fft_mulmod_2expp1(mp_limb_t * r1, mp_limb_t * i1, mp_limb_t * i2, mp_size_t r_limbs, flint_bitcnt_t depth, flint_bitcnt_t w); -void fft_mulmod_2expp1(mp_limb_t * r, mp_limb_t * i1, mp_limb_t * i2, mp_size_t n, mp_size_t w, mp_limb_t * tt); +void _fft_mulmod_2expp1( + mp_limb_t * r1, + mp_limb_t * i1, + mp_limb_t * i2, + mp_size_t r_limbs, + flint_bitcnt_t depth, + flint_bitcnt_t w); +void fft_mulmod_2expp1( + mp_limb_t * r, + mp_limb_t * i1, + mp_limb_t * i2, + mp_size_t n, + mp_size_t w, + mp_limb_t * tt); slong fft_adjust_limbs(mp_size_t limbs); -void flint_mpn_mul_fft_main(mp_ptr r1, mp_srcptr i1, mp_size_t n1, mp_srcptr i2, mp_size_t n2); - -void fft_convolution_basic(mp_limb_t ** ii, mp_limb_t ** jj, slong depth, slong limbs, slong trunc, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** s1, mp_limb_t ** tt); -void fft_convolution(mp_limb_t ** ii, mp_limb_t ** jj, slong depth, slong limbs, slong trunc, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** s1, mp_limb_t ** tt); +void flint_mpn_mul_fft_main( + mp_ptr r1, + mp_srcptr i1, + mp_size_t n1, + mp_srcptr i2, + mp_size_t n2); + +void fft_convolution_basic( + mp_limb_t ** ii, + mp_limb_t ** jj, + slong depth, + slong limbs, + slong trunc, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** s1, + mp_limb_t ** tt); +void fft_convolution( + mp_limb_t ** ii, + mp_limb_t ** jj, + slong depth, + slong limbs, + slong trunc, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** s1, + mp_limb_t ** tt); /***** FFT Precaching *****/ -void fft_precache(mp_limb_t ** jj, slong depth, slong limbs, slong trunc, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** s1); - -void fft_convolution_precache(mp_limb_t ** ii, mp_limb_t ** jj, slong depth, slong limbs, slong trunc, mp_limb_t ** t1, mp_limb_t ** t2, mp_limb_t ** s1, mp_limb_t ** tt); +void fft_precache( + mp_limb_t ** jj, + slong depth, + slong limbs, + slong trunc, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** s1); + +void fft_convolution_precache( + mp_limb_t ** ii, + mp_limb_t ** jj, + slong depth, + slong limbs, + slong trunc, + mp_limb_t ** t1, + mp_limb_t ** t2, + mp_limb_t ** s1, + mp_limb_t ** tt); #ifdef __cplusplus } diff --git a/src/fft_small.h b/src/fft_small.h index 2be07085a9..200f604632 100644 --- a/src/fft_small.h +++ b/src/fft_small.h @@ -47,8 +47,16 @@ FLINT_INLINE ulong n_next_pow2m1(ulong a) return a; } -FLINT_INLINE ulong n_leading_zeros(ulong x) { return x == 0 ? FLINT_BITS : flint_clz(x); } -FLINT_INLINE ulong n_trailing_zeros(ulong x) { return x == 0 ? FLINT_BITS : flint_ctz(x); } +FLINT_INLINE +ulong n_leading_zeros(ulong x) +{ + return x == 0 ? FLINT_BITS : flint_clz(x); +} +FLINT_INLINE +ulong n_trailing_zeros(ulong x) +{ + return x == 0 ? FLINT_BITS : flint_ctz(x); +} /* nbits is a mess @@ -63,11 +71,27 @@ FLINT_INLINE ulong n_trailing_zeros(ulong x) { return x == 0 ? FLINT_BITS : flin assuming x != 0: on x86 we want BSR + 1 */ -FLINT_INLINE ulong n_nbits(ulong x) { return (x == 0) ? 0 : FLINT_BITS - flint_clz(x); } -FLINT_INLINE ulong n_nbits_nz(ulong x) { FLINT_ASSERT(x != 0); return (flint_clz(x) ^ (FLINT_BITS - 1)) + 1; } +FLINT_INLINE +ulong n_nbits(ulong x) +{ + return (x == 0) ? 0 : FLINT_BITS - flint_clz(x); +} +FLINT_INLINE +ulong n_nbits_nz(ulong x) +{ + FLINT_ASSERT(x != 0); return (flint_clz(x) ^ (FLINT_BITS - 1)) + 1; +} -FLINT_INLINE ulong n_clog2(ulong x) { return (x <= 2) ? (x == 2) : FLINT_BITS - flint_clz(x - 1); } -FLINT_INLINE ulong n_flog2(ulong x) { return (x <= 2) ? (x == 2) : FLINT_BITS - flint_clz(x); } +FLINT_INLINE +ulong n_clog2(ulong x) +{ + return (x <= 2) ? (x == 2) : FLINT_BITS - flint_clz(x - 1); +} +FLINT_INLINE +ulong n_flog2(ulong x) +{ + return (x <= 2) ? (x == 2) : FLINT_BITS - flint_clz(x); +} FLINT_INLINE slong z_min(slong a, slong b) { return FLINT_MIN(a, b); } FLINT_INLINE slong z_max(slong a, slong b) { return FLINT_MAX(a, b); } @@ -160,16 +184,40 @@ typedef sd_fft_lctx_struct sd_fft_lctx_t[1]; and stores in the fft (unspecified vec4d_load) need to support unaligned addresses. */ -FLINT_INLINE ulong sd_fft_ctx_blk_offset(ulong I) { return (I << LG_BLK_SZ) + 4*(I >> (BLK_SHIFT+2)); } +FLINT_INLINE +ulong sd_fft_ctx_blk_offset(ulong I) +{ + return (I << LG_BLK_SZ) + 4*(I >> (BLK_SHIFT+2)); +} -FLINT_INLINE ulong sd_fft_ctx_data_size(ulong depth) { FLINT_ASSERT(depth >= LG_BLK_SZ); return sd_fft_ctx_blk_offset(n_pow2(depth - LG_BLK_SZ)); } +FLINT_INLINE +ulong sd_fft_ctx_data_size(ulong depth) +{ + FLINT_ASSERT(depth >= LG_BLK_SZ); return sd_fft_ctx_blk_offset(n_pow2(depth - LG_BLK_SZ)); +} -FLINT_INLINE double * sd_fft_ctx_blk_index(double * d, ulong I) { return d + sd_fft_ctx_blk_offset(I); } +FLINT_INLINE +double * sd_fft_ctx_blk_index(double * d, ulong I) +{ + return d + sd_fft_ctx_blk_offset(I); +} -FLINT_INLINE double * sd_fft_lctx_blk_index(const sd_fft_lctx_t Q, ulong I) { return Q->data + sd_fft_ctx_blk_offset(I); } +FLINT_INLINE +double * sd_fft_lctx_blk_index(const sd_fft_lctx_t Q, ulong I) +{ + return Q->data + sd_fft_ctx_blk_offset(I); +} -FLINT_INLINE void sd_fft_ctx_set_index(double * d, ulong i, double x) { sd_fft_ctx_blk_index(d, i/BLK_SZ)[i%BLK_SZ] = x; } -FLINT_INLINE double sd_fft_ctx_get_index(double * d, ulong i) { return sd_fft_ctx_blk_index(d, i/BLK_SZ)[i%BLK_SZ]; } +FLINT_INLINE +void sd_fft_ctx_set_index(double * d, ulong i, double x) +{ + sd_fft_ctx_blk_index(d, i/BLK_SZ)[i%BLK_SZ] = x; +} +FLINT_INLINE +double sd_fft_ctx_get_index(double * d, ulong i) +{ + return sd_fft_ctx_blk_index(d, i/BLK_SZ)[i%BLK_SZ]; +} /* slightly-worse-than-bit-reversed order of sd_{i}fft_basecase_4 */ FLINT_INLINE double sd_fft_ctx_get_fft_index(double * d, ulong i) @@ -199,7 +247,11 @@ FLINT_INLINE void sd_fft_lctx_init(sd_fft_lctx_t L, sd_fft_ctx_t Q, ulong depth) L->w2tab[i] = Q->w2tab[i]; } -FLINT_INLINE void sd_fft_lctx_clear(sd_fft_lctx_t LQ, sd_fft_ctx_t Q) { /* empty */ } +FLINT_INLINE +void sd_fft_lctx_clear(sd_fft_lctx_t LQ, sd_fft_ctx_t Q) +{ + /* empty */ +} FLINT_DLL void sd_fft_lctx_point_mul(const sd_fft_lctx_t Q, double * a, const double * b, ulong m_, ulong depth); FLINT_DLL void sd_fft_lctx_point_sqr(const sd_fft_lctx_t Q, double * a, ulong m_, ulong depth); @@ -292,14 +344,30 @@ FLINT_DLL void crt_data_init(crt_data_t C, ulong prime, ulong coeff_len, ulong n FLINT_DLL void crt_data_clear(crt_data_t C); /* return mpn of length C->coeff_len */ -FLINT_FORCE_INLINE ulong * _crt_data_co_prime(const crt_data_t C, ulong i, ulong n) { FLINT_ASSERT(i < C->nprimes); FLINT_ASSERT(n == C->coeff_len); return C->data + i * n; } -FLINT_FORCE_INLINE ulong * crt_data_co_prime(const crt_data_t C, ulong i) { FLINT_ASSERT(i < C->nprimes); return C->data + i * C->coeff_len; } +FLINT_FORCE_INLINE +ulong * _crt_data_co_prime(const crt_data_t C, ulong i, ulong n) +{ + FLINT_ASSERT(i < C->nprimes); FLINT_ASSERT(n == C->coeff_len); return C->data + i * n; +} +FLINT_FORCE_INLINE +ulong * crt_data_co_prime(const crt_data_t C, ulong i) +{ + FLINT_ASSERT(i < C->nprimes); return C->data + i * C->coeff_len; +} /* return mpn of length C->coeff_len */ -FLINT_FORCE_INLINE ulong * crt_data_prod_primes(const crt_data_t C) { return C->data + C->nprimes * C->coeff_len; } +FLINT_FORCE_INLINE +ulong * crt_data_prod_primes(const crt_data_t C) +{ + return C->data + C->nprimes * C->coeff_len; +} /* the reduction of co_prime mod the i^th prime */ -FLINT_FORCE_INLINE ulong * crt_data_co_prime_red(const crt_data_t C, ulong i) { FLINT_ASSERT(i < C->nprimes); return C->data + C->nprimes * C->coeff_len + C->coeff_len + i; } +FLINT_FORCE_INLINE +ulong * crt_data_co_prime_red(const crt_data_t C, ulong i) +{ + FLINT_ASSERT(i < C->nprimes); return C->data + C->nprimes * C->coeff_len + C->coeff_len + i; +} typedef void (* to_ffts_func)(sd_fft_ctx_struct * Qffts, double * d, ulong dstride, const ulong * a_, ulong an_, ulong atrunc, const vec4d * two_pow, ulong start_easy, ulong stop_easy, ulong start_hard, ulong stop_hard); @@ -345,7 +413,13 @@ typedef struct { typedef mpn_ctx_struct mpn_ctx_t[1]; -void _convert_block(ulong * Xs, sd_fft_ctx_struct * Rffts, double * d, ulong dstride, ulong np, ulong I); +void _convert_block( + ulong * Xs, + sd_fft_ctx_struct * Rffts, + double * d, + ulong dstride, + ulong np, + ulong I); ulong flint_mpn_nbits(const ulong * a, ulong an); int flint_mpn_cmp_ui_2exp(const ulong * a, ulong an, ulong b, ulong e); unsigned char flint_mpn_add_inplace_c(ulong * z, ulong zn, ulong * a, ulong an, unsigned char cf); @@ -353,12 +427,42 @@ unsigned char flint_mpn_add_inplace_c(ulong * z, ulong zn, ulong * a, ulong an, void mpn_ctx_init(mpn_ctx_t R, ulong p); void mpn_ctx_clear(mpn_ctx_t R); void * mpn_ctx_fit_buffer(mpn_ctx_t R, ulong n); -void mpn_ctx_mpn_mul(mpn_ctx_t R, ulong * z, const ulong * a, ulong an, const ulong * b, ulong bn); - -void _nmod_poly_divrem_mpn_ctx(ulong * q, ulong * r, const ulong * a, ulong an, const ulong * b, ulong bn, nmod_t mod, mpn_ctx_t R); - -void _nmod_poly_mul_mid_classical(ulong * z, slong zl, slong zh, const ulong * a, slong an, const ulong * b, slong bn, nmod_t mod); -void _nmod_poly_mul_mid(ulong * z, slong zl, slong zh, const ulong * a, slong an, const ulong * b, slong bn, nmod_t mod); +void mpn_ctx_mpn_mul( + mpn_ctx_t R, + ulong * z, + const ulong * a, + ulong an, + const ulong * b, + ulong bn); + +void _nmod_poly_divrem_mpn_ctx( + ulong * q, + ulong * r, + const ulong * a, + ulong an, + const ulong * b, + ulong bn, + nmod_t mod, + mpn_ctx_t R); + +void _nmod_poly_mul_mid_classical( + ulong * z, + slong zl, + slong zh, + const ulong * a, + slong an, + const ulong * b, + slong bn, + nmod_t mod); +void _nmod_poly_mul_mid( + ulong * z, + slong zl, + slong zh, + const ulong * a, + slong an, + const ulong * b, + slong bn, + nmod_t mod); typedef struct { @@ -372,10 +476,29 @@ typedef struct double * bbuf; } mul_precomp_struct; -void _mul_precomp_init(mul_precomp_struct * M, const ulong * b, ulong bn, ulong btrunc, ulong depth, nmod_t mod, mpn_ctx_t R); -FLINT_INLINE void _mul_precomp_clear(mul_precomp_struct * M) { flint_aligned_free(M->bbuf); } +void _mul_precomp_init( + mul_precomp_struct * M, + const ulong * b, + ulong bn, + ulong btrunc, + ulong depth, + nmod_t mod, + mpn_ctx_t R); +FLINT_INLINE +void _mul_precomp_clear(mul_precomp_struct * M) +{ + flint_aligned_free(M->bbuf); +} -int _nmod_poly_mul_mid_precomp(ulong * z, ulong zl, ulong zh, const ulong * a, ulong an, mul_precomp_struct * M, nmod_t mod, mpn_ctx_t R); +int _nmod_poly_mul_mid_precomp( + ulong * z, + ulong zl, + ulong zh, + const ulong * a, + ulong an, + mul_precomp_struct * M, + nmod_t mod, + mpn_ctx_t R); typedef struct { @@ -383,20 +506,74 @@ typedef struct mul_precomp_struct rem_maker[1]; } nmod_poly_divrem_precomp_struct; -void _nmod_poly_divrem_precomp_init(nmod_poly_divrem_precomp_struct * M, const ulong * b, ulong bn, ulong Bn, nmod_t mod, mpn_ctx_t R); -FLINT_INLINE void _nmod_poly_divrem_precomp_clear(nmod_poly_divrem_precomp_struct * M) { _mul_precomp_clear(M->quo_maker); _mul_precomp_clear(M->rem_maker); } +void _nmod_poly_divrem_precomp_init( + nmod_poly_divrem_precomp_struct * M, + const ulong * b, + ulong bn, + ulong Bn, + nmod_t mod, + mpn_ctx_t R); +FLINT_INLINE +void _nmod_poly_divrem_precomp_clear(nmod_poly_divrem_precomp_struct * M) +{ + _mul_precomp_clear(M->quo_maker); _mul_precomp_clear(M->rem_maker); +} -int _nmod_poly_divrem_precomp(ulong * q, ulong * r, const ulong * a, ulong an, nmod_poly_divrem_precomp_struct * M, nmod_t mod, mpn_ctx_t R); +int _nmod_poly_divrem_precomp( + ulong * q, + ulong * r, + const ulong * a, + ulong an, + nmod_poly_divrem_precomp_struct * M, + nmod_t mod, + mpn_ctx_t R); mpn_ctx_struct * get_default_mpn_ctx(void); -void mpn_mul_default_mpn_ctx(mp_ptr r1, mp_srcptr i1, mp_size_t n1, mp_srcptr i2, mp_size_t n2); - -void _nmod_poly_mul_mid_mpn_ctx(ulong * z, ulong zl, ulong zh, const ulong * a, ulong an, const ulong * b, ulong bn, nmod_t mod, mpn_ctx_t R); -int _fmpz_poly_mul_mid_mpn_ctx(fmpz * z, ulong zl, ulong zh, const fmpz * a, ulong an, const fmpz * b, ulong bn, mpn_ctx_t R); - -void _nmod_poly_mul_mid_default_mpn_ctx(mp_ptr res, slong zl, slong zh, mp_srcptr a, slong an, mp_srcptr b, slong bn, nmod_t mod); -int _fmpz_poly_mul_mid_default_mpn_ctx(fmpz * z, slong zl, slong zh, const fmpz * a, slong an, const fmpz * b, slong bn); +void mpn_mul_default_mpn_ctx( + mp_ptr r1, + mp_srcptr i1, + mp_size_t n1, + mp_srcptr i2, + mp_size_t n2); + +void _nmod_poly_mul_mid_mpn_ctx( + ulong * z, + ulong zl, + ulong zh, + const ulong * a, + ulong an, + const ulong * b, + ulong bn, + nmod_t mod, + mpn_ctx_t R); +int _fmpz_poly_mul_mid_mpn_ctx( + fmpz * z, + ulong zl, + ulong zh, + const fmpz * a, + ulong an, + const fmpz * b, + ulong bn, + mpn_ctx_t R); + +void _nmod_poly_mul_mid_default_mpn_ctx( + mp_ptr res, + slong zl, + slong zh, + mp_srcptr a, + slong an, + mp_srcptr b, + slong bn, + nmod_t mod); +int _fmpz_poly_mul_mid_default_mpn_ctx( + fmpz * z, + slong zl, + slong zh, + const fmpz * a, + slong an, + const fmpz * b, + slong bn); #ifdef __cplusplus } diff --git a/src/fmpq.h b/src/fmpq.h index c8d59c2ee0..f2fdaecf59 100644 --- a/src/fmpq.h +++ b/src/fmpq.h @@ -28,7 +28,11 @@ extern "C" { /* Memory management *********************************************************/ FMPQ_INLINE void fmpq_init(fmpq_t x) { x->num = WORD(0); x->den = WORD(1); } -FMPQ_INLINE void fmpq_clear(fmpq_t x) { fmpz_clear(fmpq_numref(x)); fmpz_clear(fmpq_denref(x)); } +FMPQ_INLINE +void fmpq_clear(fmpq_t x) +{ + fmpz_clear(fmpq_numref(x)); fmpz_clear(fmpq_denref(x)); +} /* inlines, for speed, use fmpq_numref and fmpq_denref defined in flint.h */ void fmpq_numerator(fmpz_t n, const fmpq_t q); @@ -61,21 +65,49 @@ void fmpq_randtest_not_zero(fmpq_t res, flint_rand_t state, flint_bitcnt_t bits) /* Assignments and conversions ***********************************************/ -FMPQ_INLINE void fmpq_zero(fmpq_t res) { fmpz_zero(fmpq_numref(res)); fmpz_one(fmpq_denref(res)); } -FMPQ_INLINE void fmpq_one(fmpq_t res) { fmpz_one(fmpq_numref(res)); fmpz_one(fmpq_denref(res)); } +FMPQ_INLINE +void fmpq_zero(fmpq_t res) +{ + fmpz_zero(fmpq_numref(res)); fmpz_one(fmpq_denref(res)); +} +FMPQ_INLINE +void fmpq_one(fmpq_t res) +{ + fmpz_one(fmpq_numref(res)); fmpz_one(fmpq_denref(res)); +} -FMPQ_INLINE void fmpq_swap(fmpq_t op1, fmpq_t op2) { fmpz_swap(fmpq_numref(op1), fmpq_numref(op2)); fmpz_swap(fmpq_denref(op1), fmpq_denref(op2)); } +FMPQ_INLINE +void fmpq_swap(fmpq_t op1, fmpq_t op2) +{ + fmpz_swap(fmpq_numref(op1), fmpq_numref(op2)); fmpz_swap(fmpq_denref(op1), fmpq_denref(op2)); +} void _fmpq_set_ui(fmpz_t rnum, fmpz_t rden, ulong p, ulong q); void fmpq_set_ui(fmpq_t res, ulong p, ulong q); void _fmpq_set_si(fmpz_t rnum, fmpz_t rden, slong p, ulong q); void fmpq_set_si(fmpq_t res, slong p, ulong q); -FMPQ_INLINE void fmpq_set_fmpz(fmpq_t q, const fmpz_t n) { fmpz_set(fmpq_numref(q), n); fmpz_one(fmpq_denref(q)); } +FMPQ_INLINE +void fmpq_set_fmpz(fmpq_t q, const fmpz_t n) +{ + fmpz_set(fmpq_numref(q), n); fmpz_one(fmpq_denref(q)); +} void fmpq_set_fmpz_frac(fmpq_t res, const fmpz_t p, const fmpz_t q); -FMPQ_INLINE void fmpq_set(fmpq_t dest, const fmpq_t src) { fmpz_set(fmpq_numref(dest), fmpq_numref(src)); fmpz_set(fmpq_denref(dest), fmpq_denref(src)); } +FMPQ_INLINE +void fmpq_set(fmpq_t dest, const fmpq_t src) +{ + fmpz_set(fmpq_numref(dest), fmpq_numref(src)); fmpz_set(fmpq_denref(dest), fmpq_denref(src)); +} -FMPQ_INLINE void fmpq_set_mpq(fmpq_t dest, const mpq_t src) { fmpz_set_mpz(fmpq_numref(dest), mpq_numref(src)); fmpz_set_mpz(fmpq_denref(dest), mpq_denref(src)); } -FMPQ_INLINE void fmpq_get_mpq(mpq_t dest, const fmpq_t src) { fmpz_get_mpz(mpq_numref(dest), fmpq_numref(src)); fmpz_get_mpz(mpq_denref(dest), fmpq_denref(src)); } +FMPQ_INLINE +void fmpq_set_mpq(fmpq_t dest, const mpq_t src) +{ + fmpz_set_mpz(fmpq_numref(dest), mpq_numref(src)); fmpz_set_mpz(fmpq_denref(dest), mpq_denref(src)); +} +FMPQ_INLINE +void fmpq_get_mpq(mpq_t dest, const fmpq_t src) +{ + fmpz_get_mpz(mpq_numref(dest), fmpq_numref(src)); fmpz_get_mpz(mpq_denref(dest), fmpq_denref(src)); +} void fmpq_get_mpz_frac(mpz_t a, mpz_t b, fmpq_t c); @@ -87,14 +119,38 @@ int fmpq_get_mpfr(mpfr_t r, const fmpq_t x, mpfr_rnd_t rnd); /* Comparisons ***************************************************************/ -FMPQ_INLINE int fmpq_is_zero(const fmpq_t x) { return fmpz_is_zero(fmpq_numref(x)); } -FMPQ_INLINE int fmpq_is_one(const fmpq_t x) { return fmpz_is_one(fmpq_numref(x)) && fmpz_is_one(fmpq_denref(x)); } -FMPQ_INLINE int fmpq_is_pm1(const fmpq_t x) { return fmpz_is_pm1(fmpq_numref(x)) && fmpz_is_one(fmpq_denref(x)); } +FMPQ_INLINE +int fmpq_is_zero(const fmpq_t x) +{ + return fmpz_is_zero(fmpq_numref(x)); +} +FMPQ_INLINE +int fmpq_is_one(const fmpq_t x) +{ + return fmpz_is_one(fmpq_numref(x)) && fmpz_is_one(fmpq_denref(x)); +} +FMPQ_INLINE +int fmpq_is_pm1(const fmpq_t x) +{ + return fmpz_is_pm1(fmpq_numref(x)) && fmpz_is_one(fmpq_denref(x)); +} -FMPQ_INLINE int fmpq_equal_ui(fmpq_t q, ulong n) { return fmpz_equal_ui(fmpq_numref(q), n) && fmpz_is_one(fmpq_denref(q)); } -FMPQ_INLINE int fmpq_equal_si(fmpq_t q, slong n) { return fmpz_equal_si(fmpq_numref(q), n) && fmpz_is_one(fmpq_denref(q)); } +FMPQ_INLINE +int fmpq_equal_ui(fmpq_t q, ulong n) +{ + return fmpz_equal_ui(fmpq_numref(q), n) && fmpz_is_one(fmpq_denref(q)); +} +FMPQ_INLINE +int fmpq_equal_si(fmpq_t q, slong n) +{ + return fmpz_equal_si(fmpq_numref(q), n) && fmpz_is_one(fmpq_denref(q)); +} int fmpq_equal_fmpz(fmpq_t q, fmpz_t n); -FMPQ_INLINE int fmpq_equal(const fmpq_t x, const fmpq_t y) { return fmpz_equal(fmpq_numref(x), fmpq_numref(y)) && fmpz_equal(fmpq_denref(x), fmpq_denref(y)); } +FMPQ_INLINE +int fmpq_equal(const fmpq_t x, const fmpq_t y) +{ + return fmpz_equal(fmpq_numref(x), fmpq_numref(y)) && fmpz_equal(fmpq_denref(x), fmpq_denref(y)); +} int _fmpq_cmp_si(const fmpz_t p, const fmpz_t q, slong c); int fmpq_cmp_si(const fmpq_t x, slong c); @@ -131,23 +187,53 @@ void _fmpq_add_si(fmpz_t rnum, fmpz_t rden, const fmpz_t p, const fmpz_t q, slon void fmpq_add_si(fmpq_t res, const fmpq_t op1, slong c); void _fmpq_add_ui(fmpz_t rnum, fmpz_t rden, const fmpz_t p, const fmpz_t q, ulong r); void fmpq_add_ui(fmpq_t res, const fmpq_t op1, ulong c); -void _fmpq_add_fmpz(fmpz_t rnum, fmpz_t rden, const fmpz_t p, const fmpz_t q, const fmpz_t r); +void _fmpq_add_fmpz( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t p, + const fmpz_t q, + const fmpz_t r); void fmpq_add_fmpz(fmpq_t res, const fmpq_t op1, const fmpz_t c); void _fmpq_add_small(fmpz_t rnum, fmpz_t rden, slong p1, ulong q1, slong p2, ulong q2); -void _fmpq_add(fmpz_t rnum, fmpz_t rden, const fmpz_t op1num, const fmpz_t op1den, const fmpz_t op2num, const fmpz_t op2den); +void _fmpq_add( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t op1num, + const fmpz_t op1den, + const fmpz_t op2num, + const fmpz_t op2den); void fmpq_add(fmpq_t res, const fmpq_t op1, const fmpq_t op2); void _fmpq_sub_si(fmpz_t rnum, fmpz_t rden, const fmpz_t p, const fmpz_t q, slong r); void fmpq_sub_si(fmpq_t res, const fmpq_t op1, slong c); void _fmpq_sub_ui(fmpz_t rnum, fmpz_t rden, const fmpz_t p, const fmpz_t q, ulong r); void fmpq_sub_ui(fmpq_t res, const fmpq_t op1, ulong c); -void _fmpq_sub_fmpz(fmpz_t rnum, fmpz_t rden, const fmpz_t p, const fmpz_t q, const fmpz_t r); +void _fmpq_sub_fmpz( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t p, + const fmpz_t q, + const fmpz_t r); void fmpq_sub_fmpz(fmpq_t res, const fmpq_t op1, const fmpz_t c); -void _fmpq_sub(fmpz_t rnum, fmpz_t rden, const fmpz_t op1num, const fmpz_t op1den, const fmpz_t op2num, const fmpz_t op2den); +void _fmpq_sub( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t op1num, + const fmpz_t op1den, + const fmpz_t op2num, + const fmpz_t op2den); void fmpq_sub(fmpq_t res, const fmpq_t op1, const fmpq_t op2); -FMPQ_INLINE void fmpq_neg(fmpq_t dest, const fmpq_t src) { fmpz_neg(fmpq_numref(dest), fmpq_numref(src)); fmpz_set(fmpq_denref(dest), fmpq_denref(src)); } -FMPQ_INLINE void fmpq_abs(fmpq_t dest, const fmpq_t src) { fmpz_abs(fmpq_numref(dest), fmpq_numref(src)); fmpz_set(fmpq_denref(dest), fmpq_denref(src)); } +FMPQ_INLINE +void fmpq_neg(fmpq_t dest, const fmpq_t src) +{ + fmpz_neg(fmpq_numref(dest), fmpq_numref(src)); fmpz_set(fmpq_denref(dest), fmpq_denref(src)); +} +FMPQ_INLINE +void fmpq_abs(fmpq_t dest, const fmpq_t src) +{ + fmpz_abs(fmpq_numref(dest), fmpq_numref(src)); fmpz_set(fmpq_denref(dest), fmpq_denref(src)); +} void _fmpq_mul_si(fmpz_t rnum, fmpz_t rden, const fmpz_t p, const fmpz_t q, slong r); void fmpq_mul_si(fmpq_t res, const fmpq_t op1, slong c); @@ -155,24 +241,53 @@ void _fmpq_mul_ui(fmpz_t rnum, fmpz_t rden, const fmpz_t p, const fmpz_t q, ulon void fmpq_mul_ui(fmpq_t res, const fmpq_t op1, ulong c); void fmpq_mul_fmpz(fmpq_t res, const fmpq_t op, const fmpz_t x); void _fmpq_mul_small(fmpz_t rnum, fmpz_t rden, slong p1, ulong q1, slong p2, ulong q2); -void _fmpq_mul(fmpz_t rnum, fmpz_t rden, const fmpz_t op1num, const fmpz_t op1den, const fmpz_t op2num, const fmpz_t op2den); +void _fmpq_mul( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t op1num, + const fmpz_t op1den, + const fmpz_t op2num, + const fmpz_t op2den); void fmpq_mul(fmpq_t res, const fmpq_t op1, const fmpq_t op2); void fmpq_mul_2exp(fmpq_t res, const fmpq_t x, flint_bitcnt_t exp); void fmpq_div_fmpz(fmpq_t res, const fmpq_t op, const fmpz_t x); -void _fmpq_div(fmpz_t rnum, fmpz_t rden, const fmpz_t op1num, const fmpz_t op1den, const fmpz_t op2num, const fmpz_t op2den); +void _fmpq_div( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t op1num, + const fmpz_t op1den, + const fmpz_t op2num, + const fmpz_t op2den); void fmpq_div(fmpq_t res, const fmpq_t op1, const fmpq_t op2); void fmpq_div_2exp(fmpq_t res, const fmpq_t x, flint_bitcnt_t exp); void fmpq_inv(fmpq_t dest, const fmpq_t src); -void _fmpq_addmul(fmpz_t rnum, fmpz_t rden, const fmpz_t op1num, const fmpz_t op1den, const fmpz_t op2num, const fmpz_t op2den); +void _fmpq_addmul( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t op1num, + const fmpz_t op1den, + const fmpz_t op2num, + const fmpz_t op2den); void fmpq_addmul(fmpq_t res, const fmpq_t op1, const fmpq_t op2); -void _fmpq_submul(fmpz_t rnum, fmpz_t rden, const fmpz_t op1num, const fmpz_t op1den, const fmpz_t op2num, const fmpz_t op2den); +void _fmpq_submul( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t op1num, + const fmpz_t op1den, + const fmpz_t op2num, + const fmpz_t op2den); void fmpq_submul(fmpq_t res, const fmpq_t op1, const fmpq_t op2); -void _fmpq_pow_si(fmpz_t rnum, fmpz_t rden, const fmpz_t opnum, const fmpz_t opden, slong e); +void _fmpq_pow_si( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t opnum, + const fmpz_t opden, + slong e); void fmpq_pow_si(fmpq_t rop, const fmpq_t op, slong e); int fmpq_pow_fmpz(fmpq_t a, const fmpq_t b, const fmpz_t e); @@ -184,35 +299,84 @@ int fmpq_mod_fmpz(fmpz_t res, const fmpq_t x, const fmpz_t mod); int _fmpq_reconstruct_fmpz(fmpz_t num, fmpz_t den, const fmpz_t a, const fmpz_t m); int fmpq_reconstruct_fmpz(fmpq_t res, const fmpz_t a, const fmpz_t m); -int _fmpq_reconstruct_fmpz_2_naive(fmpz_t n, fmpz_t d, const fmpz_t a, const fmpz_t m, const fmpz_t N, const fmpz_t D); -int _fmpq_reconstruct_fmpz_2(fmpz_t n, fmpz_t d, const fmpz_t a, const fmpz_t m, const fmpz_t N, const fmpz_t D); -int fmpq_reconstruct_fmpz_2(fmpq_t res, const fmpz_t a, const fmpz_t m, const fmpz_t N, const fmpz_t D); +int _fmpq_reconstruct_fmpz_2_naive( + fmpz_t n, + fmpz_t d, + const fmpz_t a, + const fmpz_t m, + const fmpz_t N, + const fmpz_t D); +int _fmpq_reconstruct_fmpz_2( + fmpz_t n, + fmpz_t d, + const fmpz_t a, + const fmpz_t m, + const fmpz_t N, + const fmpz_t D); +int fmpq_reconstruct_fmpz_2( + fmpq_t res, + const fmpz_t a, + const fmpz_t m, + const fmpz_t N, + const fmpz_t D); /* GCD ***********************************************************************/ -void _fmpq_gcd(fmpz_t rnum, fmpz_t rden, const fmpz_t p, const fmpz_t q, const fmpz_t r, const fmpz_t s); +void _fmpq_gcd( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t p, + const fmpz_t q, + const fmpz_t r, + const fmpz_t s); void fmpq_gcd(fmpq_t res, const fmpq_t op1, const fmpq_t op2); -void _fmpq_gcd_cofactors(fmpz_t ng, fmpz_t dg, fmpz_t A, fmpz_t B, const fmpz_t na, const fmpz_t da, const fmpz_t nb, const fmpz_t db); +void _fmpq_gcd_cofactors( + fmpz_t ng, + fmpz_t dg, + fmpz_t A, + fmpz_t B, + const fmpz_t na, + const fmpz_t da, + const fmpz_t nb, + const fmpz_t db); void fmpq_gcd_cofactors(fmpq_t g, fmpz_t A, fmpz_t B, const fmpq_t a, const fmpq_t b); /* Rational enumeration ******************************************************/ -void _fmpq_next_calkin_wilf(fmpz_t rnum, fmpz_t rden, const fmpz_t num, const fmpz_t den); +void _fmpq_next_calkin_wilf( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t num, + const fmpz_t den); void fmpq_next_calkin_wilf(fmpq_t res, const fmpq_t x); -void _fmpq_next_signed_calkin_wilf(fmpz_t rnum, fmpz_t rden, const fmpz_t num, const fmpz_t den); +void _fmpq_next_signed_calkin_wilf( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t num, + const fmpz_t den); void fmpq_next_signed_calkin_wilf(fmpq_t res, const fmpq_t x); void _fmpq_next_minimal(fmpz_t rnum, fmpz_t rden, const fmpz_t num, const fmpz_t den); void fmpq_next_minimal(fmpq_t res, const fmpq_t x); -void _fmpq_next_signed_minimal(fmpz_t rnum, fmpz_t rden, const fmpz_t num, const fmpz_t den); +void _fmpq_next_signed_minimal( + fmpz_t rnum, + fmpz_t rden, + const fmpz_t num, + const fmpz_t den); void fmpq_next_signed_minimal(fmpq_t res, const fmpq_t x); void fmpq_farey_neighbors(fmpq_t left, fmpq_t right, const fmpq_t mid, const fmpz_t Q); -void _fmpq_simplest_between(fmpz_t mid_num, fmpz_t mid_den, const fmpz_t l_num, const fmpz_t l_den, const fmpz_t r_num, const fmpz_t r_den); +void _fmpq_simplest_between( + fmpz_t mid_num, + fmpz_t mid_den, + const fmpz_t l_num, + const fmpz_t l_den, + const fmpz_t r_num, + const fmpz_t r_den); void fmpq_simplest_between(fmpq_t mid, const fmpq_t l, const fmpq_t r); /* Continued fractions *******************************************************/ diff --git a/src/fmpq_mat.h b/src/fmpq_mat.h index b29e70274f..36aa4523ab 100644 --- a/src/fmpq_mat.h +++ b/src/fmpq_mat.h @@ -24,10 +24,22 @@ extern "C" { #endif -FMPQ_MAT_INLINE fmpq * fmpq_mat_entry(const fmpq_mat_t mat, slong i, slong j) { return mat->rows[i] + j; } +FMPQ_MAT_INLINE +fmpq * fmpq_mat_entry(const fmpq_mat_t mat, slong i, slong j) +{ + return mat->rows[i] + j; +} -FMPQ_MAT_INLINE fmpz * fmpq_mat_entry_num(const fmpq_mat_t mat, slong i, slong j) { return fmpq_numref(fmpq_mat_entry(mat, i, j)); } -FMPQ_MAT_INLINE fmpz * fmpq_mat_entry_den(const fmpq_mat_t mat, slong i, slong j) { return fmpq_denref(fmpq_mat_entry(mat, i, j)); } +FMPQ_MAT_INLINE +fmpz * fmpq_mat_entry_num(const fmpq_mat_t mat, slong i, slong j) +{ + return fmpq_numref(fmpq_mat_entry(mat, i, j)); +} +FMPQ_MAT_INLINE +fmpz * fmpq_mat_entry_den(const fmpq_mat_t mat, slong i, slong j) +{ + return fmpq_denref(fmpq_mat_entry(mat, i, j)); +} FMPQ_MAT_INLINE slong fmpq_mat_nrows(const fmpq_mat_t mat) { return mat->r; } FMPQ_MAT_INLINE slong fmpq_mat_ncols(const fmpq_mat_t mat) { return mat->c; } @@ -41,11 +53,23 @@ void fmpq_mat_swap_entrywise(fmpq_mat_t mat1, fmpq_mat_t mat2); /* Windows and concatenation *************************************************/ -void fmpq_mat_window_init(fmpq_mat_t window, const fmpq_mat_t mat, slong r1, slong c1, slong r2, slong c2); +void fmpq_mat_window_init( + fmpq_mat_t window, + const fmpq_mat_t mat, + slong r1, + slong c1, + slong r2, + slong c2); void fmpq_mat_window_clear(fmpq_mat_t window); -void fmpq_mat_concat_horizontal(fmpq_mat_t res, const fmpq_mat_t mat1, const fmpq_mat_t mat2); -void fmpq_mat_concat_vertical(fmpq_mat_t res, const fmpq_mat_t mat1, const fmpq_mat_t mat2); +void fmpq_mat_concat_horizontal( + fmpq_mat_t res, + const fmpq_mat_t mat1, + const fmpq_mat_t mat2); +void fmpq_mat_concat_vertical( + fmpq_mat_t res, + const fmpq_mat_t mat1, + const fmpq_mat_t mat2); /* Input and output **********************************************************/ @@ -89,25 +113,50 @@ int fmpq_mat_is_integral(const fmpq_mat_t mat); int fmpq_mat_is_zero(const fmpq_mat_t mat); int fmpq_mat_is_one(const fmpq_mat_t mat); -FMPQ_MAT_INLINE int fmpq_mat_is_empty(const fmpq_mat_t mat) { return (mat->r == 0) || (mat->c == 0); } -FMPQ_MAT_INLINE int fmpq_mat_is_square(const fmpq_mat_t mat) { return (mat->r == mat->c); } +FMPQ_MAT_INLINE +int fmpq_mat_is_empty(const fmpq_mat_t mat) +{ + return (mat->r == 0) || (mat->c == 0); +} +FMPQ_MAT_INLINE +int fmpq_mat_is_square(const fmpq_mat_t mat) +{ + return (mat->r == mat->c); +} /* Integer matrix conversion *************************************************/ int fmpq_mat_get_fmpz_mat(fmpz_mat_t dest, const fmpq_mat_t mat); -void fmpq_mat_get_fmpz_mat_entrywise(fmpz_mat_t num, fmpz_mat_t den, const fmpq_mat_t mat); +void fmpq_mat_get_fmpz_mat_entrywise( + fmpz_mat_t num, + fmpz_mat_t den, + const fmpq_mat_t mat); void fmpq_mat_get_fmpz_mat_matwise(fmpz_mat_t num, fmpz_t den, const fmpq_mat_t mat); void fmpq_mat_get_fmpz_mat_rowwise(fmpz_mat_t num, fmpz * den, const fmpq_mat_t mat); -void fmpq_mat_get_fmpz_mat_rowwise_2(fmpz_mat_t num, fmpz_mat_t num2, fmpz * den, const fmpq_mat_t mat, const fmpq_mat_t mat2); +void fmpq_mat_get_fmpz_mat_rowwise_2( + fmpz_mat_t num, + fmpz_mat_t num2, + fmpz * den, + const fmpq_mat_t mat, + const fmpq_mat_t mat2); void fmpq_mat_get_fmpz_mat_colwise(fmpz_mat_t num, fmpz * den, const fmpq_mat_t mat); -void fmpq_mat_get_fmpz_mat_mod_fmpz(fmpz_mat_t dest, const fmpq_mat_t mat, const fmpz_t mod); +void fmpq_mat_get_fmpz_mat_mod_fmpz( + fmpz_mat_t dest, + const fmpq_mat_t mat, + const fmpz_t mod); void fmpq_mat_set_fmpz_mat(fmpq_mat_t dest, const fmpz_mat_t src); -void fmpq_mat_set_fmpz_mat_div_fmpz(fmpq_mat_t X, const fmpz_mat_t Xmod, const fmpz_t div); +void fmpq_mat_set_fmpz_mat_div_fmpz( + fmpq_mat_t X, + const fmpz_mat_t Xmod, + const fmpz_t div); -int fmpq_mat_set_fmpz_mat_mod_fmpz(fmpq_mat_t X, const fmpz_mat_t Xmod, const fmpz_t mod); +int fmpq_mat_set_fmpz_mat_mod_fmpz( + fmpq_mat_t X, + const fmpz_mat_t Xmod, + const fmpz_t mod); /* Matrix multiplication *****************************************************/ @@ -122,16 +171,32 @@ void fmpq_mat_mul_fmpz_mat(fmpq_mat_t C, const fmpq_mat_t A, const fmpz_mat_t B) void fmpq_mat_mul_r_fmpz_mat(fmpq_mat_t C, const fmpz_mat_t A, const fmpq_mat_t B); void fmpq_mat_mul_fmpq_vec(fmpq * c, const fmpq_mat_t A, const fmpq * b, slong blen); -void fmpq_mat_mul_fmpq_vec_ptr(fmpq * const * c, const fmpq_mat_t A, const fmpq * const * b, slong blen); +void fmpq_mat_mul_fmpq_vec_ptr( + fmpq * const * c, + const fmpq_mat_t A, + const fmpq * const * b, + slong blen); void fmpq_mat_mul_fmpz_vec(fmpq* c, const fmpq_mat_t A, const fmpz * b, slong blen); -void fmpq_mat_mul_fmpz_vec_ptr(fmpq * const * c, const fmpq_mat_t A, const fmpz * const * b, slong blen); +void fmpq_mat_mul_fmpz_vec_ptr( + fmpq * const * c, + const fmpq_mat_t A, + const fmpz * const * b, + slong blen); void fmpq_mat_fmpq_vec_mul(fmpq* c, const fmpq* a, slong alen, const fmpq_mat_t B); -void fmpq_mat_fmpq_vec_mul_ptr(fmpq * const * c, const fmpq * const * a, slong alen, const fmpq_mat_t B); +void fmpq_mat_fmpq_vec_mul_ptr( + fmpq * const * c, + const fmpq * const * a, + slong alen, + const fmpq_mat_t B); void fmpq_mat_fmpz_vec_mul(fmpq * c, const fmpz * a, slong alen, const fmpq_mat_t B); -void fmpq_mat_fmpz_vec_mul_ptr(fmpq * const * c, const fmpz * const * a, slong alen, const fmpq_mat_t B); +void fmpq_mat_fmpz_vec_mul_ptr( + fmpq * const * c, + const fmpz * const * a, + slong alen, + const fmpq_mat_t B); /* Kronecker product *********************************************************/ @@ -155,24 +220,39 @@ void fmpq_mat_det(fmpq_t det, const fmpq_mat_t mat); /* Nonsingular solving *******************************************************/ -int fmpq_mat_solve_fmpz_mat_fraction_free(fmpq_mat_t X, const fmpz_mat_t A, const fmpz_mat_t B); +int fmpq_mat_solve_fmpz_mat_fraction_free( + fmpq_mat_t X, + const fmpz_mat_t A, + const fmpz_mat_t B); int fmpq_mat_solve_fraction_free(fmpq_mat_t X, const fmpq_mat_t A, const fmpq_mat_t B); int fmpq_mat_solve_fmpz_mat_dixon(fmpq_mat_t X, const fmpz_mat_t A, const fmpz_mat_t B); int fmpq_mat_solve_dixon(fmpq_mat_t X, const fmpq_mat_t A, const fmpq_mat_t B); -int fmpq_mat_solve_fmpz_mat_multi_mod(fmpq_mat_t X, const fmpz_mat_t A, const fmpz_mat_t B); +int fmpq_mat_solve_fmpz_mat_multi_mod( + fmpq_mat_t X, + const fmpz_mat_t A, + const fmpz_mat_t B); int fmpq_mat_solve_multi_mod(fmpq_mat_t X, const fmpq_mat_t A, const fmpq_mat_t B); int fmpq_mat_solve_fmpz_mat(fmpq_mat_t X, const fmpz_mat_t A, const fmpz_mat_t B); int fmpq_mat_solve(fmpq_mat_t X, const fmpq_mat_t A, const fmpq_mat_t B); -int fmpq_mat_can_solve_fraction_free(fmpq_mat_t X, const fmpq_mat_t A, const fmpq_mat_t B); +int fmpq_mat_can_solve_fraction_free( + fmpq_mat_t X, + const fmpq_mat_t A, + const fmpq_mat_t B); -int fmpq_mat_can_solve_fmpz_mat_dixon(fmpq_mat_t X, const fmpz_mat_t A, const fmpz_mat_t B); +int fmpq_mat_can_solve_fmpz_mat_dixon( + fmpq_mat_t X, + const fmpz_mat_t A, + const fmpz_mat_t B); int fmpq_mat_can_solve_dixon(fmpq_mat_t X, const fmpq_mat_t A, const fmpq_mat_t B); -int fmpq_mat_can_solve_fmpz_mat_multi_mod(fmpq_mat_t X, const fmpz_mat_t A, const fmpz_mat_t B); +int fmpq_mat_can_solve_fmpz_mat_multi_mod( + fmpq_mat_t X, + const fmpz_mat_t A, + const fmpz_mat_t B); int fmpq_mat_can_solve_multi_mod(fmpq_mat_t X, const fmpq_mat_t A, const fmpq_mat_t B); int fmpq_mat_can_solve(fmpq_mat_t X, const fmpq_mat_t A, const fmpq_mat_t B); diff --git a/src/fmpq_mpoly.h b/src/fmpq_mpoly.h index 4673d9620e..ab59061e7b 100644 --- a/src/fmpq_mpoly.h +++ b/src/fmpq_mpoly.h @@ -164,10 +164,17 @@ char * fmpq_mpoly_get_str_pretty(const fmpq_mpoly_t A, const char ** x, const fmpq_mpoly_ctx_t ctx); #ifdef FLINT_HAVE_FILE -int fmpq_mpoly_fprint_pretty(FILE * file, const fmpq_mpoly_t A, const char ** x, const fmpq_mpoly_ctx_t ctx); +int fmpq_mpoly_fprint_pretty( + FILE * file, + const fmpq_mpoly_t A, + const char ** x, + const fmpq_mpoly_ctx_t ctx); #endif -int fmpq_mpoly_print_pretty(const fmpq_mpoly_t A, const char ** x, const fmpq_mpoly_ctx_t ctx); +int fmpq_mpoly_print_pretty( + const fmpq_mpoly_t A, + const char ** x, + const fmpq_mpoly_ctx_t ctx); /* Basic manipulation *******************************************************/ @@ -873,7 +880,10 @@ void fmpq_mpoly_univar_swap_term_coeff(fmpq_mpoly_t c, ******************************************************************************/ -void fmpq_mpoly_remainder_test(const fmpq_mpoly_t r, const fmpq_mpoly_t g, const fmpq_mpoly_ctx_t ctx); +void fmpq_mpoly_remainder_test( + const fmpq_mpoly_t r, + const fmpq_mpoly_t g, + const fmpq_mpoly_ctx_t ctx); #ifdef __cplusplus } diff --git a/src/fmpq_mpoly_factor.h b/src/fmpq_mpoly_factor.h index 4a166174fe..1c02d95948 100644 --- a/src/fmpq_mpoly_factor.h +++ b/src/fmpq_mpoly_factor.h @@ -25,20 +25,46 @@ extern "C" { #endif void fmpq_mpoly_factor_init(fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx); -void fmpq_mpoly_factor_realloc(fmpq_mpoly_factor_t f, slong alloc, const fmpq_mpoly_ctx_t ctx); +void fmpq_mpoly_factor_realloc( + fmpq_mpoly_factor_t f, + slong alloc, + const fmpq_mpoly_ctx_t ctx); void fmpq_mpoly_factor_clear(fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx); -void fmpq_mpoly_factor_fit_length(fmpq_mpoly_factor_t f, slong len, const fmpq_mpoly_ctx_t ctx); +void fmpq_mpoly_factor_fit_length( + fmpq_mpoly_factor_t f, + slong len, + const fmpq_mpoly_ctx_t ctx); -FMPQ_MPOLY_FACTOR_INLINE slong fmpq_mpoly_factor_length(const fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx) { return f->num; } +FMPQ_MPOLY_FACTOR_INLINE +slong fmpq_mpoly_factor_length(const fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx) +{ + return f->num; +} -FMPQ_MPOLY_FACTOR_INLINE void fmpq_mpoly_factor_get_constant_fmpq(fmpq_t c, const fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx) { fmpq_set(c, f->constant); } +FMPQ_MPOLY_FACTOR_INLINE +void fmpq_mpoly_factor_get_constant_fmpq(fmpq_t c, const fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx) +{ + fmpq_set(c, f->constant); +} -FMPQ_MPOLY_FACTOR_INLINE void fmpq_mpoly_factor_get_base(fmpq_mpoly_t p, const fmpq_mpoly_factor_t f, slong i, const fmpq_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); fmpq_mpoly_set(p, f->poly + i, ctx); } +FMPQ_MPOLY_FACTOR_INLINE +void fmpq_mpoly_factor_get_base(fmpq_mpoly_t p, const fmpq_mpoly_factor_t f, slong i, const fmpq_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); fmpq_mpoly_set(p, f->poly + i, ctx); +} -FMPQ_MPOLY_FACTOR_INLINE void fmpq_mpoly_factor_swap_base(fmpq_mpoly_t p, fmpq_mpoly_factor_t f, slong i, const fmpq_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); fmpq_mpoly_swap(p, f->poly + i, ctx); } +FMPQ_MPOLY_FACTOR_INLINE +void fmpq_mpoly_factor_swap_base(fmpq_mpoly_t p, fmpq_mpoly_factor_t f, slong i, const fmpq_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); fmpq_mpoly_swap(p, f->poly + i, ctx); +} -FMPQ_MPOLY_FACTOR_INLINE slong fmpq_mpoly_factor_get_exp_si(fmpq_mpoly_factor_t f, slong i, const fmpq_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); return fmpz_get_si(f->exp + i); } +FMPQ_MPOLY_FACTOR_INLINE +slong fmpq_mpoly_factor_get_exp_si(fmpq_mpoly_factor_t f, slong i, const fmpq_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); return fmpz_get_si(f->exp + i); +} void fmpq_mpoly_factor_sort(fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx); @@ -46,12 +72,25 @@ int fmpq_mpoly_factor_make_monic(fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t c int fmpq_mpoly_factor_make_integral(fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx); -int fmpq_mpoly_factor_squarefree(fmpq_mpoly_factor_t f, const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx); -int fmpq_mpoly_factor(fmpq_mpoly_factor_t f, const fmpq_mpoly_t A, const fmpq_mpoly_ctx_t ctx); - -void _fmpq_mpoly_factor_swap_fmpz_mpoly_factor(fmpq_mpoly_factor_t f, fmpz_mpoly_factor_t g, const fmpq_t c, const fmpq_mpoly_ctx_t ctx); - -int fmpq_mpoly_factor_expand(fmpq_mpoly_t A, const fmpq_mpoly_factor_t f, const fmpq_mpoly_ctx_t ctx); +int fmpq_mpoly_factor_squarefree( + fmpq_mpoly_factor_t f, + const fmpq_mpoly_t A, + const fmpq_mpoly_ctx_t ctx); +int fmpq_mpoly_factor( + fmpq_mpoly_factor_t f, + const fmpq_mpoly_t A, + const fmpq_mpoly_ctx_t ctx); + +void _fmpq_mpoly_factor_swap_fmpz_mpoly_factor( + fmpq_mpoly_factor_t f, + fmpz_mpoly_factor_t g, + const fmpq_t c, + const fmpq_mpoly_ctx_t ctx); + +int fmpq_mpoly_factor_expand( + fmpq_mpoly_t A, + const fmpq_mpoly_factor_t f, + const fmpq_mpoly_ctx_t ctx); #ifdef __cplusplus } diff --git a/src/fmpq_poly.h b/src/fmpq_poly.h index 9f77d3e544..bc2f214875 100644 --- a/src/fmpq_poly.h +++ b/src/fmpq_poly.h @@ -90,9 +90,21 @@ slong fmpq_poly_length(const fmpq_poly_t poly) /* Randomisation ***********************************************************/ -void fmpq_poly_randtest(fmpq_poly_t f, flint_rand_t state, slong len, flint_bitcnt_t bits_in); -void fmpq_poly_randtest_unsigned(fmpq_poly_t f, flint_rand_t state, slong len, flint_bitcnt_t bits_in); -void fmpq_poly_randtest_not_zero(fmpq_poly_t f, flint_rand_t state, slong len, flint_bitcnt_t bits_in); +void fmpq_poly_randtest( + fmpq_poly_t f, + flint_rand_t state, + slong len, + flint_bitcnt_t bits_in); +void fmpq_poly_randtest_unsigned( + fmpq_poly_t f, + flint_rand_t state, + slong len, + flint_bitcnt_t bits_in); +void fmpq_poly_randtest_not_zero( + fmpq_poly_t f, + flint_rand_t state, + slong len, + flint_bitcnt_t bits_in); /* Assignment and basic manipulation ***************************************/ @@ -115,7 +127,11 @@ int fmpq_poly_set_str(fmpq_poly_t poly, const char * str); char * fmpq_poly_get_str(const fmpq_poly_t poly); char * fmpq_poly_get_str_pretty(const fmpq_poly_t poly, const char * var); -char * _fmpq_poly_get_str_pretty(const fmpz * poly, const fmpz_t den, slong len, const char * var); +char * _fmpq_poly_get_str_pretty( + const fmpz * poly, + const fmpz_t den, + slong len, + const char * var); void fmpq_poly_zero(fmpq_poly_t poly); void fmpq_poly_one(fmpq_poly_t poly); @@ -148,10 +164,22 @@ void fmpq_poly_set_coeff_fmpq(fmpq_poly_t poly, slong n, const fmpq_t x); int fmpq_poly_equal(const fmpq_poly_t poly1, const fmpq_poly_t poly2); -int _fmpq_poly_cmp(const fmpz * lpoly, const fmpz_t lden, const fmpz * rpoly, const fmpz_t rden, slong len); +int _fmpq_poly_cmp( + const fmpz * lpoly, + const fmpz_t lden, + const fmpz * rpoly, + const fmpz_t rden, + slong len); int fmpq_poly_cmp(const fmpq_poly_t left, const fmpq_poly_t right); -int _fmpq_poly_equal_trunc(const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, slong n); +int _fmpq_poly_equal_trunc( + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + slong n); int fmpq_poly_equal_trunc(const fmpq_poly_t poly1, const fmpq_poly_t poly2, slong n); FMPQ_POLY_INLINE @@ -168,29 +196,127 @@ int fmpq_poly_is_gen(const fmpq_poly_t op) /* Addition and subtraction ************************************************/ -void _fmpq_poly_add(fmpz * rpoly, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2); +void _fmpq_poly_add( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2); void fmpq_poly_add(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2); -void _fmpq_poly_add_series(fmpz * rpoly, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, slong n); -void fmpq_poly_add_series(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2, slong n); - -void _fmpq_poly_add_can(fmpz * rpoly, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, int can); -void fmpq_poly_add_can(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2, int can); - -void _fmpq_poly_add_series_can(fmpz * rpoly, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, slong n, int can); -void fmpq_poly_add_series_can(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2, slong n, int can); - -void _fmpq_poly_sub(fmpz * rpoly, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2); +void _fmpq_poly_add_series( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + slong n); +void fmpq_poly_add_series( + fmpq_poly_t res, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2, + slong n); + +void _fmpq_poly_add_can( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + int can); +void fmpq_poly_add_can( + fmpq_poly_t res, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2, + int can); + +void _fmpq_poly_add_series_can( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + slong n, + int can); +void fmpq_poly_add_series_can( + fmpq_poly_t res, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2, + slong n, + int can); + +void _fmpq_poly_sub( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2); void fmpq_poly_sub(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2); -void _fmpq_poly_sub_series(fmpz * rpoly, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, slong n); -void fmpq_poly_sub_series(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2, slong n); - -void _fmpq_poly_sub_can(fmpz * rpoly, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, int can); -void fmpq_poly_sub_can(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2, int can); - -void _fmpq_poly_sub_series_can(fmpz * rpoly, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, slong n, int can); -void fmpq_poly_sub_series_can(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2, slong n, int can); +void _fmpq_poly_sub_series( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + slong n); +void fmpq_poly_sub_series( + fmpq_poly_t res, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2, + slong n); + +void _fmpq_poly_sub_can( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + int can); +void fmpq_poly_sub_can( + fmpq_poly_t res, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2, + int can); + +void _fmpq_poly_sub_series_can( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + slong n, + int can); +void fmpq_poly_sub_series_can( + fmpq_poly_t res, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2, + slong n, + int can); void fmpq_poly_add_si(fmpq_poly_t res, const fmpq_poly_t poly, slong c); void fmpq_poly_add_fmpz(fmpq_poly_t res, const fmpq_poly_t poly, const fmpz_t c); @@ -205,31 +331,102 @@ void fmpq_poly_fmpq_sub(fmpq_poly_t res, const fmpq_t c, const fmpq_poly_t poly) /* Scalar multiplication and division **************************************/ -void _fmpq_poly_scalar_mul_si(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, slong c); +void _fmpq_poly_scalar_mul_si( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + slong c); void fmpq_poly_scalar_mul_si(fmpq_poly_t rop, const fmpq_poly_t op, slong c); -void _fmpq_poly_scalar_mul_ui(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, ulong c); +void _fmpq_poly_scalar_mul_ui( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + ulong c); void fmpq_poly_scalar_mul_ui(fmpq_poly_t rop, const fmpq_poly_t op, ulong c); -void _fmpq_poly_scalar_mul_fmpz(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, const fmpz_t c); +void _fmpq_poly_scalar_mul_fmpz( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + const fmpz_t c); void fmpq_poly_scalar_mul_fmpz(fmpq_poly_t rop, const fmpq_poly_t op, const fmpz_t c); -void _fmpq_poly_scalar_mul_fmpq(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, const fmpz_t r, const fmpz_t s); +void _fmpq_poly_scalar_mul_fmpq( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + const fmpz_t r, + const fmpz_t s); void fmpq_poly_scalar_mul_fmpq(fmpq_poly_t rop, const fmpq_poly_t op, const fmpq_t c); -void _fmpq_poly_scalar_div_si(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, slong c); +void _fmpq_poly_scalar_div_si( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + slong c); void fmpq_poly_scalar_div_si(fmpq_poly_t rop, const fmpq_poly_t op, slong c); -void _fmpq_poly_scalar_div_ui(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, ulong c); +void _fmpq_poly_scalar_div_ui( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + ulong c); void fmpq_poly_scalar_div_ui(fmpq_poly_t rop, const fmpq_poly_t op, ulong c); -void _fmpq_poly_scalar_div_fmpz(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, const fmpz_t c); +void _fmpq_poly_scalar_div_fmpz( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + const fmpz_t c); void fmpq_poly_scalar_div_fmpz(fmpq_poly_t rop, const fmpq_poly_t op, const fmpz_t c); -void _fmpq_poly_scalar_div_fmpq(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, const fmpz_t r, const fmpz_t s); +void _fmpq_poly_scalar_div_fmpq( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + const fmpz_t r, + const fmpz_t s); void fmpq_poly_scalar_div_fmpq(fmpq_poly_t rop, const fmpq_poly_t op, const fmpq_t c); /* Multiplication **********************************************************/ -void _fmpq_poly_mul(fmpz * rpoly, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2); +void _fmpq_poly_mul( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2); void fmpq_poly_mul(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2); -void _fmpq_poly_mullow(fmpz * rpoly, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, slong n); -void fmpq_poly_mullow(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2, slong n); +void _fmpq_poly_mullow( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + slong n); +void fmpq_poly_mullow( + fmpq_poly_t res, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2, + slong n); FMPQ_POLY_INLINE void fmpq_poly_addmul(fmpq_poly_t rop, const fmpq_poly_t op1, const fmpq_poly_t op2) @@ -255,10 +452,23 @@ void fmpq_poly_submul(fmpq_poly_t rop, const fmpq_poly_t op1, const fmpq_poly_t /* Powering ****************************************************************/ -void _fmpq_poly_pow(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, ulong e); +void _fmpq_poly_pow( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + ulong e); void fmpq_poly_pow(fmpq_poly_t rpoly, const fmpq_poly_t poly, ulong e); -void _fmpq_poly_pow_trunc(fmpz * res, fmpz_t resden, const fmpz * f, const fmpz_t fden, slong flen, ulong exp, slong len); +void _fmpq_poly_pow_trunc( + fmpz * res, + fmpz_t resden, + const fmpz * f, + const fmpz_t fden, + slong flen, + ulong exp, + slong len); void fmpq_poly_pow_trunc(fmpq_poly_t res, const fmpq_poly_t poly, ulong exp, slong len); /* Shifting ****************************************************************/ @@ -269,135 +479,414 @@ void fmpq_poly_shift_right(fmpq_poly_t res, const fmpq_poly_t poly, slong n); /* Euclidean division ******************************************************/ #ifdef FMPZ_H -void _fmpq_poly_divrem(fmpz * Q, fmpz_t q, fmpz * R, fmpz_t r, const fmpz * A, const fmpz_t a, slong lenA, const fmpz * B, const fmpz_t b, slong lenB, const fmpz_preinvn_t inv); -void _fmpq_poly_div(fmpz * Q, fmpz_t q, const fmpz * A, const fmpz_t a, slong lenA, const fmpz * B, const fmpz_t b, slong lenB, const fmpz_preinvn_t inv); -void _fmpq_poly_rem(fmpz * R, fmpz_t r, const fmpz * A, const fmpz_t a, slong lenA, const fmpz * B, const fmpz_t b, slong lenB, const fmpz_preinvn_t inv); +void _fmpq_poly_divrem( + fmpz * Q, + fmpz_t q, + fmpz * R, + fmpz_t r, + const fmpz * A, + const fmpz_t a, + slong lenA, + const fmpz * B, + const fmpz_t b, + slong lenB, + const fmpz_preinvn_t inv); +void _fmpq_poly_div( + fmpz * Q, + fmpz_t q, + const fmpz * A, + const fmpz_t a, + slong lenA, + const fmpz * B, + const fmpz_t b, + slong lenB, + const fmpz_preinvn_t inv); +void _fmpq_poly_rem( + fmpz * R, + fmpz_t r, + const fmpz * A, + const fmpz_t a, + slong lenA, + const fmpz * B, + const fmpz_t b, + slong lenB, + const fmpz_preinvn_t inv); #endif -void fmpq_poly_divrem(fmpq_poly_t Q, fmpq_poly_t R, const fmpq_poly_t poly1, const fmpq_poly_t poly2); +void fmpq_poly_divrem( + fmpq_poly_t Q, + fmpq_poly_t R, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2); void fmpq_poly_div(fmpq_poly_t Q, const fmpq_poly_t poly1, const fmpq_poly_t poly2); void fmpq_poly_rem(fmpq_poly_t R, const fmpq_poly_t poly1, const fmpq_poly_t poly2); /* Precomputed inverse *****************************************************/ -fmpq_poly_struct * _fmpq_poly_powers_precompute(const fmpz * B, const fmpz_t denB, slong len); +fmpq_poly_struct * _fmpq_poly_powers_precompute( + const fmpz * B, + const fmpz_t denB, + slong len); void fmpq_poly_powers_precompute(fmpq_poly_powers_precomp_t pinv, fmpq_poly_t poly); void _fmpq_poly_powers_clear(fmpq_poly_struct * powers, slong len); void fmpq_poly_powers_clear(fmpq_poly_powers_precomp_t pinv); -void _fmpq_poly_rem_powers_precomp(fmpz * A, fmpz_t denA, slong m, const fmpz * B, const fmpz_t denB, slong n, fmpq_poly_struct * const powers); -void fmpq_poly_rem_powers_precomp(fmpq_poly_t R, const fmpq_poly_t A, const fmpq_poly_t B, const fmpq_poly_powers_precomp_t B_inv); +void _fmpq_poly_rem_powers_precomp( + fmpz * A, + fmpz_t denA, + slong m, + const fmpz * B, + const fmpz_t denB, + slong n, + fmpq_poly_struct * const powers); +void fmpq_poly_rem_powers_precomp( + fmpq_poly_t R, + const fmpq_poly_t A, + const fmpq_poly_t B, + const fmpq_poly_powers_precomp_t B_inv); /* Divisibility testing ******************************************************/ -int _fmpq_poly_divides(fmpz * qpoly, fmpz_t qden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2); +int _fmpq_poly_divides( + fmpz * qpoly, + fmpz_t qden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2); int fmpq_poly_divides(fmpq_poly_t q, const fmpq_poly_t poly1, const fmpq_poly_t poly2); slong fmpq_poly_remove(fmpq_poly_t q, const fmpq_poly_t poly1, const fmpq_poly_t poly2); /* Power series division ***************************************************/ -void _fmpq_poly_inv_series_newton(fmpz * Qinv, fmpz_t Qinvden, const fmpz * Q, const fmpz_t Qden, slong Qlen, slong n); +void _fmpq_poly_inv_series_newton( + fmpz * Qinv, + fmpz_t Qinvden, + const fmpz * Q, + const fmpz_t Qden, + slong Qlen, + slong n); void fmpq_poly_inv_series_newton(fmpq_poly_t Qinv, const fmpq_poly_t Q, slong n); -FMPQ_POLY_INLINE void _fmpq_poly_inv_series(fmpz * Qinv, fmpz_t Qinvden, const fmpz * Q, const fmpz_t Qden, slong Qlen, slong n) { _fmpq_poly_inv_series_newton(Qinv, Qinvden, Q, Qden, Qlen, n); } -FMPQ_POLY_INLINE void fmpq_poly_inv_series(fmpq_poly_t Qinv, const fmpq_poly_t Q, slong n) { fmpq_poly_inv_series_newton(Qinv, Q, n); } +FMPQ_POLY_INLINE +void _fmpq_poly_inv_series(fmpz * Qinv, fmpz_t Qinvden, const fmpz * Q, const fmpz_t Qden, slong Qlen, slong n) +{ + _fmpq_poly_inv_series_newton(Qinv, Qinvden, Q, Qden, Qlen, n); +} +FMPQ_POLY_INLINE +void fmpq_poly_inv_series(fmpq_poly_t Qinv, const fmpq_poly_t Q, slong n) +{ + fmpq_poly_inv_series_newton(Qinv, Q, n); +} -void _fmpq_poly_div_series(fmpz * Q, fmpz_t denQ, const fmpz * A, const fmpz_t denA, slong lenA, const fmpz * B, const fmpz_t denB, slong lenB, slong n); -void fmpq_poly_div_series(fmpq_poly_t Q, const fmpq_poly_t A, const fmpq_poly_t B, slong n); +void _fmpq_poly_div_series( + fmpz * Q, + fmpz_t denQ, + const fmpz * A, + const fmpz_t denA, + slong lenA, + const fmpz * B, + const fmpz_t denB, + slong lenB, + slong n); +void fmpq_poly_div_series( + fmpq_poly_t Q, + const fmpq_poly_t A, + const fmpq_poly_t B, + slong n); /* Greatest common divisor **************************************************/ -void _fmpq_poly_gcd(fmpz * G, fmpz_t denG, const fmpz * A, slong lenA, const fmpz * B, slong lenB); +void _fmpq_poly_gcd( + fmpz * G, + fmpz_t denG, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB); void fmpq_poly_gcd(fmpq_poly_t G, const fmpq_poly_t A, const fmpq_poly_t B); -void _fmpq_poly_xgcd(fmpz * G, fmpz_t denG, fmpz * S, fmpz_t denS, fmpz * T, fmpz_t denT, const fmpz * A, const fmpz_t denA, slong lenA, const fmpz * B, const fmpz_t denB, slong lenB); -void fmpq_poly_xgcd(fmpq_poly_t G, fmpq_poly_t S, fmpq_poly_t T, const fmpq_poly_t A, const fmpq_poly_t B); - -void _fmpq_poly_lcm(fmpz * G, fmpz_t denG, const fmpz * A, slong lenA, const fmpz * B, slong lenB); +void _fmpq_poly_xgcd( + fmpz * G, + fmpz_t denG, + fmpz * S, + fmpz_t denS, + fmpz * T, + fmpz_t denT, + const fmpz * A, + const fmpz_t denA, + slong lenA, + const fmpz * B, + const fmpz_t denB, + slong lenB); +void fmpq_poly_xgcd( + fmpq_poly_t G, + fmpq_poly_t S, + fmpq_poly_t T, + const fmpq_poly_t A, + const fmpq_poly_t B); + +void _fmpq_poly_lcm( + fmpz * G, + fmpz_t denG, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB); void fmpq_poly_lcm(fmpq_poly_t L, const fmpq_poly_t A, const fmpq_poly_t B); -void _fmpq_poly_resultant(fmpz_t rnum, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2); +void _fmpq_poly_resultant( + fmpz_t rnum, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2); void fmpq_poly_resultant(fmpq_t r, const fmpq_poly_t f, const fmpq_poly_t g); -void _fmpq_poly_resultant_div(fmpz_t rnum, fmpz_t rden, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, const fmpz_t divisor, slong nbits); -void fmpq_poly_resultant_div(fmpq_t r, const fmpq_poly_t f, const fmpq_poly_t g, const fmpz_t divisor, slong nbits); +void _fmpq_poly_resultant_div( + fmpz_t rnum, + fmpz_t rden, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + const fmpz_t divisor, + slong nbits); +void fmpq_poly_resultant_div( + fmpq_t r, + const fmpq_poly_t f, + const fmpq_poly_t g, + const fmpz_t divisor, + slong nbits); /* Derivative and integral *************************************************/ -void _fmpq_poly_derivative(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len); +void _fmpq_poly_derivative( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len); void fmpq_poly_derivative(fmpq_poly_t res, const fmpq_poly_t poly); -void _fmpq_poly_nth_derivative(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, ulong n, slong len); +void _fmpq_poly_nth_derivative( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + ulong n, + slong len); void fmpq_poly_nth_derivative(fmpq_poly_t res, const fmpq_poly_t poly, ulong n); -void _fmpq_poly_integral(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len); +void _fmpq_poly_integral( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len); void fmpq_poly_integral(fmpq_poly_t res, const fmpq_poly_t poly); /* Square roots ************************************************************/ -void _fmpq_poly_invsqrt_series(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, slong n); +void _fmpq_poly_invsqrt_series( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + slong n); void fmpq_poly_invsqrt_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_sqrt_series(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, slong n); +void _fmpq_poly_sqrt_series( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + slong n); void fmpq_poly_sqrt_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); /* Power sums ****************************************************************/ -void _fmpq_poly_power_sums(fmpz * res, fmpz_t rden, const fmpz * poly, slong len, slong n); +void _fmpq_poly_power_sums( + fmpz * res, + fmpz_t rden, + const fmpz * poly, + slong len, + slong n); void fmpq_poly_power_sums(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_power_sums_to_poly(fmpz * res, const fmpz * poly, const fmpz_t den, slong len); +void _fmpq_poly_power_sums_to_poly( + fmpz * res, + const fmpz * poly, + const fmpz_t den, + slong len); void fmpq_poly_power_sums_to_poly(fmpq_poly_t res, const fmpq_poly_t Q); void fmpq_poly_power_sums_to_fmpz_poly(fmpz_poly_t res, const fmpq_poly_t Q); /* Transcendental functions ************************************************/ -void _fmpq_poly_log_series(fmpz * g, fmpz_t gden, const fmpz * f, const fmpz_t fden, slong flen, slong n); +void _fmpq_poly_log_series( + fmpz * g, + fmpz_t gden, + const fmpz * f, + const fmpz_t fden, + slong flen, + slong n); void fmpq_poly_log_series(fmpq_poly_t res, const fmpq_poly_t f, slong n); -void _fmpq_poly_exp_series(fmpz * g, fmpz_t gden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); +void _fmpq_poly_exp_series( + fmpz * g, + fmpz_t gden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); void fmpq_poly_exp_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_exp_expinv_series(fmpz * g, fmpz_t gden, fmpz * r, fmpz_t rden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); -void fmpq_poly_exp_expinv_series(fmpq_poly_t res1, fmpq_poly_t res2, const fmpq_poly_t poly, slong n); - -void _fmpq_poly_atan_series(fmpz * g, fmpz_t gden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); +void _fmpq_poly_exp_expinv_series( + fmpz * g, + fmpz_t gden, + fmpz * r, + fmpz_t rden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); +void fmpq_poly_exp_expinv_series( + fmpq_poly_t res1, + fmpq_poly_t res2, + const fmpq_poly_t poly, + slong n); + +void _fmpq_poly_atan_series( + fmpz * g, + fmpz_t gden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); void fmpq_poly_atan_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_atanh_series(fmpz * g, fmpz_t gden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); +void _fmpq_poly_atanh_series( + fmpz * g, + fmpz_t gden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); void fmpq_poly_atanh_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_asin_series(fmpz * g, fmpz_t gden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); +void _fmpq_poly_asin_series( + fmpz * g, + fmpz_t gden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); void fmpq_poly_asin_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_asinh_series(fmpz * g, fmpz_t gden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); +void _fmpq_poly_asinh_series( + fmpz * g, + fmpz_t gden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); void fmpq_poly_asinh_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_tan_series(fmpz * g, fmpz_t gden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); +void _fmpq_poly_tan_series( + fmpz * g, + fmpz_t gden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); void fmpq_poly_tan_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_sin_series(fmpz * g, fmpz_t gden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); +void _fmpq_poly_sin_series( + fmpz * g, + fmpz_t gden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); void fmpq_poly_sin_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_cos_series(fmpz * g, fmpz_t gden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); +void _fmpq_poly_cos_series( + fmpz * g, + fmpz_t gden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); void fmpq_poly_cos_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_sin_cos_series(fmpz * s, fmpz_t sden, fmpz * c, fmpz_t cden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); -void fmpq_poly_sin_cos_series(fmpq_poly_t res1, fmpq_poly_t res2, const fmpq_poly_t poly, slong n); - -void _fmpq_poly_sinh_series(fmpz * g, fmpz_t gden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); +void _fmpq_poly_sin_cos_series( + fmpz * s, + fmpz_t sden, + fmpz * c, + fmpz_t cden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); +void fmpq_poly_sin_cos_series( + fmpq_poly_t res1, + fmpq_poly_t res2, + const fmpq_poly_t poly, + slong n); + +void _fmpq_poly_sinh_series( + fmpz * g, + fmpz_t gden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); void fmpq_poly_sinh_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_cosh_series(fmpz * g, fmpz_t gden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); +void _fmpq_poly_cosh_series( + fmpz * g, + fmpz_t gden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); void fmpq_poly_cosh_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_sinh_cosh_series(fmpz * s, fmpz_t sden, fmpz * c, fmpz_t cden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); -void fmpq_poly_sinh_cosh_series(fmpq_poly_t res1, fmpq_poly_t res2, const fmpq_poly_t poly, slong n); - -void _fmpq_poly_tanh_series(fmpz * g, fmpz_t gden, const fmpz * h, const fmpz_t hden, slong hlen, slong n); +void _fmpq_poly_sinh_cosh_series( + fmpz * s, + fmpz_t sden, + fmpz * c, + fmpz_t cden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); +void fmpq_poly_sinh_cosh_series( + fmpq_poly_t res1, + fmpq_poly_t res2, + const fmpq_poly_t poly, + slong n); + +void _fmpq_poly_tanh_series( + fmpz * g, + fmpz_t gden, + const fmpz * h, + const fmpz_t hden, + slong hlen, + slong n); void fmpq_poly_tanh_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); /* Orthogonal polynomials ***************************************************/ @@ -413,48 +902,154 @@ void fmpq_poly_gegenbauer_c(fmpq_poly_t poly, ulong n, const fmpq_t a); /* Evaluation **************************************************************/ -void _fmpq_poly_evaluate_fmpz(fmpz_t rnum, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, const fmpz_t a); +void _fmpq_poly_evaluate_fmpz( + fmpz_t rnum, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + const fmpz_t a); void fmpq_poly_evaluate_fmpz(fmpq_t res, const fmpq_poly_t poly, const fmpz_t a); -void _fmpq_poly_evaluate_fmpq(fmpz_t rnum, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len, const fmpz_t anum, const fmpz_t aden); +void _fmpq_poly_evaluate_fmpq( + fmpz_t rnum, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len, + const fmpz_t anum, + const fmpz_t aden); void fmpq_poly_evaluate_fmpq(fmpq_t res, const fmpq_poly_t poly, const fmpq_t a); /* Interpolation ************************************************************/ -void _fmpq_poly_interpolate_fmpz_vec(fmpz * poly, fmpz_t den, const fmpz * xs, const fmpz * ys, slong n); -void fmpq_poly_interpolate_fmpz_vec(fmpq_poly_t poly, const fmpz * xs, const fmpz * ys, slong n); +void _fmpq_poly_interpolate_fmpz_vec( + fmpz * poly, + fmpz_t den, + const fmpz * xs, + const fmpz * ys, + slong n); +void fmpq_poly_interpolate_fmpz_vec( + fmpq_poly_t poly, + const fmpz * xs, + const fmpz * ys, + slong n); /* Composition *************************************************************/ -void _fmpq_poly_compose(fmpz * res, fmpz_t den, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2); -void fmpq_poly_compose(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2); - -void _fmpq_poly_rescale(fmpz * res, fmpz_t denr, const fmpz * poly, const fmpz_t den, slong len, const fmpz_t xnum, const fmpz_t xden); +void _fmpq_poly_compose( + fmpz * res, + fmpz_t den, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2); +void fmpq_poly_compose( + fmpq_poly_t res, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2); + +void _fmpq_poly_rescale( + fmpz * res, + fmpz_t denr, + const fmpz * poly, + const fmpz_t den, + slong len, + const fmpz_t xnum, + const fmpz_t xden); void fmpq_poly_rescale(fmpq_poly_t res, const fmpq_poly_t poly, const fmpq_t x); /* Power series composition ************************************************/ -void _fmpq_poly_compose_series_horner(fmpz * res, fmpz_t den, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, slong n); -void fmpq_poly_compose_series_horner(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2, slong n); - -void _fmpq_poly_compose_series_brent_kung(fmpz * res, fmpz_t den, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, slong n); -void fmpq_poly_compose_series_brent_kung(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2, slong n); - -void _fmpq_poly_compose_series(fmpz * res, fmpz_t den, const fmpz * poly1, const fmpz_t den1, slong len1, const fmpz * poly2, const fmpz_t den2, slong len2, slong n); -void fmpq_poly_compose_series(fmpq_poly_t res, const fmpq_poly_t poly1, const fmpq_poly_t poly2, slong n); +void _fmpq_poly_compose_series_horner( + fmpz * res, + fmpz_t den, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + slong n); +void fmpq_poly_compose_series_horner( + fmpq_poly_t res, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2, + slong n); + +void _fmpq_poly_compose_series_brent_kung( + fmpz * res, + fmpz_t den, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + slong n); +void fmpq_poly_compose_series_brent_kung( + fmpq_poly_t res, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2, + slong n); + +void _fmpq_poly_compose_series( + fmpz * res, + fmpz_t den, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + const fmpz * poly2, + const fmpz_t den2, + slong len2, + slong n); +void fmpq_poly_compose_series( + fmpq_poly_t res, + const fmpq_poly_t poly1, + const fmpq_poly_t poly2, + slong n); /* Power series reversion ************************************************/ -void _fmpq_poly_revert_series_lagrange(fmpz * res, fmpz_t den, const fmpz * poly1, const fmpz_t den1, slong len1, slong n); +void _fmpq_poly_revert_series_lagrange( + fmpz * res, + fmpz_t den, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + slong n); void fmpq_poly_revert_series_lagrange(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_revert_series_lagrange_fast(fmpz * res, fmpz_t den, const fmpz * poly1, const fmpz_t den1, slong len1, slong n); -void fmpq_poly_revert_series_lagrange_fast(fmpq_poly_t res, const fmpq_poly_t poly, slong n); - -void _fmpq_poly_revert_series_newton(fmpz * res, fmpz_t den, const fmpz * poly1, const fmpz_t den1, slong len1, slong n); +void _fmpq_poly_revert_series_lagrange_fast( + fmpz * res, + fmpz_t den, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + slong n); +void fmpq_poly_revert_series_lagrange_fast( + fmpq_poly_t res, + const fmpq_poly_t poly, + slong n); + +void _fmpq_poly_revert_series_newton( + fmpz * res, + fmpz_t den, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + slong n); void fmpq_poly_revert_series_newton(fmpq_poly_t res, const fmpq_poly_t poly, slong n); -void _fmpq_poly_revert_series(fmpz * res, fmpz_t den, const fmpz * poly1, const fmpz_t den1, slong len1, slong n); +void _fmpq_poly_revert_series( + fmpz * res, + fmpz_t den, + const fmpz * poly1, + const fmpz_t den1, + slong len1, + slong n); void fmpq_poly_revert_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); /* Gaussian content ********************************************************/ @@ -462,13 +1057,23 @@ void fmpq_poly_revert_series(fmpq_poly_t res, const fmpq_poly_t poly, slong n); void _fmpq_poly_content(fmpq_t res, const fmpz * poly, const fmpz_t den, slong len); void fmpq_poly_content(fmpq_t res, const fmpq_poly_t poly); -void _fmpq_poly_primitive_part(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len); +void _fmpq_poly_primitive_part( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len); void fmpq_poly_primitive_part(fmpq_poly_t res, const fmpq_poly_t poly); int _fmpq_poly_is_monic(const fmpz * poly, const fmpz_t den, slong len); int fmpq_poly_is_monic(const fmpq_poly_t poly); -void _fmpq_poly_make_monic(fmpz * rpoly, fmpz_t rden, const fmpz * poly, const fmpz_t den, slong len); +void _fmpq_poly_make_monic( + fmpz * rpoly, + fmpz_t rden, + const fmpz * poly, + const fmpz_t den, + slong len); void fmpq_poly_make_monic(fmpq_poly_t res, const fmpq_poly_t poly); /* Square-free *************************************************************/ @@ -480,7 +1085,12 @@ int fmpq_poly_is_squarefree(const fmpq_poly_t poly); #ifdef FLINT_HAVE_FILE int _fmpq_poly_fprint(FILE * file, const fmpz * poly, const fmpz_t den, slong len); int fmpq_poly_fprint(FILE * file, const fmpq_poly_t poly); -int _fmpq_poly_fprint_pretty(FILE * file, const fmpz * poly, const fmpz_t den, slong len, const char * x); +int _fmpq_poly_fprint_pretty( + FILE * file, + const fmpz * poly, + const fmpz_t den, + slong len, + const char * x); int fmpq_poly_fprint_pretty(FILE * file, const fmpq_poly_t poly, const char * var); int fmpq_poly_fread(FILE * file, fmpq_poly_t poly); @@ -488,7 +1098,11 @@ int fmpq_poly_fread(FILE * file, fmpq_poly_t poly); int _fmpq_poly_print(const fmpz * poly, const fmpz_t den, slong len); int fmpq_poly_print(const fmpq_poly_t poly); -int _fmpq_poly_print_pretty(const fmpz *poly, const fmpz_t den, slong len, const char * x); +int _fmpq_poly_print_pretty( + const fmpz *poly, + const fmpz_t den, + slong len, + const char * x); int fmpq_poly_print_pretty(const fmpq_poly_t poly, const char * var); int fmpq_poly_read(fmpq_poly_t poly); diff --git a/src/fmpq_vec.h b/src/fmpq_vec.h index 1aaa1ef908..936775fbbe 100644 --- a/src/fmpq_vec.h +++ b/src/fmpq_vec.h @@ -32,7 +32,11 @@ void _fmpq_vec_clear(fmpq * vec, slong len); /* Randomisation ***********************************************************/ void _fmpq_vec_randtest(fmpq * f, flint_rand_t state, slong len, flint_bitcnt_t bits); -void _fmpq_vec_randtest_uniq_sorted(fmpq * vec, flint_rand_t state, slong len, flint_bitcnt_t bits); +void _fmpq_vec_randtest_uniq_sorted( + fmpq * vec, + flint_rand_t state, + slong len, + flint_bitcnt_t bits); /* Sorting ******************************************************************/ diff --git a/src/fmpz.h b/src/fmpz.h index 38927ab836..bf40cc0976 100644 --- a/src/fmpz.h +++ b/src/fmpz.h @@ -521,9 +521,25 @@ flint_bitcnt_t fmpz_popcnt(const fmpz_t c); /* Bit packing ***************************************************************/ -int fmpz_bit_pack(mp_ptr arr, flint_bitcnt_t shift, flint_bitcnt_t bits, const fmpz_t coeff, int negate, int borrow); -int fmpz_bit_unpack(fmpz_t coeff, mp_srcptr arr, flint_bitcnt_t shift, flint_bitcnt_t bits, int negate, int borrow); -void fmpz_bit_unpack_unsigned(fmpz_t coeff, mp_srcptr arr, flint_bitcnt_t shift, flint_bitcnt_t bits); +int fmpz_bit_pack( + mp_ptr arr, + flint_bitcnt_t shift, + flint_bitcnt_t bits, + const fmpz_t coeff, + int negate, + int borrow); +int fmpz_bit_unpack( + fmpz_t coeff, + mp_srcptr arr, + flint_bitcnt_t shift, + flint_bitcnt_t bits, + int negate, + int borrow); +void fmpz_bit_unpack_unsigned( + fmpz_t coeff, + mp_srcptr arr, + flint_bitcnt_t shift, + flint_bitcnt_t bits); /* Modular arithmetic ********************************************************/ @@ -562,7 +578,13 @@ int fmpz_sqrtmod(fmpz_t b, const fmpz_t a, const fmpz_t p); void fmpz_powm_ui(fmpz_t f, const fmpz_t g, ulong exp, const fmpz_t m); void fmpz_powm(fmpz_t f, const fmpz_t g, const fmpz_t e, const fmpz_t m); -void fmpz_divides_mod_list(fmpz_t xstart, fmpz_t xstride, fmpz_t xlength, const fmpz_t a, const fmpz_t b, const fmpz_t n); +void fmpz_divides_mod_list( + fmpz_t xstart, + fmpz_t xstride, + fmpz_t xlength, + const fmpz_t a, + const fmpz_t b, + const fmpz_t n); slong _fmpz_remove(fmpz_t x, const fmpz_t f, double finv); slong fmpz_remove(fmpz_t rop, const fmpz_t op, const fmpz_t f); @@ -575,15 +597,29 @@ void fmpz_gcd3(fmpz_t f, const fmpz_t a, const fmpz_t b, const fmpz_t c); void fmpz_gcdinv(fmpz_t d, fmpz_t a, const fmpz_t f, const fmpz_t g); void fmpz_xgcd(fmpz_t d, fmpz_t a, fmpz_t b, const fmpz_t f, const fmpz_t g); -void fmpz_xgcd_canonical_bezout(fmpz_t d, fmpz_t a, fmpz_t b, const fmpz_t f, const fmpz_t g); +void fmpz_xgcd_canonical_bezout( + fmpz_t d, + fmpz_t a, + fmpz_t b, + const fmpz_t f, + const fmpz_t g); void fmpz_xgcd_partial(fmpz_t co2, fmpz_t co1, fmpz_t r2, fmpz_t r1, const fmpz_t L); void fmpz_lcm(fmpz_t f, const fmpz_t g, const fmpz_t h); /* preinvn *******************************************************************/ -void fmpz_fdiv_qr_preinvn(fmpz_t f, fmpz_t s, const fmpz_t g, const fmpz_t h, const fmpz_preinvn_t inv); -void fmpz_fdiv_r_preinvn(fmpz_t f, const fmpz_t g, const fmpz_t h, const fmpz_preinvn_t inv); +void fmpz_fdiv_qr_preinvn( + fmpz_t f, + fmpz_t s, + const fmpz_t g, + const fmpz_t h, + const fmpz_preinvn_t inv); +void fmpz_fdiv_r_preinvn( + fmpz_t f, + const fmpz_t g, + const fmpz_t h, + const fmpz_preinvn_t inv); void fmpz_preinvn_init(fmpz_preinvn_t inv, const fmpz_t f); void fmpz_preinvn_clear(fmpz_preinvn_t inv); @@ -606,9 +642,30 @@ void fmpz_fib_ui(fmpz_t f, ulong n); /* crt ***********************************************************************/ -void _fmpz_CRT_ui_precomp(fmpz_t out, const fmpz_t r1, const fmpz_t m1, ulong r2, ulong m2, mp_limb_t m2inv, const fmpz_t m1m2, mp_limb_t c, int sign); -void fmpz_CRT_ui(fmpz_t out, const fmpz_t r1, const fmpz_t m1, ulong r2, ulong m2, int sign); -void fmpz_CRT(fmpz_t out, const fmpz_t r1, const fmpz_t m1, const fmpz_t r2, const fmpz_t m2, int sign); +void _fmpz_CRT_ui_precomp( + fmpz_t out, + const fmpz_t r1, + const fmpz_t m1, + ulong r2, + ulong m2, + mp_limb_t m2inv, + const fmpz_t m1m2, + mp_limb_t c, + int sign); +void fmpz_CRT_ui( + fmpz_t out, + const fmpz_t r1, + const fmpz_t m1, + ulong r2, + ulong m2, + int sign); +void fmpz_CRT( + fmpz_t out, + const fmpz_t r1, + const fmpz_t m1, + const fmpz_t r2, + const fmpz_t m2, + int sign); /* multi CRT *****************************************************************/ @@ -640,10 +697,23 @@ typedef fmpz_multi_CRT_struct fmpz_multi_CRT_t[1]; void fmpz_multi_CRT_init(fmpz_multi_CRT_t CRT); void fmpz_multi_CRT_clear(fmpz_multi_CRT_t P); -void _fmpz_multi_CRT_precomp(fmpz * outputs, const fmpz_multi_CRT_t P, const fmpz * inputs, int sign); -void fmpz_multi_CRT_precomp(fmpz_t output, const fmpz_multi_CRT_t P, const fmpz * inputs, int sign); +void _fmpz_multi_CRT_precomp( + fmpz * outputs, + const fmpz_multi_CRT_t P, + const fmpz * inputs, + int sign); +void fmpz_multi_CRT_precomp( + fmpz_t output, + const fmpz_multi_CRT_t P, + const fmpz * inputs, + int sign); int fmpz_multi_CRT_precompute(fmpz_multi_CRT_t CRT, const fmpz * moduli, slong len); -int fmpz_multi_CRT(fmpz_t output, const fmpz * moduli, const fmpz * values, slong len, int sign); +int fmpz_multi_CRT( + fmpz_t output, + const fmpz * moduli, + const fmpz * values, + slong len, + int sign); /* multi mod *****************************************************************/ @@ -675,8 +745,17 @@ void fmpz_multi_mod_clear(fmpz_multi_mod_t P); int fmpz_multi_mod_precompute(fmpz_multi_mod_t P, const fmpz * f, slong r); -void _fmpz_multi_mod_precomp(fmpz * outputs, const fmpz_multi_mod_t P, const fmpz_t input, int sign, fmpz * tmp); -void fmpz_multi_mod_precomp(fmpz * outputs, const fmpz_multi_mod_t P, const fmpz_t input, int sign); +void _fmpz_multi_mod_precomp( + fmpz * outputs, + const fmpz_multi_mod_t P, + const fmpz_t input, + int sign, + fmpz * tmp); +void fmpz_multi_mod_precomp( + fmpz * outputs, + const fmpz_multi_mod_t P, + const fmpz_t input, + int sign); /* multi mod/multi CRT ui ****************************************************/ @@ -723,18 +802,70 @@ void fmpz_comb_temp_clear(fmpz_comb_temp_t CT); void fmpz_comb_init(fmpz_comb_t C, mp_srcptr primes, slong num_primes); void fmpz_comb_clear(fmpz_comb_t C); -void fmpz_multi_mod_ui(mp_limb_t * out, const fmpz_t in, const fmpz_comb_t C, fmpz_comb_temp_t CT); -void fmpz_multi_CRT_ui(fmpz_t output, mp_srcptr residues, const fmpz_comb_t comb, fmpz_comb_temp_t temp, int sign); +void fmpz_multi_mod_ui( + mp_limb_t * out, + const fmpz_t in, + const fmpz_comb_t C, + fmpz_comb_temp_t CT); +void fmpz_multi_CRT_ui( + fmpz_t output, + mp_srcptr residues, + const fmpz_comb_t comb, + fmpz_comb_temp_t temp, + int sign); /*****************************************************************************/ -void fmpz_lucas_chain(fmpz_t Vm, fmpz_t Vm1, const fmpz_t A, const fmpz_t m, const fmpz_t n); -void fmpz_lucas_chain_full(fmpz_t Vm, fmpz_t Vm1, const fmpz_t A, const fmpz_t B, const fmpz_t m, const fmpz_t n); -void fmpz_lucas_chain_double(fmpz_t U2m, fmpz_t U2m1, const fmpz_t Um, const fmpz_t Um1, const fmpz_t A, const fmpz_t B, const fmpz_t n); - -void fmpz_lucas_chain_add(fmpz_t Umn, fmpz_t Umn1, const fmpz_t Um, const fmpz_t Um1, const fmpz_t Un, const fmpz_t Un1, const fmpz_t A, const fmpz_t B, const fmpz_t n); -void fmpz_lucas_chain_mul(fmpz_t Ukm, fmpz_t Ukm1, const fmpz_t Um, const fmpz_t Um1, const fmpz_t A, const fmpz_t B, const fmpz_t k, const fmpz_t n); -void fmpz_lucas_chain_VtoU(fmpz_t Um, fmpz_t Um1, const fmpz_t Vm, const fmpz_t Vm1, const fmpz_t A, const fmpz_t B, const fmpz_t Dinv, const fmpz_t n); +void fmpz_lucas_chain( + fmpz_t Vm, + fmpz_t Vm1, + const fmpz_t A, + const fmpz_t m, + const fmpz_t n); +void fmpz_lucas_chain_full( + fmpz_t Vm, + fmpz_t Vm1, + const fmpz_t A, + const fmpz_t B, + const fmpz_t m, + const fmpz_t n); +void fmpz_lucas_chain_double( + fmpz_t U2m, + fmpz_t U2m1, + const fmpz_t Um, + const fmpz_t Um1, + const fmpz_t A, + const fmpz_t B, + const fmpz_t n); + +void fmpz_lucas_chain_add( + fmpz_t Umn, + fmpz_t Umn1, + const fmpz_t Um, + const fmpz_t Um1, + const fmpz_t Un, + const fmpz_t Un1, + const fmpz_t A, + const fmpz_t B, + const fmpz_t n); +void fmpz_lucas_chain_mul( + fmpz_t Ukm, + fmpz_t Ukm1, + const fmpz_t Um, + const fmpz_t Um1, + const fmpz_t A, + const fmpz_t B, + const fmpz_t k, + const fmpz_t n); +void fmpz_lucas_chain_VtoU( + fmpz_t Um, + fmpz_t Um1, + const fmpz_t Vm, + const fmpz_t Vm1, + const fmpz_t A, + const fmpz_t B, + const fmpz_t Dinv, + const fmpz_t n); int fmpz_is_probabprime_lucas(const fmpz_t n); int fmpz_is_probabprime_BPSW(const fmpz_t n); @@ -742,8 +873,18 @@ int fmpz_is_probabprime(const fmpz_t p); int fmpz_is_strong_probabprime(const fmpz_t n, const fmpz_t a); int fmpz_is_prime_pseudosquare(const fmpz_t n); -int fmpz_is_prime_pocklington(fmpz_t F, fmpz_t R, const fmpz_t n, mp_ptr pm1, slong num_pm1); -int fmpz_is_prime_morrison(fmpz_t F, fmpz_t R, const fmpz_t n, mp_ptr pm1, slong num_pm1); +int fmpz_is_prime_pocklington( + fmpz_t F, + fmpz_t R, + const fmpz_t n, + mp_ptr pm1, + slong num_pm1); +int fmpz_is_prime_morrison( + fmpz_t F, + fmpz_t R, + const fmpz_t n, + mp_ptr pm1, + slong num_pm1); int fmpz_is_prime(const fmpz_t p); void fmpz_nextprime(fmpz_t res, const fmpz_t n, int proved); @@ -751,7 +892,11 @@ void fmpz_nextprime(fmpz_t res, const fmpz_t n, int proved); void _fmpz_nm1_trial_factors(const fmpz_t n, mp_ptr pm1, slong * num_pm1, ulong limit); void _fmpz_np1_trial_factors(const fmpz_t n, mp_ptr pp1, slong * num_pp1, ulong limit); -int fmpz_divisor_in_residue_class_lenstra(fmpz_t fac, const fmpz_t n, const fmpz_t r, const fmpz_t s); +int fmpz_divisor_in_residue_class_lenstra( + fmpz_t fac, + const fmpz_t n, + const fmpz_t r, + const fmpz_t s); /* Primorial *****************************************************************/ diff --git a/src/fmpz_factor.h b/src/fmpz_factor.h index 2aa231e377..82b37b7a97 100644 --- a/src/fmpz_factor.h +++ b/src/fmpz_factor.h @@ -44,7 +44,11 @@ void _fmpz_factor_concat(fmpz_factor_t factor1, fmpz_factor_t factor2, ulong exp void _fmpz_factor_extend_factor_ui(fmpz_factor_t factor, mp_limb_t n); -int fmpz_factor_trial_range(fmpz_factor_t factor, const fmpz_t n, ulong start, ulong num_primes); +int fmpz_factor_trial_range( + fmpz_factor_t factor, + const fmpz_t n, + ulong start, + ulong num_primes); int fmpz_factor_trial(fmpz_factor_t factor, const fmpz_t n, slong num_primes); void fmpz_factor_no_trial(fmpz_factor_t factor, const fmpz_t n); @@ -58,11 +62,35 @@ int fmpz_factor_pp1(fmpz_t factor, const fmpz_t n, ulong B1, ulong B2_sqrt, ulon void fmpz_factor_refine(fmpz_factor_t res, const fmpz_factor_t f); -void flint_mpn_sqr_and_add_a(mp_ptr y, mp_ptr a, mp_ptr n, mp_limb_t n_size, mp_ptr ninv, mp_limb_t normbits); - -int flint_mpn_factor_pollard_brent_single(mp_ptr factor, mp_ptr n, mp_ptr ninv, mp_ptr a, mp_ptr y, mp_limb_t n_size, mp_limb_t normbits, mp_limb_t max_iters); -int fmpz_factor_pollard_brent_single(fmpz_t p_factor, fmpz_t n_in, fmpz_t yi, fmpz_t ai, mp_limb_t max_iters); -int fmpz_factor_pollard_brent(fmpz_t factor, flint_rand_t state, fmpz_t n, mp_limb_t max_tries, mp_limb_t max_iters); +void flint_mpn_sqr_and_add_a( + mp_ptr y, + mp_ptr a, + mp_ptr n, + mp_limb_t n_size, + mp_ptr ninv, + mp_limb_t normbits); + +int flint_mpn_factor_pollard_brent_single( + mp_ptr factor, + mp_ptr n, + mp_ptr ninv, + mp_ptr a, + mp_ptr y, + mp_limb_t n_size, + mp_limb_t normbits, + mp_limb_t max_iters); +int fmpz_factor_pollard_brent_single( + fmpz_t p_factor, + fmpz_t n_in, + fmpz_t yi, + fmpz_t ai, + mp_limb_t max_iters); +int fmpz_factor_pollard_brent( + fmpz_t factor, + flint_rand_t state, + fmpz_t n, + mp_limb_t max_tries, + mp_limb_t max_iters); /* Expansion *****************************************************************/ @@ -108,18 +136,59 @@ void fmpz_factor_ecm_clear(ecm_t ecm_inf); void fmpz_factor_ecm_addmod(mp_ptr a, mp_ptr b, mp_ptr c, mp_ptr n, mp_limb_t n_size); void fmpz_factor_ecm_submod(mp_ptr x, mp_ptr a, mp_ptr b, mp_ptr n, mp_limb_t n_size); -void fmpz_factor_ecm_double(mp_ptr x, mp_ptr z, mp_ptr x0, mp_ptr z0, mp_ptr n, ecm_t ecm_inf); - -void fmpz_factor_ecm_add(mp_ptr x, mp_ptr z, mp_ptr x1, mp_ptr z1, mp_ptr x2, mp_ptr z2, mp_ptr x0, mp_ptr z0, mp_ptr n, ecm_t ecm_inf); - -void fmpz_factor_ecm_mul_montgomery_ladder(mp_ptr x, mp_ptr z, mp_ptr x0, mp_ptr z0, mp_limb_t k, mp_ptr n, ecm_t ecm_inf); +void fmpz_factor_ecm_double( + mp_ptr x, + mp_ptr z, + mp_ptr x0, + mp_ptr z0, + mp_ptr n, + ecm_t ecm_inf); + +void fmpz_factor_ecm_add( + mp_ptr x, + mp_ptr z, + mp_ptr x1, + mp_ptr z1, + mp_ptr x2, + mp_ptr z2, + mp_ptr x0, + mp_ptr z0, + mp_ptr n, + ecm_t ecm_inf); + +void fmpz_factor_ecm_mul_montgomery_ladder( + mp_ptr x, + mp_ptr z, + mp_ptr x0, + mp_ptr z0, + mp_limb_t k, + mp_ptr n, + ecm_t ecm_inf); int fmpz_factor_ecm_select_curve(mp_ptr f, mp_ptr sig, mp_ptr n, ecm_t ecm_inf); -int fmpz_factor_ecm_stage_I(mp_ptr f, const mp_limb_t * prime_array, mp_limb_t num, mp_limb_t B1, mp_ptr n, ecm_t ecm_inf); -int fmpz_factor_ecm_stage_II(mp_ptr f, mp_limb_t B1, mp_limb_t B2, mp_limb_t P, mp_ptr n, ecm_t ecm_inf); - -int fmpz_factor_ecm(fmpz_t f, mp_limb_t curves, mp_limb_t B1, mp_limb_t B2, flint_rand_t state, const fmpz_t n_in); +int fmpz_factor_ecm_stage_I( + mp_ptr f, + const mp_limb_t * prime_array, + mp_limb_t num, + mp_limb_t B1, + mp_ptr n, + ecm_t ecm_inf); +int fmpz_factor_ecm_stage_II( + mp_ptr f, + mp_limb_t B1, + mp_limb_t B2, + mp_limb_t P, + mp_ptr n, + ecm_t ecm_inf); + +int fmpz_factor_ecm( + fmpz_t f, + mp_limb_t curves, + mp_limb_t B1, + mp_limb_t B2, + flint_rand_t state, + const fmpz_t n_in); /* Inlines *******************************************************************/ diff --git a/src/fmpz_lll.h b/src/fmpz_lll.h index 28904f94f3..df551e2382 100644 --- a/src/fmpz_lll.h +++ b/src/fmpz_lll.h @@ -69,7 +69,12 @@ typedef fmpz_gram_union fmpz_gram_t[1]; /* Parameter manipulation ***************************************************/ void fmpz_lll_context_init_default(fmpz_lll_t fl); -void fmpz_lll_context_init(fmpz_lll_t fl, double delta, double eta, rep_type rt, gram_type gt); +void fmpz_lll_context_init( + fmpz_lll_t fl, + double delta, + double eta, + rep_type rt, + gram_type gt); /* Random parameter generation **********************************************/ @@ -77,7 +82,14 @@ void fmpz_lll_randtest(fmpz_lll_t fl, flint_rand_t state); /* The various Babai's ******************************************************/ -double fmpz_lll_heuristic_dot(const double * vec1, const double * vec2, slong len2, const fmpz_mat_t B, slong k, slong j, slong exp_adj); +double fmpz_lll_heuristic_dot( + const double * vec1, + const double * vec2, + slong len2, + const fmpz_mat_t B, + slong k, + slong j, + slong exp_adj); int fmpz_lll_shift(const fmpz_mat_t B); @@ -89,52 +101,180 @@ int fmpz_lll_mpf(fmpz_mat_t B, fmpz_mat_t U, const fmpz_lll_t fl); int fmpz_lll_wrapper(fmpz_mat_t B, fmpz_mat_t U, const fmpz_lll_t fl); -int fmpz_lll_check_babai_heuristic_d(int kappa, fmpz_mat_t B, fmpz_mat_t U, d_mat_t mu, d_mat_t r, double *s, d_mat_t appB, int *expo, fmpz_gram_t A, int a, int zeros, int kappamax, int n, const fmpz_lll_t fl); -int fmpz_lll_check_babai_heuristic(int kappa, fmpz_mat_t B, fmpz_mat_t U, mpf_mat_t mu, mpf_mat_t r, mpf *s, mpf_mat_t appB, fmpz_gram_t A, int a, int zeros, int kappamax, int n, mpf_t tmp, mpf_t rtmp, flint_bitcnt_t prec, const fmpz_lll_t fl); -int fmpz_lll_check_babai(int kappa, fmpz_mat_t B, fmpz_mat_t U, d_mat_t mu, d_mat_t r, double *s, d_mat_t appB, int *expo, fmpz_gram_t A, int a, int zeros, int kappamax, int n, const fmpz_lll_t fl); - -int fmpz_lll_advance_check_babai_heuristic_d(int cur_kappa, int kappa, fmpz_mat_t B, fmpz_mat_t U, d_mat_t mu, d_mat_t r, double *s, d_mat_t appB, int *expo, fmpz_gram_t A, int a, int zeros, int kappamax, int n, const fmpz_lll_t fl); -int fmpz_lll_advance_check_babai(int cur_kappa, int kappa, fmpz_mat_t B, fmpz_mat_t U, d_mat_t mu, d_mat_t r, double *s, d_mat_t appB, int *expo, fmpz_gram_t A, int a, int zeros, int kappamax, int n, const fmpz_lll_t fl); +int fmpz_lll_check_babai_heuristic_d( + int kappa, + fmpz_mat_t B, + fmpz_mat_t U, + d_mat_t mu, + d_mat_t r, + double *s, + d_mat_t appB, + int *expo, + fmpz_gram_t A, + int a, + int zeros, + int kappamax, + int n, + const fmpz_lll_t fl); +int fmpz_lll_check_babai_heuristic( + int kappa, fmpz_mat_t B, + fmpz_mat_t U, + mpf_mat_t mu, + mpf_mat_t r, + mpf *s, + mpf_mat_t appB, + fmpz_gram_t A, + int a, + int zeros, + int kappamax, + int n, + mpf_t tmp, + mpf_t rtmp, + flint_bitcnt_t prec, + const fmpz_lll_t fl); +int fmpz_lll_check_babai( + int kappa, + fmpz_mat_t B, + fmpz_mat_t U, + d_mat_t mu, + d_mat_t r, + double *s, + d_mat_t appB, + int *expo, + fmpz_gram_t A, + int a, + int zeros, + int kappamax, + int n, + const fmpz_lll_t fl); + +int fmpz_lll_advance_check_babai_heuristic_d( + int cur_kappa, + int kappa, + fmpz_mat_t B, + fmpz_mat_t U, + d_mat_t mu, + d_mat_t r, + double *s, + d_mat_t appB, + int *expo, + fmpz_gram_t A, + int a, + int zeros, + int kappamax, + int n, + const fmpz_lll_t fl); +int fmpz_lll_advance_check_babai( + int cur_kappa, + int kappa, + fmpz_mat_t B, + fmpz_mat_t U, + d_mat_t mu, + d_mat_t r, + double *s, + d_mat_t appB, + int *expo, + fmpz_gram_t A, + int a, + int zeros, + int kappamax, + int n, + const fmpz_lll_t fl); /* LLL with removals ********************************************************/ -int fmpz_lll_d_with_removal(fmpz_mat_t B, fmpz_mat_t U, const fmpz_t gs_B, const fmpz_lll_t fl); - -int fmpz_lll_d_heuristic_with_removal(fmpz_mat_t B, fmpz_mat_t U, const fmpz_t gs_B, const fmpz_lll_t fl); - -int fmpz_lll_mpf2_with_removal(fmpz_mat_t B, fmpz_mat_t U, flint_bitcnt_t prec, const fmpz_t gs_B, const fmpz_lll_t fl); - -int fmpz_lll_mpf_with_removal(fmpz_mat_t B, fmpz_mat_t U, const fmpz_t gs_B, const fmpz_lll_t fl); - -int fmpz_lll_wrapper_with_removal(fmpz_mat_t B, fmpz_mat_t U, const fmpz_t gs_B, const fmpz_lll_t fl); - -int fmpz_lll_d_with_removal_knapsack(fmpz_mat_t B, fmpz_mat_t U, const fmpz_t gs_B, const fmpz_lll_t fl); - -int fmpz_lll_wrapper_with_removal_knapsack(fmpz_mat_t B, fmpz_mat_t U, const fmpz_t gs_B, const fmpz_lll_t fl); +int fmpz_lll_d_with_removal( + fmpz_mat_t B, + fmpz_mat_t U, + const fmpz_t gs_B, + const fmpz_lll_t fl); + +int fmpz_lll_d_heuristic_with_removal( + fmpz_mat_t B, + fmpz_mat_t U, + const fmpz_t gs_B, + const fmpz_lll_t fl); + +int fmpz_lll_mpf2_with_removal( + fmpz_mat_t B, + fmpz_mat_t U, + flint_bitcnt_t prec, + const fmpz_t gs_B, + const fmpz_lll_t fl); + +int fmpz_lll_mpf_with_removal( + fmpz_mat_t B, + fmpz_mat_t U, + const fmpz_t gs_B, + const fmpz_lll_t fl); + +int fmpz_lll_wrapper_with_removal( + fmpz_mat_t B, + fmpz_mat_t U, + const fmpz_t gs_B, + const fmpz_lll_t fl); + +int fmpz_lll_d_with_removal_knapsack( + fmpz_mat_t B, + fmpz_mat_t U, + const fmpz_t gs_B, + const fmpz_lll_t fl); + +int fmpz_lll_wrapper_with_removal_knapsack( + fmpz_mat_t B, + fmpz_mat_t U, + const fmpz_t gs_B, + const fmpz_lll_t fl); /* ULLL *********************************************************************/ -int fmpz_lll_with_removal_ulll(fmpz_mat_t FM, fmpz_mat_t UM, slong new_size, const fmpz_t gs_B, const fmpz_lll_t fl); +int fmpz_lll_with_removal_ulll( + fmpz_mat_t FM, + fmpz_mat_t UM, + slong new_size, + const fmpz_t gs_B, + const fmpz_lll_t fl); /* LLL-reducedness ***********************************************************/ int fmpz_lll_is_reduced_d(const fmpz_mat_t B, const fmpz_lll_t fl); -int fmpz_lll_is_reduced_mpfr(const fmpz_mat_t B, const fmpz_lll_t fl, flint_bitcnt_t prec); +int fmpz_lll_is_reduced_mpfr( + const fmpz_mat_t B, + const fmpz_lll_t fl, + flint_bitcnt_t prec); int fmpz_lll_is_reduced(const fmpz_mat_t B, const fmpz_lll_t fl, flint_bitcnt_t prec); -int fmpz_lll_is_reduced_d_with_removal(const fmpz_mat_t B, const fmpz_lll_t fl, const fmpz_t gs_B, int newd); - -int fmpz_lll_is_reduced_mpfr_with_removal(const fmpz_mat_t B, const fmpz_lll_t fl, const fmpz_t gs_B, int newd,flint_bitcnt_t prec); - -int fmpz_lll_is_reduced_with_removal(const fmpz_mat_t B, const fmpz_lll_t fl, const fmpz_t gs_B, int newd, flint_bitcnt_t prec); +int fmpz_lll_is_reduced_d_with_removal( + const fmpz_mat_t B, + const fmpz_lll_t fl, + const fmpz_t gs_B, + int newd); + +int fmpz_lll_is_reduced_mpfr_with_removal( + const fmpz_mat_t B, + const fmpz_lll_t fl, + const fmpz_t gs_B, + int newd, + flint_bitcnt_t prec); + +int fmpz_lll_is_reduced_with_removal( + const fmpz_mat_t B, + const fmpz_lll_t fl, + const fmpz_t gs_B, + int newd, + flint_bitcnt_t prec); /* Default functions *********************************************************/ void fmpz_lll(fmpz_mat_t B, fmpz_mat_t U, const fmpz_lll_t fl); -int fmpz_lll_with_removal(fmpz_mat_t B, fmpz_mat_t U, const fmpz_t gs_B, const fmpz_lll_t fl); +int fmpz_lll_with_removal( + fmpz_mat_t B, + fmpz_mat_t U, + const fmpz_t gs_B, + const fmpz_lll_t fl); /* Modified ULLL ************************************************************/ diff --git a/src/fmpz_mat.h b/src/fmpz_mat.h index 19f19ebc2a..f40edce64d 100644 --- a/src/fmpz_mat.h +++ b/src/fmpz_mat.h @@ -28,7 +28,11 @@ extern "C" { /* Element access ***********************************************************/ -FMPZ_MAT_INLINE fmpz * fmpz_mat_entry(const fmpz_mat_t mat, slong i, slong j) { return mat->rows[i] + j; } +FMPZ_MAT_INLINE +fmpz * fmpz_mat_entry(const fmpz_mat_t mat, slong i, slong j) +{ + return mat->rows[i] + j; +} FMPZ_MAT_INLINE slong fmpz_mat_nrows(const fmpz_mat_t mat) { return mat->r; } FMPZ_MAT_INLINE slong fmpz_mat_ncols(const fmpz_mat_t mat) { return mat->c; } @@ -51,23 +55,47 @@ int fmpz_mat_equal(const fmpz_mat_t mat1, const fmpz_mat_t mat2); int fmpz_mat_equal_col(fmpz_mat_t M, slong m, slong n); int fmpz_mat_equal_row(fmpz_mat_t M, slong m, slong n); -FMPZ_MAT_INLINE int fmpz_mat_is_empty(const fmpz_mat_t mat) { return mat->r == 0 || mat->c == 0; } -FMPZ_MAT_INLINE int fmpz_mat_is_square(const fmpz_mat_t mat) { return mat->r == mat->c; } +FMPZ_MAT_INLINE +int fmpz_mat_is_empty(const fmpz_mat_t mat) +{ + return mat->r == 0 || mat->c == 0; +} +FMPZ_MAT_INLINE +int fmpz_mat_is_square(const fmpz_mat_t mat) +{ + return mat->r == mat->c; +} void fmpz_mat_zero(fmpz_mat_t mat); void fmpz_mat_one(fmpz_mat_t mat); /* Windows and concatenation ************************************************/ -void fmpz_mat_window_init(fmpz_mat_t window, const fmpz_mat_t mat, slong r1, slong c1, slong r2, slong c2); +void fmpz_mat_window_init( + fmpz_mat_t window, + const fmpz_mat_t mat, + slong r1, + slong c1, + slong r2, + slong c2); void fmpz_mat_window_clear(fmpz_mat_t window); -void fmpz_mat_concat_horizontal(fmpz_mat_t res, const fmpz_mat_t mat1, const fmpz_mat_t mat2); -void fmpz_mat_concat_vertical(fmpz_mat_t res, const fmpz_mat_t mat1, const fmpz_mat_t mat2); +void fmpz_mat_concat_horizontal( + fmpz_mat_t res, + const fmpz_mat_t mat1, + const fmpz_mat_t mat2); +void fmpz_mat_concat_vertical( + fmpz_mat_t res, + const fmpz_mat_t mat1, + const fmpz_mat_t mat2); void _fmpz_mat_read_only_window_init_strip_initial_zero_rows(fmpz_mat_t A, const fmpz_mat_t B); -FMPZ_MAT_INLINE void _fmpz_mat_read_only_window_clear(fmpz_mat_t A) { /* Do nothing */ } +FMPZ_MAT_INLINE +void _fmpz_mat_read_only_window_clear(fmpz_mat_t A) +{ + /* Do nothing */ +} /* Input and output *********************************************************/ @@ -87,14 +115,34 @@ void fmpz_mat_randbits(fmpz_mat_t mat, flint_rand_t state, flint_bitcnt_t bits); void fmpz_mat_randtest(fmpz_mat_t mat, flint_rand_t state, flint_bitcnt_t bits); void fmpz_mat_randtest_unsigned(fmpz_mat_t mat, flint_rand_t state, flint_bitcnt_t bits); void fmpz_mat_randintrel(fmpz_mat_t mat, flint_rand_t state, flint_bitcnt_t bits); -void fmpz_mat_randsimdioph(fmpz_mat_t mat, flint_rand_t state, flint_bitcnt_t bits, flint_bitcnt_t bits2); -void fmpz_mat_randntrulike(fmpz_mat_t mat, flint_rand_t state, flint_bitcnt_t bits, ulong q); -void fmpz_mat_randntrulike2(fmpz_mat_t mat, flint_rand_t state, flint_bitcnt_t bits, ulong q); +void fmpz_mat_randsimdioph( + fmpz_mat_t mat, + flint_rand_t state, + flint_bitcnt_t bits, + flint_bitcnt_t bits2); +void fmpz_mat_randntrulike( + fmpz_mat_t mat, + flint_rand_t state, + flint_bitcnt_t bits, + ulong q); +void fmpz_mat_randntrulike2( + fmpz_mat_t mat, + flint_rand_t state, + flint_bitcnt_t bits, + ulong q); void fmpz_mat_randajtai(fmpz_mat_t mat, flint_rand_t state, double alpha); -void fmpz_mat_randrank(fmpz_mat_t mat, flint_rand_t state, slong rank, flint_bitcnt_t bits); +void fmpz_mat_randrank( + fmpz_mat_t mat, + flint_rand_t state, + slong rank, + flint_bitcnt_t bits); void fmpz_mat_randdet(fmpz_mat_t mat, flint_rand_t state, const fmpz_t det); void fmpz_mat_randops(fmpz_mat_t mat, flint_rand_t state, slong count); -int fmpz_mat_randpermdiag(fmpz_mat_t mat, flint_rand_t state, const fmpz * diag, slong n); +int fmpz_mat_randpermdiag( + fmpz_mat_t mat, + flint_rand_t state, + const fmpz * diag, + slong n); /* Norms ********************************************************************/ @@ -125,7 +173,10 @@ void fmpz_mat_scalar_submul_fmpz(fmpz_mat_t B, const fmpz_mat_t A, const fmpz_t void fmpz_mat_scalar_submul_si(fmpz_mat_t B, const fmpz_mat_t A, slong c); void fmpz_mat_scalar_submul_ui(fmpz_mat_t B, const fmpz_mat_t A, ulong c); -void fmpz_mat_scalar_addmul_nmod_mat_fmpz(fmpz_mat_t B, const nmod_mat_t A, const fmpz_t c); +void fmpz_mat_scalar_addmul_nmod_mat_fmpz( + fmpz_mat_t B, + const nmod_mat_t A, + const fmpz_t c); void fmpz_mat_scalar_addmul_nmod_mat_ui(fmpz_mat_t B, const nmod_mat_t A, ulong c); void fmpz_mat_scalar_divexact_fmpz(fmpz_mat_t B, const fmpz_mat_t A, const fmpz_t c); @@ -146,22 +197,49 @@ void fmpz_mat_mul_classical_inline(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_ void fmpz_mat_mul_strassen(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B); -void _fmpz_mat_mul_fft(fmpz_mat_t C, const fmpz_mat_t A, slong abits, const fmpz_mat_t B, slong bbits, int sign); +void _fmpz_mat_mul_fft( + fmpz_mat_t C, + const fmpz_mat_t A, + slong abits, + const fmpz_mat_t B, + slong bbits, + int sign); void fmpz_mat_mul_fft(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B); -void _fmpz_mat_mul_multi_mod(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B, int sign, flint_bitcnt_t Cbits); +void _fmpz_mat_mul_multi_mod( + fmpz_mat_t C, + const fmpz_mat_t A, + const fmpz_mat_t B, + int sign, + flint_bitcnt_t Cbits); void fmpz_mat_mul_multi_mod(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B); -int _fmpz_mat_mul_blas(fmpz_mat_t C, const fmpz_mat_t A, flint_bitcnt_t Abits, const fmpz_mat_t B, flint_bitcnt_t Bbits, int sign, flint_bitcnt_t Cbits); +int _fmpz_mat_mul_blas( + fmpz_mat_t C, + const fmpz_mat_t A, + flint_bitcnt_t Abits, + const fmpz_mat_t B, + flint_bitcnt_t Bbits, + int sign, + flint_bitcnt_t Cbits); int fmpz_mat_mul_blas(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B); void _fmpz_mat_mul_small_1(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B); void _fmpz_mat_mul_small_2a(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B); void _fmpz_mat_mul_small_2b(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B); -void _fmpz_mat_mul_small_internal(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B, flint_bitcnt_t Cbits); +void _fmpz_mat_mul_small_internal( + fmpz_mat_t C, + const fmpz_mat_t A, + const fmpz_mat_t B, + flint_bitcnt_t Cbits); void _fmpz_mat_mul_small(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B); -void _fmpz_mat_mul_double_word_internal(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B, int sign, flint_bitcnt_t bits); +void _fmpz_mat_mul_double_word_internal( + fmpz_mat_t C, + const fmpz_mat_t A, + const fmpz_mat_t B, + int sign, + flint_bitcnt_t bits); void _fmpz_mat_mul_double_word(fmpz_mat_t C, const fmpz_mat_t A, const fmpz_mat_t B); void fmpz_mat_sqr_bodrato(fmpz_mat_t B, const fmpz_mat_t A); @@ -169,10 +247,18 @@ void fmpz_mat_sqr(fmpz_mat_t B, const fmpz_mat_t A); void fmpz_mat_pow(fmpz_mat_t B, const fmpz_mat_t A, ulong exp); -void fmpz_mat_mul_fmpz_vec_ptr(fmpz * const * c, const fmpz_mat_t A, const fmpz * const * b, slong blen); +void fmpz_mat_mul_fmpz_vec_ptr( + fmpz * const * c, + const fmpz_mat_t A, + const fmpz * const * b, + slong blen); void fmpz_mat_mul_fmpz_vec(fmpz * c, const fmpz_mat_t A, const fmpz * b, slong blen); -void fmpz_mat_fmpz_vec_mul_ptr(fmpz * const * c, const fmpz * const * a, slong alen, const fmpz_mat_t B); +void fmpz_mat_fmpz_vec_mul_ptr( + fmpz * const * c, + const fmpz * const * a, + slong alen, + const fmpz_mat_t B); void fmpz_mat_fmpz_vec_mul(fmpz * c, const fmpz * a, slong alen, const fmpz_mat_t B); /* Kronecker product ********************************************************/ @@ -202,12 +288,25 @@ void fmpz_mat_invert_cols(fmpz_mat_t mat, slong * perm); /* Gaussian elimination *****************************************************/ -slong fmpz_mat_find_pivot_any(const fmpz_mat_t mat, slong start_row, slong end_row, slong c); -slong fmpz_mat_find_pivot_smallest(const fmpz_mat_t mat, slong start_row, slong end_row, slong c); +slong fmpz_mat_find_pivot_any( + const fmpz_mat_t mat, + slong start_row, + slong end_row, + slong c); +slong fmpz_mat_find_pivot_smallest( + const fmpz_mat_t mat, + slong start_row, + slong end_row, + slong c); slong fmpz_mat_rank_small_inplace(fmpz_mat_t B); -slong fmpz_mat_fflu(fmpz_mat_t B, fmpz_t den, slong * perm, const fmpz_mat_t A, int rank_check); +slong fmpz_mat_fflu( + fmpz_mat_t B, + fmpz_t den, + slong * perm, + const fmpz_mat_t A, + int rank_check); slong fmpz_mat_rref_fflu(fmpz_mat_t B, fmpz_t den, const fmpz_mat_t A); slong fmpz_mat_rref(fmpz_mat_t B, fmpz_t den, const fmpz_mat_t A); slong fmpz_mat_rref_mul(fmpz_mat_t B, fmpz_t den, const fmpz_mat_t A); @@ -235,7 +334,11 @@ void fmpz_mat_det_cofactor(fmpz_t det, const fmpz_mat_t A); void fmpz_mat_det_bareiss(fmpz_t det, const fmpz_mat_t A); void fmpz_mat_det_modular(fmpz_t det, const fmpz_mat_t A, int proved); void fmpz_mat_det_modular_accelerated(fmpz_t det, const fmpz_mat_t A, int proved); -void fmpz_mat_det_modular_given_divisor(fmpz_t det, const fmpz_mat_t A, const fmpz_t d, int proved); +void fmpz_mat_det_modular_given_divisor( + fmpz_t det, + const fmpz_mat_t A, + const fmpz_t d, + int proved); void fmpz_mat_det_bound(fmpz_t bound, const fmpz_mat_t A); void fmpz_mat_det_bound_nonzero(fmpz_t bound, const fmpz_mat_t A); @@ -273,25 +376,79 @@ slong fmpz_mat_rank(const fmpz_mat_t A); void fmpz_mat_solve_bound(fmpz_t N, fmpz_t D, const fmpz_mat_t A, const fmpz_mat_t B); -int fmpz_mat_solve_cramer(fmpz_mat_t X, fmpz_t den, const fmpz_mat_t A, const fmpz_mat_t B); -int fmpz_mat_solve_fflu_precomp(fmpz_mat_t X, const slong * perm, const fmpz_mat_t FFLU, const fmpz_mat_t B); -int fmpz_mat_solve_fflu(fmpz_mat_t X, fmpz_t den, const fmpz_mat_t A, const fmpz_mat_t B); +int fmpz_mat_solve_cramer( + fmpz_mat_t X, + fmpz_t den, + const fmpz_mat_t A, + const fmpz_mat_t B); +int fmpz_mat_solve_fflu_precomp( + fmpz_mat_t X, + const slong * perm, + const fmpz_mat_t FFLU, + const fmpz_mat_t B); +int fmpz_mat_solve_fflu( + fmpz_mat_t X, + fmpz_t den, + const fmpz_mat_t A, + const fmpz_mat_t B); int fmpz_mat_solve(fmpz_mat_t X, fmpz_t den, const fmpz_mat_t A, const fmpz_mat_t B); -mp_limb_t fmpz_mat_find_good_prime_and_invert(nmod_mat_t Ainv, const fmpz_mat_t A, const fmpz_t det_bound); - -mp_limb_t * fmpz_mat_dixon_get_crt_primes(slong * num_primes, const fmpz_mat_t A, mp_limb_t p); - -void _fmpz_mat_solve_dixon_den(fmpz_mat_t X, fmpz_t den, const fmpz_mat_t A, const fmpz_mat_t B, const nmod_mat_t Ainv, mp_limb_t p, const fmpz_t N, const fmpz_t D); -int fmpz_mat_solve_dixon_den(fmpz_mat_t X, fmpz_t den, const fmpz_mat_t A, const fmpz_mat_t B); - -void _fmpz_mat_solve_dixon(fmpz_mat_t X, fmpz_t mod, const fmpz_mat_t A, const fmpz_mat_t B, const nmod_mat_t Ainv, mp_limb_t p, const fmpz_t N, const fmpz_t D); -int fmpz_mat_solve_dixon(fmpz_mat_t X, fmpz_t mod, const fmpz_mat_t A, const fmpz_mat_t B); - -int fmpz_mat_solve_multi_mod_den(fmpz_mat_t X, fmpz_t den, const fmpz_mat_t A, const fmpz_mat_t B); - -int fmpz_mat_can_solve_fflu(fmpz_mat_t X, fmpz_t den, const fmpz_mat_t A, const fmpz_mat_t B); -int fmpz_mat_can_solve_multi_mod_den(fmpz_mat_t X, fmpz_t den, const fmpz_mat_t A, const fmpz_mat_t B); +mp_limb_t fmpz_mat_find_good_prime_and_invert( + nmod_mat_t Ainv, + const fmpz_mat_t A, + const fmpz_t det_bound); + +mp_limb_t * fmpz_mat_dixon_get_crt_primes( + slong * num_primes, + const fmpz_mat_t A, + mp_limb_t p); + +void _fmpz_mat_solve_dixon_den( + fmpz_mat_t X, + fmpz_t den, + const fmpz_mat_t A, + const fmpz_mat_t B, + const nmod_mat_t Ainv, + mp_limb_t p, + const fmpz_t N, + const fmpz_t D); +int fmpz_mat_solve_dixon_den( + fmpz_mat_t X, + fmpz_t den, + const fmpz_mat_t A, + const fmpz_mat_t B); + +void _fmpz_mat_solve_dixon( + fmpz_mat_t X, + fmpz_t mod, + const fmpz_mat_t A, + const fmpz_mat_t B, + const nmod_mat_t Ainv, + mp_limb_t p, + const fmpz_t N, + const fmpz_t D); +int fmpz_mat_solve_dixon( + fmpz_mat_t X, + fmpz_t mod, + const fmpz_mat_t A, + const fmpz_mat_t B); + +int fmpz_mat_solve_multi_mod_den( + fmpz_mat_t X, + fmpz_t den, + const fmpz_mat_t A, + const fmpz_mat_t B); + +int fmpz_mat_can_solve_fflu( + fmpz_mat_t X, + fmpz_t den, + const fmpz_mat_t A, + const fmpz_mat_t B); +int fmpz_mat_can_solve_multi_mod_den( + fmpz_mat_t X, + fmpz_t den, + const fmpz_mat_t A, + const fmpz_mat_t B); int fmpz_mat_can_solve(fmpz_mat_t X, fmpz_t den, const fmpz_mat_t A, const fmpz_mat_t B); /* Nullspace *****************************************************************/ @@ -308,15 +465,35 @@ void fmpz_mat_set_nmod_mat(fmpz_mat_t A, const nmod_mat_t Amod); void fmpz_mat_set_nmod_mat_unsigned(fmpz_mat_t A, const nmod_mat_t Amod); void fmpz_mat_get_nmod_mat(nmod_mat_t Amod, const fmpz_mat_t A); -void fmpz_mat_CRT_ui(fmpz_mat_t res, const fmpz_mat_t mat1, const fmpz_t m1, const nmod_mat_t mat2, int sign); +void fmpz_mat_CRT_ui( + fmpz_mat_t res, + const fmpz_mat_t mat1, + const fmpz_t m1, + const nmod_mat_t mat2, + int sign); #ifdef FMPZ_H -void fmpz_mat_multi_mod_ui_precomp(nmod_mat_t * residues, slong nres, const fmpz_mat_t mat, const fmpz_comb_t comb, fmpz_comb_temp_t temp); -void fmpz_mat_multi_CRT_ui_precomp(fmpz_mat_t mat, nmod_mat_t * const residues, slong nres, const fmpz_comb_t comb, fmpz_comb_temp_t temp, int sign); +void fmpz_mat_multi_mod_ui_precomp( + nmod_mat_t * residues, + slong nres, + const fmpz_mat_t mat, + const fmpz_comb_t comb, + fmpz_comb_temp_t temp); +void fmpz_mat_multi_CRT_ui_precomp( + fmpz_mat_t mat, + nmod_mat_t * const residues, + slong nres, + const fmpz_comb_t comb, + fmpz_comb_temp_t temp, + int sign); #endif void fmpz_mat_multi_mod_ui(nmod_mat_t * residues, slong nres, const fmpz_mat_t mat); -void fmpz_mat_multi_CRT_ui(fmpz_mat_t mat, nmod_mat_t * const residues, slong nres, int sign); +void fmpz_mat_multi_CRT_ui( + fmpz_mat_t mat, + nmod_mat_t * const residues, + slong nres, + int sign); /* HNF and SNF **************************************************************/ @@ -366,8 +543,18 @@ void fmpz_mat_chol_d(d_mat_t R, const fmpz_mat_t A); int fmpz_mat_is_reduced(const fmpz_mat_t A, double delta, double eta); int fmpz_mat_is_reduced_gram(const fmpz_mat_t A, double delta, double eta); -int fmpz_mat_is_reduced_with_removal(const fmpz_mat_t A, double delta, double eta, const fmpz_t gs_B, int newd); -int fmpz_mat_is_reduced_gram_with_removal(const fmpz_mat_t A, double delta, double eta, const fmpz_t gs_B, int newd); +int fmpz_mat_is_reduced_with_removal( + const fmpz_mat_t A, + double delta, + double eta, + const fmpz_t gs_B, + int newd); +int fmpz_mat_is_reduced_gram_with_removal( + const fmpz_mat_t A, + double delta, + double eta, + const fmpz_t gs_B, + int newd); /* Classical LLL *************************************************************/ @@ -383,7 +570,12 @@ int fmpz_mat_col_partition(slong * part, fmpz_mat_t M, int short_circuit); /* Van Hoeij helper function *************************************************/ -int fmpz_mat_next_col_van_hoeij(fmpz_mat_t M, fmpz_t P, fmpz_mat_t col, slong exp, slong U_exp); +int fmpz_mat_next_col_van_hoeij( + fmpz_mat_t M, + fmpz_t P, + fmpz_mat_t col, + slong exp, + slong U_exp); #ifdef __cplusplus } diff --git a/src/fmpz_mod.h b/src/fmpz_mod.h index 372effd56d..fbddd7bd0e 100644 --- a/src/fmpz_mod.h +++ b/src/fmpz_mod.h @@ -39,12 +39,22 @@ extern "C" { void fmpz_mod_ctx_init(fmpz_mod_ctx_t ctx, const fmpz_t n); void fmpz_mod_ctx_init_ui(fmpz_mod_ctx_t ctx, ulong n); -void fmpz_mod_ctx_init_rand_bits(fmpz_mod_ctx_t ctx, flint_rand_t state, flint_bitcnt_t max_bits); -void fmpz_mod_ctx_init_rand_bits_prime(fmpz_mod_ctx_t ctx, flint_rand_t state, flint_bitcnt_t max_bits); +void fmpz_mod_ctx_init_rand_bits( + fmpz_mod_ctx_t ctx, + flint_rand_t state, + flint_bitcnt_t max_bits); +void fmpz_mod_ctx_init_rand_bits_prime( + fmpz_mod_ctx_t ctx, + flint_rand_t state, + flint_bitcnt_t max_bits); void fmpz_mod_ctx_clear(fmpz_mod_ctx_t ctx); -FMPZ_MOD_INLINE const fmpz * fmpz_mod_ctx_modulus(const fmpz_mod_ctx_t ctx) { return ctx->n; } +FMPZ_MOD_INLINE +const fmpz * fmpz_mod_ctx_modulus(const fmpz_mod_ctx_t ctx) +{ + return ctx->n; +} void fmpz_mod_ctx_set_modulus(fmpz_mod_ctx_t ctx, const fmpz_t n); void fmpz_mod_ctx_set_modulus_ui(fmpz_mod_ctx_t ctx, ulong n); @@ -62,7 +72,11 @@ void fmpz_mod_set_fmpz(fmpz_t a, const fmpz_t b, const fmpz_mod_ctx_t ctx); void fmpz_mod_set_ui(fmpz_t a, ulong b, const fmpz_mod_ctx_t ctx); void fmpz_mod_set_si(fmpz_t a, slong b, const fmpz_mod_ctx_t ctx); -void fmpz_mod_add_fmpz(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); +void fmpz_mod_add_fmpz( + fmpz_t a, + const fmpz_t b, + const fmpz_t c, + const fmpz_mod_ctx_t ctx); void fmpz_mod_add_ui(fmpz_t a, const fmpz_t b, ulong c, const fmpz_mod_ctx_t ctx); void fmpz_mod_add_si(fmpz_t a, const fmpz_t b, slong c, const fmpz_mod_ctx_t ctx); @@ -70,12 +84,24 @@ void _fmpz_mod_add1(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx void _fmpz_mod_add2s(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); void _fmpz_mod_add2(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); void _fmpz_mod_addN(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); -FMPZ_MOD_INLINE void fmpz_mod_add(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx) { (ctx->add_fxn)(a, b, c, ctx); } +FMPZ_MOD_INLINE +void fmpz_mod_add(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx) +{ + (ctx->add_fxn)(a, b, c, ctx); +} -void fmpz_mod_sub_fmpz(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); +void fmpz_mod_sub_fmpz( + fmpz_t a, + const fmpz_t b, + const fmpz_t c, + const fmpz_mod_ctx_t ctx); void fmpz_mod_sub_ui(fmpz_t a, const fmpz_t b, ulong c, const fmpz_mod_ctx_t ctx); void fmpz_mod_sub_si(fmpz_t a, const fmpz_t b, slong c, const fmpz_mod_ctx_t ctx); -void fmpz_mod_fmpz_sub(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); +void fmpz_mod_fmpz_sub( + fmpz_t a, + const fmpz_t b, + const fmpz_t c, + const fmpz_mod_ctx_t ctx); void fmpz_mod_ui_sub(fmpz_t a, ulong b, const fmpz_t c, const fmpz_mod_ctx_t ctx); void fmpz_mod_si_sub(fmpz_t a, slong b, const fmpz_t c, const fmpz_mod_ctx_t ctx); @@ -83,21 +109,38 @@ void _fmpz_mod_sub1(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx void _fmpz_mod_sub2s(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); void _fmpz_mod_sub2(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); void _fmpz_mod_subN(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); -FMPZ_MOD_INLINE void fmpz_mod_sub(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx) { (ctx->sub_fxn)(a, b, c, ctx); } +FMPZ_MOD_INLINE +void fmpz_mod_sub(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx) +{ + (ctx->sub_fxn)(a, b, c, ctx); +} void fmpz_mod_neg(fmpz_t a, const fmpz_t b, const fmpz_mod_ctx_t ctx); void fmpz_mod_mul_si(fmpz_t a, const fmpz_t b, slong c, const fmpz_mod_ctx_t ctx); void fmpz_mod_mul_ui(fmpz_t a, const fmpz_t b, ulong c, const fmpz_mod_ctx_t ctx); -void fmpz_mod_mul_fmpz(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); +void fmpz_mod_mul_fmpz( + fmpz_t a, + const fmpz_t b, + const fmpz_t c, + const fmpz_mod_ctx_t ctx); void _fmpz_mod_mul1(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); void _fmpz_mod_mul2s(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); void _fmpz_mod_mul2(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); void _fmpz_mod_mulN(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); -FMPZ_MOD_INLINE void fmpz_mod_mul(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx) { (ctx->mul_fxn)(a, b, c, ctx); } +FMPZ_MOD_INLINE +void fmpz_mod_mul(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx) +{ + (ctx->mul_fxn)(a, b, c, ctx); +} -void fmpz_mod_addmul(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_t d, const fmpz_mod_ctx_t ctx); +void fmpz_mod_addmul( + fmpz_t a, + const fmpz_t b, + const fmpz_t c, + const fmpz_t d, + const fmpz_mod_ctx_t ctx); int fmpz_mod_is_invertible(const fmpz_t a, const fmpz_mod_ctx_t ctx); @@ -106,7 +149,11 @@ void fmpz_mod_inv(fmpz_t a, const fmpz_t b, const fmpz_mod_ctx_t ctx); int fmpz_mod_divides(fmpz_t a, const fmpz_t b, const fmpz_t c, const fmpz_mod_ctx_t ctx); void fmpz_mod_pow_ui(fmpz_t a, const fmpz_t b, ulong pow, const fmpz_mod_ctx_t ctx); -int fmpz_mod_pow_fmpz(fmpz_t a, const fmpz_t b, const fmpz_t pow, const fmpz_mod_ctx_t ctx); +int fmpz_mod_pow_fmpz( + fmpz_t a, + const fmpz_t b, + const fmpz_t pow, + const fmpz_mod_ctx_t ctx); void fmpz_mod_rand(fmpz_t a, flint_rand_t state, const fmpz_mod_ctx_t ctx); void fmpz_mod_rand_not_zero(fmpz_t a, flint_rand_t state, const fmpz_mod_ctx_t ctx); @@ -150,9 +197,16 @@ void fmpz_mod_discrete_log_pohlig_hellman_clear(fmpz_mod_discrete_log_pohlig_hel double fmpz_mod_discrete_log_pohlig_hellman_precompute_prime(fmpz_mod_discrete_log_pohlig_hellman_t L, const fmpz_t p); -void fmpz_mod_discrete_log_pohlig_hellman_run(fmpz_t x, const fmpz_mod_discrete_log_pohlig_hellman_t L, const fmpz_t y); +void fmpz_mod_discrete_log_pohlig_hellman_run( + fmpz_t x, + const fmpz_mod_discrete_log_pohlig_hellman_t L, + const fmpz_t y); -FMPZ_MOD_INLINE const fmpz * fmpz_mod_discrete_log_pohlig_hellman_primitive_root(fmpz_mod_discrete_log_pohlig_hellman_t L) { return L->alpha; } +FMPZ_MOD_INLINE +const fmpz * fmpz_mod_discrete_log_pohlig_hellman_primitive_root(fmpz_mod_discrete_log_pohlig_hellman_t L) +{ + return L->alpha; +} int fmpz_next_smooth_prime(fmpz_t a, const fmpz_t b); diff --git a/src/fmpz_mod_mat.h b/src/fmpz_mod_mat.h index e98a077ebf..d1d40b4cb8 100644 --- a/src/fmpz_mod_mat.h +++ b/src/fmpz_mod_mat.h @@ -34,9 +34,21 @@ /* Element access ***********************************************************/ -FMPZ_MOD_MAT_INLINE fmpz * fmpz_mod_mat_entry(const fmpz_mod_mat_t mat, slong i, slong j) { return mat->mat->rows[i] + j; } -FMPZ_MOD_MAT_INLINE slong fmpz_mod_mat_nrows(const fmpz_mod_mat_t mat) { return mat->mat->r; } -FMPZ_MOD_MAT_INLINE slong fmpz_mod_mat_ncols(const fmpz_mod_mat_t mat) { return mat->mat->c; } +FMPZ_MOD_MAT_INLINE +fmpz * fmpz_mod_mat_entry(const fmpz_mod_mat_t mat, slong i, slong j) +{ + return mat->mat->rows[i] + j; +} +FMPZ_MOD_MAT_INLINE +slong fmpz_mod_mat_nrows(const fmpz_mod_mat_t mat) +{ + return mat->mat->r; +} +FMPZ_MOD_MAT_INLINE +slong fmpz_mod_mat_ncols(const fmpz_mod_mat_t mat) +{ + return mat->mat->c; +} void fmpz_mod_mat_set_entry(fmpz_mod_mat_t mat, slong i, slong j, const fmpz_t val); void fmpz_mod_mat_get_entry(fmpz_t x, const fmpz_mod_mat_t mat, slong i, slong j); @@ -86,11 +98,23 @@ void fmpz_mod_mat_randops(fmpz_mod_mat_t mat, slong count, flint_rand_t state); /* Windows and concatenation *************************************************/ -void fmpz_mod_mat_window_init(fmpz_mod_mat_t window, const fmpz_mod_mat_t mat, slong r1, slong c1, slong r2, slong c2); +void fmpz_mod_mat_window_init( + fmpz_mod_mat_t window, + const fmpz_mod_mat_t mat, + slong r1, + slong c1, + slong r2, + slong c2); void fmpz_mod_mat_window_clear(fmpz_mod_mat_t window); -void fmpz_mod_mat_concat_horizontal(fmpz_mod_mat_t res, const fmpz_mod_mat_t mat1, const fmpz_mod_mat_t mat2); -void fmpz_mod_mat_concat_vertical(fmpz_mod_mat_t res, const fmpz_mod_mat_t mat1, const fmpz_mod_mat_t mat2); +void fmpz_mod_mat_concat_horizontal( + fmpz_mod_mat_t res, + const fmpz_mod_mat_t mat1, + const fmpz_mod_mat_t mat2); +void fmpz_mod_mat_concat_vertical( + fmpz_mod_mat_t res, + const fmpz_mod_mat_t mat1, + const fmpz_mod_mat_t mat2); /* I/O ***********************************************************************/ @@ -135,18 +159,48 @@ void fmpz_mod_mat_scalar_mul_fmpz(fmpz_mod_mat_t B, const fmpz_mod_mat_t A, fmpz void fmpz_mod_mat_mul(fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B); -void _fmpz_mod_mat_mul_classical_threaded_pool_op(fmpz_mod_mat_t D, const fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B, int op, thread_pool_handle * threads, slong num_threads); -void fmpz_mod_mat_mul_classical_threaded(fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B); +void _fmpz_mod_mat_mul_classical_threaded_pool_op( + fmpz_mod_mat_t D, + const fmpz_mod_mat_t C, + const fmpz_mod_mat_t A, + const fmpz_mod_mat_t B, + int op, + thread_pool_handle * threads, + slong num_threads); +void fmpz_mod_mat_mul_classical_threaded( + fmpz_mod_mat_t C, + const fmpz_mod_mat_t A, + const fmpz_mod_mat_t B); void fmpz_mod_mat_sqr(fmpz_mod_mat_t B, const fmpz_mod_mat_t A); -void fmpz_mod_mat_submul(fmpz_mod_mat_t D, const fmpz_mod_mat_t C, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B); - -void fmpz_mod_mat_mul_fmpz_vec(fmpz * c, const fmpz_mod_mat_t A, const fmpz * b, slong blen); -void fmpz_mod_mat_mul_fmpz_vec_ptr(fmpz * const * c, const fmpz_mod_mat_t A, const fmpz * const * b, slong blen); - -void fmpz_mod_mat_fmpz_vec_mul(fmpz * c, const fmpz * a, slong alen, const fmpz_mod_mat_t B); -void fmpz_mod_mat_fmpz_vec_mul_ptr(fmpz * const * c, const fmpz * const * a, slong alen, const fmpz_mod_mat_t B); +void fmpz_mod_mat_submul( + fmpz_mod_mat_t D, + const fmpz_mod_mat_t C, + const fmpz_mod_mat_t A, + const fmpz_mod_mat_t B); + +void fmpz_mod_mat_mul_fmpz_vec( + fmpz * c, + const fmpz_mod_mat_t A, + const fmpz * b, + slong blen); +void fmpz_mod_mat_mul_fmpz_vec_ptr( + fmpz * const * c, + const fmpz_mod_mat_t A, + const fmpz * const * b, + slong blen); + +void fmpz_mod_mat_fmpz_vec_mul( + fmpz * c, + const fmpz * a, + slong alen, + const fmpz_mod_mat_t B); +void fmpz_mod_mat_fmpz_vec_mul_ptr( + fmpz * const * c, + const fmpz * const * a, + slong alen, + const fmpz_mod_mat_t B); /* Trace *********************************************************************/ @@ -156,22 +210,54 @@ void fmpz_mod_mat_trace(fmpz_t trace, const fmpz_mod_mat_t mat); slong fmpz_mod_mat_rref(slong * perm, fmpz_mod_mat_t mat); -slong _fmpz_mod_mat_reduce_row(fmpz_mod_mat_t A, slong * P, slong * L, slong m, const fmpz_mod_ctx_t ctx); +slong _fmpz_mod_mat_reduce_row( + fmpz_mod_mat_t A, + slong * P, + slong * L, + slong m, + const fmpz_mod_ctx_t ctx); slong fmpz_mod_mat_reduce_row(fmpz_mod_mat_t A, slong * P, slong * L, slong m); slong fmpz_mod_mat_lu(slong * P, fmpz_mod_mat_t A, int rank_check); slong fmpz_mod_mat_lu_classical(slong * P, fmpz_mod_mat_t A, int rank_check); slong fmpz_mod_mat_lu_recursive(slong * P, fmpz_mod_mat_t A, int rank_check); -void fmpz_mod_mat_solve_triu(fmpz_mod_mat_t X, const fmpz_mod_mat_t L, const fmpz_mod_mat_t B, int unit); -void fmpz_mod_mat_solve_triu_classical(fmpz_mod_mat_t X, const fmpz_mod_mat_t L, const fmpz_mod_mat_t B, int unit); -void fmpz_mod_mat_solve_triu_recursive(fmpz_mod_mat_t X, const fmpz_mod_mat_t L, const fmpz_mod_mat_t B, int unit); - -void fmpz_mod_mat_solve_tril(fmpz_mod_mat_t X, const fmpz_mod_mat_t L, const fmpz_mod_mat_t B, int unit); -void fmpz_mod_mat_solve_tril_classical(fmpz_mod_mat_t X, const fmpz_mod_mat_t L, const fmpz_mod_mat_t B, int unit); -void fmpz_mod_mat_solve_tril_recursive(fmpz_mod_mat_t X, const fmpz_mod_mat_t L, const fmpz_mod_mat_t B, int unit); - -int fmpz_mod_mat_can_solve(fmpz_mod_mat_t X, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B); +void fmpz_mod_mat_solve_triu( + fmpz_mod_mat_t X, + const fmpz_mod_mat_t L, + const fmpz_mod_mat_t B, + int unit); +void fmpz_mod_mat_solve_triu_classical( + fmpz_mod_mat_t X, + const fmpz_mod_mat_t L, + const fmpz_mod_mat_t B, + int unit); +void fmpz_mod_mat_solve_triu_recursive( + fmpz_mod_mat_t X, + const fmpz_mod_mat_t L, + const fmpz_mod_mat_t B, + int unit); + +void fmpz_mod_mat_solve_tril( + fmpz_mod_mat_t X, + const fmpz_mod_mat_t L, + const fmpz_mod_mat_t B, + int unit); +void fmpz_mod_mat_solve_tril_classical( + fmpz_mod_mat_t X, + const fmpz_mod_mat_t L, + const fmpz_mod_mat_t B, + int unit); +void fmpz_mod_mat_solve_tril_recursive( + fmpz_mod_mat_t X, + const fmpz_mod_mat_t L, + const fmpz_mod_mat_t B, + int unit); + +int fmpz_mod_mat_can_solve( + fmpz_mod_mat_t X, + const fmpz_mod_mat_t A, + const fmpz_mod_mat_t B); int fmpz_mod_mat_solve(fmpz_mod_mat_t X, const fmpz_mod_mat_t A, const fmpz_mod_mat_t B); int fmpz_mod_mat_inv(fmpz_mod_mat_t B, fmpz_mod_mat_t A); diff --git a/src/fmpz_mod_mpoly.h b/src/fmpz_mod_mpoly.h index 3a4b059a21..941ae767aa 100644 --- a/src/fmpz_mod_mpoly.h +++ b/src/fmpz_mod_mpoly.h @@ -44,17 +44,49 @@ typedef fmpz_mod_mpoly_univar_struct fmpz_mod_mpoly_univar_t[1]; /* Context object ************************************************************/ -void fmpz_mod_mpoly_ctx_init(fmpz_mod_mpoly_ctx_t ctx, slong nvars, const ordering_t ord, const fmpz_t modulus); -void fmpz_mod_mpoly_ctx_init_rand(fmpz_mod_mpoly_ctx_t ctx, flint_rand_t state, slong max_nvars, const fmpz_t modulus); -void fmpz_mod_mpoly_ctx_init_rand_bits_prime(fmpz_mod_mpoly_ctx_t ctx, flint_rand_t state, slong max_nvars, flint_bitcnt_t max_bits); -void fmpz_mod_mpoly_ctx_init_rand_bits(fmpz_mod_mpoly_ctx_t ctx, flint_rand_t state, slong max_nvars, flint_bitcnt_t max_bits); +void fmpz_mod_mpoly_ctx_init( + fmpz_mod_mpoly_ctx_t ctx, + slong nvars, + const ordering_t ord, + const fmpz_t modulus); +void fmpz_mod_mpoly_ctx_init_rand( + fmpz_mod_mpoly_ctx_t ctx, + flint_rand_t state, + slong max_nvars, + const fmpz_t modulus); +void fmpz_mod_mpoly_ctx_init_rand_bits_prime( + fmpz_mod_mpoly_ctx_t ctx, + flint_rand_t state, + slong max_nvars, + flint_bitcnt_t max_bits); +void fmpz_mod_mpoly_ctx_init_rand_bits( + fmpz_mod_mpoly_ctx_t ctx, + flint_rand_t state, + slong max_nvars, + flint_bitcnt_t max_bits); void fmpz_mod_mpoly_ctx_clear(fmpz_mod_mpoly_ctx_t ctx); -FMPZ_MOD_MPOLY_INLINE slong fmpz_mod_mpoly_ctx_nvars(const fmpz_mod_mpoly_ctx_t ctx) { return ctx->minfo->nvars; } -FMPZ_MOD_MPOLY_INLINE ordering_t fmpz_mod_mpoly_ctx_ord(const fmpz_mod_mpoly_ctx_t ctx) { return ctx->minfo->ord; } -FMPZ_MOD_MPOLY_INLINE const fmpz * fmpz_mod_mpoly_ctx_modulus(const fmpz_mod_mpoly_ctx_t ctx) { return ctx->ffinfo->n; } +FMPZ_MOD_MPOLY_INLINE +slong fmpz_mod_mpoly_ctx_nvars(const fmpz_mod_mpoly_ctx_t ctx) +{ + return ctx->minfo->nvars; +} +FMPZ_MOD_MPOLY_INLINE +ordering_t fmpz_mod_mpoly_ctx_ord(const fmpz_mod_mpoly_ctx_t ctx) +{ + return ctx->minfo->ord; +} +FMPZ_MOD_MPOLY_INLINE +const fmpz * fmpz_mod_mpoly_ctx_modulus(const fmpz_mod_mpoly_ctx_t ctx) +{ + return ctx->ffinfo->n; +} -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_ctx_get_modulus(fmpz_t m, const fmpz_mod_mpoly_ctx_t ctx) { fmpz_set(m, fmpz_mod_mpoly_ctx_modulus(ctx)); } +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_ctx_get_modulus(fmpz_t m, const fmpz_mod_mpoly_ctx_t ctx) +{ + fmpz_set(m, fmpz_mod_mpoly_ctx_modulus(ctx)); +} /* Memory management ********************************************************/ @@ -69,14 +101,35 @@ void fmpz_mod_mpoly_init(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) A->exps_alloc = 0; } -void fmpz_mod_mpoly_init2(fmpz_mod_mpoly_t A, slong alloc, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_init3(fmpz_mod_mpoly_t A, slong alloc, flint_bitcnt_t bits, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_realloc(fmpz_mod_mpoly_t A, slong alloc, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_init2( + fmpz_mod_mpoly_t A, + slong alloc, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_init3( + fmpz_mod_mpoly_t A, + slong alloc, + flint_bitcnt_t bits, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_realloc( + fmpz_mod_mpoly_t A, + slong alloc, + const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpoly_clear(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_fit_length(fmpz_mod_mpoly_t A, slong length, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_fit_length_fit_bits(fmpz_mod_mpoly_t A, slong len, flint_bitcnt_t bits, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_fit_length_reset_bits(fmpz_mod_mpoly_t A, slong len, flint_bitcnt_t bits, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_fit_length( + fmpz_mod_mpoly_t A, + slong length, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_fit_length_fit_bits( + fmpz_mod_mpoly_t A, + slong len, + flint_bitcnt_t bits, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_fit_length_reset_bits( + fmpz_mod_mpoly_t A, + slong len, + flint_bitcnt_t bits, + const fmpz_mod_mpoly_ctx_t ctx); FMPZ_MOD_MPOLY_INLINE void _fmpz_mod_mpoly_fit_length(fmpz ** coeffs, slong * coeffs_alloc, ulong ** exps, slong * exps_alloc, slong N, slong length) @@ -123,64 +176,157 @@ void fmpz_mod_mpoly_truncate(fmpz_mod_mpoly_t A, slong newlen, const fmpz_mod_mp /* Input/output **************************************************************/ -int fmpz_mod_mpoly_set_str_pretty(fmpz_mod_mpoly_t A, const char * str, const char ** x, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_set_str_pretty( + fmpz_mod_mpoly_t A, + const char * str, + const char ** x, + const fmpz_mod_mpoly_ctx_t ctx); -char * fmpz_mod_mpoly_get_str_pretty(const fmpz_mod_mpoly_t A, const char ** x, const fmpz_mod_mpoly_ctx_t ctx); +char * fmpz_mod_mpoly_get_str_pretty( + const fmpz_mod_mpoly_t A, + const char ** x, + const fmpz_mod_mpoly_ctx_t ctx); #ifdef FLINT_HAVE_FILE -int fmpz_mod_mpoly_fprint_pretty(FILE * file, const fmpz_mod_mpoly_t A, const char ** x, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_fprint_pretty( + FILE * file, + const fmpz_mod_mpoly_t A, + const char ** x, + const fmpz_mod_mpoly_ctx_t ctx); #endif -int fmpz_mod_mpoly_print_pretty(const fmpz_mod_mpoly_t A, const char ** x, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_print_pretty( + const fmpz_mod_mpoly_t A, + const char ** x, + const fmpz_mod_mpoly_ctx_t ctx); /* Basic manipulation *******************************************************/ void fmpz_mod_mpoly_gen(fmpz_mod_mpoly_t A, slong var, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_is_gen(const fmpz_mod_mpoly_t A, slong var, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_is_gen( + const fmpz_mod_mpoly_t A, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_equal(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_equal( + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_swap(fmpz_mod_mpoly_t A, fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx) { FLINT_SWAP(fmpz_mod_mpoly_struct, *A, *B); } +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_swap(fmpz_mod_mpoly_t A, fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx) +{ + FLINT_SWAP(fmpz_mod_mpoly_struct, *A, *B); +} /* Constants *****************************************************************/ int fmpz_mod_mpoly_is_fmpz(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_get_fmpz(fmpz_t c, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_get_fmpz( + fmpz_t c, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpoly_set_si(fmpz_mod_mpoly_t A, slong c, const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpoly_set_ui(fmpz_mod_mpoly_t A, ulong c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_fmpz(fmpz_mod_mpoly_t A, const fmpz_t c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_fmpz_mod(fmpz_mod_mpoly_t A, const fmpz_t c, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set_fmpz( + fmpz_mod_mpoly_t A, + const fmpz_t c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set_fmpz_mod( + fmpz_mod_mpoly_t A, + const fmpz_t c, + const fmpz_mod_mpoly_ctx_t ctx); -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_zero(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { _fmpz_mod_mpoly_set_length(A, 0, ctx); } -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_one(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { fmpz_mod_mpoly_set_si(A, 1, ctx); } +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_zero(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + _fmpz_mod_mpoly_set_length(A, 0, ctx); +} +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_one(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + fmpz_mod_mpoly_set_si(A, 1, ctx); +} -int fmpz_mod_mpoly_equal_si(const fmpz_mod_mpoly_t A, slong c, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_equal_ui(const fmpz_mod_mpoly_t A, ulong c, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_equal_fmpz(const fmpz_mod_mpoly_t A, const fmpz_t c, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_equal_si( + const fmpz_mod_mpoly_t A, + slong c, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_equal_ui( + const fmpz_mod_mpoly_t A, + ulong c, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_equal_fmpz( + const fmpz_mod_mpoly_t A, + const fmpz_t c, + const fmpz_mod_mpoly_ctx_t ctx); -FMPZ_MOD_MPOLY_INLINE int fmpz_mod_mpoly_is_zero(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { return A->length < 1; } +FMPZ_MOD_MPOLY_INLINE +int fmpz_mod_mpoly_is_zero(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + return A->length < 1; +} -FMPZ_MOD_MPOLY_INLINE int fmpz_mod_mpoly_is_one(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { return fmpz_mod_mpoly_equal_si(A, 1, ctx); } +FMPZ_MOD_MPOLY_INLINE +int fmpz_mod_mpoly_is_one(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + return fmpz_mod_mpoly_equal_si(A, 1, ctx); +} /* Degrees *******************************************************************/ -FMPZ_MOD_MPOLY_INLINE int fmpz_mod_mpoly_degrees_fit_si(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_degrees_fit_si(A->exps, A->length, A->bits, ctx->minfo); } +FMPZ_MOD_MPOLY_INLINE +int fmpz_mod_mpoly_degrees_fit_si(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_degrees_fit_si(A->exps, A->length, A->bits, ctx->minfo); +} -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_degrees_si(slong * degs, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { mpoly_degrees_si(degs, A->exps, A->length, A->bits, ctx->minfo); } -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_degrees_fmpz(fmpz ** degs, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { mpoly_degrees_pfmpz(degs, A->exps, A->length, A->bits, ctx->minfo); } +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_degrees_si(slong * degs, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + mpoly_degrees_si(degs, A->exps, A->length, A->bits, ctx->minfo); +} +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_degrees_fmpz(fmpz ** degs, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + mpoly_degrees_pfmpz(degs, A->exps, A->length, A->bits, ctx->minfo); +} -FMPZ_MOD_MPOLY_INLINE slong fmpz_mod_mpoly_degree_si(const fmpz_mod_mpoly_t A, slong var, const fmpz_mod_mpoly_ctx_t ctx) { FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); return mpoly_degree_si(A->exps, A->length, A->bits, var, ctx->minfo); } -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_degree_fmpz(fmpz_t deg, const fmpz_mod_mpoly_t A, slong var, const fmpz_mod_mpoly_ctx_t ctx) { FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); mpoly_degree_fmpz(deg, A->exps, A->length, A->bits, var, ctx->minfo); } +FMPZ_MOD_MPOLY_INLINE +slong fmpz_mod_mpoly_degree_si(const fmpz_mod_mpoly_t A, slong var, const fmpz_mod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); return mpoly_degree_si(A->exps, A->length, A->bits, var, ctx->minfo); +} +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_degree_fmpz(fmpz_t deg, const fmpz_mod_mpoly_t A, slong var, const fmpz_mod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); mpoly_degree_fmpz(deg, A->exps, A->length, A->bits, var, ctx->minfo); +} -FMPZ_MOD_MPOLY_INLINE int fmpz_mod_mpoly_total_degree_fits_si(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { return mpoly_total_degree_fits_si(A->exps, A->length, A->bits, ctx->minfo); } +FMPZ_MOD_MPOLY_INLINE +int fmpz_mod_mpoly_total_degree_fits_si(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + return mpoly_total_degree_fits_si(A->exps, A->length, A->bits, ctx->minfo); +} -FMPZ_MOD_MPOLY_INLINE slong fmpz_mod_mpoly_total_degree_si(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { return mpoly_total_degree_si(A->exps, A->length, A->bits, ctx->minfo); } -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_total_degree_fmpz(fmpz_t td, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { mpoly_total_degree_fmpz(td, A->exps, A->length, A->bits, ctx->minfo); } +FMPZ_MOD_MPOLY_INLINE +slong fmpz_mod_mpoly_total_degree_si(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + return mpoly_total_degree_si(A->exps, A->length, A->bits, ctx->minfo); +} +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_total_degree_fmpz(fmpz_t td, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + mpoly_total_degree_fmpz(td, A->exps, A->length, A->bits, ctx->minfo); +} FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_used_vars(int * used, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) @@ -195,185 +341,603 @@ void fmpz_mod_mpoly_used_vars(int * used, const fmpz_mod_mpoly_t A, const fmpz_m /* Coefficients **************************************************************/ -void fmpz_mod_mpoly_get_coeff_fmpz_monomial(fmpz_t c, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t M, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_coeff_fmpz_monomial(fmpz_mod_mpoly_t A, const fmpz_t c, const fmpz_mod_mpoly_t M, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_get_coeff_fmpz_ui(fmpz_t c, const fmpz_mod_mpoly_t A, const ulong * exp, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_get_coeff_fmpz_fmpz(fmpz_t c, const fmpz_mod_mpoly_t A, fmpz * const * exp, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_set_coeff_si_ui(fmpz_mod_mpoly_t A, slong c, const ulong * exp, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_coeff_ui_ui(fmpz_mod_mpoly_t A, ulong c, const ulong * exp, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_coeff_fmpz_ui(fmpz_mod_mpoly_t A, const fmpz_t c, const ulong * exp, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_get_coeff_fmpz_monomial( + fmpz_t c, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t M, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set_coeff_fmpz_monomial( + fmpz_mod_mpoly_t A, + const fmpz_t c, + const fmpz_mod_mpoly_t M, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_get_coeff_fmpz_ui( + fmpz_t c, + const fmpz_mod_mpoly_t A, + const ulong * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_get_coeff_fmpz_fmpz( + fmpz_t c, + const fmpz_mod_mpoly_t A, + fmpz * const * exp, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_set_coeff_si_ui( + fmpz_mod_mpoly_t A, + slong c, + const ulong * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set_coeff_ui_ui( + fmpz_mod_mpoly_t A, + ulong c, + const ulong * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set_coeff_fmpz_ui( + fmpz_mod_mpoly_t A, + const fmpz_t c, + const ulong * exp, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_set_coeff_si_fmpz( + fmpz_mod_mpoly_t A, + slong c, + fmpz * const * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set_coeff_ui_fmpz( + fmpz_mod_mpoly_t A, + ulong c, + fmpz * const * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void _fmpz_mod_mpoly_set_coeff_fmpz_fmpz( + fmpz_mod_mpoly_t A, + const fmpz_t c, + const fmpz * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set_coeff_fmpz_fmpz( + fmpz_mod_mpoly_t A, + const fmpz_t c, + fmpz * const * exp, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_get_coeff_vars_ui( + fmpz_mod_mpoly_t C, + const fmpz_mod_mpoly_t A, + const slong * vars, + const ulong * exps, + slong length, + const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_coeff_si_fmpz(fmpz_mod_mpoly_t A, slong c, fmpz * const * exp, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_coeff_ui_fmpz(fmpz_mod_mpoly_t A, ulong c, fmpz * const * exp, const fmpz_mod_mpoly_ctx_t ctx); -void _fmpz_mod_mpoly_set_coeff_fmpz_fmpz(fmpz_mod_mpoly_t A, const fmpz_t c, const fmpz * exp, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_coeff_fmpz_fmpz(fmpz_mod_mpoly_t A, const fmpz_t c, fmpz * const * exp, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_get_coeff_vars_ui(fmpz_mod_mpoly_t C, const fmpz_mod_mpoly_t A, const slong * vars, const ulong * exps, slong length, const fmpz_mod_mpoly_ctx_t ctx); - -FMPZ_MOD_MPOLY_INLINE fmpz * fmpz_mod_mpoly_leadcoeff(fmpz_mod_mpoly_t A) { FLINT_ASSERT(A->length > 0); return A->coeffs + 0; } +FMPZ_MOD_MPOLY_INLINE +fmpz * fmpz_mod_mpoly_leadcoeff(fmpz_mod_mpoly_t A) +{ + FLINT_ASSERT(A->length > 0); return A->coeffs + 0; +} /* conversion ****************************************************************/ -int fmpz_mod_mpoly_is_fmpz_mod_poly(const fmpz_mod_mpoly_t A, slong var, const fmpz_mod_mpoly_ctx_t ctx); - -int fmpz_mod_mpoly_get_fmpz_mod_poly(fmpz_mod_poly_t A, const fmpz_mod_mpoly_t B, slong var, const fmpz_mod_mpoly_ctx_t ctx); - -void _fmpz_mod_mpoly_set_fmpz_mod_poly(fmpz_mod_mpoly_t A, flint_bitcnt_t Abits, const fmpz * Bcoeffs, slong Blen, slong var, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_fmpz_mod_poly(fmpz_mod_mpoly_t A, const fmpz_mod_poly_t B, slong var, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_is_fmpz_mod_poly( + const fmpz_mod_mpoly_t A, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); + +int fmpz_mod_mpoly_get_fmpz_mod_poly( + fmpz_mod_poly_t A, + const fmpz_mod_mpoly_t B, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); + +void _fmpz_mod_mpoly_set_fmpz_mod_poly( + fmpz_mod_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz * Bcoeffs, + slong Blen, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set_fmpz_mod_poly( + fmpz_mod_mpoly_t A, + const fmpz_mod_poly_t B, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); /* comparison ****************************************************************/ -int fmpz_mod_mpoly_cmp(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_cmp( + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); /* container operations ******************************************************/ int fmpz_mod_mpoly_is_canonical(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); -FMPZ_MOD_MPOLY_INLINE slong fmpz_mod_mpoly_length(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { return A->length; } - -void fmpz_mod_mpoly_resize(fmpz_mod_mpoly_t A, slong new_length, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_get_term_coeff_fmpz(fmpz_t c, const fmpz_mod_mpoly_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_set_term_coeff_si(fmpz_mod_mpoly_t A, slong i, slong c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_term_coeff_ui(fmpz_mod_mpoly_t A, slong i, ulong c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_term_coeff_fmpz(fmpz_mod_mpoly_t A, slong i, const fmpz_t c, const fmpz_mod_mpoly_ctx_t ctx); - -FMPZ_MOD_MPOLY_INLINE int fmpz_mod_mpoly_term_exp_fits_si(const fmpz_mod_mpoly_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_si(A->exps, A->bits, i, ctx->minfo); } -FMPZ_MOD_MPOLY_INLINE int fmpz_mod_mpoly_term_exp_fits_ui(const fmpz_mod_mpoly_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_ui(A->exps, A->bits, i, ctx->minfo); } - -void fmpz_mod_mpoly_get_term_exp_si(slong * exp, const fmpz_mod_mpoly_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_get_term_exp_ui(ulong * exp, const fmpz_mod_mpoly_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_get_term_exp_fmpz(fmpz ** exp, const fmpz_mod_mpoly_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx); - -slong fmpz_mod_mpoly_get_term_var_exp_si(const fmpz_mod_mpoly_t A, slong i, slong var, const fmpz_mod_mpoly_ctx_t ctx); -ulong fmpz_mod_mpoly_get_term_var_exp_ui(const fmpz_mod_mpoly_t A, slong i, slong var, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_get_term_monomial(fmpz_mod_mpoly_t M, const fmpz_mod_mpoly_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_get_term(fmpz_mod_mpoly_t M, const fmpz_mod_mpoly_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_set_term_exp_ui(fmpz_mod_mpoly_t A, slong i, const ulong * exp, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_set_term_exp_fmpz(fmpz_mod_mpoly_t A, slong i, fmpz * const * exp, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_push_term_fmpz_fmpz(fmpz_mod_mpoly_t A, const fmpz_t c, fmpz * const * exp, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_push_term_fmpz_ffmpz(fmpz_mod_mpoly_t A, const fmpz_t c, const fmpz * exp, const fmpz_mod_mpoly_ctx_t ctx); +FMPZ_MOD_MPOLY_INLINE +slong fmpz_mod_mpoly_length(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + return A->length; +} -void fmpz_mod_mpoly_push_term_si_fmpz(fmpz_mod_mpoly_t A, slong c, fmpz * const * exp, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_push_term_ui_fmpz(fmpz_mod_mpoly_t A, ulong c, fmpz * const * exp, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_resize( + fmpz_mod_mpoly_t A, + slong new_length, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_get_term_coeff_fmpz( + fmpz_t c, + const fmpz_mod_mpoly_t A, + slong i, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_set_term_coeff_si( + fmpz_mod_mpoly_t A, + slong i, + slong c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set_term_coeff_ui( + fmpz_mod_mpoly_t A, + slong i, + ulong c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set_term_coeff_fmpz( + fmpz_mod_mpoly_t A, + slong i, + const fmpz_t c, + const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_push_term_si_ffmpz(fmpz_mod_mpoly_t A, slong c, const fmpz * exp, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_push_term_ui_ffmpz(fmpz_mod_mpoly_t A, ulong c, const fmpz * exp, const fmpz_mod_mpoly_ctx_t ctx); +FMPZ_MOD_MPOLY_INLINE +int fmpz_mod_mpoly_term_exp_fits_si(const fmpz_mod_mpoly_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_si(A->exps, A->bits, i, ctx->minfo); +} +FMPZ_MOD_MPOLY_INLINE +int fmpz_mod_mpoly_term_exp_fits_ui(const fmpz_mod_mpoly_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_ui(A->exps, A->bits, i, ctx->minfo); +} -void fmpz_mod_mpoly_push_term_si_ui(fmpz_mod_mpoly_t A, slong c, const ulong * exp, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_push_term_ui_ui(fmpz_mod_mpoly_t A, ulong c, const ulong * exp, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_push_term_fmpz_ui(fmpz_mod_mpoly_t A, const fmpz_t c, const ulong * exp, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_get_term_exp_si( + slong * exp, + const fmpz_mod_mpoly_t A, + slong i, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_get_term_exp_ui( + ulong * exp, + const fmpz_mod_mpoly_t A, + slong i, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_get_term_exp_fmpz( + fmpz ** exp, + const fmpz_mod_mpoly_t A, + slong i, + const fmpz_mod_mpoly_ctx_t ctx); + +slong fmpz_mod_mpoly_get_term_var_exp_si( + const fmpz_mod_mpoly_t A, + slong i, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); +ulong fmpz_mod_mpoly_get_term_var_exp_ui( + const fmpz_mod_mpoly_t A, + slong i, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_get_term_monomial( + fmpz_mod_mpoly_t M, + const fmpz_mod_mpoly_t A, + slong i, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_get_term( + fmpz_mod_mpoly_t M, + const fmpz_mod_mpoly_t A, + slong i, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_set_term_exp_ui( + fmpz_mod_mpoly_t A, + slong i, + const ulong * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_set_term_exp_fmpz( + fmpz_mod_mpoly_t A, + slong i, + fmpz * const * exp, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_push_term_fmpz_fmpz( + fmpz_mod_mpoly_t A, + const fmpz_t c, + fmpz * const * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_push_term_fmpz_ffmpz( + fmpz_mod_mpoly_t A, + const fmpz_t c, + const fmpz * exp, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_push_term_si_fmpz( + fmpz_mod_mpoly_t A, + slong c, + fmpz * const * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_push_term_ui_fmpz( + fmpz_mod_mpoly_t A, + ulong c, + fmpz * const * exp, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_push_term_si_ffmpz( + fmpz_mod_mpoly_t A, + slong c, + const fmpz * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_push_term_ui_ffmpz( + fmpz_mod_mpoly_t A, + ulong c, + const fmpz * exp, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_push_term_si_ui( + fmpz_mod_mpoly_t A, + slong c, + const ulong * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_push_term_ui_ui( + fmpz_mod_mpoly_t A, + ulong c, + const ulong * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_push_term_fmpz_ui( + fmpz_mod_mpoly_t A, + const fmpz_t c, + const ulong * exp, + const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpoly_sort_terms(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpoly_combine_like_terms(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_reverse(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_reverse( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpoly_assert_canonical(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); -void _fmpz_mod_mpoly_radix_sort1(fmpz *, ulong *, slong left, slong right, flint_bitcnt_t pos, ulong cmpmask, ulong totalmask); -void _fmpz_mod_mpoly_radix_sort(fmpz *, ulong *, slong left, slong right, flint_bitcnt_t pos, slong N, ulong * cmpmask); - -void _fmpz_mod_mpoly_push_exp_ui(fmpz_mod_mpoly_t A, const ulong * exp, const fmpz_mod_mpoly_ctx_t ctx); -void _fmpz_mod_mpoly_push_exp_ffmpz(fmpz_mod_mpoly_t A, const fmpz * exp, const fmpz_mod_mpoly_ctx_t ctx); -void _fmpz_mod_mpoly_push_exp_pfmpz(fmpz_mod_mpoly_t A, fmpz * const * exp, const fmpz_mod_mpoly_ctx_t ctx); +void _fmpz_mod_mpoly_radix_sort1( + fmpz *, + ulong *, + slong left, + slong right, + flint_bitcnt_t pos, + ulong cmpmask, + ulong totalmask); +void _fmpz_mod_mpoly_radix_sort( + fmpz *, + ulong *, + slong left, + slong right, + flint_bitcnt_t pos, + slong N, + ulong * cmpmask); + +void _fmpz_mod_mpoly_push_exp_ui( + fmpz_mod_mpoly_t A, + const ulong * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void _fmpz_mod_mpoly_push_exp_ffmpz( + fmpz_mod_mpoly_t A, + const fmpz * exp, + const fmpz_mod_mpoly_ctx_t ctx); +void _fmpz_mod_mpoly_push_exp_pfmpz( + fmpz_mod_mpoly_t A, + fmpz * const * exp, + const fmpz_mod_mpoly_ctx_t ctx); /* Random generation *********************************************************/ -void fmpz_mod_mpoly_randtest_bounds(fmpz_mod_mpoly_t A, flint_rand_t state, slong length, ulong * exp_bounds, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_randtest_bound(fmpz_mod_mpoly_t A, flint_rand_t state, slong length, ulong exp_bound, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_randtest_bits(fmpz_mod_mpoly_t A, flint_rand_t state, slong length, flint_bitcnt_t exp_bits, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_randtest_bounds( + fmpz_mod_mpoly_t A, + flint_rand_t state, + slong length, + ulong * exp_bounds, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_randtest_bound( + fmpz_mod_mpoly_t A, + flint_rand_t state, + slong length, + ulong exp_bound, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_randtest_bits( + fmpz_mod_mpoly_t A, + flint_rand_t state, + slong length, + flint_bitcnt_t exp_bits, + const fmpz_mod_mpoly_ctx_t ctx); /* Addition/Subtraction ******************************************************/ -void fmpz_mod_mpoly_add_si(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, slong c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_add_ui(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, ulong c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_add_fmpz(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_t c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_add_fmpz_mod(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_t c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_add(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_sub_si(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, slong c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_sub_ui(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, ulong c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_sub_fmpz(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_t c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_sub(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_neg(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_add_si( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + slong c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_add_ui( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + ulong c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_add_fmpz( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_t c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_add_fmpz_mod( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_t c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_add( + 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_sub_si( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + slong c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_sub_ui( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + ulong c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_sub_fmpz( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_t c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_sub( + 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_neg( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); /* Scalar operations *********************************************************/ -void fmpz_mod_mpoly_scalar_mul_si(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, slong c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_scalar_mul_ui(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, ulong c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_scalar_mul_fmpz(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_t c, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_scalar_mul_fmpz_mod_invertible(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_t c, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_scalar_addmul_fmpz(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_t C, const fmpz_t d, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_make_monic(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_scalar_mul_si( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + slong c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_scalar_mul_ui( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + ulong c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_scalar_mul_fmpz( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_t c, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_scalar_mul_fmpz_mod_invertible( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_t c, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_scalar_addmul_fmpz( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_t C, + const fmpz_t d, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_make_monic( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); /* Differentiation ************************************************************/ -void fmpz_mod_mpoly_derivative(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, slong var, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_derivative( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); /* Evaluation ****************************************************************/ -void fmpz_mod_mpoly_evaluate_all_fmpz(fmpz_t eval, const fmpz_mod_mpoly_t A, fmpz * const * alphas, const fmpz_mod_mpoly_ctx_t ctx); -void _fmpz_mod_mpoly_eval_all_fmpz_mod(fmpz_t eval, const fmpz * Acoeffs, const ulong * Aexps, slong Alen, flint_bitcnt_t Abits, const fmpz * alphas, const mpoly_ctx_t mctx, const fmpz_mod_ctx_t fctx); - -void fmpz_mod_mpoly_evaluate_one_fmpz(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, slong var, const fmpz_t val, const fmpz_mod_mpoly_ctx_t ctx); - -void _fmpz_mod_mpoly_compose_mat(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mat_t M, const fmpz_mod_mpoly_ctx_t ctxB, const fmpz_mod_mpoly_ctx_t ctxAC); - -int fmpz_mod_mpoly_compose_fmpz_mod_mpoly_geobucket(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, fmpz_mod_mpoly_struct * const * C, const fmpz_mod_mpoly_ctx_t ctxB, const fmpz_mod_mpoly_ctx_t ctxAC); -int fmpz_mod_mpoly_compose_fmpz_mod_mpoly(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, fmpz_mod_mpoly_struct * const * C, const fmpz_mod_mpoly_ctx_t ctxB, const fmpz_mod_mpoly_ctx_t ctxAC); +void fmpz_mod_mpoly_evaluate_all_fmpz( + fmpz_t eval, + const fmpz_mod_mpoly_t A, + fmpz * const * alphas, + const fmpz_mod_mpoly_ctx_t ctx); +void _fmpz_mod_mpoly_eval_all_fmpz_mod( + fmpz_t eval, + const fmpz * Acoeffs, + const ulong * Aexps, + slong Alen, + flint_bitcnt_t Abits, + const fmpz * alphas, + const mpoly_ctx_t mctx, + const fmpz_mod_ctx_t fctx); + +void fmpz_mod_mpoly_evaluate_one_fmpz( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + slong var, + const fmpz_t val, + const fmpz_mod_mpoly_ctx_t ctx); + +void _fmpz_mod_mpoly_compose_mat( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mat_t M, + const fmpz_mod_mpoly_ctx_t ctxB, + const fmpz_mod_mpoly_ctx_t ctxAC); + +int fmpz_mod_mpoly_compose_fmpz_mod_mpoly_geobucket( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + fmpz_mod_mpoly_struct * const * C, + const fmpz_mod_mpoly_ctx_t ctxB, + const fmpz_mod_mpoly_ctx_t ctxAC); +int fmpz_mod_mpoly_compose_fmpz_mod_mpoly( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + fmpz_mod_mpoly_struct * const * C, + const fmpz_mod_mpoly_ctx_t ctxB, + const fmpz_mod_mpoly_ctx_t ctxAC); /* Multiplication ************************************************************/ -void _fmpz_mod_mpoly_mul_johnson_maxfields(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, fmpz * maxBfields, const fmpz_mod_mpoly_t C, fmpz * maxCfields, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_mul_johnson(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_mul(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_t C, const fmpz_mod_mpoly_ctx_t ctx); - -int _fmpz_mod_mpoly_mul_dense_maxfields(fmpz_mod_mpoly_t P, const fmpz_mod_mpoly_t A, fmpz * maxAfields, const fmpz_mod_mpoly_t B, fmpz * maxBfields, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_mul_dense(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_mul_johnson_maxfields( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + fmpz * maxBfields, + const fmpz_mod_mpoly_t C, + fmpz * maxCfields, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_mul_johnson( + 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_mul( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_t C, + const fmpz_mod_mpoly_ctx_t ctx); + +int _fmpz_mod_mpoly_mul_dense_maxfields( + fmpz_mod_mpoly_t P, + const fmpz_mod_mpoly_t A, + fmpz * maxAfields, + const fmpz_mod_mpoly_t B, + fmpz * maxBfields, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_mul_dense( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_t C, + const fmpz_mod_mpoly_ctx_t ctx); /* Powering ******************************************************************/ -int fmpz_mod_mpoly_pow_ui(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, ulong k, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_pow_fmpz(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_t k, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_pow_rmul(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, ulong k, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_pow_ui( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + ulong k, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_pow_fmpz( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_t k, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_pow_rmul( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + ulong k, + const fmpz_mod_mpoly_ctx_t ctx); /* Division ******************************************************************/ -int _fmpz_mod_mpoly_divides_monagan_pearce_maxfields(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, fmpz * maxAfields, const fmpz_mod_mpoly_t B, fmpz * maxBfields, const fmpz_mod_mpoly_ctx_t ctx); +int _fmpz_mod_mpoly_divides_monagan_pearce_maxfields( + fmpz_mod_mpoly_t Q, + const fmpz_mod_mpoly_t A, + fmpz * maxAfields, + const fmpz_mod_mpoly_t B, + fmpz * maxBfields, + const fmpz_mod_mpoly_ctx_t ctx); + +int fmpz_mod_mpoly_divides_monagan_pearce( + fmpz_mod_mpoly_t Q, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_divides( + fmpz_mod_mpoly_t Q, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); + +int _fmpz_mod_mpoly_divides_dense_maxfields( + fmpz_mod_mpoly_t Q, + const fmpz_mod_mpoly_t A, + fmpz * maxAfields, + const fmpz_mod_mpoly_t B, + fmpz * maxBfields, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_divides_dense( + fmpz_mod_mpoly_t Q, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_div_monagan_pearce( + fmpz_mod_mpoly_t Q, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_div( + fmpz_mod_mpoly_t Q, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_divrem_monagan_pearce( + fmpz_mod_mpoly_t Q, + fmpz_mod_mpoly_t R, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_divrem( + fmpz_mod_mpoly_t Q, + fmpz_mod_mpoly_t R, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_divrem_ideal_monagan_pearce( + fmpz_mod_mpoly_struct ** Q, + fmpz_mod_mpoly_t R, + const fmpz_mod_mpoly_t A, + fmpz_mod_mpoly_struct * const * B, + slong len, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_divrem_ideal( + fmpz_mod_mpoly_struct ** Q, + fmpz_mod_mpoly_t R, + const fmpz_mod_mpoly_t A, + fmpz_mod_mpoly_struct * const * B, + slong len, + const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_divides_monagan_pearce(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_divides(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); - -int _fmpz_mod_mpoly_divides_dense_maxfields(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, fmpz * maxAfields, const fmpz_mod_mpoly_t B, fmpz * maxBfields, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_divides_dense(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_div_monagan_pearce(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_div(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_divrem_monagan_pearce(fmpz_mod_mpoly_t Q, fmpz_mod_mpoly_t R, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_divrem(fmpz_mod_mpoly_t Q, fmpz_mod_mpoly_t R, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_divrem_ideal_monagan_pearce(fmpz_mod_mpoly_struct ** Q, fmpz_mod_mpoly_t R, const fmpz_mod_mpoly_t A, fmpz_mod_mpoly_struct * const * B, slong len, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_divrem_ideal(fmpz_mod_mpoly_struct ** Q, fmpz_mod_mpoly_t R, const fmpz_mod_mpoly_t A, fmpz_mod_mpoly_struct * const * B, slong len, const fmpz_mod_mpoly_ctx_t ctx); - -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_divexact(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx) { if (fmpz_mod_mpoly_divides(Q, A, B, ctx)) return; else flint_throw(FLINT_ERROR, "fmpz_mod_mpoly_divexact: nonexact division"); } +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_divexact(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx) +{ + if (fmpz_mod_mpoly_divides(Q, A, B, ctx)) return; else flint_throw(FLINT_ERROR, "fmpz_mod_mpoly_divexact: nonexact division"); +} /* Square root ***************************************************************/ -int fmpz_mod_mpoly_sqrt_heap(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); -FMPZ_MOD_MPOLY_INLINE int fmpz_mod_mpoly_sqrt(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) { return fmpz_mod_mpoly_sqrt_heap(Q, A, ctx); } +int fmpz_mod_mpoly_sqrt_heap( + fmpz_mod_mpoly_t Q, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_ctx_t ctx); +FMPZ_MOD_MPOLY_INLINE +int fmpz_mod_mpoly_sqrt(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + return fmpz_mod_mpoly_sqrt_heap(Q, A, ctx); +} FMPZ_MOD_MPOLY_INLINE int fmpz_mod_mpoly_is_square(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx) @@ -386,65 +950,192 @@ int fmpz_mod_mpoly_is_square(const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_ return res; } -int fmpz_mod_mpoly_quadratic_root(fmpz_mod_mpoly_t Q, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_quadratic_root( + fmpz_mod_mpoly_t Q, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); /* GCD ***********************************************************************/ -void fmpz_mod_mpoly_term_content(fmpz_mod_mpoly_t M, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); - -int fmpz_mod_mpoly_content_vars(fmpz_mod_mpoly_t g, const fmpz_mod_mpoly_t A, slong * vars, slong vars_length, const fmpz_mod_mpoly_ctx_t ctx); - -int fmpz_mod_mpoly_gcd_cofactors(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); -int fmpz_mod_mpoly_gcd_subresultant(fmpz_mod_mpoly_t G, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_gcd_brown(fmpz_mod_mpoly_t G, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_gcd_hensel(fmpz_mod_mpoly_t G, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_gcd_zippel(fmpz_mod_mpoly_t G, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_gcd_zippel2(fmpz_mod_mpoly_t G, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_gcd(fmpz_mod_mpoly_t G, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_deflation(fmpz * shift, fmpz * stride, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_deflate(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz * shift, const fmpz * stride, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_inflate(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, const fmpz * shift, const fmpz * stride, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_term_content( + fmpz_mod_mpoly_t M, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_ctx_t ctx); + +int fmpz_mod_mpoly_content_vars( + fmpz_mod_mpoly_t g, + const fmpz_mod_mpoly_t A, + slong * vars, + slong vars_length, + const fmpz_mod_mpoly_ctx_t ctx); + +int fmpz_mod_mpoly_gcd_cofactors( + 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); +int fmpz_mod_mpoly_gcd_subresultant( + fmpz_mod_mpoly_t G, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_gcd_brown( + fmpz_mod_mpoly_t G, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_gcd_hensel( + fmpz_mod_mpoly_t G, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_gcd_zippel( + fmpz_mod_mpoly_t G, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_gcd_zippel2( + fmpz_mod_mpoly_t G, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_gcd( + fmpz_mod_mpoly_t G, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_deflation( + fmpz * shift, + fmpz * stride, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_deflate( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz * shift, + const fmpz * stride, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_inflate( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + const fmpz * shift, + const fmpz * stride, + const fmpz_mod_mpoly_ctx_t ctx); /* Univariates ***************************************************************/ void fmpz_mod_mpoly_univar_init(fmpz_mod_mpoly_univar_t A, const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpoly_univar_clear(fmpz_mod_mpoly_univar_t A, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_univar_fit_length(fmpz_mod_mpoly_univar_t A, slong length, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_univar_fit_length( + fmpz_mod_mpoly_univar_t A, + slong length, + const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_univar_print_pretty(const fmpz_mod_mpoly_univar_t A, const char ** x, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_univar_print_pretty( + const fmpz_mod_mpoly_univar_t A, + const char ** x, + const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpoly_univar_assert_canonical(fmpz_mod_mpoly_univar_t A, const fmpz_mod_mpoly_ctx_t ctx); -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_univar_zero(fmpz_mod_mpoly_univar_t A, const fmpz_mod_mpoly_ctx_t ctx) { A->length = 0; } - -void fmpz_mod_mpoly_univar_set_coeff_ui(fmpz_mod_mpoly_univar_t A, ulong e, const fmpz_mod_mpoly_t c, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_to_univar(fmpz_mod_mpoly_univar_t A, const fmpz_mod_mpoly_t B, slong var, const fmpz_mod_mpoly_ctx_t ctx); -void _fmpz_mod_mpoly_from_univar(fmpz_mod_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mod_mpoly_univar_t B, slong var, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_from_univar(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_univar_t B, slong var, const fmpz_mod_mpoly_ctx_t ctx); - -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_univar_swap(fmpz_mod_mpoly_univar_t A, fmpz_mod_mpoly_univar_t B, const fmpz_mod_mpoly_ctx_t ctx) { FLINT_SWAP(fmpz_mod_mpoly_univar_struct, *A, *B); } +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_univar_zero(fmpz_mod_mpoly_univar_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + A->length = 0; +} -FMPZ_MOD_MPOLY_INLINE int fmpz_mod_mpoly_univar_degree_fits_si(const fmpz_mod_mpoly_univar_t A, const fmpz_mod_mpoly_ctx_t ctx) { return A->length == 0 || fmpz_fits_si(A->exps + 0); } +void fmpz_mod_mpoly_univar_set_coeff_ui( + fmpz_mod_mpoly_univar_t A, + ulong e, + const fmpz_mod_mpoly_t c, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_to_univar( + fmpz_mod_mpoly_univar_t A, + const fmpz_mod_mpoly_t B, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); +void _fmpz_mod_mpoly_from_univar( + fmpz_mod_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_mod_mpoly_univar_t B, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_from_univar( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_univar_t B, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); -FMPZ_MOD_MPOLY_INLINE slong fmpz_mod_mpoly_univar_length(const fmpz_mod_mpoly_univar_t A, const fmpz_mod_mpoly_ctx_t ctx) { return A->length; } +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_univar_swap(fmpz_mod_mpoly_univar_t A, fmpz_mod_mpoly_univar_t B, const fmpz_mod_mpoly_ctx_t ctx) +{ + FLINT_SWAP(fmpz_mod_mpoly_univar_struct, *A, *B); +} -FMPZ_MOD_MPOLY_INLINE slong fmpz_mod_mpoly_univar_get_term_exp_si(fmpz_mod_mpoly_univar_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) A->length); return fmpz_get_si(A->exps + i); } +FMPZ_MOD_MPOLY_INLINE +int fmpz_mod_mpoly_univar_degree_fits_si(const fmpz_mod_mpoly_univar_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + return A->length == 0 || fmpz_fits_si(A->exps + 0); +} -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_univar_get_term_coeff(fmpz_mod_mpoly_t c, const fmpz_mod_mpoly_univar_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx) { FLINT_ASSERT((ulong) i < (ulong)A->length); fmpz_mod_mpoly_set(c, A->coeffs + i, ctx); } +FMPZ_MOD_MPOLY_INLINE +slong fmpz_mod_mpoly_univar_length(const fmpz_mod_mpoly_univar_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + return A->length; +} -FMPZ_MOD_MPOLY_INLINE void fmpz_mod_mpoly_univar_swap_term_coeff(fmpz_mod_mpoly_t c, fmpz_mod_mpoly_univar_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx) { FLINT_ASSERT((ulong) i < (ulong) A->length); fmpz_mod_mpoly_swap(c, A->coeffs + i, ctx); } +FMPZ_MOD_MPOLY_INLINE +slong fmpz_mod_mpoly_univar_get_term_exp_si(fmpz_mod_mpoly_univar_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) A->length); return fmpz_get_si(A->exps + i); +} -int fmpz_mod_mpoly_univar_pseudo_gcd(fmpz_mod_mpoly_univar_t Gx, const fmpz_mod_mpoly_univar_t Ax, const fmpz_mod_mpoly_univar_t Bx, const fmpz_mod_mpoly_ctx_t ctx); +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_univar_get_term_coeff(fmpz_mod_mpoly_t c, const fmpz_mod_mpoly_univar_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT((ulong) i < (ulong)A->length); fmpz_mod_mpoly_set(c, A->coeffs + i, ctx); +} -int fmpz_mod_mpoly_univar_discriminant(fmpz_mod_mpoly_t D, const fmpz_mod_mpoly_univar_t Fx, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_discriminant(fmpz_mod_mpoly_t R, const fmpz_mod_mpoly_t A, slong var, const fmpz_mod_mpoly_ctx_t ctx); +FMPZ_MOD_MPOLY_INLINE +void fmpz_mod_mpoly_univar_swap_term_coeff(fmpz_mod_mpoly_t c, fmpz_mod_mpoly_univar_t A, slong i, const fmpz_mod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT((ulong) i < (ulong) A->length); fmpz_mod_mpoly_swap(c, A->coeffs + i, ctx); +} -int fmpz_mod_mpoly_univar_resultant(fmpz_mod_mpoly_t R, const fmpz_mod_mpoly_univar_t Ax, const fmpz_mod_mpoly_univar_t Bx, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_resultant(fmpz_mod_mpoly_t R, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, slong var, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_univar_pseudo_gcd( + fmpz_mod_mpoly_univar_t Gx, + const fmpz_mod_mpoly_univar_t Ax, + const fmpz_mod_mpoly_univar_t Bx, + const fmpz_mod_mpoly_ctx_t ctx); + +int fmpz_mod_mpoly_univar_discriminant( + fmpz_mod_mpoly_t D, + const fmpz_mod_mpoly_univar_t Fx, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_discriminant( + fmpz_mod_mpoly_t R, + const fmpz_mod_mpoly_t A, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); + +int fmpz_mod_mpoly_univar_resultant( + fmpz_mod_mpoly_t R, + const fmpz_mod_mpoly_univar_t Ax, + const fmpz_mod_mpoly_univar_t Bx, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_resultant( + fmpz_mod_mpoly_t R, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + slong var, + const fmpz_mod_mpoly_ctx_t ctx); /****************************************************************************** @@ -452,9 +1143,17 @@ int fmpz_mod_mpoly_resultant(fmpz_mod_mpoly_t R, const fmpz_mod_mpoly_t A, const ******************************************************************************/ -FMPZ_MOD_MPOLY_INLINE void _fmpz_mod_mpoly_clear_dense_mock(fmpz_mod_poly_t D) { flint_free(D->coeffs); } +FMPZ_MOD_MPOLY_INLINE +void _fmpz_mod_mpoly_clear_dense_mock(fmpz_mod_poly_t D) +{ + flint_free(D->coeffs); +} -void _fmpz_mod_mpoly_init_dense_mock(fmpz_mod_poly_t D, const fmpz_mod_mpoly_t A, const slong * Adeg_bounds, const fmpz_mod_mpoly_ctx_t ctx); +void _fmpz_mod_mpoly_init_dense_mock( + fmpz_mod_poly_t D, + const fmpz_mod_mpoly_t A, + const slong * Adeg_bounds, + const fmpz_mod_mpoly_ctx_t ctx); void mpoly_void_ring_init_fmpz_mod_mpoly_ctx(mpoly_void_ring_t R, const fmpz_mod_mpoly_ctx_t ctx); @@ -472,30 +1171,96 @@ typedef fmpz_mod_mpoly_geobucket_struct fmpz_mod_mpoly_geobucket_t[1]; void fmpz_mod_mpoly_geobucket_init(fmpz_mod_mpoly_geobucket_t B, const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpoly_geobucket_clear(fmpz_mod_mpoly_geobucket_t B, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_geobucket_empty(fmpz_mod_mpoly_t p, fmpz_mod_mpoly_geobucket_t B, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_geobucket_fit_length(fmpz_mod_mpoly_geobucket_t B, slong i, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_geobucket_set(fmpz_mod_mpoly_geobucket_t B, fmpz_mod_mpoly_t p, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_geobucket_add(fmpz_mod_mpoly_geobucket_t B, fmpz_mod_mpoly_t p, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_geobucket_sub(fmpz_mod_mpoly_geobucket_t B, fmpz_mod_mpoly_t p, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpolyl_lead_coeff(fmpz_mod_mpoly_t c, const fmpz_mod_mpoly_t A, slong num_vars, const fmpz_mod_mpoly_ctx_t ctx); - -int fmpz_mod_mpolyl_content(fmpz_mod_mpoly_t g, const fmpz_mod_mpoly_t A, slong num_vars, const fmpz_mod_mpoly_ctx_t ctx); - -void _fmpz_mod_mpoly_to_fmpz_mod_poly_deflate(fmpz_mod_poly_t A, const fmpz_mod_mpoly_t B, slong var, const ulong * Bshift, const ulong * Bstride, const fmpz_mod_mpoly_ctx_t ctx); -void _fmpz_mod_mpoly_from_fmpz_mod_poly_inflate(fmpz_mod_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mod_poly_t B, slong var, const ulong * Ashift, const ulong * Astride, const fmpz_mod_mpoly_ctx_t ctx); - -void _fmpz_mod_mpoly_set_nmod_mpoly(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx, const nmod_mpoly_t nA, const nmod_mpoly_ctx_t nctx); -void _fmpz_mod_mpoly_get_nmod_mpoly(nmod_mpoly_t nA, const nmod_mpoly_ctx_t nctx, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); - -int fmpz_mod_mpoly_repack_bits_inplace(fmpz_mod_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpoly_repack_bits(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_t B, flint_bitcnt_t Abits, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpoly_to_mpolyl_perm_deflate(fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t lctx, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t ctx, const slong * perm, const ulong * shift, const ulong * stride); -void fmpz_mod_mpoly_from_mpolyl_perm_inflate(fmpz_mod_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mod_mpoly_ctx_t ctx, const fmpz_mod_mpoly_t B, const fmpz_mod_mpoly_ctx_t lctx, const slong * perm, const ulong * shift, const ulong * stride); +void fmpz_mod_mpoly_geobucket_empty( + fmpz_mod_mpoly_t p, + fmpz_mod_mpoly_geobucket_t B, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_geobucket_fit_length( + fmpz_mod_mpoly_geobucket_t B, + slong i, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_geobucket_set( + fmpz_mod_mpoly_geobucket_t B, + fmpz_mod_mpoly_t p, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_geobucket_add( + fmpz_mod_mpoly_geobucket_t B, + fmpz_mod_mpoly_t p, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_geobucket_sub( + fmpz_mod_mpoly_geobucket_t B, + fmpz_mod_mpoly_t p, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpolyl_lead_coeff( + fmpz_mod_mpoly_t c, + const fmpz_mod_mpoly_t A, + slong num_vars, + const fmpz_mod_mpoly_ctx_t ctx); + +int fmpz_mod_mpolyl_content( + fmpz_mod_mpoly_t g, + const fmpz_mod_mpoly_t A, + slong num_vars, + const fmpz_mod_mpoly_ctx_t ctx); + +void _fmpz_mod_mpoly_to_fmpz_mod_poly_deflate( + fmpz_mod_poly_t A, + const fmpz_mod_mpoly_t B, + slong var, + const ulong * Bshift, + const ulong * Bstride, + const fmpz_mod_mpoly_ctx_t ctx); +void _fmpz_mod_mpoly_from_fmpz_mod_poly_inflate( + fmpz_mod_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_mod_poly_t B, + slong var, + const ulong * Ashift, + const ulong * Astride, + const fmpz_mod_mpoly_ctx_t ctx); + +void _fmpz_mod_mpoly_set_nmod_mpoly( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_ctx_t ctx, + const nmod_mpoly_t nA, + const nmod_mpoly_ctx_t nctx); +void _fmpz_mod_mpoly_get_nmod_mpoly( + nmod_mpoly_t nA, + const nmod_mpoly_ctx_t nctx, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_ctx_t ctx); + +int fmpz_mod_mpoly_repack_bits_inplace( + fmpz_mod_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpoly_repack_bits( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_t B, + flint_bitcnt_t Abits, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpoly_to_mpolyl_perm_deflate( + fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_ctx_t lctx, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t ctx, + const slong * perm, + const ulong * shift, + const ulong * stride); +void fmpz_mod_mpoly_from_mpolyl_perm_inflate( + fmpz_mod_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_mod_mpoly_ctx_t ctx, + const fmpz_mod_mpoly_t B, + const fmpz_mod_mpoly_ctx_t lctx, + const slong * perm, + const ulong * shift, + const ulong * stride); /****************************************************************************** @@ -503,7 +1268,10 @@ void fmpz_mod_mpoly_from_mpolyl_perm_inflate(fmpz_mod_mpoly_t A, flint_bitcnt_t ******************************************************************************/ -void fmpz_mod_mpoly_remainder_strongtest(const fmpz_mod_mpoly_t r, const fmpz_mod_mpoly_t g, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_remainder_strongtest( + const fmpz_mod_mpoly_t r, + const fmpz_mod_mpoly_t g, + const fmpz_mod_mpoly_ctx_t ctx); #ifdef __cplusplus } diff --git a/src/fmpz_mod_mpoly_factor.h b/src/fmpz_mod_mpoly_factor.h index 188aaa3505..a5f06c73d4 100644 --- a/src/fmpz_mod_mpoly_factor.h +++ b/src/fmpz_mod_mpoly_factor.h @@ -35,36 +35,87 @@ void fmpz_mod_mpoly_factor_init(fmpz_mod_mpoly_factor_t f, const fmpz_mod_mpoly_ f->alloc = 0; } -void fmpz_mod_mpoly_factor_init2(fmpz_mod_mpoly_factor_t f, slong alloc, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_factor_realloc(fmpz_mod_mpoly_factor_t f, slong alloc, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_factor_init2( + fmpz_mod_mpoly_factor_t f, + slong alloc, + const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_factor_realloc( + fmpz_mod_mpoly_factor_t f, + slong alloc, + const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpoly_factor_clear(fmpz_mod_mpoly_factor_t f, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpoly_factor_fit_length(fmpz_mod_mpoly_factor_t f, slong len, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpoly_factor_fit_length( + fmpz_mod_mpoly_factor_t f, + slong len, + 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_length(const fmpz_mod_mpoly_factor_t f, const fmpz_mod_mpoly_ctx_t ctx) +{ + return f->num; +} -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_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_swap(fmpz_mod_mpoly_factor_t f, fmpz_mod_mpoly_factor_t g, const fmpz_mod_mpoly_ctx_t ctx) { FLINT_SWAP(fmpz_mod_mpoly_factor_struct, *f, *g); } +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); +} -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); +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); +} -void fmpz_mod_mpoly_factor_print_pretty(const fmpz_mod_mpoly_factor_t f, const char ** vars, const fmpz_mod_mpoly_ctx_t 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); +} -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); +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) +{ + FLINT_SWAP(fmpz_mod_mpoly_factor_struct, *f, *g); +} -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); -int fmpz_mod_mpoly_factor(fmpz_mod_mpoly_factor_t f, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); +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); + +void fmpz_mod_mpoly_factor_print_pretty( + const fmpz_mod_mpoly_factor_t f, + const char ** vars, + const fmpz_mod_mpoly_ctx_t ctx); + +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); + +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); +int fmpz_mod_mpoly_factor( + fmpz_mod_mpoly_factor_t f, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpoly_factor_sort(fmpz_mod_mpoly_factor_t f, const fmpz_mod_mpoly_ctx_t ctx); -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); +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); /****************************************************************************** @@ -74,22 +125,53 @@ int fmpz_mod_mpoly_factor_cmp(const fmpz_mod_mpoly_factor_t A, const fmpz_mod_mp /* fmpz_mod_poly extras ******************************************************/ -FMPZ_MOD_MPOLY_FACTOR_INLINE slong _fmpz_mod_poly_degree(const fmpz_mod_poly_t a) { return a->length - 1; } - -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); - -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); - -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); +FMPZ_MOD_MPOLY_FACTOR_INLINE +slong _fmpz_mod_poly_degree(const fmpz_mod_poly_t a) +{ + return a->length - 1; +} -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); -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); +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); + +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); + +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); + +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); +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); /* fmpz_mod_mat extras *******************************************************/ int fmpz_mod_mat_is_reduced(const fmpz_mod_mat_t N); -void fmpz_mod_mat_init_nullspace_tr(fmpz_mod_mat_t X, fmpz_mod_mat_t tmp, const fmpz_mod_ctx_t ctx); +void fmpz_mod_mat_init_nullspace_tr( + fmpz_mod_mat_t X, + fmpz_mod_mat_t tmp, + const fmpz_mod_ctx_t ctx); /*****************************************************************************/ @@ -164,9 +246,16 @@ typedef fmpz_mod_mpolyn_struct fmpz_mod_mpolyn_t[1]; /*****************************************************************************/ -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); +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); -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); +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) @@ -190,14 +279,29 @@ void fmpz_mod_mpoly_factor_append_fmpz_swap(fmpz_mod_mpoly_factor_t f, fmpz_mod_ 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; } +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; +} -void _fmpz_mod_mpoly_get_lead0(fmpz_mod_mpoly_t c, const fmpz_mod_mpoly_t A, const fmpz_mod_mpoly_ctx_t ctx); -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_get_lead0( + fmpz_mod_mpoly_t c, + const fmpz_mod_mpoly_t A, + const fmpz_mod_mpoly_ctx_t ctx); +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); +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 *********************************************************************/ @@ -285,9 +389,17 @@ fmpz_mod_poly_struct * fmpz_mod_poly_stack_take_top(fmpz_mod_poly_stack_t S) return poly_top[0]; } -FMPZ_MOD_MPOLY_FACTOR_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_FACTOR_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_FACTOR_INLINE slong fmpz_mod_poly_stack_size(const fmpz_mod_poly_stack_t S) { return S->top; } +FMPZ_MOD_MPOLY_FACTOR_INLINE +slong fmpz_mod_poly_stack_size(const fmpz_mod_poly_stack_t S) +{ + return S->top; +} void fmpz_mod_bpoly_stack_init(fmpz_mod_bpoly_stack_t S); void fmpz_mod_bpoly_stack_clear(fmpz_mod_bpoly_stack_t S); @@ -314,9 +426,17 @@ fmpz_mod_bpoly_struct * fmpz_mod_bpoly_stack_take_top(fmpz_mod_bpoly_stack_t S) return bpoly_top[0]; } -FMPZ_MOD_MPOLY_FACTOR_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_FACTOR_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_FACTOR_INLINE slong fmpz_mod_bpoly_stack_size(const fmpz_mod_bpoly_stack_t S) { return S->top; } +FMPZ_MOD_MPOLY_FACTOR_INLINE +slong fmpz_mod_bpoly_stack_size(const fmpz_mod_bpoly_stack_t S) +{ + return S->top; +} void fmpz_mod_polyun_stack_init(fmpz_mod_polyun_stack_t S); void fmpz_mod_polyun_stack_clear(fmpz_mod_polyun_stack_t S); @@ -343,14 +463,28 @@ fmpz_mod_polyun_struct * fmpz_mod_polyun_stack_take_top(fmpz_mod_polyun_stack_t return polyun_top[0]; } -FMPZ_MOD_MPOLY_FACTOR_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_FACTOR_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_FACTOR_INLINE slong fmpz_mod_polyun_stack_size(const fmpz_mod_polyun_stack_t S) { return S->top; } +FMPZ_MOD_MPOLY_FACTOR_INLINE +slong fmpz_mod_polyun_stack_size(const fmpz_mod_polyun_stack_t S) +{ + return S->top; +} -void fmpz_mod_mpolyn_stack_init(fmpz_mod_mpolyn_stack_t S, flint_bitcnt_t bits, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpolyn_stack_init( + fmpz_mod_mpolyn_stack_t S, + flint_bitcnt_t bits, + const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpolyn_stack_clear(fmpz_mod_mpolyn_stack_t S, const fmpz_mod_mpoly_ctx_t ctx); -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_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_FACTOR_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) @@ -372,22 +506,53 @@ fmpz_mod_mpolyn_struct * fmpz_mod_mpolyn_stack_take_top(fmpz_mod_mpolyn_stack_t return mpolyn_top[0]; } -FMPZ_MOD_MPOLY_FACTOR_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_FACTOR_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_FACTOR_INLINE slong fmpz_mod_mpolyn_stack_size(const fmpz_mod_mpolyn_stack_t S) { return S->top; } +FMPZ_MOD_MPOLY_FACTOR_INLINE +slong fmpz_mod_mpolyn_stack_size(const fmpz_mod_mpolyn_stack_t S) +{ + return S->top; +} /* poly_vec ******************************************************************/ -slong _fmpz_mod_poly_vec_max_degree(const fmpz_mod_poly_struct * A, slong Alen, const fmpz_mod_ctx_t ctx); - -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); - -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); - -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); -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); - -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); +slong _fmpz_mod_poly_vec_max_degree( + const fmpz_mod_poly_struct * A, + slong Alen, + const fmpz_mod_ctx_t ctx); + +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); + +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); + +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); +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); + +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); /* polyun ********************************************************************/ @@ -401,42 +566,103 @@ ulong fmpz_mod_polyu1n_bidegree(const fmpz_mod_polyun_t A) 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 +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) { FLINT_SWAP(fmpz_mod_polyun_struct, *A, *B); } +FMPZ_MOD_MPOLY_FACTOR_INLINE +void fmpz_mod_polyun_swap(fmpz_mod_polyun_t A, fmpz_mod_polyun_t B) +{ + FLINT_SWAP(fmpz_mod_polyun_struct, *A, *B); +} int fmpz_mod_polyun_is_canonical(const fmpz_mod_polyun_t A, const fmpz_mod_ctx_t ctx); -FMPZ_MOD_MPOLY_FACTOR_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; } +FMPZ_MOD_MPOLY_FACTOR_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; +} void fmpz_mod_polyun_realloc(fmpz_mod_polyun_t A, slong len, const fmpz_mod_ctx_t ctx); void fmpz_mod_polyun_clear(fmpz_mod_polyun_t A, const fmpz_mod_ctx_t ctx); -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); - -int fmpz_mod_polyun_equal(fmpz_mod_polyun_t A, const fmpz_mod_polyun_t B, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_polyun_set(fmpz_mod_polyun_t A, const fmpz_mod_polyun_t B, const fmpz_mod_ctx_t ctx); +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); + +int fmpz_mod_polyun_equal( + fmpz_mod_polyun_t A, + const fmpz_mod_polyun_t B, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_polyun_set( + fmpz_mod_polyun_t A, + const fmpz_mod_polyun_t B, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_polyu1n_print_pretty( + const fmpz_mod_polyun_t A, + const char * var0, + const char * varlast, + const fmpz_mod_ctx_t ctx); +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); -void fmpz_mod_polyu1n_print_pretty(const fmpz_mod_polyun_t A, const char * var0, const char * varlast, const fmpz_mod_ctx_t ctx); -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); - -FMPZ_MOD_MPOLY_FACTOR_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); } +FMPZ_MOD_MPOLY_FACTOR_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); +} void fmpz_mod_polyun_one(fmpz_mod_polyun_t A, const fmpz_mod_ctx_t ctx); -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); -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); +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); +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 ********************************************************************/ -void fmpz_mod_mpolyn_init(fmpz_mod_mpolyn_t A, flint_bitcnt_t bits, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpolyn_init( + fmpz_mod_mpolyn_t A, + flint_bitcnt_t bits, + const fmpz_mod_mpoly_ctx_t ctx); void fmpz_mod_mpolyn_clear(fmpz_mod_mpolyn_t A, const fmpz_mod_mpoly_ctx_t ctx); -FMPZ_MOD_MPOLY_FACTOR_INLINE void fmpz_mod_mpolyn_swap(fmpz_mod_mpolyn_t A, fmpz_mod_mpolyn_t B, const fmpz_mod_mpoly_ctx_t ctx) { FLINT_SWAP(fmpz_mod_mpolyn_struct, *A, *B); } +FMPZ_MOD_MPOLY_FACTOR_INLINE +void fmpz_mod_mpolyn_swap(fmpz_mod_mpolyn_t A, fmpz_mod_mpolyn_t B, const fmpz_mod_mpoly_ctx_t ctx) +{ + FLINT_SWAP(fmpz_mod_mpolyn_struct, *A, *B); +} -void fmpz_mod_mpolyn_fit_length(fmpz_mod_mpolyn_t A, slong length, const fmpz_mod_mpoly_ctx_t ctx); +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; } +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; +} int fmpz_mod_mpolyn_is_canonical(const fmpz_mod_mpolyn_t A, const fmpz_mod_mpoly_ctx_t ctx); @@ -444,42 +670,152 @@ slong fmpz_mod_mpolyn_lastdeg(const fmpz_mod_mpolyn_t A, const fmpz_mod_mpoly_ct void fmpz_mod_mpolyn_one(fmpz_mod_mpolyn_t A, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpolyn_set(fmpz_mod_mpolyn_t A, const fmpz_mod_mpolyn_t B, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpolyn_set( + fmpz_mod_mpolyn_t A, + const fmpz_mod_mpolyn_t B, + const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpolyn_scalar_mul_fmpz_mod(fmpz_mod_mpolyn_t A, const fmpz_t c, const fmpz_mod_mpoly_ctx_t ctx); +void fmpz_mod_mpolyn_scalar_mul_fmpz_mod( + fmpz_mod_mpolyn_t A, + const fmpz_t c, + const fmpz_mod_mpoly_ctx_t ctx); -int fmpz_mod_mpolyn_equal(const fmpz_mod_mpolyn_t A, const fmpz_mod_mpolyn_t B, const fmpz_mod_mpoly_ctx_t ctx); +int fmpz_mod_mpolyn_equal( + const fmpz_mod_mpolyn_t A, + const fmpz_mod_mpolyn_t B, + const fmpz_mod_mpoly_ctx_t ctx); int fmpz_mod_mpolyn_is_nonzero_fmpz(const fmpz_mod_mpolyn_t A, const fmpz_mod_mpoly_ctx_t ctx); -void fmpz_mod_mpolyn_print_pretty(const fmpz_mod_mpolyn_t poly, const char ** x, const fmpz_mod_mpoly_ctx_t ctx); - -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); - -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); - -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); -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); - -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); +void fmpz_mod_mpolyn_print_pretty( + const fmpz_mod_mpolyn_t poly, + const char ** x, + const fmpz_mod_mpoly_ctx_t ctx); + +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); + +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); + +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); +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); + +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 ********************************************************************/ -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); -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); -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); - -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); -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); -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); - -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); -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); -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); - -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); -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); -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); +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); +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); +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); + +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); +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); +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); + +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); +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); +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); + +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); +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); +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 *********************************************************************/ @@ -487,93 +823,246 @@ void fmpz_mod_polyu_init(fmpz_mod_polyu_t A); void fmpz_mod_polyu_realloc(fmpz_mod_polyu_t A, slong len); void fmpz_mod_polyu_clear(fmpz_mod_polyu_t A); -FMPZ_MOD_MPOLY_FACTOR_INLINE void fmpz_mod_polyu_swap(fmpz_mod_polyu_t A, fmpz_mod_polyu_t B) { FLINT_SWAP(fmpz_mod_polyu_struct, *A, *B); } +FMPZ_MOD_MPOLY_FACTOR_INLINE +void fmpz_mod_polyu_swap(fmpz_mod_polyu_t A, fmpz_mod_polyu_t B) +{ + FLINT_SWAP(fmpz_mod_polyu_struct, *A, *B); +} -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); } +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); +} -void fmpz_mod_polyu3_degrees(slong * deg0, slong * deg1, slong * deg2, const fmpz_mod_polyu_t A); +void fmpz_mod_polyu3_degrees( + slong * deg0, + slong * deg1, + slong * deg2, + const fmpz_mod_polyu_t A); -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); +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 ********************************************************************/ int fmpz_mod_mpolyu_is_canonical(const fmpz_mod_mpolyu_t A, const fmpz_mod_mpoly_ctx_t ctx); -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); +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 *********************************************************************/ -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; } +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; +} void fmpz_mod_bpoly_clear(fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx); 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_swap(fmpz_mod_bpoly_t A, fmpz_mod_bpoly_t B, const fmpz_mod_ctx_t ctx) { FLINT_SWAP(fmpz_mod_bpoly_struct, *A, *B); } +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) +{ + FLINT_SWAP(fmpz_mod_bpoly_struct, *A, *B); +} -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 +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 +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--; } +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--; +} -void fmpz_mod_bpoly_set(fmpz_mod_bpoly_t A, const fmpz_mod_bpoly_t B, const fmpz_mod_ctx_t ctx); +void fmpz_mod_bpoly_set( + fmpz_mod_bpoly_t A, + const fmpz_mod_bpoly_t B, + const fmpz_mod_ctx_t ctx); -void fmpz_mod_bpoly_set_poly_gen0(fmpz_mod_bpoly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); -void fmpz_mod_bpoly_set_poly_gen1(fmpz_mod_bpoly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); +void fmpz_mod_bpoly_set_poly_gen0( + fmpz_mod_bpoly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_bpoly_set_poly_gen1( + fmpz_mod_bpoly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); void fmpz_mod_bpoly_zero(fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx); void fmpz_mod_bpoly_one(fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx); -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); +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); -int fmpz_mod_bpoly_equal(const fmpz_mod_bpoly_t A, const fmpz_mod_bpoly_t B, const fmpz_mod_ctx_t ctx); +int fmpz_mod_bpoly_equal( + const fmpz_mod_bpoly_t A, + const fmpz_mod_bpoly_t B, + 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); } +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); +} slong fmpz_mod_bpoly_degree1(const fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx); -void fmpz_mod_bpoly_print_pretty(const fmpz_mod_bpoly_t A, const char * xvar, const char * yvar, const fmpz_mod_ctx_t ctx); +void fmpz_mod_bpoly_print_pretty( + const fmpz_mod_bpoly_t A, + const char * xvar, + const char * yvar, + const fmpz_mod_ctx_t ctx); void fmpz_mod_bpoly_fit_length(fmpz_mod_bpoly_t A, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_bpoly_reverse_vars(fmpz_mod_bpoly_t A, const fmpz_mod_bpoly_t B, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_bpoly_taylor_shift_gen0(fmpz_mod_bpoly_t A, const fmpz_t alpha, const fmpz_mod_ctx_t ctx); -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); - -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); -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); - -void fmpz_mod_bpoly_make_primitive(fmpz_mod_poly_t g, fmpz_mod_bpoly_t A, const fmpz_mod_ctx_t ctx); - -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); -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); - -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); - -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); - -void fmpz_mod_bpoly_derivative_gen0(fmpz_mod_bpoly_t A, const fmpz_mod_bpoly_t B, const fmpz_mod_ctx_t ctx); +void fmpz_mod_bpoly_reverse_vars( + fmpz_mod_bpoly_t A, + const fmpz_mod_bpoly_t B, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_bpoly_taylor_shift_gen0( + fmpz_mod_bpoly_t A, + const fmpz_t alpha, + const fmpz_mod_ctx_t ctx); +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); + +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); +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); + +void fmpz_mod_bpoly_make_primitive( + fmpz_mod_poly_t g, + fmpz_mod_bpoly_t A, + const fmpz_mod_ctx_t ctx); + +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); +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); + +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); + +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); + +void fmpz_mod_bpoly_derivative_gen0( + fmpz_mod_bpoly_t A, + const fmpz_mod_bpoly_t B, + const fmpz_mod_ctx_t ctx); + +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); -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_FACTOR_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_FACTOR_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; +} void fmpz_mod_tpoly_clear(fmpz_mod_tpoly_t A, const fmpz_mod_ctx_t ctx); -FMPZ_MOD_MPOLY_FACTOR_INLINE void fmpz_mod_tpoly_swap(fmpz_mod_tpoly_t A, fmpz_mod_tpoly_t B, const fmpz_mod_ctx_t ctx) { FLINT_SWAP(fmpz_mod_tpoly_struct, *A, *B); } +FMPZ_MOD_MPOLY_FACTOR_INLINE +void fmpz_mod_tpoly_swap(fmpz_mod_tpoly_t A, fmpz_mod_tpoly_t B, const fmpz_mod_ctx_t ctx) +{ + FLINT_SWAP(fmpz_mod_tpoly_struct, *A, *B); +} void fmpz_mod_tpoly_fit_length(fmpz_mod_tpoly_t A, slong len, const fmpz_mod_ctx_t ctx); -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); -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); - -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); +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); +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); + +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); /*****************************************************************************/ -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); - -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); +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); + +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); /*****************************************************************************/ @@ -586,40 +1075,117 @@ typedef 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_init(fmpz_mod_mpolyv_t A, const fmpz_mod_mpoly_ctx_t ctx) +{ + A->coeffs = NULL; A->alloc = 0; A->length = 0; +} void fmpz_mod_mpolyv_clear(fmpz_mod_mpolyv_t A, const fmpz_mod_mpoly_ctx_t ctx); -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) { FLINT_SWAP(fmpz_mod_mpolyv_struct, *A, *B); } - -void fmpz_mod_mpolyv_print_pretty(const fmpz_mod_mpolyv_t poly, const char ** x, const fmpz_mod_mpoly_ctx_t ctx); - -void fmpz_mod_mpolyv_fit_length(fmpz_mod_mpolyv_t A, slong length, const fmpz_mod_mpoly_ctx_t ctx); - -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); - -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); -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); - -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); - -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); +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) +{ + FLINT_SWAP(fmpz_mod_mpolyv_struct, *A, *B); +} -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); +void fmpz_mod_mpolyv_print_pretty( + const fmpz_mod_mpolyv_t poly, + const char ** x, + const fmpz_mod_mpoly_ctx_t ctx); + +void fmpz_mod_mpolyv_fit_length( + fmpz_mod_mpolyv_t A, + slong length, + const fmpz_mod_mpoly_ctx_t ctx); + +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); + +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); +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); + +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); + +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); + +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); /*****************************************************************************/ -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); - -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); - -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); -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); -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); +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); + +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); + +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); +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); +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); /*****************************************************************************/ -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); -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); +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); +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); /*****************************************************************************/ @@ -649,64 +1215,261 @@ typedef struct typedef fmpz_mod_mpoly_pfrac_struct fmpz_mod_mpoly_pfrac_t[1]; -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); +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); void fmpz_mod_mpoly_pfrac_clear(fmpz_mod_mpoly_pfrac_t I, const fmpz_mod_mpoly_ctx_t ctx); -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); -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); - -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); -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); -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); - -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); - -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); - -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); -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); -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); -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); - -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); -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); - -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); +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); +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); + +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); +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); +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); + +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); + +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); + +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); +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); +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); +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); + +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); +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); + +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 ***********************************************************************/ -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); - -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); - -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); - -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); - -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); -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); +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); + +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); + +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); + +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); + +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); +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 *****************************************************************/ -void fmpz_mod_pow_cache_start(const fmpz_t b, fmpz_mod_poly_t c, const fmpz_mod_ctx_t ctx); +void fmpz_mod_pow_cache_start( + const fmpz_t b, + fmpz_mod_poly_t c, + const fmpz_mod_ctx_t ctx); -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); +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 ***************************************************************/ -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); -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); -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); - -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); - -slong fmpz_mod_polyun_product_roots(fmpz_mod_polyun_t M, const fmpz_mod_polyun_t H, const fmpz_mod_ctx_t ctx); - -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); - -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); - -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); +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); +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); +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); + +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); + +slong fmpz_mod_polyun_product_roots( + fmpz_mod_polyun_t M, + const fmpz_mod_polyun_t H, + const fmpz_mod_ctx_t ctx); + +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); + +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); + +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 } diff --git a/src/fmpz_mod_poly.h b/src/fmpz_mod_poly.h index c868ffa1df..e932261191 100644 --- a/src/fmpz_mod_poly.h +++ b/src/fmpz_mod_poly.h @@ -97,7 +97,11 @@ void fmpz_mod_poly_realloc(fmpz_mod_poly_t poly, slong alloc, const fmpz_mod_ctx void fmpz_mod_poly_clear(fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); void _fmpz_mod_poly_fit_length(fmpz_mod_poly_t poly, slong len); -FMPZ_MOD_POLY_INLINE void fmpz_mod_poly_fit_length(fmpz_mod_poly_t poly, slong len, const fmpz_mod_ctx_t ctx) { _fmpz_mod_poly_fit_length(poly, len); } +FMPZ_MOD_POLY_INLINE +void fmpz_mod_poly_fit_length(fmpz_mod_poly_t poly, slong len, const fmpz_mod_ctx_t ctx) +{ + _fmpz_mod_poly_fit_length(poly, len); +} /* Normalisation and truncation *********************************************/ @@ -114,27 +118,77 @@ void _fmpz_mod_poly_set_length(fmpz_mod_poly_t poly, slong len); void fmpz_mod_poly_truncate(fmpz_mod_poly_t poly, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_set_trunc(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, slong n, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_set_trunc( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + slong n, + const fmpz_mod_ctx_t ctx); int fmpz_mod_poly_is_canonical(const fmpz_mod_poly_t A, const fmpz_mod_ctx_t ctx); /* Randomisation ************************************************************/ -void fmpz_mod_poly_randtest(fmpz_mod_poly_t f, flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_randtest_irreducible(fmpz_mod_poly_t f, flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_randtest_not_zero(fmpz_mod_poly_t f, flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_randtest_monic(fmpz_mod_poly_t f, flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_randtest_monic_irreducible(fmpz_mod_poly_t f, flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_randtest_monic_primitive(fmpz_mod_poly_t f, flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_randtest_trinomial(fmpz_mod_poly_t f, flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_randtest_trinomial_irreducible(fmpz_mod_poly_t f, flint_rand_t state, slong len, slong max_attempts, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_randtest_pentomial(fmpz_mod_poly_t f, flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_randtest_pentomial_irreducible(fmpz_mod_poly_t f, flint_rand_t state, slong len, slong max_attempts, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_randtest_sparse_irreducible(fmpz_mod_poly_t poly, flint_rand_t state, slong len, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_randtest( + fmpz_mod_poly_t f, + flint_rand_t state, + slong len, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_randtest_irreducible( + fmpz_mod_poly_t f, + flint_rand_t state, + slong len, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_randtest_not_zero( + fmpz_mod_poly_t f, + flint_rand_t state, + slong len, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_randtest_monic( + fmpz_mod_poly_t f, + flint_rand_t state, + slong len, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_randtest_monic_irreducible( + fmpz_mod_poly_t f, + flint_rand_t state, + slong len, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_randtest_monic_primitive( + fmpz_mod_poly_t f, + flint_rand_t state, + slong len, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_randtest_trinomial( + fmpz_mod_poly_t f, + flint_rand_t state, + slong len, + const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_randtest_trinomial_irreducible( + fmpz_mod_poly_t f, + flint_rand_t state, + slong len, + slong max_attempts, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_randtest_pentomial( + fmpz_mod_poly_t f, + flint_rand_t state, + slong len, + const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_randtest_pentomial_irreducible( + fmpz_mod_poly_t f, + flint_rand_t state, + slong len, + slong max_attempts, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_randtest_sparse_irreducible( + fmpz_mod_poly_t poly, + flint_rand_t state, + slong len, + const fmpz_mod_ctx_t ctx); /* Attributes ***************************************************************/ @@ -150,7 +204,10 @@ int fmpz_mod_poly_is_unit(const fmpz_mod_poly_t op, const fmpz_mod_ctx_t ctx); /* Assignment and basic manipulation ****************************************/ -void fmpz_mod_poly_set(fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_set( + fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_ctx_t ctx); FMPZ_MOD_POLY_INLINE void fmpz_mod_poly_swap(fmpz_mod_poly_t poly1, fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t ctx) @@ -159,7 +216,11 @@ void fmpz_mod_poly_swap(fmpz_mod_poly_t poly1, fmpz_mod_poly_t poly2, const fmpz } void _fmpz_mod_poly_reverse(fmpz * res, const fmpz * poly, slong len, slong n); -void fmpz_mod_poly_reverse(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, slong n, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_reverse( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + slong n, + const fmpz_mod_ctx_t ctx); FMPZ_MOD_POLY_INLINE void fmpz_mod_poly_zero(fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx) @@ -169,198 +230,714 @@ void fmpz_mod_poly_zero(fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx) void fmpz_mod_poly_one(fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); void fmpz_mod_poly_gen(fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_zero_coeffs(fmpz_mod_poly_t poly, slong i, slong j, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_zero_coeffs( + fmpz_mod_poly_t poly, + slong i, + slong j, + const fmpz_mod_ctx_t ctx); ulong fmpz_mod_poly_deflation(const fmpz_mod_poly_t input, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_deflate(fmpz_mod_poly_t result, const fmpz_mod_poly_t input, ulong deflation, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_inflate(fmpz_mod_poly_t result, const fmpz_mod_poly_t input, ulong inflation, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_deflate( + fmpz_mod_poly_t result, + const fmpz_mod_poly_t input, + ulong deflation, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_inflate( + fmpz_mod_poly_t result, + const fmpz_mod_poly_t input, + ulong inflation, + const fmpz_mod_ctx_t ctx); /* Conversion ***************************************************************/ void fmpz_mod_poly_set_ui(fmpz_mod_poly_t f, ulong x, const fmpz_mod_ctx_t ctx); void fmpz_mod_poly_set_nmod_poly(fmpz_mod_poly_t f, const nmod_poly_t g); -void fmpz_mod_poly_set_fmpz(fmpz_mod_poly_t poly, const fmpz_t c, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_set_fmpz_poly(fmpz_mod_poly_t f, const fmpz_poly_t g, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_set_fmpz( + fmpz_mod_poly_t poly, + const fmpz_t c, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_set_fmpz_poly( + fmpz_mod_poly_t f, + const fmpz_poly_t g, + const fmpz_mod_ctx_t ctx); void fmpz_mod_poly_get_nmod_poly(nmod_poly_t f, const fmpz_mod_poly_t g); -void fmpz_mod_poly_get_fmpz_poly(fmpz_poly_t f, const fmpz_mod_poly_t g, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_get_fmpz_poly( + fmpz_poly_t f, + const fmpz_mod_poly_t g, + const fmpz_mod_ctx_t ctx); /* Comparison ***************************************************************/ -int fmpz_mod_poly_equal(const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_equal_trunc(const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, slong n, const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_equal( + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_equal_trunc( + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + slong n, + const fmpz_mod_ctx_t ctx); int fmpz_mod_poly_is_zero(const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); /* Getting and setting coefficients *****************************************/ -void fmpz_mod_poly_set_coeff_fmpz(fmpz_mod_poly_t poly, slong n, const fmpz_t x, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_set_coeff_ui(fmpz_mod_poly_t poly, slong n, ulong x, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_set_coeff_si(fmpz_mod_poly_t poly, slong n, slong x, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_get_coeff_fmpz(fmpz_t x, const fmpz_mod_poly_t poly, slong n, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_set_coeff_fmpz( + fmpz_mod_poly_t poly, + slong n, + const fmpz_t x, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_set_coeff_ui( + fmpz_mod_poly_t poly, + slong n, + ulong x, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_set_coeff_si( + fmpz_mod_poly_t poly, + slong n, + slong x, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_get_coeff_fmpz( + fmpz_t x, + const fmpz_mod_poly_t poly, + slong n, + const fmpz_mod_ctx_t ctx); /* Shifting *****************************************************************/ void _fmpz_mod_poly_shift_left(fmpz * res, const fmpz * poly, slong len, slong n); -void fmpz_mod_poly_shift_left(fmpz_mod_poly_t f, const fmpz_mod_poly_t g, slong n, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_shift_left( + fmpz_mod_poly_t f, + const fmpz_mod_poly_t g, + slong n, + const fmpz_mod_ctx_t ctx); void _fmpz_mod_poly_shift_right(fmpz * res, const fmpz * poly, slong len, slong n); -void fmpz_mod_poly_shift_right(fmpz_mod_poly_t f, const fmpz_mod_poly_t g, slong n, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_shift_right( + fmpz_mod_poly_t f, + const fmpz_mod_poly_t g, + slong n, + const fmpz_mod_ctx_t ctx); /* Addition and subtraction *************************************************/ -void _fmpz_mod_poly_neg(fmpz *res, const fmpz *poly, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_neg(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_add_si(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, slong c, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_add_fmpz(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_t c, const fmpz_mod_ctx_t ctx); -void _fmpz_mod_poly_add(fmpz *res, const fmpz *poly1, slong len1, const fmpz *poly2, slong len2, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_add(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_sub_si(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, slong c, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_si_sub(fmpz_mod_poly_t res, slong c, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_sub_fmpz(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_t c, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_fmpz_sub(fmpz_mod_poly_t res, const fmpz_t c, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); -void _fmpz_mod_poly_sub(fmpz *res, const fmpz *poly1, slong len1, const fmpz *poly2, slong len2, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_sub(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_add_series(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, slong n, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_sub_series(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, slong n, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_neg( + fmpz *res, + const fmpz *poly, + slong len, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_neg( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_add_si( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + slong c, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_add_fmpz( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + const fmpz_t c, + const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_add( + fmpz *res, + const fmpz *poly1, + slong len1, + const fmpz *poly2, + slong len2, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_add( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_sub_si( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + slong c, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_si_sub( + fmpz_mod_poly_t res, + slong c, + const fmpz_mod_poly_t poly, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_sub_fmpz( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + const fmpz_t c, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_fmpz_sub( + fmpz_mod_poly_t res, + const fmpz_t c, + const fmpz_mod_poly_t poly, + const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_sub( + fmpz *res, + const fmpz *poly1, + slong len1, + const fmpz *poly2, + slong len2, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_sub( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_add_series( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + slong n, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_sub_series( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + slong n, + const fmpz_mod_ctx_t ctx); /* Scalar multiplication ****************************************************/ -void _fmpz_mod_poly_scalar_mul_fmpz(fmpz *res, const fmpz *poly, slong len, const fmpz_t x, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_scalar_mul_fmpz(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_t x, const fmpz_mod_ctx_t ctx); -void _fmpz_mod_poly_scalar_mul_ui(fmpz *res, const fmpz *poly, slong len, ulong x, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_scalar_mul_ui(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, ulong x, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_scalar_addmul_fmpz(fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_t x, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_scalar_mul_fmpz( + fmpz *res, + const fmpz *poly, + slong len, + const fmpz_t x, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_scalar_mul_fmpz( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + const fmpz_t x, + const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_scalar_mul_ui( + fmpz *res, + const fmpz *poly, + slong len, + ulong x, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_scalar_mul_ui( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + ulong x, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_scalar_addmul_fmpz( + fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_t x, + const fmpz_mod_ctx_t ctx); /* Scalar division ****************************************************/ -void _fmpz_mod_poly_scalar_div_fmpz(fmpz *res, const fmpz *poly, slong len, const fmpz_t x, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_scalar_div_fmpz(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_t x, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_scalar_div_fmpz( + fmpz *res, + const fmpz *poly, + slong len, + const fmpz_t x, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_scalar_div_fmpz( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + const fmpz_t x, + const fmpz_mod_ctx_t ctx); /* Multiplication ***********************************************************/ -void _fmpz_mod_poly_mul(fmpz *res, const fmpz *poly1, slong len1, const fmpz *poly2, slong len2, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_mul(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_mullow(fmpz *res, const fmpz *poly1, slong len1, const fmpz *poly2, slong len2, slong n, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_mullow(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, slong n, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_mulhigh(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, slong start, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_sqr(fmpz *res, const fmpz *poly, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_sqr(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_mulmod(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, const fmpz * f, slong lenf, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_mulmod(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_mulmod_preinv(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, const fmpz * f, slong lenf, const fmpz* finv, slong lenfinv, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_mulmod_preinv(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_poly_t f, const fmpz_mod_poly_t finv, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_mul( + fmpz *res, + const fmpz *poly1, + slong len1, + const fmpz *poly2, + slong len2, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_mul( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_mullow( + fmpz *res, + const fmpz *poly1, + slong len1, + const fmpz *poly2, + slong len2, + slong n, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_mullow( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + slong n, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_mulhigh( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + slong start, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_sqr( + fmpz *res, + const fmpz *poly, + slong len, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_sqr( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_mulmod( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + const fmpz * f, + slong lenf, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_mulmod( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_poly_t f, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_mulmod_preinv( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + const fmpz * f, + slong lenf, + const fmpz* finv, + slong lenfinv, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_mulmod_preinv( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_poly_t f, + const fmpz_mod_poly_t finv, + const fmpz_mod_ctx_t ctx); /* Powering *****************************************************************/ -void _fmpz_mod_poly_pow(fmpz *rop, const fmpz *op, slong len, ulong e, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_pow(fmpz_mod_poly_t rop, const fmpz_mod_poly_t op, ulong e, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_pow_trunc(fmpz * res, const fmpz * poly, ulong e, slong trunc, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_pow_trunc(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, ulong e, slong trunc, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_pow_trunc_binexp(fmpz * res, const fmpz * poly, ulong e, slong trunc, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_pow_trunc_binexp(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, ulong e, slong trunc, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_powmod_ui_binexp(fmpz * res, const fmpz * poly, ulong e, const fmpz * f, slong lenf, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_powmod_ui_binexp(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, ulong e, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_powmod_ui_binexp_preinv(fmpz * res, const fmpz * poly, ulong e, const fmpz * f, slong lenf, const fmpz * finv, slong lenfinv, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_powmod_ui_binexp_preinv(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, ulong e, const fmpz_mod_poly_t f, const fmpz_mod_poly_t finv, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_powmod_fmpz_binexp(fmpz * res, const fmpz * poly, const fmpz_t e, const fmpz * f, slong lenf, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_powmod_fmpz_binexp(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_t e, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_powmod_fmpz_binexp_preinv(fmpz * res, const fmpz * poly, const fmpz_t e, const fmpz * f, slong lenf, const fmpz * finv, slong lenfinv, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_powmod_fmpz_binexp_preinv(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_t e, const fmpz_mod_poly_t f, const fmpz_mod_poly_t finv, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_powmod_x_fmpz_preinv(fmpz * res, const fmpz_t e, const fmpz * f, slong lenf, const fmpz* finv, slong lenfinv, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_powmod_x_fmpz_preinv(fmpz_mod_poly_t res, const fmpz_t e, const fmpz_mod_poly_t f, const fmpz_mod_poly_t finv, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_powmod_linear_fmpz_preinv(fmpz_mod_poly_t res, const fmpz_t a, const fmpz_t e, const fmpz_mod_poly_t f, const fmpz_mod_poly_t finv, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_powers_mod_preinv_naive(fmpz ** res, const fmpz * f, slong flen, slong n, const fmpz * g, slong glen, const fmpz * ginv, slong ginvlen, const fmpz_mod_ctx_t ctx); -void _fmpz_mod_poly_powers_mod_preinv_threaded_pool(fmpz ** res, const fmpz * f, slong flen, slong n, const fmpz * g, slong glen, const fmpz * ginv, slong ginvlen, const fmpz_mod_ctx_t ctx, thread_pool_handle * threads, slong num_threads); - -void fmpz_mod_poly_powers_mod_naive(fmpz_mod_poly_struct * res, const fmpz_mod_poly_t f, slong n, const fmpz_mod_poly_t g, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_powers_mod_bsgs(fmpz_mod_poly_struct * res, const fmpz_mod_poly_t f, slong n, const fmpz_mod_poly_t g, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_frobenius_powers_2exp_precomp(fmpz_mod_poly_frobenius_powers_2exp_t pow, const fmpz_mod_poly_t f, const fmpz_mod_poly_t finv, ulong m, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_pow( + fmpz *rop, + const fmpz *op, + slong len, + ulong e, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_pow( + fmpz_mod_poly_t rop, + const fmpz_mod_poly_t op, + ulong e, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_pow_trunc( + fmpz * res, + const fmpz * poly, + ulong e, + slong trunc, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_pow_trunc( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + ulong e, + slong trunc, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_pow_trunc_binexp( + fmpz * res, + const fmpz * poly, + ulong e, + slong trunc, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_pow_trunc_binexp( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + ulong e, + slong trunc, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_powmod_ui_binexp( + fmpz * res, + const fmpz * poly, + ulong e, + const fmpz * f, + slong lenf, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_powmod_ui_binexp( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + ulong e, + const fmpz_mod_poly_t f, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_powmod_ui_binexp_preinv( + fmpz * res, + const fmpz * poly, + ulong e, + const fmpz * f, + slong lenf, + const fmpz * finv, + slong lenfinv, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_powmod_ui_binexp_preinv( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + ulong e, + const fmpz_mod_poly_t f, + const fmpz_mod_poly_t finv, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_powmod_fmpz_binexp( + fmpz * res, + const fmpz * poly, + const fmpz_t e, + const fmpz * f, + slong lenf, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_powmod_fmpz_binexp( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + const fmpz_t e, + const fmpz_mod_poly_t f, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_powmod_fmpz_binexp_preinv( + fmpz * res, + const fmpz * poly, + const fmpz_t e, + const fmpz * f, + slong lenf, + const fmpz * finv, + slong lenfinv, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_powmod_fmpz_binexp_preinv( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + const fmpz_t e, + const fmpz_mod_poly_t f, + const fmpz_mod_poly_t finv, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_powmod_x_fmpz_preinv( + fmpz * res, + const fmpz_t e, + const fmpz * f, + slong lenf, + const fmpz* finv, + slong lenfinv, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_powmod_x_fmpz_preinv( + fmpz_mod_poly_t res, + const fmpz_t e, + const fmpz_mod_poly_t f, + const fmpz_mod_poly_t finv, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_powmod_linear_fmpz_preinv( + fmpz_mod_poly_t res, + const fmpz_t a, + const fmpz_t e, + const fmpz_mod_poly_t f, + const fmpz_mod_poly_t finv, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_powers_mod_preinv_naive( + fmpz ** res, + const fmpz * f, + slong flen, + slong n, + const fmpz * g, + slong glen, + const fmpz * ginv, + slong ginvlen, + const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_powers_mod_preinv_threaded_pool( + fmpz ** res, + const fmpz * f, + slong flen, + slong n, + const fmpz * g, + slong glen, + const fmpz * ginv, + slong ginvlen, + const fmpz_mod_ctx_t ctx, + thread_pool_handle * threads, + slong num_threads); + +void fmpz_mod_poly_powers_mod_naive( + fmpz_mod_poly_struct * res, + const fmpz_mod_poly_t f, + slong n, + const fmpz_mod_poly_t g, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_powers_mod_bsgs( + fmpz_mod_poly_struct * res, + const fmpz_mod_poly_t f, + slong n, + const fmpz_mod_poly_t g, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_frobenius_powers_2exp_precomp( + fmpz_mod_poly_frobenius_powers_2exp_t pow, + const fmpz_mod_poly_t f, + const fmpz_mod_poly_t finv, + ulong m, + const fmpz_mod_ctx_t ctx); void fmpz_mod_poly_frobenius_powers_2exp_clear(fmpz_mod_poly_frobenius_powers_2exp_t pow, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_frobenius_powers_precomp(fmpz_mod_poly_frobenius_powers_t pow, const fmpz_mod_poly_t f, const fmpz_mod_poly_t finv, ulong m, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_frobenius_powers_precomp( + fmpz_mod_poly_frobenius_powers_t pow, + const fmpz_mod_poly_t f, + const fmpz_mod_poly_t finv, + ulong m, + const fmpz_mod_ctx_t ctx); void fmpz_mod_poly_frobenius_powers_clear(fmpz_mod_poly_frobenius_powers_t pow, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_frobenius_power(fmpz_mod_poly_t res, fmpz_mod_poly_frobenius_powers_2exp_t pow, const fmpz_mod_poly_t f, ulong m, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_frobenius_power( + fmpz_mod_poly_t res, + fmpz_mod_poly_frobenius_powers_2exp_t pow, + const fmpz_mod_poly_t f, + ulong m, + const fmpz_mod_ctx_t ctx); /* Division *****************************************************************/ -void _fmpz_mod_poly_divrem_basecase(fmpz * Q, fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_t invB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_divrem_basecase(fmpz_mod_poly_t Q, fmpz_mod_poly_t R, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_divrem_basecase( + fmpz * Q, + fmpz * R, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_t invB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_divrem_basecase( + fmpz_mod_poly_t Q, + fmpz_mod_poly_t R, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); void _fmpz_mod_poly_div_newton_n_preinv (fmpz * Q, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz * Binv, slong lenBinv, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_div_newton_n_preinv(fmpz_mod_poly_t Q, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_poly_t Binv, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_div_newton_n_preinv( + fmpz_mod_poly_t Q, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_poly_t Binv, + const fmpz_mod_ctx_t ctx); void _fmpz_mod_poly_divrem_newton_n_preinv (fmpz * Q, fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz * Binv, slong lenBinv, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_divrem_newton_n_preinv(fmpz_mod_poly_t Q, fmpz_mod_poly_t R, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_poly_t Binv, const fmpz_mod_ctx_t ctx); - -ulong fmpz_mod_poly_remove(fmpz_mod_poly_t f, const fmpz_mod_poly_t p, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_rem_basecase(fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_t invB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_rem_basecase(fmpz_mod_poly_t R, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_divrem(fmpz * Q, fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_t invB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_divrem(fmpz_mod_poly_t Q, fmpz_mod_poly_t R, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_div(fmpz * Q, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_t invB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_div(fmpz_mod_poly_t Q, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_divrem_f(fmpz_t f, fmpz * Q, fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_divrem_f(fmpz_t f, fmpz_mod_poly_t Q, fmpz_mod_poly_t R, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_rem(fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_t invB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_rem(fmpz_mod_poly_t R, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_rem_f(fmpz_t f, fmpz_mod_poly_t R, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_divrem_newton_n_preinv( + fmpz_mod_poly_t Q, + fmpz_mod_poly_t R, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_poly_t Binv, + const fmpz_mod_ctx_t ctx); + +ulong fmpz_mod_poly_remove( + fmpz_mod_poly_t f, + const fmpz_mod_poly_t p, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_rem_basecase( + fmpz * R, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_t invB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_rem_basecase( + fmpz_mod_poly_t R, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_divrem( + fmpz * Q, + fmpz * R, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_t invB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_divrem( + fmpz_mod_poly_t Q, + fmpz_mod_poly_t R, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_div( + fmpz * Q, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_t invB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_div( + fmpz_mod_poly_t Q, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_divrem_f( + fmpz_t f, + fmpz * Q, + fmpz * R, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_divrem_f( + fmpz_t f, + fmpz_mod_poly_t Q, + fmpz_mod_poly_t R, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_rem( + fmpz * R, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_t invB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_rem( + fmpz_mod_poly_t R, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_rem_f( + fmpz_t f, + fmpz_mod_poly_t R, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); /* Divisibility testing ******************************************************/ -int _fmpz_mod_poly_divides_classical(fmpz * Q, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_divides_classical(fmpz_mod_poly_t Q, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -int _fmpz_mod_poly_divides(fmpz * Q, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_divides(fmpz_mod_poly_t Q, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); +int _fmpz_mod_poly_divides_classical( + fmpz * Q, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_divides_classical( + fmpz_mod_poly_t Q, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +int _fmpz_mod_poly_divides( + fmpz * Q, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_divides( + fmpz_mod_poly_t Q, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); /* Power series inversion ***************************************************/ -void _fmpz_mod_poly_inv_series(fmpz * Qinv, const fmpz * Q, slong Qlen, slong n, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_inv_series(fmpz_mod_poly_t Qinv, const fmpz_mod_poly_t Q, slong n, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_inv_series_f(fmpz_t f, fmpz_mod_poly_t Qinv, const fmpz_mod_poly_t Q, slong n, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_div_series(fmpz * Q, const fmpz * A, slong Alen, const fmpz * B, slong Blen, slong n, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_div_series(fmpz_mod_poly_t Q, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, slong n, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_inv_series( + fmpz * Qinv, + const fmpz * Q, + slong Qlen, + slong n, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_inv_series( + fmpz_mod_poly_t Qinv, + const fmpz_mod_poly_t Q, + slong n, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_inv_series_f( + fmpz_t f, + fmpz_mod_poly_t Qinv, + const fmpz_mod_poly_t Q, + slong n, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_div_series( + fmpz * Q, + const fmpz * A, + slong Alen, + const fmpz * B, + slong Blen, + slong n, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_div_series( + fmpz_mod_poly_t Q, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + slong n, + const fmpz_mod_ctx_t ctx); /* Greatest common divisor **************************************************/ -void fmpz_mod_poly_make_monic(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_make_monic_f(fmpz_t f, fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); - -slong _fmpz_mod_poly_gcd(fmpz * G, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_gcd(fmpz_mod_poly_t G, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -slong _fmpz_mod_poly_gcd_euclidean_f(fmpz_t f, fmpz * G, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_gcd_euclidean_f(fmpz_t f, fmpz_mod_poly_t G, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_make_monic( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_make_monic_f( + fmpz_t f, + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + const fmpz_mod_ctx_t ctx); + +slong _fmpz_mod_poly_gcd( + fmpz * G, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_gcd( + fmpz_mod_poly_t G, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +slong _fmpz_mod_poly_gcd_euclidean_f( + fmpz_t f, + fmpz * G, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_gcd_euclidean_f( + fmpz_t f, + fmpz_mod_poly_t G, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); FMPZ_MOD_POLY_INLINE slong _fmpz_mod_poly_gcd_f(fmpz_t f, fmpz * G, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_mod_ctx_t ctx) @@ -373,13 +950,56 @@ void fmpz_mod_poly_gcd_f(fmpz_t f, fmpz_mod_poly_t G, const fmpz_mod_poly_t A, c fmpz_mod_poly_gcd_euclidean_f(f, G, A, B, ctx); } -slong _fmpz_mod_poly_hgcd(fmpz ** M, slong * lenM, fmpz * A, slong * lenA, fmpz * B, slong * lenB, const fmpz * a, slong lena, const fmpz * b, slong lenb, const fmpz_mod_ctx_t ctx); - -slong _fmpz_mod_poly_xgcd_euclidean_f(fmpz_t f, fmpz * G, fmpz * S, fmpz * T, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_t invB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_xgcd_euclidean_f(fmpz_t f, fmpz_mod_poly_t G, fmpz_mod_poly_t S, fmpz_mod_poly_t T, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -slong _fmpz_mod_poly_xgcd(fmpz * G, fmpz * S, fmpz * T, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_t invB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_xgcd(fmpz_mod_poly_t G, fmpz_mod_poly_t S, fmpz_mod_poly_t T, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); +slong _fmpz_mod_poly_hgcd( + fmpz ** M, + slong * lenM, + fmpz * A, + slong * lenA, + fmpz * B, + slong * lenB, + const fmpz * a, + slong lena, + const fmpz * b, + slong lenb, + const fmpz_mod_ctx_t ctx); + +slong _fmpz_mod_poly_xgcd_euclidean_f( + fmpz_t f, + fmpz * G, + fmpz * S, + fmpz * T, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_t invB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_xgcd_euclidean_f( + fmpz_t f, + fmpz_mod_poly_t G, + fmpz_mod_poly_t S, + fmpz_mod_poly_t T, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +slong _fmpz_mod_poly_xgcd( + fmpz * G, + fmpz * S, + fmpz * T, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_t invB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_xgcd( + fmpz_mod_poly_t G, + fmpz_mod_poly_t S, + fmpz_mod_poly_t T, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); FMPZ_MOD_POLY_INLINE slong _fmpz_mod_poly_xgcd_f(fmpz_t f, fmpz * G, fmpz * S, fmpz * T, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_t invB, const fmpz_mod_ctx_t ctx) @@ -392,53 +1012,194 @@ void fmpz_mod_poly_xgcd_f(fmpz_t f, fmpz_mod_poly_t G, fmpz_mod_poly_t S, fmpz_m fmpz_mod_poly_xgcd_euclidean_f(f, G, S, T, A, B, ctx); } -slong _fmpz_mod_poly_gcdinv_euclidean_f(fmpz_t f, fmpz * G, fmpz * S, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_t invA, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_gcdinv_euclidean_f(fmpz_t f, fmpz_mod_poly_t G, fmpz_mod_poly_t S, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -slong _fmpz_mod_poly_gcdinv_euclidean(fmpz * G, fmpz * S, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_t invA, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_gcdinv_euclidean(fmpz_mod_poly_t G, fmpz_mod_poly_t S, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -slong _fmpz_mod_poly_gcdinv(fmpz * G, fmpz * S, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_gcdinv(fmpz_mod_poly_t G, fmpz_mod_poly_t S, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -slong _fmpz_mod_poly_gcdinv_f(fmpz_t f, fmpz * G, fmpz * S, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_gcdinv_f(fmpz_t f, fmpz_mod_poly_t G, fmpz_mod_poly_t S, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); - -int _fmpz_mod_poly_invmod(fmpz * A, const fmpz * B, slong lenB, const fmpz * P, slong lenP, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_invmod(fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_poly_t P, const fmpz_mod_ctx_t ctx); - -int _fmpz_mod_poly_invmod_f(fmpz_t f, fmpz * A, const fmpz * B, slong lenB, const fmpz * P, slong lenP, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_invmod_f(fmpz_t f, fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_poly_t P, const fmpz_mod_ctx_t ctx); +slong _fmpz_mod_poly_gcdinv_euclidean_f( + fmpz_t f, + fmpz * G, + fmpz * S, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_t invA, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_gcdinv_euclidean_f( + fmpz_t f, + fmpz_mod_poly_t G, + fmpz_mod_poly_t S, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +slong _fmpz_mod_poly_gcdinv_euclidean( + fmpz * G, + fmpz * S, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_t invA, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_gcdinv_euclidean( + fmpz_mod_poly_t G, + fmpz_mod_poly_t S, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +slong _fmpz_mod_poly_gcdinv( + fmpz * G, + fmpz * S, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_gcdinv( + fmpz_mod_poly_t G, + fmpz_mod_poly_t S, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +slong _fmpz_mod_poly_gcdinv_f( + fmpz_t f, + fmpz * G, + fmpz * S, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_gcdinv_f( + fmpz_t f, + fmpz_mod_poly_t G, + fmpz_mod_poly_t S, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); + +int _fmpz_mod_poly_invmod( + fmpz * A, + const fmpz * B, + slong lenB, + const fmpz * P, + slong lenP, + const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_invmod( + fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_poly_t P, + const fmpz_mod_ctx_t ctx); + +int _fmpz_mod_poly_invmod_f( + fmpz_t f, + fmpz * A, + const fmpz * B, + slong lenB, + const fmpz * P, + slong lenP, + const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_invmod_f( + fmpz_t f, + fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_poly_t P, + const fmpz_mod_ctx_t ctx); /* Square root ***************************************************************/ -void _fmpz_mod_poly_invsqrt_series(fmpz * g, const fmpz * h, slong hlen, slong n, const fmpz_mod_ctx_t mod); -void fmpz_mod_poly_invsqrt_series(fmpz_mod_poly_t g, const fmpz_mod_poly_t h, slong n, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_sqrt_series(fmpz * g, const fmpz * h, slong hlen, slong n, const fmpz_mod_ctx_t mod); -void fmpz_mod_poly_sqrt_series(fmpz_mod_poly_t g, const fmpz_mod_poly_t h, slong n, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_invsqrt_series( + fmpz * g, + const fmpz * h, + slong hlen, + slong n, + const fmpz_mod_ctx_t mod); +void fmpz_mod_poly_invsqrt_series( + fmpz_mod_poly_t g, + const fmpz_mod_poly_t h, + slong n, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_sqrt_series( + fmpz * g, + const fmpz * h, + slong hlen, + slong n, + const fmpz_mod_ctx_t mod); +void fmpz_mod_poly_sqrt_series( + fmpz_mod_poly_t g, + const fmpz_mod_poly_t h, + slong n, + const fmpz_mod_ctx_t ctx); int _fmpz_mod_poly_sqrt(fmpz * s, const fmpz * p, slong len, const fmpz_mod_ctx_t mod); -int fmpz_mod_poly_sqrt(fmpz_mod_poly_t b, const fmpz_mod_poly_t a, const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_sqrt( + fmpz_mod_poly_t b, + const fmpz_mod_poly_t a, + const fmpz_mod_ctx_t ctx); /* Minpoly *****************************************************************/ -slong _fmpz_mod_poly_minpoly_bm(fmpz * poly, const fmpz * seq, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_minpoly_bm(fmpz_mod_poly_t poly, const fmpz * seq, slong len, const fmpz_mod_ctx_t ctx); - -slong _fmpz_mod_poly_minpoly_hgcd(fmpz * poly, const fmpz* seq, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_minpoly_hgcd(fmpz_mod_poly_t poly, const fmpz* seq, slong len, const fmpz_mod_ctx_t ctx); - -slong _fmpz_mod_poly_minpoly(fmpz* poly, const fmpz* seq, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_minpoly(fmpz_mod_poly_t poly, const fmpz* seq, slong len, const fmpz_mod_ctx_t ctx); +slong _fmpz_mod_poly_minpoly_bm( + fmpz * poly, + const fmpz * seq, + slong len, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_minpoly_bm( + fmpz_mod_poly_t poly, + const fmpz * seq, + slong len, + const fmpz_mod_ctx_t ctx); + +slong _fmpz_mod_poly_minpoly_hgcd( + fmpz * poly, + const fmpz* seq, + slong len, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_minpoly_hgcd( + fmpz_mod_poly_t poly, + const fmpz* seq, + slong len, + const fmpz_mod_ctx_t ctx); + +slong _fmpz_mod_poly_minpoly( + fmpz* poly, + const fmpz* seq, + slong len, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_minpoly( + fmpz_mod_poly_t poly, + const fmpz* seq, + slong len, + const fmpz_mod_ctx_t ctx); /* Resultant ***************************************************************/ -void _fmpz_mod_poly_resultant_euclidean(fmpz_t res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_resultant_euclidean(fmpz_t r, const fmpz_mod_poly_t f, const fmpz_mod_poly_t g, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_resultant_hgcd(fmpz_t res, const fmpz * A, slong lenA, const fmpz *B, slong lenB, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_resultant_hgcd(fmpz_t res, const fmpz_mod_poly_t A, const fmpz_mod_poly_t B, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_resultant_euclidean( + fmpz_t res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_resultant_euclidean( + fmpz_t r, + const fmpz_mod_poly_t f, + const fmpz_mod_poly_t g, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_resultant_hgcd( + fmpz_t res, + const fmpz * A, + slong lenA, + const fmpz *B, + slong lenB, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_resultant_hgcd( + fmpz_t res, + const fmpz_mod_poly_t A, + const fmpz_mod_poly_t B, + const fmpz_mod_ctx_t ctx); FMPZ_MOD_POLY_INLINE void _fmpz_mod_poly_resultant(fmpz_t res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, const fmpz_mod_ctx_t ctx) @@ -459,71 +1220,275 @@ void fmpz_mod_poly_resultant(fmpz_t res, const fmpz_mod_poly_t f, const fmpz_mod /* Discriminant ************************************************************/ -void _fmpz_mod_poly_discriminant(fmpz_t d, const fmpz * poly, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_discriminant(fmpz_t d, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_discriminant( + fmpz_t d, + const fmpz * poly, + slong len, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_discriminant( + fmpz_t d, + const fmpz_mod_poly_t f, + const fmpz_mod_ctx_t ctx); /* Derivative **************************************************************/ -void _fmpz_mod_poly_derivative(fmpz * res, const fmpz * poly, slong len, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_derivative(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_derivative( + fmpz * res, + const fmpz * poly, + slong len, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_derivative( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly, + const fmpz_mod_ctx_t ctx); /* Evaluation **************************************************************/ -void _fmpz_mod_poly_evaluate_fmpz(fmpz_t res, const fmpz * poly, slong len, const fmpz_t a, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_evaluate_fmpz(fmpz_t res, const fmpz_mod_poly_t poly, const fmpz_t a, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_evaluate_fmpz( + fmpz_t res, + const fmpz * poly, + slong len, + const fmpz_t a, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_evaluate_fmpz( + fmpz_t res, + const fmpz_mod_poly_t poly, + const fmpz_t a, + const fmpz_mod_ctx_t ctx); fmpz_poly_struct ** _fmpz_mod_poly_tree_alloc(slong len); void _fmpz_mod_poly_tree_free(fmpz_poly_struct ** tree, slong len); -void _fmpz_mod_poly_tree_build(fmpz_poly_struct ** tree, const fmpz * roots, slong len, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_evaluate_fmpz_vec_iter(fmpz * ys, const fmpz * coeffs, slong len, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_evaluate_fmpz_vec_iter(fmpz * ys, const fmpz_mod_poly_t poly, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_evaluate_fmpz_vec_fast_precomp(fmpz * vs, const fmpz * poly, slong plen, fmpz_poly_struct * const * tree, slong len, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_evaluate_fmpz_vec_fast(fmpz * ys, const fmpz * poly, slong plen, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_evaluate_fmpz_vec_fast(fmpz * ys, const fmpz_mod_poly_t poly, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_evaluate_fmpz_vec(fmpz * ys, const fmpz * coeffs, slong len, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_evaluate_fmpz_vec(fmpz * ys, const fmpz_mod_poly_t poly, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_tree_build( + fmpz_poly_struct ** tree, + const fmpz * roots, + slong len, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_evaluate_fmpz_vec_iter( + fmpz * ys, + const fmpz * coeffs, + slong len, + const fmpz * xs, + slong n, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_evaluate_fmpz_vec_iter( + fmpz * ys, + const fmpz_mod_poly_t poly, + const fmpz * xs, + slong n, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_evaluate_fmpz_vec_fast_precomp( + fmpz * vs, + const fmpz * poly, + slong plen, + fmpz_poly_struct * const * tree, + slong len, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_evaluate_fmpz_vec_fast( + fmpz * ys, + const fmpz * poly, + slong plen, + const fmpz * xs, + slong n, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_evaluate_fmpz_vec_fast( + fmpz * ys, + const fmpz_mod_poly_t poly, + const fmpz * xs, + slong n, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_evaluate_fmpz_vec( + fmpz * ys, + const fmpz * coeffs, + slong len, + const fmpz * xs, + slong n, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_evaluate_fmpz_vec( + fmpz * ys, + const fmpz_mod_poly_t poly, + const fmpz * xs, + slong n, + const fmpz_mod_ctx_t ctx); /* Composition *************************************************************/ -void _fmpz_mod_poly_compose(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_compose(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_compose( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_compose( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_ctx_t ctx); /* Modular composition ******************************************************/ -void _fmpz_mod_poly_compose_mod(fmpz * res, const fmpz * f, slong lenf, const fmpz * g, const fmpz * h, slong lenh, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_compose_mod(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_poly_t poly3, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_compose_mod_brent_kung(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, const fmpz * poly3, slong len3, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_compose_mod_brent_kung(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_poly_t poly3, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_compose_mod( + fmpz * res, + const fmpz * f, + slong lenf, + const fmpz * g, + const fmpz * h, + slong lenh, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_compose_mod( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_poly_t poly3, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_compose_mod_brent_kung( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + const fmpz * poly3, + slong len3, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_compose_mod_brent_kung( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_poly_t poly3, + const fmpz_mod_ctx_t ctx); void _fmpz_mod_poly_reduce_matrix_mod_poly (fmpz_mat_t A, const fmpz_mat_t B, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); void _fmpz_mod_poly_precompute_matrix_worker(void * arg_ptr); -void _fmpz_mod_poly_precompute_matrix(fmpz_mat_t A, const fmpz * poly1, const fmpz * poly2, slong len2, const fmpz * poly2inv, slong len2inv, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_precompute_matrix(fmpz_mat_t A, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_poly_t poly2inv, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_precompute_matrix( + fmpz_mat_t A, + const fmpz * poly1, + const fmpz * poly2, + slong len2, + const fmpz * poly2inv, + slong len2inv, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_precompute_matrix( + fmpz_mat_t A, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_poly_t poly2inv, + const fmpz_mod_ctx_t ctx); void _fmpz_mod_poly_compose_mod_brent_kung_precomp_preinv_worker(void * arg_ptr); -void _fmpz_mod_poly_compose_mod_brent_kung_precomp_preinv(fmpz * res, const fmpz * poly1, slong len1, const fmpz_mat_t A, const fmpz * poly3, slong len3, const fmpz * poly3inv, slong len3inv, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_compose_mod_brent_kung_precomp_preinv(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mat_t A, const fmpz_mod_poly_t poly3, const fmpz_mod_poly_t poly3inv, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_compose_mod_brent_kung_preinv(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, const fmpz * poly3, slong len3, const fmpz * poly3inv, slong len3inv, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_compose_mod_brent_kung_preinv(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_poly_t poly3, const fmpz_mod_poly_t poly3inv, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_compose_mod_horner(fmpz * res, const fmpz * f, slong lenf, const fmpz * g, const fmpz * h, slong lenh, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_compose_mod_horner(fmpz_mod_poly_t res, const fmpz_mod_poly_t poly1, const fmpz_mod_poly_t poly2, const fmpz_mod_poly_t poly3, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_compose_mod_brent_kung_vec_preinv(fmpz_mod_poly_struct * res, const fmpz_mod_poly_struct * polys, slong len1, slong l, const fmpz * g, slong glen, const fmpz * poly, slong len, const fmpz * polyinv, slong leninv, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_compose_mod_brent_kung_vec_preinv(fmpz_mod_poly_struct * res, const fmpz_mod_poly_struct * polys, slong len1, slong n, const fmpz_mod_poly_t g, const fmpz_mod_poly_t poly, const fmpz_mod_poly_t polyinv, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool(fmpz_mod_poly_struct * res, const fmpz_mod_poly_struct * polys, slong lenpolys, slong l, const fmpz * g, slong glen, const fmpz * poly, slong len, const fmpz * polyinv, slong leninv, const fmpz_mod_ctx_t ctx, thread_pool_handle * threads, slong num_threads); -void fmpz_mod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool(fmpz_mod_poly_struct * res, const fmpz_mod_poly_struct * polys, slong len1, slong n, const fmpz_mod_poly_t g, const fmpz_mod_poly_t poly, const fmpz_mod_poly_t polyinv, const fmpz_mod_ctx_t ctx, thread_pool_handle * threads, slong num_threads); -void fmpz_mod_poly_compose_mod_brent_kung_vec_preinv_threaded(fmpz_mod_poly_struct * res, const fmpz_mod_poly_struct * polys, slong len1, slong n, const fmpz_mod_poly_t g, const fmpz_mod_poly_t poly, const fmpz_mod_poly_t polyinv, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_compose_mod_brent_kung_precomp_preinv( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz_mat_t A, + const fmpz * poly3, + slong len3, + const fmpz * poly3inv, + slong len3inv, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_compose_mod_brent_kung_precomp_preinv( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mat_t A, + const fmpz_mod_poly_t poly3, + const fmpz_mod_poly_t poly3inv, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_compose_mod_brent_kung_preinv( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + const fmpz * poly3, + slong len3, + const fmpz * poly3inv, + slong len3inv, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_compose_mod_brent_kung_preinv( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_poly_t poly3, + const fmpz_mod_poly_t poly3inv, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_compose_mod_horner( + fmpz * res, + const fmpz * f, + slong lenf, + const fmpz * g, + const fmpz * h, + slong lenh, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_compose_mod_horner( + fmpz_mod_poly_t res, + const fmpz_mod_poly_t poly1, + const fmpz_mod_poly_t poly2, + const fmpz_mod_poly_t poly3, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_compose_mod_brent_kung_vec_preinv( + fmpz_mod_poly_struct * res, + const fmpz_mod_poly_struct * polys, + slong len1, + slong l, + const fmpz * g, + slong glen, + const fmpz * poly, + slong len, + const fmpz * polyinv, + slong leninv, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_compose_mod_brent_kung_vec_preinv( + fmpz_mod_poly_struct * res, + const fmpz_mod_poly_struct * polys, + slong len1, + slong n, + const fmpz_mod_poly_t g, + const fmpz_mod_poly_t poly, + const fmpz_mod_poly_t polyinv, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool( + fmpz_mod_poly_struct * res, + const fmpz_mod_poly_struct * polys, + slong lenpolys, + slong l, + const fmpz * g, + slong glen, + const fmpz * poly, + slong len, + const fmpz * polyinv, + slong leninv, + const fmpz_mod_ctx_t ctx, + thread_pool_handle * threads, + slong num_threads); +void fmpz_mod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool( + fmpz_mod_poly_struct * res, + const fmpz_mod_poly_struct * polys, + slong len1, + slong n, + const fmpz_mod_poly_t g, + const fmpz_mod_poly_t poly, + const fmpz_mod_poly_t polyinv, + const fmpz_mod_ctx_t ctx, + thread_pool_handle * threads, + slong num_threads); +void fmpz_mod_poly_compose_mod_brent_kung_vec_preinv_threaded( + fmpz_mod_poly_struct * res, + const fmpz_mod_poly_struct * polys, + slong len1, + slong n, + const fmpz_mod_poly_t g, + const fmpz_mod_poly_t poly, + const fmpz_mod_poly_t polyinv, + const fmpz_mod_ctx_t ctx); /* Norms *********************************************************************/ @@ -544,43 +1509,102 @@ typedef struct typedef fmpz_mod_poly_radix_struct fmpz_mod_poly_radix_t[1]; -void _fmpz_mod_poly_radix_init(fmpz ** Rpow, fmpz ** Rinv, const fmpz * R, slong lenR, slong k, const fmpz_t invL, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_radix_init(fmpz_mod_poly_radix_t D, const fmpz_mod_poly_t R, slong degF, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_radix_init( + fmpz ** Rpow, + fmpz ** Rinv, + const fmpz * R, + slong lenR, + slong k, + const fmpz_t invL, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_radix_init( + fmpz_mod_poly_radix_t D, + const fmpz_mod_poly_t R, + slong degF, + const fmpz_mod_ctx_t ctx); void fmpz_mod_poly_radix_clear(fmpz_mod_poly_radix_t D); -void _fmpz_mod_poly_radix(fmpz ** B, const fmpz * F, fmpz ** Rpow, fmpz ** Rinv, slong degR, slong k, slong i, fmpz * W, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_radix(fmpz_mod_poly_struct ** B, const fmpz_mod_poly_t F, const fmpz_mod_poly_radix_t D, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_radix( + fmpz ** B, + const fmpz * F, + fmpz ** Rpow, + fmpz ** Rinv, + slong degR, + slong k, + slong i, + fmpz * W, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_radix( + fmpz_mod_poly_struct ** B, + const fmpz_mod_poly_t F, + const fmpz_mod_poly_radix_t D, + const fmpz_mod_ctx_t ctx); /* Input and output *********************************************************/ char * fmpz_mod_poly_get_str(const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); -char * fmpz_mod_poly_get_str_pretty(const fmpz_mod_poly_t poly, const char * x, const fmpz_mod_ctx_t ctx); +char * fmpz_mod_poly_get_str_pretty( + const fmpz_mod_poly_t poly, + const char * x, + const fmpz_mod_ctx_t ctx); #ifdef FLINT_HAVE_FILE int _fmpz_mod_poly_fprint(FILE * file, const fmpz *poly, slong len, const fmpz_t p); -int fmpz_mod_poly_fprint(FILE * file, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_fprint_pretty(FILE * file, const fmpz_mod_poly_t poly, const char * x, const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_fprint( + FILE * file, + const fmpz_mod_poly_t poly, + const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_fprint_pretty( + FILE * file, + const fmpz_mod_poly_t poly, + const char * x, + const fmpz_mod_ctx_t ctx); int fmpz_mod_poly_fread(FILE * file, fmpz_mod_poly_t poly, fmpz_mod_ctx_t ctx); #endif int _fmpz_mod_poly_print(const fmpz *poly, slong len, const fmpz_t p); int fmpz_mod_poly_print(const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_print_pretty(const fmpz_mod_poly_t poly, const char * x, const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_print_pretty( + const fmpz_mod_poly_t poly, + const char * x, + const fmpz_mod_ctx_t ctx); /* Products *****************************************************************/ -void _fmpz_mod_poly_product_roots_fmpz_vec(fmpz * poly, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_product_roots_fmpz_vec(fmpz_mod_poly_t poly, const fmpz * xs, slong n, const fmpz_mod_ctx_t ctx); - -int fmpz_mod_poly_find_distinct_nonzero_roots(fmpz * roots, const fmpz_mod_poly_t P, const fmpz_mod_ctx_t ctx); - -void _fmpz_mod_poly_split_rabin(fmpz_mod_poly_t a, fmpz_mod_poly_t b, const fmpz_mod_poly_t f, const fmpz_t halfp, fmpz_mod_poly_t t, fmpz_mod_poly_t t2, flint_rand_t randstate, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_poly_product_roots_fmpz_vec( + fmpz * poly, + const fmpz * xs, + slong n, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_product_roots_fmpz_vec( + fmpz_mod_poly_t poly, + const fmpz * xs, + slong n, + const fmpz_mod_ctx_t ctx); + +int fmpz_mod_poly_find_distinct_nonzero_roots( + fmpz * roots, + const fmpz_mod_poly_t P, + const fmpz_mod_ctx_t ctx); + +void _fmpz_mod_poly_split_rabin( + fmpz_mod_poly_t a, + fmpz_mod_poly_t b, + const fmpz_mod_poly_t f, + const fmpz_t halfp, + fmpz_mod_poly_t t, + fmpz_mod_poly_t t2, + flint_rand_t randstate, + const fmpz_mod_ctx_t ctx); /* Characteristic polynomial and minimal polynomial */ -void fmpz_mod_mat_charpoly_berkowitz(fmpz_mod_poly_t p, const fmpz_mod_mat_t M, const fmpz_mod_ctx_t ctx); +void fmpz_mod_mat_charpoly_berkowitz( + fmpz_mod_poly_t p, + const fmpz_mod_mat_t M, + const fmpz_mod_ctx_t ctx); FMPZ_MOD_POLY_INLINE void fmpz_mod_mat_charpoly(fmpz_mod_poly_t p, const fmpz_mod_mat_t M, const fmpz_mod_ctx_t ctx) @@ -588,7 +1612,10 @@ void fmpz_mod_mat_charpoly(fmpz_mod_poly_t p, const fmpz_mod_mat_t M, const fmpz fmpz_mod_mat_charpoly_berkowitz(p, M, ctx); } -void fmpz_mod_mat_minpoly(fmpz_mod_poly_t p, const fmpz_mod_mat_t M, const fmpz_mod_ctx_t ctx); +void fmpz_mod_mat_minpoly( + fmpz_mod_poly_t p, + const fmpz_mod_mat_t M, + const fmpz_mod_ctx_t ctx); /* Berlekamp-Massey Algorithm - see fmpz_mod_poly/berlekamp_massey.c for more info ********/ @@ -610,11 +1637,24 @@ void fmpz_mod_berlekamp_massey_start_over(fmpz_mod_berlekamp_massey_t B, const f void fmpz_mod_berlekamp_massey_print(const fmpz_mod_berlekamp_massey_t B, const fmpz_mod_ctx_t ctx); -void fmpz_mod_berlekamp_massey_add_points(fmpz_mod_berlekamp_massey_t B, const fmpz * a, slong count, const fmpz_mod_ctx_t ctx); -void fmpz_mod_berlekamp_massey_add_point(fmpz_mod_berlekamp_massey_t B, const fmpz_t a, const fmpz_mod_ctx_t ctx); -void fmpz_mod_berlekamp_massey_add_point_ui(fmpz_mod_berlekamp_massey_t B, ulong a, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_berlekamp_massey_add_zeros(fmpz_mod_berlekamp_massey_t B, slong count, const fmpz_mod_ctx_t ctx); +void fmpz_mod_berlekamp_massey_add_points( + fmpz_mod_berlekamp_massey_t B, + const fmpz * a, + slong count, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_berlekamp_massey_add_point( + fmpz_mod_berlekamp_massey_t B, + const fmpz_t a, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_berlekamp_massey_add_point_ui( + fmpz_mod_berlekamp_massey_t B, + ulong a, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_berlekamp_massey_add_zeros( + fmpz_mod_berlekamp_massey_t B, + slong count, + const fmpz_mod_ctx_t ctx); int fmpz_mod_berlekamp_massey_reduce(fmpz_mod_berlekamp_massey_t B, const fmpz_mod_ctx_t ctx); diff --git a/src/fmpz_mod_poly_factor.h b/src/fmpz_mod_poly_factor.h index 8c7c7d60a0..5424ba3829 100644 --- a/src/fmpz_mod_poly_factor.h +++ b/src/fmpz_mod_poly_factor.h @@ -29,7 +29,10 @@ extern "C" { /* Factoring ****************************************************************/ void fmpz_mod_poly_factor_init(fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_realloc(fmpz_mod_poly_factor_t fac, slong alloc, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_realloc( + fmpz_mod_poly_factor_t fac, + slong alloc, + const fmpz_mod_ctx_t ctx); void fmpz_mod_poly_factor_clear(fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx); typedef struct @@ -45,9 +48,15 @@ typedef struct } fmpz_mod_poly_interval_poly_arg_t; -void fmpz_mod_poly_factor_fit_length(fmpz_mod_poly_factor_t fac, slong len, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_fit_length( + fmpz_mod_poly_factor_t fac, + slong len, + const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_set(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_set( + fmpz_mod_poly_factor_t res, + const fmpz_mod_poly_factor_t fac, + const fmpz_mod_ctx_t ctx); FMPZ_MOD_POLY_FACTOR_INLINE void fmpz_mod_poly_factor_swap(fmpz_mod_poly_factor_t a, fmpz_mod_poly_factor_t b, const fmpz_mod_ctx_t ctx) @@ -57,58 +66,151 @@ void fmpz_mod_poly_factor_swap(fmpz_mod_poly_factor_t a, fmpz_mod_poly_factor_t *b = t; } -void fmpz_mod_poly_factor_get_poly(fmpz_mod_poly_t a, const fmpz_mod_poly_factor_t b, slong i, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_get_poly( + fmpz_mod_poly_t a, + const fmpz_mod_poly_factor_t b, + slong i, + const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_insert(fmpz_mod_poly_factor_t fac, const fmpz_mod_poly_t poly, slong exp, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_insert( + fmpz_mod_poly_factor_t fac, + const fmpz_mod_poly_t poly, + slong exp, + const fmpz_mod_ctx_t ctx); void fmpz_mod_poly_factor_print(const fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_print_pretty(const fmpz_mod_poly_factor_t fac, const char * var, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_print_pretty( + const fmpz_mod_poly_factor_t fac, + const char * var, + const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_concat(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_factor_t fac, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_concat( + fmpz_mod_poly_factor_t res, + const fmpz_mod_poly_factor_t fac, + const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_pow(fmpz_mod_poly_factor_t fac, slong exp, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_pow( + fmpz_mod_poly_factor_t fac, + slong exp, + const fmpz_mod_ctx_t ctx); int fmpz_mod_poly_is_irreducible_ddf(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); int fmpz_mod_poly_is_irreducible_rabin(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_is_irreducible_rabin_f(fmpz_t fac, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_is_irreducible_rabin_f( + fmpz_t fac, + const fmpz_mod_poly_t f, + const fmpz_mod_ctx_t ctx); int fmpz_mod_poly_is_irreducible(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); -int _fmpz_mod_poly_is_squarefree_f(fmpz_t fac, const fmpz * f, slong len, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_is_squarefree_f(fmpz_t fac, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); +int _fmpz_mod_poly_is_squarefree_f( + fmpz_t fac, + const fmpz * f, + slong len, + const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_is_squarefree_f( + fmpz_t fac, + const fmpz_mod_poly_t f, + const fmpz_mod_ctx_t ctx); int _fmpz_mod_poly_is_squarefree(const fmpz * f, slong len, const fmpz_mod_ctx_t ctx); int fmpz_mod_poly_is_squarefree(const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); -int fmpz_mod_poly_factor_equal_deg_prob(fmpz_mod_poly_t factor, flint_rand_t state, const fmpz_mod_poly_t pol, slong d, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_factor_equal_deg_with_frob(fmpz_mod_poly_factor_t factors, const fmpz_mod_poly_t f, slong d, const fmpz_mod_poly_t frob, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_equal_deg(fmpz_mod_poly_factor_t factors, const fmpz_mod_poly_t pol, slong d, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_factor_distinct_deg_with_frob(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t poly, const fmpz_mod_poly_t polyinv, const fmpz_mod_poly_t frob, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_distinct_deg(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t poly, slong * const * degs, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_factor_distinct_deg_threaded_with_frob(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t poly, const fmpz_mod_poly_t polyinv, const fmpz_mod_poly_t frob, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_distinct_deg_threaded(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t poly, slong * const * degs, const fmpz_mod_ctx_t ctx); - -void fmpz_mod_poly_factor_berlekamp(fmpz_mod_poly_factor_t factors, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_cantor_zassenhaus(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_kaltofen_shoup(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t poly, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor_squarefree(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); -void fmpz_mod_poly_factor(fmpz_mod_poly_factor_t res, const fmpz_mod_poly_t f, const fmpz_mod_ctx_t ctx); +int fmpz_mod_poly_factor_equal_deg_prob( + fmpz_mod_poly_t factor, + flint_rand_t state, + const fmpz_mod_poly_t pol, + slong d, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_factor_equal_deg_with_frob( + fmpz_mod_poly_factor_t factors, + const fmpz_mod_poly_t f, + slong d, + const fmpz_mod_poly_t frob, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_equal_deg( + fmpz_mod_poly_factor_t factors, + const fmpz_mod_poly_t pol, + slong d, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_factor_distinct_deg_with_frob( + fmpz_mod_poly_factor_t res, + const fmpz_mod_poly_t poly, + const fmpz_mod_poly_t polyinv, + const fmpz_mod_poly_t frob, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_distinct_deg( + fmpz_mod_poly_factor_t res, + const fmpz_mod_poly_t poly, + slong * const * degs, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_factor_distinct_deg_threaded_with_frob( + fmpz_mod_poly_factor_t res, + const fmpz_mod_poly_t poly, + const fmpz_mod_poly_t polyinv, + const fmpz_mod_poly_t frob, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_distinct_deg_threaded( + fmpz_mod_poly_factor_t res, + const fmpz_mod_poly_t poly, + slong * const * degs, + const fmpz_mod_ctx_t ctx); + +void fmpz_mod_poly_factor_berlekamp( + fmpz_mod_poly_factor_t factors, + const fmpz_mod_poly_t f, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_cantor_zassenhaus( + fmpz_mod_poly_factor_t res, + const fmpz_mod_poly_t f, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_kaltofen_shoup( + fmpz_mod_poly_factor_t res, + const fmpz_mod_poly_t poly, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_squarefree( + fmpz_mod_poly_factor_t res, + const fmpz_mod_poly_t f, + const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor( + fmpz_mod_poly_factor_t res, + const fmpz_mod_poly_t f, + const fmpz_mod_ctx_t ctx); void _fmpz_mod_poly_interval_poly_worker(void * arg_ptr); /* Roots *********************************************************************/ -void fmpz_mod_poly_roots(fmpz_mod_poly_factor_t r, const fmpz_mod_poly_t f, int with_multiplicity, const fmpz_mod_ctx_t ctx); - -int fmpz_mod_poly_roots_factored(fmpz_mod_poly_factor_t r, const fmpz_mod_poly_t f, int with_multiplicity, const fmpz_factor_t n, const fmpz_mod_ctx_t ctx); - -int fmpz_mod_poly_roots_factored_with_length_limit(fmpz_mod_poly_factor_t x0, const fmpz_mod_poly_t f, int with_mult, slong length_limit, const fmpz_factor_t fac, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_roots( + fmpz_mod_poly_factor_t r, + const fmpz_mod_poly_t f, + int with_multiplicity, + const fmpz_mod_ctx_t ctx); + +int fmpz_mod_poly_roots_factored( + fmpz_mod_poly_factor_t r, + const fmpz_mod_poly_t f, + int with_multiplicity, + const fmpz_factor_t n, + const fmpz_mod_ctx_t ctx); + +int fmpz_mod_poly_roots_factored_with_length_limit( + fmpz_mod_poly_factor_t x0, + const fmpz_mod_poly_t f, + int with_mult, + slong length_limit, + const fmpz_factor_t fac, + const fmpz_mod_ctx_t ctx); /* Inlines *******************************************************************/ -void fmpz_mod_poly_factor_get_fmpz_mod_poly(fmpz_mod_poly_t z, fmpz_mod_poly_factor_t fac, slong i, const fmpz_mod_ctx_t ctx); +void fmpz_mod_poly_factor_get_fmpz_mod_poly( + fmpz_mod_poly_t z, + fmpz_mod_poly_factor_t fac, + slong i, + const fmpz_mod_ctx_t ctx); #ifdef __cplusplus } diff --git a/src/fmpz_mod_vec.h b/src/fmpz_mod_vec.h index 9384662908..85a85669b1 100644 --- a/src/fmpz_mod_vec.h +++ b/src/fmpz_mod_vec.h @@ -25,20 +25,64 @@ extern "C" { #endif -void _fmpz_mod_vec_set_fmpz_vec(fmpz * A, const fmpz * B, slong len, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_vec_set_fmpz_vec( + fmpz * A, + const fmpz * B, + slong len, + const fmpz_mod_ctx_t ctx); -void _fmpz_mod_vec_add(fmpz * a, const fmpz * b, const fmpz * c, slong n, const fmpz_mod_ctx_t ctx); -void _fmpz_mod_vec_sub(fmpz * a, const fmpz * b, const fmpz * c, slong n, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_vec_add( + fmpz * a, + const fmpz * b, + const fmpz * c, + slong n, + const fmpz_mod_ctx_t ctx); +void _fmpz_mod_vec_sub( + fmpz * a, + const fmpz * b, + const fmpz * c, + slong n, + const fmpz_mod_ctx_t ctx); void _fmpz_mod_vec_neg(fmpz * A, const fmpz * B, slong len, const fmpz_mod_ctx_t ctx); -void _fmpz_mod_vec_mul(fmpz * A, const fmpz * B, const fmpz * C, slong len, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_vec_mul( + fmpz * A, + const fmpz * B, + const fmpz * C, + slong len, + const fmpz_mod_ctx_t ctx); -void _fmpz_mod_vec_scalar_mul_fmpz_mod(fmpz * A, const fmpz * B, slong len, const fmpz_t c, const fmpz_mod_ctx_t ctx); -void _fmpz_mod_vec_scalar_addmul_fmpz_mod(fmpz * A, const fmpz * B, slong len, const fmpz_t c, const fmpz_mod_ctx_t ctx); -void _fmpz_mod_vec_scalar_div_fmpz_mod(fmpz * A, const fmpz * B, slong len, const fmpz_t c, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_vec_scalar_mul_fmpz_mod( + fmpz * A, + const fmpz * B, + slong len, + const fmpz_t c, + const fmpz_mod_ctx_t ctx); +void _fmpz_mod_vec_scalar_addmul_fmpz_mod( + fmpz * A, + const fmpz * B, + slong len, + const fmpz_t c, + const fmpz_mod_ctx_t ctx); +void _fmpz_mod_vec_scalar_div_fmpz_mod( + fmpz * A, + const fmpz * B, + slong len, + const fmpz_t c, + const fmpz_mod_ctx_t ctx); -void _fmpz_mod_vec_dot(fmpz_t d, const fmpz * A, const fmpz * B, slong len, const fmpz_mod_ctx_t ctx); -void _fmpz_mod_vec_dot_rev(fmpz_t r, const fmpz * a, const fmpz * b, slong len, const fmpz_mod_ctx_t ctx); +void _fmpz_mod_vec_dot( + fmpz_t d, + const fmpz * A, + const fmpz * B, + slong len, + const fmpz_mod_ctx_t ctx); +void _fmpz_mod_vec_dot_rev( + fmpz_t r, + const fmpz * a, + const fmpz * b, + slong len, + const fmpz_mod_ctx_t ctx); #ifdef __cplusplus } diff --git a/src/fmpz_mpoly.h b/src/fmpz_mpoly.h index df23d1fb4c..4e4019aea9 100644 --- a/src/fmpz_mpoly.h +++ b/src/fmpz_mpoly.h @@ -27,8 +27,16 @@ extern "C" { #endif -FMPZ_MPOLY_INLINE fmpz * fmpz_mpoly_term_coeff_ref(fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx) { FLINT_ASSERT(i < A->length); return A->coeffs + i; } -FMPZ_MPOLY_INLINE fmpz * fmpz_mpoly_leadcoeff(const fmpz_mpoly_t A) { FLINT_ASSERT(A->length > 0); return A->coeffs + 0; } +FMPZ_MPOLY_INLINE +fmpz * fmpz_mpoly_term_coeff_ref(fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < A->length); return A->coeffs + i; +} +FMPZ_MPOLY_INLINE +fmpz * fmpz_mpoly_leadcoeff(const fmpz_mpoly_t A) +{ + FLINT_ASSERT(A->length > 0); return A->coeffs + 0; +} /* Internal type definitions *************************************************/ @@ -68,24 +76,53 @@ typedef fmpz_mpolyd_struct fmpz_mpolyd_t[1]; /* Context object ************************************************************/ void fmpz_mpoly_ctx_init(fmpz_mpoly_ctx_t ctx, slong nvars, const ordering_t ord); -void fmpz_mpoly_ctx_init_rand(fmpz_mpoly_ctx_t mctx, flint_rand_t state, slong max_nvars); +void fmpz_mpoly_ctx_init_rand( + fmpz_mpoly_ctx_t mctx, + flint_rand_t state, + slong max_nvars); void fmpz_mpoly_ctx_clear(fmpz_mpoly_ctx_t ctx); -FMPZ_MPOLY_INLINE slong fmpz_mpoly_ctx_nvars(const fmpz_mpoly_ctx_t ctx) { return ctx->minfo->nvars; } -FMPZ_MPOLY_INLINE ordering_t fmpz_mpoly_ctx_ord(const fmpz_mpoly_ctx_t ctx) { return ctx->minfo->ord; } +FMPZ_MPOLY_INLINE +slong fmpz_mpoly_ctx_nvars(const fmpz_mpoly_ctx_t ctx) +{ + return ctx->minfo->nvars; +} +FMPZ_MPOLY_INLINE +ordering_t fmpz_mpoly_ctx_ord(const fmpz_mpoly_ctx_t ctx) +{ + return ctx->minfo->ord; +} /* Memory management ********************************************************/ void fmpz_mpoly_init(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_init2(fmpz_mpoly_t A, slong alloc, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_init3(fmpz_mpoly_t A, slong alloc, flint_bitcnt_t bits, const fmpz_mpoly_ctx_t ctx); -void _fmpz_mpoly_realloc(fmpz ** Acoeff, ulong ** Aexp, slong * Aalloc, slong len, slong N); +void fmpz_mpoly_init3( + fmpz_mpoly_t A, + slong alloc, + flint_bitcnt_t bits, + const fmpz_mpoly_ctx_t ctx); +void _fmpz_mpoly_realloc( + fmpz ** Acoeff, + ulong ** Aexp, + slong * Aalloc, + slong len, + slong N); void fmpz_mpoly_realloc(fmpz_mpoly_t A, slong alloc, const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_clear(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); -void _fmpz_mpoly_fit_length(fmpz ** Acoeff, ulong ** Aexp, slong * Aalloc, slong len, slong N); +void _fmpz_mpoly_fit_length( + fmpz ** Acoeff, + ulong ** Aexp, + slong * Aalloc, + slong len, + slong N); void fmpz_mpoly_fit_length(fmpz_mpoly_t A, slong len, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_fit_length_reset_bits(fmpz_mpoly_t A, slong len, flint_bitcnt_t bits, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_fit_length_reset_bits( + fmpz_mpoly_t A, + slong len, + flint_bitcnt_t bits, + const fmpz_mpoly_ctx_t ctx); FMPZ_MPOLY_INLINE void _fmpz_mpoly_set_length(fmpz_mpoly_t A, slong newlen, const fmpz_mpoly_ctx_t ctx) @@ -111,22 +148,58 @@ void fmpz_mpoly_truncate(fmpz_mpoly_t A, slong newlen, const fmpz_mpoly_ctx_t ct } } -void fmpz_mpoly_fit_bits(fmpz_mpoly_t A, flint_bitcnt_t bits, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_fit_bits( + fmpz_mpoly_t A, + flint_bitcnt_t bits, + const fmpz_mpoly_ctx_t ctx); /* Input/output **************************************************************/ -int fmpz_mpoly_set_str_pretty(fmpz_mpoly_t A, const char * str, const char ** x, const fmpz_mpoly_ctx_t ctx); - -char * _fmpz_mpoly_get_str_pretty(const fmpz * poly, const ulong * exps, slong len, const char ** x, slong bits, const mpoly_ctx_t mctx); -char * fmpz_mpoly_get_str_pretty(const fmpz_mpoly_t A, const char ** x, const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_set_str_pretty( + fmpz_mpoly_t A, + const char * str, + const char ** x, + const fmpz_mpoly_ctx_t ctx); + +char * _fmpz_mpoly_get_str_pretty( + const fmpz * poly, + const ulong * exps, + slong len, + const char ** x, + slong bits, + const mpoly_ctx_t mctx); +char * fmpz_mpoly_get_str_pretty( + const fmpz_mpoly_t A, + const char ** x, + const fmpz_mpoly_ctx_t ctx); #ifdef FLINT_HAVE_FILE -int _fmpz_mpoly_fprint_pretty(FILE * file, const fmpz * poly, const ulong * exps, slong len, const char ** x_in, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -int fmpz_mpoly_fprint_pretty(FILE * file, const fmpz_mpoly_t A, const char ** x, const fmpz_mpoly_ctx_t ctx); +int _fmpz_mpoly_fprint_pretty( + FILE * file, + const fmpz * poly, + const ulong * exps, + slong len, + const char ** x_in, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +int fmpz_mpoly_fprint_pretty( + FILE * file, + const fmpz_mpoly_t A, + const char ** x, + const fmpz_mpoly_ctx_t ctx); #endif -int _fmpz_mpoly_print_pretty(const fmpz * poly, const ulong * exps, slong len, const char ** x, slong bits, const mpoly_ctx_t mctx); -int fmpz_mpoly_print_pretty(const fmpz_mpoly_t A, const char ** x, const fmpz_mpoly_ctx_t ctx); +int _fmpz_mpoly_print_pretty( + const fmpz * poly, + const ulong * exps, + slong len, + const char ** x, + slong bits, + const mpoly_ctx_t mctx); +int fmpz_mpoly_print_pretty( + const fmpz_mpoly_t A, + const char ** x, + const fmpz_mpoly_ctx_t ctx); /* Basic manipulation *******************************************************/ @@ -134,13 +207,32 @@ void fmpz_mpoly_gen(fmpz_mpoly_t poly, slong i, const fmpz_mpoly_ctx_t ctx); int fmpz_mpoly_is_gen(const fmpz_mpoly_t poly, slong k, const fmpz_mpoly_ctx_t ctx); -void _fmpz_mpoly_set(fmpz * poly1, ulong * exps1, const fmpz * poly2, const ulong * exps2, slong n, slong N); +void _fmpz_mpoly_set( + fmpz * poly1, + ulong * exps1, + const fmpz * poly2, + const ulong * exps2, + slong n, + slong N); void fmpz_mpoly_set(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); -int _fmpz_mpoly_equal(fmpz * poly1, ulong * exps1, const fmpz * poly2, const ulong * exps2, slong n, slong N); -int fmpz_mpoly_equal(const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); +int _fmpz_mpoly_equal( + fmpz * poly1, + ulong * exps1, + const fmpz * poly2, + const ulong * exps2, + slong n, + slong N); +int fmpz_mpoly_equal( + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); -FMPZ_MPOLY_INLINE void fmpz_mpoly_swap(fmpz_mpoly_t A, fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx) { FLINT_SWAP(fmpz_mpoly_struct, *A, *B); } +FMPZ_MPOLY_INLINE +void fmpz_mpoly_swap(fmpz_mpoly_t A, fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_SWAP(fmpz_mpoly_struct, *A, *B); +} FMPZ_MPOLY_INLINE int _fmpz_mpoly_fits_small(const fmpz * poly, slong len) @@ -154,7 +246,11 @@ int _fmpz_mpoly_fits_small(const fmpz * poly, slong len) return 1; } -FMPZ_MPOLY_INLINE slong fmpz_mpoly_max_bits(const fmpz_mpoly_t A) { return _fmpz_vec_max_bits(A->coeffs, A->length); } +FMPZ_MPOLY_INLINE +slong fmpz_mpoly_max_bits(const fmpz_mpoly_t A) +{ + return _fmpz_vec_max_bits(A->coeffs, A->length); +} /* Constants *****************************************************************/ @@ -166,30 +262,81 @@ void fmpz_mpoly_set_si(fmpz_mpoly_t A, slong c, const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_set_ui(fmpz_mpoly_t A, ulong c, const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_set_fmpz(fmpz_mpoly_t A, const fmpz_t c, const fmpz_mpoly_ctx_t ctx); -FMPZ_MPOLY_INLINE void fmpz_mpoly_zero(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { _fmpz_mpoly_set_length(A, 0, ctx); } -FMPZ_MPOLY_INLINE void fmpz_mpoly_one(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { fmpz_mpoly_set_ui(A, UWORD(1), ctx); } +FMPZ_MPOLY_INLINE +void fmpz_mpoly_zero(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + _fmpz_mpoly_set_length(A, 0, ctx); +} +FMPZ_MPOLY_INLINE +void fmpz_mpoly_one(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + fmpz_mpoly_set_ui(A, UWORD(1), ctx); +} int fmpz_mpoly_equal_si(const fmpz_mpoly_t A, slong c, const fmpz_mpoly_ctx_t ctx); int fmpz_mpoly_equal_ui(const fmpz_mpoly_t A, ulong c, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_equal_fmpz(const fmpz_mpoly_t A, const fmpz_t c, const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_equal_fmpz( + const fmpz_mpoly_t A, + const fmpz_t c, + const fmpz_mpoly_ctx_t ctx); -FMPZ_MPOLY_INLINE int fmpz_mpoly_is_zero(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { return A->length == 0; } -FMPZ_MPOLY_INLINE int fmpz_mpoly_is_one(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { return fmpz_mpoly_equal_ui(A, UWORD(1), ctx); } +FMPZ_MPOLY_INLINE +int fmpz_mpoly_is_zero(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + return A->length == 0; +} +FMPZ_MPOLY_INLINE +int fmpz_mpoly_is_one(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + return fmpz_mpoly_equal_ui(A, UWORD(1), ctx); +} /* Degrees *******************************************************************/ -FMPZ_MPOLY_INLINE int fmpz_mpoly_degrees_fit_si(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_degrees_fit_si(A->exps, A->length, A->bits, ctx->minfo); } +FMPZ_MPOLY_INLINE +int fmpz_mpoly_degrees_fit_si(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_degrees_fit_si(A->exps, A->length, A->bits, ctx->minfo); +} -FMPZ_MPOLY_INLINE void fmpz_mpoly_degrees_si(slong * degs, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { mpoly_degrees_si(degs, A->exps, A->length, A->bits, ctx->minfo); } -FMPZ_MPOLY_INLINE void fmpz_mpoly_degrees_fmpz(fmpz ** degs, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { mpoly_degrees_pfmpz(degs, A->exps, A->length, A->bits, ctx->minfo); } +FMPZ_MPOLY_INLINE +void fmpz_mpoly_degrees_si(slong * degs, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + mpoly_degrees_si(degs, A->exps, A->length, A->bits, ctx->minfo); +} +FMPZ_MPOLY_INLINE +void fmpz_mpoly_degrees_fmpz(fmpz ** degs, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + mpoly_degrees_pfmpz(degs, A->exps, A->length, A->bits, ctx->minfo); +} -FMPZ_MPOLY_INLINE slong fmpz_mpoly_degree_si(const fmpz_mpoly_t A, slong var, const fmpz_mpoly_ctx_t ctx) { FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); return mpoly_degree_si(A->exps, A->length, A->bits, var, ctx->minfo); } -FMPZ_MPOLY_INLINE void fmpz_mpoly_degree_fmpz(fmpz_t deg, const fmpz_mpoly_t A, slong var, const fmpz_mpoly_ctx_t ctx) { FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); mpoly_degree_fmpz(deg, A->exps, A->length, A->bits, var, ctx->minfo); } +FMPZ_MPOLY_INLINE +slong fmpz_mpoly_degree_si(const fmpz_mpoly_t A, slong var, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); return mpoly_degree_si(A->exps, A->length, A->bits, var, ctx->minfo); +} +FMPZ_MPOLY_INLINE +void fmpz_mpoly_degree_fmpz(fmpz_t deg, const fmpz_mpoly_t A, slong var, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); mpoly_degree_fmpz(deg, A->exps, A->length, A->bits, var, ctx->minfo); +} -FMPZ_MPOLY_INLINE int fmpz_mpoly_total_degree_fits_si(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { return mpoly_total_degree_fits_si(A->exps, A->length, A->bits, ctx->minfo); } +FMPZ_MPOLY_INLINE +int fmpz_mpoly_total_degree_fits_si(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + return mpoly_total_degree_fits_si(A->exps, A->length, A->bits, ctx->minfo); +} -FMPZ_MPOLY_INLINE slong fmpz_mpoly_total_degree_si(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { return mpoly_total_degree_si(A->exps, A->length, A->bits, ctx->minfo); } -FMPZ_MPOLY_INLINE void fmpz_mpoly_total_degree_fmpz(fmpz_t td, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { mpoly_total_degree_fmpz(td, A->exps, A->length, A->bits, ctx->minfo); } +FMPZ_MPOLY_INLINE +slong fmpz_mpoly_total_degree_si(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + return mpoly_total_degree_si(A->exps, A->length, A->bits, ctx->minfo); +} +FMPZ_MPOLY_INLINE +void fmpz_mpoly_total_degree_fmpz(fmpz_t td, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + mpoly_total_degree_fmpz(td, A->exps, A->length, A->bits, ctx->minfo); +} FMPZ_MPOLY_INLINE void fmpz_mpoly_used_vars(int * used, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) @@ -204,241 +351,925 @@ void fmpz_mpoly_used_vars(int * used, const fmpz_mpoly_t A, const fmpz_mpoly_ctx /* Coefficients **************************************************************/ -void fmpz_mpoly_get_coeff_fmpz_monomial(fmpz_t c, const fmpz_mpoly_t A, const fmpz_mpoly_t M, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_set_coeff_fmpz_monomial(fmpz_mpoly_t A, const fmpz_t c, const fmpz_mpoly_t M, const fmpz_mpoly_ctx_t ctx); - -slong fmpz_mpoly_get_coeff_si_fmpz(const fmpz_mpoly_t A, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx); -ulong fmpz_mpoly_get_coeff_ui_fmpz(const fmpz_mpoly_t A, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_get_coeff_fmpz_fmpz(fmpz_t c, const fmpz_mpoly_t A, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx); - -slong fmpz_mpoly_get_coeff_si_ui(const fmpz_mpoly_t A, const ulong * exp, const fmpz_mpoly_ctx_t ctx); -ulong fmpz_mpoly_get_coeff_ui_ui(const fmpz_mpoly_t A, const ulong * exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_get_coeff_fmpz_ui(fmpz_t c, const fmpz_mpoly_t A, const ulong * exp, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_set_coeff_si_fmpz(fmpz_mpoly_t A, const slong c, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_set_coeff_ui_fmpz(fmpz_mpoly_t A, const ulong c, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx); -void _fmpz_mpoly_set_coeff_fmpz_fmpz(fmpz_mpoly_t A, const fmpz_t c, const fmpz * exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_set_coeff_fmpz_fmpz(fmpz_mpoly_t A, const fmpz_t c, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_set_coeff_si_ui(fmpz_mpoly_t A, const slong c, const ulong * exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_set_coeff_ui_ui(fmpz_mpoly_t A, const ulong c, const ulong * exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_set_coeff_fmpz_ui(fmpz_mpoly_t A, const fmpz_t c, const ulong * exp, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_get_coeff_vars_ui(fmpz_mpoly_t C, const fmpz_mpoly_t A, const slong * vars, const ulong * exps, slong length, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_get_coeff_fmpz_monomial( + fmpz_t c, + const fmpz_mpoly_t A, + const fmpz_mpoly_t M, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_set_coeff_fmpz_monomial( + fmpz_mpoly_t A, + const fmpz_t c, + const fmpz_mpoly_t M, + const fmpz_mpoly_ctx_t ctx); + +slong fmpz_mpoly_get_coeff_si_fmpz( + const fmpz_mpoly_t A, + fmpz * const * exp, + const fmpz_mpoly_ctx_t ctx); +ulong fmpz_mpoly_get_coeff_ui_fmpz( + const fmpz_mpoly_t A, + fmpz * const * exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_get_coeff_fmpz_fmpz( + fmpz_t c, + const fmpz_mpoly_t A, + fmpz * const * exp, + const fmpz_mpoly_ctx_t ctx); + +slong fmpz_mpoly_get_coeff_si_ui( + const fmpz_mpoly_t A, + const ulong * exp, + const fmpz_mpoly_ctx_t ctx); +ulong fmpz_mpoly_get_coeff_ui_ui( + const fmpz_mpoly_t A, + const ulong * exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_get_coeff_fmpz_ui( + fmpz_t c, + const fmpz_mpoly_t A, + const ulong * exp, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_set_coeff_si_fmpz( + fmpz_mpoly_t A, + const slong c, + fmpz * const * exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_set_coeff_ui_fmpz( + fmpz_mpoly_t A, + const ulong c, + fmpz * const * exp, + const fmpz_mpoly_ctx_t ctx); +void _fmpz_mpoly_set_coeff_fmpz_fmpz( + fmpz_mpoly_t A, + const fmpz_t c, + const fmpz * exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_set_coeff_fmpz_fmpz( + fmpz_mpoly_t A, + const fmpz_t c, + fmpz * const * exp, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_set_coeff_si_ui( + fmpz_mpoly_t A, + const slong c, + const ulong * exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_set_coeff_ui_ui( + fmpz_mpoly_t A, + const ulong c, + const ulong * exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_set_coeff_fmpz_ui( + fmpz_mpoly_t A, + const fmpz_t c, + const ulong * exp, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_get_coeff_vars_ui( + fmpz_mpoly_t C, + const fmpz_mpoly_t A, + const slong * vars, + const ulong * exps, + slong length, + const fmpz_mpoly_ctx_t ctx); /* conversion ****************************************************************/ int fmpz_mpoly_is_fmpz_poly(const fmpz_mpoly_t A, slong var, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_get_fmpz_poly(fmpz_poly_t A, const fmpz_mpoly_t B, slong var, const fmpz_mpoly_ctx_t ctx); - -void _fmpz_mpoly_set_fmpz_poly(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz * Bcoeffs, slong Blen, slong var, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_set_fmpz_poly(fmpz_mpoly_t A, const fmpz_poly_t B, slong v, const fmpz_mpoly_ctx_t ctx); - -void _fmpz_mpoly_set_fmpz_poly_one_var(fmpz_mpoly_t A, flint_bitcnt_t Aminbits, fmpz * Acoeffs, slong Adeg, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_set_gen_fmpz_poly(fmpz_mpoly_t res, slong var, const fmpz_poly_t pol, const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_get_fmpz_poly( + fmpz_poly_t A, + const fmpz_mpoly_t B, + slong var, + const fmpz_mpoly_ctx_t ctx); + +void _fmpz_mpoly_set_fmpz_poly( + fmpz_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz * Bcoeffs, + slong Blen, + slong var, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_set_fmpz_poly( + fmpz_mpoly_t A, + const fmpz_poly_t B, + slong v, + const fmpz_mpoly_ctx_t ctx); + +void _fmpz_mpoly_set_fmpz_poly_one_var( + fmpz_mpoly_t A, + flint_bitcnt_t Aminbits, + fmpz * Acoeffs, + slong Adeg, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_set_gen_fmpz_poly( + fmpz_mpoly_t res, + slong var, + const fmpz_poly_t pol, + const fmpz_mpoly_ctx_t ctx); /* comparison ****************************************************************/ -int fmpz_mpoly_cmp(const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_cmp( + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); /* container operations ******************************************************/ int fmpz_mpoly_is_canonical(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); -FMPZ_MPOLY_INLINE slong fmpz_mpoly_length(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { return A->length; } +FMPZ_MPOLY_INLINE +slong fmpz_mpoly_length(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + return A->length; +} void fmpz_mpoly_resize(fmpz_mpoly_t A, slong new_length, const fmpz_mpoly_ctx_t ctx); -slong fmpz_mpoly_get_term_coeff_si(const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx); -ulong fmpz_mpoly_get_term_coeff_ui(const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_get_term_coeff_fmpz(fmpz_t c, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_set_term_coeff_si(fmpz_mpoly_t A, slong i, slong c, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_set_term_coeff_ui(fmpz_mpoly_t A, slong i, ulong c, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_set_term_coeff_fmpz(fmpz_mpoly_t A, slong i, const fmpz_t c, const fmpz_mpoly_ctx_t ctx); - -FMPZ_MPOLY_INLINE int fmpz_mpoly_term_exp_fits_si(const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_si(A->exps, A->bits, i, ctx->minfo); } -FMPZ_MPOLY_INLINE int fmpz_mpoly_term_exp_fits_ui(const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_ui(A->exps, A->bits, i, ctx->minfo); } - -void fmpz_mpoly_get_term_exp_si(slong * exp, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_get_term_exp_ui(ulong * exp, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_get_term_exp_fmpz(fmpz ** exp, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx); +slong fmpz_mpoly_get_term_coeff_si( + const fmpz_mpoly_t A, + slong i, + const fmpz_mpoly_ctx_t ctx); +ulong fmpz_mpoly_get_term_coeff_ui( + const fmpz_mpoly_t A, + slong i, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_get_term_coeff_fmpz( + fmpz_t c, + const fmpz_mpoly_t A, + slong i, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_set_term_coeff_si( + fmpz_mpoly_t A, + slong i, + slong c, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_set_term_coeff_ui( + fmpz_mpoly_t A, + slong i, + ulong c, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_set_term_coeff_fmpz( + fmpz_mpoly_t A, + slong i, + const fmpz_t c, + const fmpz_mpoly_ctx_t ctx); -slong fmpz_mpoly_get_term_var_exp_si(const fmpz_mpoly_t A, slong i, slong var, const fmpz_mpoly_ctx_t ctx); -ulong fmpz_mpoly_get_term_var_exp_ui(const fmpz_mpoly_t A, slong i, slong var, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_set_term_exp_ui(fmpz_mpoly_t A, slong i, const ulong * exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_set_term_exp_fmpz(fmpz_mpoly_t A, slong i, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_get_term(fmpz_mpoly_t M, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_get_term_monomial(fmpz_mpoly_t M, const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_push_term_fmpz_fmpz(fmpz_mpoly_t A, const fmpz_t c, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_push_term_fmpz_ffmpz(fmpz_mpoly_t A, const fmpz_t c, const fmpz *exp, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_push_term_ui_fmpz(fmpz_mpoly_t A, ulong c, fmpz *const *exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_push_term_ui_ffmpz(fmpz_mpoly_t A, ulong c, const fmpz *exp, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_push_term_si_fmpz(fmpz_mpoly_t A, slong c, fmpz *const *exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_push_term_si_ffmpz(fmpz_mpoly_t A, slong c, const fmpz *exp, const fmpz_mpoly_ctx_t ctx); +FMPZ_MPOLY_INLINE +int fmpz_mpoly_term_exp_fits_si(const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_si(A->exps, A->bits, i, ctx->minfo); +} +FMPZ_MPOLY_INLINE +int fmpz_mpoly_term_exp_fits_ui(const fmpz_mpoly_t A, slong i, const fmpz_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_ui(A->exps, A->bits, i, ctx->minfo); +} -void fmpz_mpoly_push_term_si_ui(fmpz_mpoly_t A, slong c, const ulong * exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_push_term_ui_ui(fmpz_mpoly_t A, ulong c, const ulong * exp, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_push_term_fmpz_ui(fmpz_mpoly_t A, const fmpz_t c, const ulong * exp, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_get_term_exp_si( + slong * exp, + const fmpz_mpoly_t A, + slong i, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_get_term_exp_ui( + ulong * exp, + const fmpz_mpoly_t A, + slong i, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_get_term_exp_fmpz( + fmpz ** exp, + const fmpz_mpoly_t A, + slong i, + const fmpz_mpoly_ctx_t ctx); + +slong fmpz_mpoly_get_term_var_exp_si( + const fmpz_mpoly_t A, + slong i, + slong var, + const fmpz_mpoly_ctx_t ctx); +ulong fmpz_mpoly_get_term_var_exp_ui( + const fmpz_mpoly_t A, + slong i, + slong var, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_set_term_exp_ui( + fmpz_mpoly_t A, + slong i, + const ulong * exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_set_term_exp_fmpz( + fmpz_mpoly_t A, + slong i, + fmpz * const * exp, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_get_term( + fmpz_mpoly_t M, + const fmpz_mpoly_t A, + slong i, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_get_term_monomial( + fmpz_mpoly_t M, + const fmpz_mpoly_t A, + slong i, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_push_term_fmpz_fmpz( + fmpz_mpoly_t A, + const fmpz_t c, + fmpz * const * exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_push_term_fmpz_ffmpz( + fmpz_mpoly_t A, + const fmpz_t c, + const fmpz *exp, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_push_term_ui_fmpz( + fmpz_mpoly_t A, + ulong c, + fmpz *const *exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_push_term_ui_ffmpz( + fmpz_mpoly_t A, + ulong c, + const fmpz *exp, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_push_term_si_fmpz( + fmpz_mpoly_t A, + slong c, + fmpz *const *exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_push_term_si_ffmpz( + fmpz_mpoly_t A, + slong c, + const fmpz *exp, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_push_term_si_ui( + fmpz_mpoly_t A, + slong c, + const ulong * exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_push_term_ui_ui( + fmpz_mpoly_t A, + ulong c, + const ulong * exp, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_push_term_fmpz_ui( + fmpz_mpoly_t A, + const fmpz_t c, + const ulong * exp, + const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_sort_terms(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_combine_like_terms(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_reverse(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_reverse( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_assert_canonical(const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); -void _fmpz_mpoly_radix_sort1(fmpz_mpoly_t A, slong left, slong right, flint_bitcnt_t pos, ulong cmpmask, ulong totalmask); -void _fmpz_mpoly_radix_sort(fmpz_mpoly_t A, slong left, slong right, flint_bitcnt_t pos, slong N, ulong * cmpmask); - -void _fmpz_mpoly_push_exp_ui(fmpz_mpoly_t A, const ulong * exp, const fmpz_mpoly_ctx_t ctx); -void _fmpz_mpoly_push_exp_ffmpz(fmpz_mpoly_t A, const fmpz * exp, const fmpz_mpoly_ctx_t ctx); -void _fmpz_mpoly_push_exp_pfmpz(fmpz_mpoly_t A, fmpz * const * exp, const fmpz_mpoly_ctx_t ctx); +void _fmpz_mpoly_radix_sort1( + fmpz_mpoly_t A, + slong left, + slong right, + flint_bitcnt_t pos, + ulong cmpmask, + ulong totalmask); +void _fmpz_mpoly_radix_sort( + fmpz_mpoly_t A, + slong left, + slong right, + flint_bitcnt_t pos, + slong N, + ulong * cmpmask); + +void _fmpz_mpoly_push_exp_ui( + fmpz_mpoly_t A, + const ulong * exp, + const fmpz_mpoly_ctx_t ctx); +void _fmpz_mpoly_push_exp_ffmpz( + fmpz_mpoly_t A, + const fmpz * exp, + const fmpz_mpoly_ctx_t ctx); +void _fmpz_mpoly_push_exp_pfmpz( + fmpz_mpoly_t A, + fmpz * const * exp, + const fmpz_mpoly_ctx_t ctx); /* Random generation *********************************************************/ -void fmpz_mpoly_randtest_bound(fmpz_mpoly_t A, flint_rand_t state, slong length, flint_bitcnt_t coeff_bits, ulong exp_bound, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_randtest_bounds(fmpz_mpoly_t A, flint_rand_t state, slong length, flint_bitcnt_t coeff_bits, ulong * exp_bounds, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_randtest_bits(fmpz_mpoly_t A, flint_rand_t state, slong length, flint_bitcnt_t coeff_bits, flint_bitcnt_t exp_bits, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_randtest_bound( + fmpz_mpoly_t A, + flint_rand_t state, + slong length, + flint_bitcnt_t coeff_bits, + ulong exp_bound, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_randtest_bounds( + fmpz_mpoly_t A, + flint_rand_t state, + slong length, + flint_bitcnt_t coeff_bits, + ulong * exp_bounds, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_randtest_bits( + fmpz_mpoly_t A, + flint_rand_t state, + slong length, + flint_bitcnt_t coeff_bits, + flint_bitcnt_t exp_bits, + const fmpz_mpoly_ctx_t ctx); /* Addition/Subtraction ******************************************************/ -void fmpz_mpoly_add_si(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong c, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_add_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong c, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_add_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_sub_si(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong c, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_sub_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong c, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_sub_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_ctx_t ctx); - -slong _fmpz_mpoly_add(fmpz * poly1, ulong * exps1, const fmpz * poly2, const ulong * exps2, slong len2, const fmpz * poly3, const ulong * exps3, slong len3, slong N, const ulong * cmpmask); -void fmpz_mpoly_add(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx); - -slong _fmpz_mpoly_sub(fmpz * poly1, ulong * exps1, const fmpz * poly2, const ulong * exps2, slong len2, const fmpz * poly3, const ulong * exps3, slong len3, slong N, const ulong * cmpmask); -void fmpz_mpoly_sub(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_add_si( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + slong c, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_add_ui( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + ulong c, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_add_fmpz( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_t c, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_sub_si( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + slong c, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_sub_ui( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + ulong c, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_sub_fmpz( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_t c, + const fmpz_mpoly_ctx_t ctx); + +slong _fmpz_mpoly_add( + fmpz * poly1, + ulong * exps1, + const fmpz * poly2, + const ulong * exps2, + slong len2, + const fmpz * poly3, + const ulong * exps3, + slong len3, + slong N, + const ulong * cmpmask); +void fmpz_mpoly_add( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t C, + const fmpz_mpoly_ctx_t ctx); + +slong _fmpz_mpoly_sub( + fmpz * poly1, + ulong * exps1, + const fmpz * poly2, + const ulong * exps2, + slong len2, + const fmpz * poly3, + const ulong * exps3, + slong len3, + slong N, + const ulong * cmpmask); +void fmpz_mpoly_sub( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t C, + const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_neg(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); /* Scalar operations *********************************************************/ -void fmpz_mpoly_scalar_mul_si(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong c, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_scalar_mul_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong c, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_scalar_mul_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_scalar_fmma(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_t D, const fmpz_t e, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_scalar_divexact_si(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong c, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_scalar_divexact_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong c, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_scalar_divexact_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_ctx_t ctx); - -int fmpz_mpoly_scalar_divides_si(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong c, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_scalar_divides_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong c, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_scalar_divides_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t c, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_scalar_mul_si( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + slong c, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_scalar_mul_ui( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + ulong c, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_scalar_mul_fmpz( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_t c, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_scalar_fmma( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_t c, + const fmpz_mpoly_t D, + const fmpz_t e, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_scalar_divexact_si( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + slong c, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_scalar_divexact_ui( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + ulong c, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_scalar_divexact_fmpz( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_t c, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_scalar_divides_si( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + slong c, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_scalar_divides_ui( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + ulong c, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_scalar_divides_fmpz( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_t c, + const fmpz_mpoly_ctx_t ctx); /* Differentiation/Integration ***********************************************/ -void fmpz_mpoly_derivative(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong var, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_derivative( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + slong var, + const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_integral(fmpz_mpoly_t A, fmpz_t scale, const fmpz_mpoly_t B, slong var, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_integral( + fmpz_mpoly_t A, + fmpz_t scale, + const fmpz_mpoly_t B, + slong var, + const fmpz_mpoly_ctx_t ctx); /* Evaluation ****************************************************************/ int _fmpz_pow_ui_is_not_feasible(flint_bitcnt_t bbits, ulong e); int _fmpz_pow_fmpz_is_not_feasible(flint_bitcnt_t bbits, const fmpz_t e); -mp_limb_t fmpz_mpoly_evaluate_all_nmod(const fmpz_mpoly_t A, const mp_limb_t * alphas, const fmpz_mpoly_ctx_t ctx, nmod_t fpctx); -int fmpz_mpoly_evaluate_all_fmpz(fmpz_t ev, const fmpz_mpoly_t A, fmpz * const * vals, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_evaluate_all_fmpz_mod(fmpz_t ev, const fmpz_mpoly_t A, const fmpz * alphas, const fmpz_mpoly_ctx_t ctx, const fmpz_mod_ctx_t fpctx); - -int fmpz_mpoly_evaluate_one_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, slong var, const fmpz_t val, const fmpz_mpoly_ctx_t ctx); - -void _fmpz_mpoly_compose_mat(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mat_t M, const fmpz_mpoly_ctx_t ctxB, const fmpz_mpoly_ctx_t ctxAC); -int fmpz_mpoly_compose_fmpz_poly(fmpz_poly_t A, const fmpz_mpoly_t B, fmpz_poly_struct * const * C, const fmpz_mpoly_ctx_t ctxB); - -int fmpz_mpoly_compose_fmpz_mpoly_geobucket(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz_mpoly_struct * const * C, const fmpz_mpoly_ctx_t ctxB, const fmpz_mpoly_ctx_t ctxAC); -int fmpz_mpoly_compose_fmpz_mpoly_horner(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz_mpoly_struct * const * C, const fmpz_mpoly_ctx_t ctxB, const fmpz_mpoly_ctx_t ctxAC); -int fmpz_mpoly_compose_fmpz_mpoly(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz_mpoly_struct * const * C, const fmpz_mpoly_ctx_t ctxB, const fmpz_mpoly_ctx_t ctxAC); - -void fmpz_mpoly_compose_fmpz_mpoly_gen(fmpz_mpoly_t A, const fmpz_mpoly_t B, const slong * c, const fmpz_mpoly_ctx_t ctxB, const fmpz_mpoly_ctx_t ctxAC); +mp_limb_t fmpz_mpoly_evaluate_all_nmod( + const fmpz_mpoly_t A, + const mp_limb_t * alphas, + const fmpz_mpoly_ctx_t ctx, + nmod_t fpctx); +int fmpz_mpoly_evaluate_all_fmpz( + fmpz_t ev, + const fmpz_mpoly_t A, + fmpz * const * vals, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_evaluate_all_fmpz_mod( + fmpz_t ev, + const fmpz_mpoly_t A, + const fmpz * alphas, + const fmpz_mpoly_ctx_t ctx, + const fmpz_mod_ctx_t fpctx); + +int fmpz_mpoly_evaluate_one_fmpz( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + slong var, + const fmpz_t val, + const fmpz_mpoly_ctx_t ctx); + +void _fmpz_mpoly_compose_mat( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mat_t M, + const fmpz_mpoly_ctx_t ctxB, + const fmpz_mpoly_ctx_t ctxAC); +int fmpz_mpoly_compose_fmpz_poly( + fmpz_poly_t A, + const fmpz_mpoly_t B, + fmpz_poly_struct * const * C, + const fmpz_mpoly_ctx_t ctxB); + +int fmpz_mpoly_compose_fmpz_mpoly_geobucket( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + fmpz_mpoly_struct * const * C, + const fmpz_mpoly_ctx_t ctxB, + const fmpz_mpoly_ctx_t ctxAC); +int fmpz_mpoly_compose_fmpz_mpoly_horner( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + fmpz_mpoly_struct * const * C, + const fmpz_mpoly_ctx_t ctxB, + const fmpz_mpoly_ctx_t ctxAC); +int fmpz_mpoly_compose_fmpz_mpoly( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + fmpz_mpoly_struct * const * C, + const fmpz_mpoly_ctx_t ctxB, + const fmpz_mpoly_ctx_t ctxAC); + +void fmpz_mpoly_compose_fmpz_mpoly_gen( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const slong * c, + const fmpz_mpoly_ctx_t ctxB, + const fmpz_mpoly_ctx_t ctxAC); /* Multiplication ************************************************************/ -void fmpz_mpoly_mul_monomial(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx); - -slong _fmpz_mpoly_mul_johnson(fmpz ** poly1, ulong ** exp1, slong * alloc, const fmpz * poly2, const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3, slong len3, flint_bitcnt_t bits, slong N, const ulong * cmpmask); -void _fmpz_mpoly_mul_johnson_maxfields(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_mul_johnson(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_mul_heap_threaded(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx); -void _fmpz_mpoly_mul_heap_threaded_pool_maxfields(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles); -void fmpz_mpoly_mul(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx); - -int _fmpz_mpoly_mul_array_DEG(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx); -int _fmpz_mpoly_mul_array_LEX(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_mul_array_threaded(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx); -int _fmpz_mpoly_mul_array_threaded_pool_DEG(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles); -int _fmpz_mpoly_mul_array_threaded_pool_LEX(fmpz_mpoly_t A, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_t C, fmpz * maxCfields, const fmpz_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles); -int fmpz_mpoly_mul_array(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx); - -int _fmpz_mpoly_mul_dense(fmpz_mpoly_t P, const fmpz_mpoly_t A, fmpz * maxAfields, const fmpz_mpoly_t B, fmpz * maxBfields, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_mul_dense(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t C, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_mul_monomial( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t C, + const fmpz_mpoly_ctx_t ctx); + +slong _fmpz_mpoly_mul_johnson( + fmpz ** poly1, + ulong ** exp1, + slong * alloc, + const fmpz * poly2, + const ulong * exp2, + slong len2, + const fmpz * poly3, + const ulong * exp3, + slong len3, + flint_bitcnt_t bits, + slong N, + const ulong * cmpmask); +void _fmpz_mpoly_mul_johnson_maxfields( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + fmpz * maxBfields, + const fmpz_mpoly_t C, + fmpz * maxCfields, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_mul_johnson( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t C, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_mul_heap_threaded( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t C, + const fmpz_mpoly_ctx_t ctx); +void _fmpz_mpoly_mul_heap_threaded_pool_maxfields( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + fmpz * maxBfields, + const fmpz_mpoly_t C, + fmpz * maxCfields, + const fmpz_mpoly_ctx_t ctx, + const thread_pool_handle * handles, + slong num_handles); +void fmpz_mpoly_mul( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t C, + const fmpz_mpoly_ctx_t ctx); + +int _fmpz_mpoly_mul_array_DEG( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + fmpz * maxBfields, + const fmpz_mpoly_t C, + fmpz * maxCfields, + const fmpz_mpoly_ctx_t ctx); +int _fmpz_mpoly_mul_array_LEX( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + fmpz * maxBfields, + const fmpz_mpoly_t C, + fmpz * maxCfields, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_mul_array_threaded( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t C, + const fmpz_mpoly_ctx_t ctx); +int _fmpz_mpoly_mul_array_threaded_pool_DEG( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + fmpz * maxBfields, + const fmpz_mpoly_t C, + fmpz * maxCfields, + const fmpz_mpoly_ctx_t ctx, + const thread_pool_handle * handles, + slong num_handles); +int _fmpz_mpoly_mul_array_threaded_pool_LEX( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + fmpz * maxBfields, + const fmpz_mpoly_t C, + fmpz * maxCfields, + const fmpz_mpoly_ctx_t ctx, + const thread_pool_handle * handles, + slong num_handles); +int fmpz_mpoly_mul_array( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t C, + const fmpz_mpoly_ctx_t ctx); + +int _fmpz_mpoly_mul_dense( + fmpz_mpoly_t P, + const fmpz_mpoly_t A, + fmpz * maxAfields, + const fmpz_mpoly_t B, + fmpz * maxBfields, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_mul_dense( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t C, + const fmpz_mpoly_ctx_t ctx); /* Powering ******************************************************************/ -int fmpz_mpoly_pow_ui(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong k, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_pow_fmpz(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_t k, const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_pow_ui( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + ulong k, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_pow_fmpz( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_t k, + const fmpz_mpoly_ctx_t ctx); /* Division ******************************************************************/ -int fmpz_mpoly_divides_heap_threaded(fmpz_mpoly_t Q, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); -int _fmpz_mpoly_divides_heap_threaded_pool(fmpz_mpoly_t Q, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles); -slong _fmpz_mpoly_divides_monagan_pearce(fmpz ** poly1, ulong ** exp1, slong * alloc, const fmpz * poly2, const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3, slong len3, flint_bitcnt_t bits, slong N, const ulong * cmpmask); -int fmpz_mpoly_divides_monagan_pearce(fmpz_mpoly_t Q, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_divides(fmpz_mpoly_t Q, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); - -slong _fmpz_mpoly_divides_array(fmpz ** poly1, ulong ** exp1, slong * alloc, const fmpz * poly2, const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3, slong len3, slong * mults, slong num, slong bits); -int fmpz_mpoly_divides_array(fmpz_mpoly_t poly1, const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3, const fmpz_mpoly_ctx_t ctx); - -int mpoly_divides_select_exps(fmpz_mpoly_t S, fmpz_mpoly_ctx_t zctx, slong nworkers, ulong * Aexp, slong Alen, ulong * Bexp, slong Blen, flint_bitcnt_t bits); - -FMPZ_MPOLY_INLINE void fmpz_mpoly_divexact(fmpz_mpoly_t Q, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx) { if (fmpz_mpoly_divides(Q, A, B, ctx)) return; else flint_throw(FLINT_ERROR, "fmpz_mpoly_divexact: nonexact division"); } - -void fmpz_mpoly_quasidiv_heap(fmpz_t scale, fmpz_mpoly_t q, const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_quasidiv(fmpz_t scale, fmpz_mpoly_t Q, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_divides_heap_threaded( + fmpz_mpoly_t Q, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); +int _fmpz_mpoly_divides_heap_threaded_pool( + fmpz_mpoly_t Q, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx, + const thread_pool_handle * handles, + slong num_handles); +slong _fmpz_mpoly_divides_monagan_pearce( + fmpz ** poly1, + ulong ** exp1, + slong * alloc, + const fmpz * poly2, + const ulong * exp2, + slong len2, + const fmpz * poly3, + const ulong * exp3, + slong len3, + flint_bitcnt_t bits, + slong N, + const ulong * cmpmask); +int fmpz_mpoly_divides_monagan_pearce( + fmpz_mpoly_t Q, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_divides( + fmpz_mpoly_t Q, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); + +slong _fmpz_mpoly_divides_array( + fmpz ** poly1, + ulong ** exp1, + slong * alloc, + const fmpz * poly2, + const ulong * exp2, + slong len2, + const fmpz * poly3, + const ulong * exp3, + slong len3, + slong * mults, + slong num, + slong bits); +int fmpz_mpoly_divides_array( + fmpz_mpoly_t poly1, + const fmpz_mpoly_t poly2, + const fmpz_mpoly_t poly3, + const fmpz_mpoly_ctx_t ctx); + +int mpoly_divides_select_exps( + fmpz_mpoly_t S, + fmpz_mpoly_ctx_t zctx, + slong nworkers, + ulong * Aexp, + slong Alen, + ulong * Bexp, + slong Blen, + flint_bitcnt_t bits); -void fmpz_mpoly_quasidivrem_heap(fmpz_t scale, fmpz_mpoly_t q, fmpz_mpoly_t r, const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_quasidivrem(fmpz_t scale, fmpz_mpoly_t Q, fmpz_mpoly_t R, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_quasidivrem_ideal_heap(fmpz_t scale, fmpz_mpoly_struct ** q, fmpz_mpoly_t r, const fmpz_mpoly_t poly2, fmpz_mpoly_struct * const * poly3, slong len, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_quasidivrem_ideal(fmpz_t scale, fmpz_mpoly_struct ** Q, fmpz_mpoly_t R, const fmpz_mpoly_t A, fmpz_mpoly_struct * const * B, slong len, const fmpz_mpoly_ctx_t ctx); - -slong _fmpz_mpoly_div_monagan_pearce(fmpz ** polyq, ulong ** expq, slong * allocq, const fmpz * poly2, const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3, slong len3, slong bits, slong N, const ulong * cmpmask); -void fmpz_mpoly_div_monagan_pearce(fmpz_mpoly_t q, const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_div(fmpz_mpoly_t Q, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); - -slong _fmpz_mpoly_divrem_monagan_pearce(slong * lenr, fmpz ** polyq, ulong ** expq, slong * allocq, fmpz ** polyr, ulong ** expr, slong * allocr, const fmpz * poly2, const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3, slong len3, slong bits, slong N, const ulong * cmpmask); -void fmpz_mpoly_divrem_monagan_pearce(fmpz_mpoly_t q, fmpz_mpoly_t r, const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_divrem(fmpz_mpoly_t Q, fmpz_mpoly_t R, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); - -slong _fmpz_mpoly_divrem_array(slong * lenr, fmpz ** polyq, ulong ** expq, slong * allocq, fmpz ** polyr, ulong ** expr, slong * allocr, const fmpz * poly2, const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3, slong len3, slong * mults, slong num, slong bits); -int fmpz_mpoly_divrem_array(fmpz_mpoly_t q, fmpz_mpoly_t r, const fmpz_mpoly_t poly2, const fmpz_mpoly_t poly3, const fmpz_mpoly_ctx_t ctx); +FMPZ_MPOLY_INLINE +void fmpz_mpoly_divexact(fmpz_mpoly_t Q, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx) +{ + if (fmpz_mpoly_divides(Q, A, B, ctx)) return; else flint_throw(FLINT_ERROR, "fmpz_mpoly_divexact: nonexact division"); +} -slong _fmpz_mpoly_divrem_ideal_monagan_pearce(fmpz_mpoly_struct ** polyq, fmpz ** polyr, ulong ** expr, slong * allocr, const fmpz * poly2, const ulong * exp2, slong len2, fmpz_mpoly_struct * const * poly3, ulong * const * exp3, slong len, slong N, slong bits, const fmpz_mpoly_ctx_t ctx, const ulong * cmpmask); -void fmpz_mpoly_divrem_ideal_monagan_pearce(fmpz_mpoly_struct ** q, fmpz_mpoly_t r, const fmpz_mpoly_t poly2, fmpz_mpoly_struct * const * poly3, slong len, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_divrem_ideal(fmpz_mpoly_struct ** Q, fmpz_mpoly_t R, const fmpz_mpoly_t A, fmpz_mpoly_struct * const * B, slong len, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_quasidiv_heap( + fmpz_t scale, + fmpz_mpoly_t q, + const fmpz_mpoly_t poly2, + const fmpz_mpoly_t poly3, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_quasidiv( + fmpz_t scale, + fmpz_mpoly_t Q, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_quasidivrem_heap( + fmpz_t scale, + fmpz_mpoly_t q, + fmpz_mpoly_t r, + const fmpz_mpoly_t poly2, + const fmpz_mpoly_t poly3, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_quasidivrem( + fmpz_t scale, + fmpz_mpoly_t Q, + fmpz_mpoly_t R, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_quasidivrem_ideal_heap( + fmpz_t scale, + fmpz_mpoly_struct ** q, + fmpz_mpoly_t r, + const fmpz_mpoly_t poly2, + fmpz_mpoly_struct * const * poly3, + slong len, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_quasidivrem_ideal( + fmpz_t scale, + fmpz_mpoly_struct ** Q, + fmpz_mpoly_t R, + const fmpz_mpoly_t A, + fmpz_mpoly_struct * const * B, + slong len, + const fmpz_mpoly_ctx_t ctx); + +slong _fmpz_mpoly_div_monagan_pearce( + fmpz ** polyq, + ulong ** expq, + slong * allocq, + const fmpz * poly2, + const ulong * exp2, + slong len2, + const fmpz * poly3, + const ulong * exp3, + slong len3, + slong bits, + slong N, + const ulong * cmpmask); +void fmpz_mpoly_div_monagan_pearce( + fmpz_mpoly_t q, + const fmpz_mpoly_t poly2, + const fmpz_mpoly_t poly3, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_div( + fmpz_mpoly_t Q, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); + +slong _fmpz_mpoly_divrem_monagan_pearce( + slong * lenr, fmpz ** polyq, + ulong ** expq, + slong * allocq, + fmpz ** polyr, + ulong ** expr, + slong * allocr, + const fmpz * poly2, + const ulong * exp2, + slong len2, + const fmpz * poly3, + const ulong * exp3, + slong len3, + slong bits, + slong N, + const ulong * cmpmask); +void fmpz_mpoly_divrem_monagan_pearce( + fmpz_mpoly_t q, + fmpz_mpoly_t r, + const fmpz_mpoly_t poly2, + const fmpz_mpoly_t poly3, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_divrem( + fmpz_mpoly_t Q, + fmpz_mpoly_t R, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); + +slong _fmpz_mpoly_divrem_array( + slong * lenr, fmpz ** polyq, + ulong ** expq, + slong * allocq, + fmpz ** polyr, + ulong ** expr, + slong * allocr, + const fmpz * poly2, + const ulong * exp2, + slong len2, + const fmpz * poly3, + const ulong * exp3, + slong len3, + slong * mults, + slong num, + slong bits); +int fmpz_mpoly_divrem_array( + fmpz_mpoly_t q, + fmpz_mpoly_t r, + const fmpz_mpoly_t poly2, + const fmpz_mpoly_t poly3, + const fmpz_mpoly_ctx_t ctx); + +slong _fmpz_mpoly_divrem_ideal_monagan_pearce( + fmpz_mpoly_struct ** polyq, + fmpz ** polyr, + ulong ** expr, + slong * allocr, + const fmpz * poly2, + const ulong * exp2, + slong len2, + fmpz_mpoly_struct * const * poly3, + ulong * const * exp3, + slong len, + slong N, + slong bits, + const fmpz_mpoly_ctx_t ctx, + const ulong * cmpmask); +void fmpz_mpoly_divrem_ideal_monagan_pearce( + fmpz_mpoly_struct ** q, + fmpz_mpoly_t r, + const fmpz_mpoly_t poly2, + fmpz_mpoly_struct * const * poly3, + slong len, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_divrem_ideal( + fmpz_mpoly_struct ** Q, + fmpz_mpoly_t R, + const fmpz_mpoly_t A, + fmpz_mpoly_struct * const * B, + slong len, + const fmpz_mpoly_ctx_t ctx); /* Square root ***************************************************************/ -slong _fmpz_mpoly_sqrt_heap(fmpz ** polyq, ulong ** expq, slong * allocq, const fmpz * poly2, const ulong * exp2, slong len2, flint_bitcnt_t bits, const mpoly_ctx_t mctx, int check); -int fmpz_mpoly_sqrt_heap(fmpz_mpoly_t q, const fmpz_mpoly_t poly2, const fmpz_mpoly_ctx_t ctx, int check); -FMPZ_MPOLY_INLINE int fmpz_mpoly_sqrt(fmpz_mpoly_t q, const fmpz_mpoly_t poly2, const fmpz_mpoly_ctx_t ctx) { return fmpz_mpoly_sqrt_heap(q, poly2, ctx, 1); } +slong _fmpz_mpoly_sqrt_heap( + fmpz ** polyq, + ulong ** expq, + slong * allocq, + const fmpz * poly2, + const ulong * exp2, + slong len2, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx, + int check); +int fmpz_mpoly_sqrt_heap( + fmpz_mpoly_t q, + const fmpz_mpoly_t poly2, + const fmpz_mpoly_ctx_t ctx, + int check); +FMPZ_MPOLY_INLINE +int fmpz_mpoly_sqrt(fmpz_mpoly_t q, const fmpz_mpoly_t poly2, const fmpz_mpoly_ctx_t ctx) +{ + return fmpz_mpoly_sqrt_heap(q, poly2, ctx, 1); +} FMPZ_MPOLY_INLINE int fmpz_mpoly_is_square(const fmpz_mpoly_t poly2, const fmpz_mpoly_ctx_t ctx) @@ -453,71 +1284,202 @@ int fmpz_mpoly_is_square(const fmpz_mpoly_t poly2, const fmpz_mpoly_ctx_t ctx) /* GCD ***********************************************************************/ -void fmpz_mpoly_term_content(fmpz_mpoly_t M, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_primitive_part(fmpz_mpoly_t res, const fmpz_mpoly_t f, const fmpz_mpoly_ctx_t ctx); - -int fmpz_mpoly_content_vars(fmpz_mpoly_t g, const fmpz_mpoly_t A, slong * vars, slong vars_length, const fmpz_mpoly_ctx_t ctx); - -int fmpz_mpoly_gcd_cofactors(fmpz_mpoly_t G, fmpz_mpoly_t Abar, fmpz_mpoly_t Bbar, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_gcd(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_deflation(fmpz * shift, fmpz * stride, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_deflate(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz * shift, const fmpz * stride, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_inflate(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz * shift, const fmpz * stride, const fmpz_mpoly_ctx_t ctx); - -int fmpz_mpoly_gcd_hensel(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_gcd_brown(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_gcd_subresultant(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_gcd_zippel(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_gcd_zippel2(fmpz_mpoly_t G, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_term_content( + fmpz_mpoly_t M, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_primitive_part( + fmpz_mpoly_t res, + const fmpz_mpoly_t f, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_content_vars( + fmpz_mpoly_t g, + const fmpz_mpoly_t A, + slong * vars, + slong vars_length, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_gcd_cofactors( + fmpz_mpoly_t G, + fmpz_mpoly_t Abar, + fmpz_mpoly_t Bbar, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_gcd( + fmpz_mpoly_t G, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_deflation( + fmpz * shift, + fmpz * stride, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_deflate( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz * shift, + const fmpz * stride, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_inflate( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz * shift, + const fmpz * stride, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_gcd_hensel( + fmpz_mpoly_t G, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_gcd_brown( + fmpz_mpoly_t G, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_gcd_subresultant( + fmpz_mpoly_t G, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_gcd_zippel( + fmpz_mpoly_t G, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_gcd_zippel2( + fmpz_mpoly_t G, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); /* Univariates ***************************************************************/ void fmpz_mpoly_univar_init(fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_univar_clear(fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_univar_fit_length(fmpz_mpoly_univar_t A, slong length, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_univar_fit_length( + fmpz_mpoly_univar_t A, + slong length, + const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_univar_print_pretty(const fmpz_mpoly_univar_t A, const char ** x, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_univar_print_pretty( + const fmpz_mpoly_univar_t A, + const char ** x, + const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_univar_assert_canonical(fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t ctx); -FMPZ_MPOLY_INLINE void fmpz_mpoly_univar_zero(fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t ctx) { A->length = 0; } - -void fmpz_mpoly_univar_set_coeff_ui(fmpz_mpoly_univar_t A, ulong e, const fmpz_mpoly_t c, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_to_univar(fmpz_mpoly_univar_t A, const fmpz_mpoly_t B, slong var, const fmpz_mpoly_ctx_t ctx); - -void _fmpz_mpoly_from_univar(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mpoly_univar_t B, slong var, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_from_univar(fmpz_mpoly_t A, const fmpz_mpoly_univar_t B, slong var, const fmpz_mpoly_ctx_t ctx); - -FMPZ_MPOLY_INLINE void fmpz_mpoly_univar_swap(fmpz_mpoly_univar_t A, fmpz_mpoly_univar_t B, const fmpz_mpoly_ctx_t ctx) { FLINT_SWAP(fmpz_mpoly_univar_struct, *A, *B); } - -FMPZ_MPOLY_INLINE int fmpz_mpoly_univar_degree_fits_si(const fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t ctx) { return A->length == 0 || fmpz_fits_si(A->exps + 0); } - -FMPZ_MPOLY_INLINE slong fmpz_mpoly_univar_length(const fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t ctx) { return A->length; } +FMPZ_MPOLY_INLINE +void fmpz_mpoly_univar_zero(fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t ctx) +{ + A->length = 0; +} -FMPZ_MPOLY_INLINE slong fmpz_mpoly_univar_get_term_exp_si(fmpz_mpoly_univar_t A, slong i, const fmpz_mpoly_ctx_t ctx) { FLINT_ASSERT((ulong) i < (ulong) A->length); return fmpz_get_si(A->exps + i); } +void fmpz_mpoly_univar_set_coeff_ui( + fmpz_mpoly_univar_t A, + ulong e, + const fmpz_mpoly_t c, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_to_univar( + fmpz_mpoly_univar_t A, + const fmpz_mpoly_t B, + slong var, + const fmpz_mpoly_ctx_t ctx); + +void _fmpz_mpoly_from_univar( + fmpz_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_mpoly_univar_t B, + slong var, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_from_univar( + fmpz_mpoly_t A, + const fmpz_mpoly_univar_t B, + slong var, + const fmpz_mpoly_ctx_t ctx); -FMPZ_MPOLY_INLINE void fmpz_mpoly_univar_get_term_coeff(fmpz_mpoly_t c, const fmpz_mpoly_univar_t A, slong i, const fmpz_mpoly_ctx_t ctx) { FLINT_ASSERT((ulong) i < (ulong) A->length); fmpz_mpoly_set(c, A->coeffs + i, ctx); } +FMPZ_MPOLY_INLINE +void fmpz_mpoly_univar_swap(fmpz_mpoly_univar_t A, fmpz_mpoly_univar_t B, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_SWAP(fmpz_mpoly_univar_struct, *A, *B); +} -FMPZ_MPOLY_INLINE void fmpz_mpoly_univar_swap_term_coeff(fmpz_mpoly_t c, fmpz_mpoly_univar_t A, slong i, const fmpz_mpoly_ctx_t ctx) { FLINT_ASSERT((ulong) i < (ulong) A->length); fmpz_mpoly_swap(c, A->coeffs + i, ctx); } +FMPZ_MPOLY_INLINE +int fmpz_mpoly_univar_degree_fits_si(const fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t ctx) +{ + return A->length == 0 || fmpz_fits_si(A->exps + 0); +} -int fmpz_mpoly_univar_pseudo_gcd(fmpz_mpoly_univar_t gx, const fmpz_mpoly_univar_t ax, const fmpz_mpoly_univar_t bx, const fmpz_mpoly_ctx_t ctx); +FMPZ_MPOLY_INLINE +slong fmpz_mpoly_univar_length(const fmpz_mpoly_univar_t A, const fmpz_mpoly_ctx_t ctx) +{ + return A->length; +} -int fmpz_mpoly_univar_resultant(fmpz_mpoly_t d, const fmpz_mpoly_univar_t ax, const fmpz_mpoly_univar_t bx, const fmpz_mpoly_ctx_t ctx); +FMPZ_MPOLY_INLINE +slong fmpz_mpoly_univar_get_term_exp_si(fmpz_mpoly_univar_t A, slong i, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_ASSERT((ulong) i < (ulong) A->length); return fmpz_get_si(A->exps + i); +} -int fmpz_mpoly_univar_discriminant(fmpz_mpoly_t d, const fmpz_mpoly_univar_t fx, const fmpz_mpoly_ctx_t ctx); +FMPZ_MPOLY_INLINE +void fmpz_mpoly_univar_get_term_coeff(fmpz_mpoly_t c, const fmpz_mpoly_univar_t A, slong i, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_ASSERT((ulong) i < (ulong) A->length); fmpz_mpoly_set(c, A->coeffs + i, ctx); +} -int fmpz_mpoly_resultant(fmpz_mpoly_t R, const fmpz_mpoly_t A, const fmpz_mpoly_t B, slong var, const fmpz_mpoly_ctx_t ctx); +FMPZ_MPOLY_INLINE +void fmpz_mpoly_univar_swap_term_coeff(fmpz_mpoly_t c, fmpz_mpoly_univar_t A, slong i, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_ASSERT((ulong) i < (ulong) A->length); fmpz_mpoly_swap(c, A->coeffs + i, ctx); +} -int fmpz_mpoly_discriminant(fmpz_mpoly_t R, const fmpz_mpoly_t A, slong var, const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_univar_pseudo_gcd( + fmpz_mpoly_univar_t gx, + const fmpz_mpoly_univar_t ax, + const fmpz_mpoly_univar_t bx, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_univar_resultant( + fmpz_mpoly_t d, + const fmpz_mpoly_univar_t ax, + const fmpz_mpoly_univar_t bx, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_univar_discriminant( + fmpz_mpoly_t d, + const fmpz_mpoly_univar_t fx, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_resultant( + fmpz_mpoly_t R, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + slong var, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_discriminant( + fmpz_mpoly_t R, + const fmpz_mpoly_t A, + slong var, + const fmpz_mpoly_ctx_t ctx); /* Special polynomials *******************************************************/ -void fmpz_mpoly_symmetric_gens(fmpz_mpoly_t res, ulong k, slong * vars, slong n, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_symmetric_gens( + fmpz_mpoly_t res, + ulong k, + slong * vars, + slong n, + const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_symmetric(fmpz_mpoly_t res, ulong k, const fmpz_mpoly_ctx_t ctx); /* Vectors of multivariate polynomials ***************************************/ @@ -536,25 +1498,79 @@ typedef fmpz_mpoly_vec_struct fmpz_mpoly_vec_t[1]; void fmpz_mpoly_vec_init(fmpz_mpoly_vec_t vec, slong len, const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_vec_print(const fmpz_mpoly_vec_t F, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_vec_swap(fmpz_mpoly_vec_t x, fmpz_mpoly_vec_t y, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_vec_fit_length(fmpz_mpoly_vec_t vec, slong len, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_vec_swap( + fmpz_mpoly_vec_t x, + fmpz_mpoly_vec_t y, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_vec_fit_length( + fmpz_mpoly_vec_t vec, + slong len, + const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_vec_clear(fmpz_mpoly_vec_t vec, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_vec_set(fmpz_mpoly_vec_t dest, const fmpz_mpoly_vec_t src, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_vec_append(fmpz_mpoly_vec_t vec, const fmpz_mpoly_t f, const fmpz_mpoly_ctx_t ctx); -slong fmpz_mpoly_vec_insert_unique(fmpz_mpoly_vec_t vec, const fmpz_mpoly_t f, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_vec_set_length(fmpz_mpoly_vec_t vec, slong len, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_vec_randtest_not_zero(fmpz_mpoly_vec_t vec, flint_rand_t state, slong len, slong poly_len, slong bits, ulong exp_bound, fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_vec_set( + fmpz_mpoly_vec_t dest, + const fmpz_mpoly_vec_t src, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_vec_append( + fmpz_mpoly_vec_t vec, + const fmpz_mpoly_t f, + const fmpz_mpoly_ctx_t ctx); +slong fmpz_mpoly_vec_insert_unique( + fmpz_mpoly_vec_t vec, + const fmpz_mpoly_t f, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_vec_set_length( + fmpz_mpoly_vec_t vec, + slong len, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_vec_randtest_not_zero( + fmpz_mpoly_vec_t vec, + flint_rand_t state, + slong len, + slong poly_len, + slong bits, + ulong exp_bound, + fmpz_mpoly_ctx_t ctx); /* Ideals and Groenber bases *************************************************/ -void fmpz_mpoly_spoly(fmpz_mpoly_t res, const fmpz_mpoly_t f, const fmpz_mpoly_t g, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_vec_set_primitive_unique(fmpz_mpoly_vec_t G, const fmpz_mpoly_vec_t F, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_reduction_primitive_part(fmpz_mpoly_t res, const fmpz_mpoly_t f, const fmpz_mpoly_vec_t I, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_vec_is_groebner(const fmpz_mpoly_vec_t G, const fmpz_mpoly_vec_t F, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_buchberger_naive(fmpz_mpoly_vec_t G, const fmpz_mpoly_vec_t F, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_buchberger_naive_with_limits(fmpz_mpoly_vec_t G, const fmpz_mpoly_vec_t F, slong ideal_len_limit, slong poly_len_limit, slong poly_bits_limit, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_vec_autoreduction(fmpz_mpoly_vec_t H, const fmpz_mpoly_vec_t F, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_vec_autoreduction_groebner(fmpz_mpoly_vec_t H, const fmpz_mpoly_vec_t G, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_spoly( + fmpz_mpoly_t res, + const fmpz_mpoly_t f, + const fmpz_mpoly_t g, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_vec_set_primitive_unique( + fmpz_mpoly_vec_t G, + const fmpz_mpoly_vec_t F, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_reduction_primitive_part( + fmpz_mpoly_t res, + const fmpz_mpoly_t f, + const fmpz_mpoly_vec_t I, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_vec_is_groebner( + const fmpz_mpoly_vec_t G, + const fmpz_mpoly_vec_t F, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_buchberger_naive( + fmpz_mpoly_vec_t G, + const fmpz_mpoly_vec_t F, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_buchberger_naive_with_limits( + fmpz_mpoly_vec_t G, + const fmpz_mpoly_vec_t F, + slong ideal_len_limit, + slong poly_len_limit, + slong poly_bits_limit, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_vec_autoreduction( + fmpz_mpoly_vec_t H, + const fmpz_mpoly_vec_t F, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_vec_autoreduction_groebner( + fmpz_mpoly_vec_t H, + const fmpz_mpoly_vec_t G, + const fmpz_mpoly_ctx_t ctx); int fmpz_mpoly_vec_is_autoreduced(const fmpz_mpoly_vec_t G, const fmpz_mpoly_ctx_t ctx); /****************************************************************************** @@ -565,17 +1581,49 @@ int fmpz_mpoly_vec_is_autoreduced(const fmpz_mpoly_vec_t G, const fmpz_mpoly_ctx void mpoly_void_ring_init_fmpz_mpoly_ctx(mpoly_void_ring_t R, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_pow_fps(fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong k, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpolyl_lead_coeff(fmpz_mpoly_t c, const fmpz_mpoly_t A, slong num_vars, const fmpz_mpoly_ctx_t ctx); - -int fmpz_mpolyl_content(fmpz_mpoly_t g, const fmpz_mpoly_t A, slong num_vars, const fmpz_mpoly_ctx_t ctx); - -void _fmpz_mpoly_to_fmpz_poly_deflate(fmpz_poly_t A, const fmpz_mpoly_t B, slong var, const ulong * Bshift, const ulong * Bstride, const fmpz_mpoly_ctx_t ctx); -void _fmpz_mpoly_from_fmpz_poly_inflate(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz_poly_t B, slong var, const ulong * Ashift, const ulong * Astride, const fmpz_mpoly_ctx_t ctx); - -int fmpz_mpoly_repack_bits_inplace(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_repack_bits(fmpz_mpoly_t A, const fmpz_mpoly_t B, flint_bitcnt_t Abits, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_pow_fps( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + ulong k, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpolyl_lead_coeff( + fmpz_mpoly_t c, + const fmpz_mpoly_t A, + slong num_vars, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpolyl_content( + fmpz_mpoly_t g, + const fmpz_mpoly_t A, + slong num_vars, + const fmpz_mpoly_ctx_t ctx); + +void _fmpz_mpoly_to_fmpz_poly_deflate( + fmpz_poly_t A, + const fmpz_mpoly_t B, + slong var, + const ulong * Bshift, + const ulong * Bstride, + const fmpz_mpoly_ctx_t ctx); +void _fmpz_mpoly_from_fmpz_poly_inflate( + fmpz_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_poly_t B, + slong var, + const ulong * Ashift, + const ulong * Astride, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_repack_bits_inplace( + fmpz_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_repack_bits( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + flint_bitcnt_t Abits, + const fmpz_mpoly_ctx_t ctx); typedef struct _fmpz_mpoly_stripe_struct { @@ -624,15 +1672,40 @@ void fmpz_pow_cache_init(fmpz_pow_cache_t T, const fmpz_t val); void fmpz_pow_cache_clear(fmpz_pow_cache_t T); int fmpz_pow_cache_mulpow_ui(fmpz_t a, const fmpz_t b, ulong k, fmpz_pow_cache_t T); -int fmpz_pow_cache_mulpow_fmpz(fmpz_t a, const fmpz_t b, const fmpz_t k, fmpz_pow_cache_t T); +int fmpz_pow_cache_mulpow_fmpz( + fmpz_t a, + const fmpz_t b, + const fmpz_t k, + fmpz_pow_cache_t T); /*****************************************************************************/ -void fmpz_mpoly_to_mpoly_perm_deflate_threaded_pool(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t lctx, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx, const slong * perm, const ulong * shift, const ulong * stride, const thread_pool_handle * handles, slong num_handles); -void fmpz_mpoly_from_mpoly_perm_inflate(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mpoly_ctx_t ctx, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t lctx, const slong * perm, const ulong * shift, const ulong * stride); +void fmpz_mpoly_to_mpoly_perm_deflate_threaded_pool( + fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t lctx, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx, + const slong * perm, + const ulong * shift, + const ulong * stride, + const thread_pool_handle * handles, + slong num_handles); +void fmpz_mpoly_from_mpoly_perm_inflate( + fmpz_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_mpoly_ctx_t ctx, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t lctx, + const slong * perm, + const ulong * shift, + const ulong * stride); void fmpz_mpoly_height(fmpz_t max, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_heights(fmpz_t max, fmpz_t sum, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_heights( + fmpz_t max, + fmpz_t sum, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); /* geobuckets ****************************************************************/ @@ -648,58 +1721,281 @@ typedef fmpz_mpoly_geobucket_struct fmpz_mpoly_geobucket_t[1]; void fmpz_mpoly_geobucket_init(fmpz_mpoly_geobucket_t B, const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_geobucket_clear(fmpz_mpoly_geobucket_t B, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_geobucket_empty(fmpz_mpoly_t p, fmpz_mpoly_geobucket_t B, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_geobucket_fit_length(fmpz_mpoly_geobucket_t B, slong i, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_geobucket_set(fmpz_mpoly_geobucket_t B, fmpz_mpoly_t p, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_geobucket_add(fmpz_mpoly_geobucket_t B, fmpz_mpoly_t p, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_geobucket_sub(fmpz_mpoly_geobucket_t B, fmpz_mpoly_t p, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_geobucket_empty( + fmpz_mpoly_t p, + fmpz_mpoly_geobucket_t B, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_geobucket_fit_length( + fmpz_mpoly_geobucket_t B, + slong i, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_geobucket_set( + fmpz_mpoly_geobucket_t B, + fmpz_mpoly_t p, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_geobucket_add( + fmpz_mpoly_geobucket_t B, + fmpz_mpoly_t p, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_geobucket_sub( + fmpz_mpoly_geobucket_t B, + fmpz_mpoly_t p, + const fmpz_mpoly_ctx_t ctx); /* Helpers for array methods *************************************************/ -void _fmpz_mpoly_mul_array_chunked_DEG(fmpz_mpoly_t P, const fmpz_mpoly_t A, const fmpz_mpoly_t B, ulong degb, const fmpz_mpoly_ctx_t ctx); -void _fmpz_mpoly_mul_array_chunked_LEX(fmpz_mpoly_t P, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const ulong * mults, const fmpz_mpoly_ctx_t ctx); - -void _fmpz_mpoly_addmul_array1_slong1(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3); -void _fmpz_mpoly_addmul_array1_slong2(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3); -void _fmpz_mpoly_addmul_array1_slong(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3); -void _fmpz_mpoly_addmul_array1_fmpz(fmpz * poly1, const fmpz * poly2, const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3, slong len3); - -void _fmpz_mpoly_submul_array1_slong1(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3); -void _fmpz_mpoly_submul_array1_slong2_1(ulong * poly1, slong d, const ulong exp2, const slong * poly3, const ulong * exp3, slong len3); -void _fmpz_mpoly_submul_array1_slong2(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3); -void _fmpz_mpoly_submul_array1_slong_1(ulong * poly1, slong d, const ulong exp2, const slong * poly3, const ulong * exp3, slong len3); -void _fmpz_mpoly_submul_array1_slong(ulong * poly1, const slong * poly2, const ulong * exp2, slong len2, const slong * poly3, const ulong * exp3, slong len3); -void _fmpz_mpoly_submul_array1_fmpz_1(fmpz * poly1, const fmpz_t d, ulong exp2, const fmpz * poly3, const ulong * exp3, slong len3); -void _fmpz_mpoly_submul_array1_fmpz(fmpz * poly1, const fmpz * poly2, const ulong * exp2, slong len2, const fmpz * poly3, const ulong * exp3, slong len3); - -slong fmpz_mpoly_append_array_sm1_LEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, const ulong * mults, slong num, slong array_size, slong top); -slong fmpz_mpoly_append_array_sm2_LEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, const ulong * mults, slong num, slong array_size, slong top); -slong fmpz_mpoly_append_array_sm3_LEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, const ulong * mults, slong num, slong array_size, slong top); -slong fmpz_mpoly_append_array_fmpz_LEX(fmpz_mpoly_t P, slong Plen, fmpz * coeff_array, const ulong * mults, slong num, slong array_size, slong top); - -slong fmpz_mpoly_append_array_sm1_DEGLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb); -slong fmpz_mpoly_append_array_sm2_DEGLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb); -slong fmpz_mpoly_append_array_sm3_DEGLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb); -slong fmpz_mpoly_append_array_fmpz_DEGLEX(fmpz_mpoly_t P, slong Plen, fmpz * coeff_array, slong top, slong nvars, slong degb); - -slong fmpz_mpoly_append_array_sm1_DEGREVLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb); -slong fmpz_mpoly_append_array_sm2_DEGREVLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb); -slong fmpz_mpoly_append_array_sm3_DEGREVLEX(fmpz_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb); -slong fmpz_mpoly_append_array_fmpz_DEGREVLEX(fmpz_mpoly_t P, slong Plen, fmpz * coeff_array, slong top, slong nvars, slong degb); - -slong _fmpz_mpoly_from_ulong_array1(fmpz ** poly1, ulong ** exp1, slong * alloc, ulong * poly2, const slong * mults, slong num, slong bits, slong k); -slong _fmpz_mpoly_from_ulong_array2(fmpz ** poly1, ulong ** exp1, slong * alloc, ulong * poly2, const slong * mults, slong num, slong bits, slong k); -slong _fmpz_mpoly_from_ulong_array(fmpz ** poly1, ulong ** exp1, slong * alloc, ulong * poly2, const slong * mults, slong num, slong bits, slong k); - -void _fmpz_mpoly_to_ulong_array1(ulong * p, const fmpz * coeffs, const ulong * exps, slong len); -void _fmpz_mpoly_to_ulong_array2(ulong * p, const fmpz * coeffs, const ulong * exps, slong len); -void _fmpz_mpoly_to_ulong_array(ulong * p, const fmpz * coeffs, const ulong * exps, slong len); - -void _fmpz_mpoly_to_fmpz_array(fmpz * p, const fmpz * coeffs, const ulong * exps, slong len); -slong _fmpz_mpoly_from_fmpz_array(fmpz ** poly1, ulong ** exp1, slong * alloc, fmpz * poly2, const slong * mults, slong num, slong bits, slong k); +void _fmpz_mpoly_mul_array_chunked_DEG( + fmpz_mpoly_t P, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + ulong degb, + const fmpz_mpoly_ctx_t ctx); +void _fmpz_mpoly_mul_array_chunked_LEX( + fmpz_mpoly_t P, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const ulong * mults, + const fmpz_mpoly_ctx_t ctx); + +void _fmpz_mpoly_addmul_array1_slong1( + ulong * poly1, + const slong * poly2, + const ulong * exp2, + slong len2, + const slong * poly3, + const ulong * exp3, + slong len3); +void _fmpz_mpoly_addmul_array1_slong2( + ulong * poly1, + const slong * poly2, + const ulong * exp2, + slong len2, + const slong * poly3, + const ulong * exp3, + slong len3); +void _fmpz_mpoly_addmul_array1_slong( + ulong * poly1, + const slong * poly2, + const ulong * exp2, + slong len2, + const slong * poly3, + const ulong * exp3, + slong len3); +void _fmpz_mpoly_addmul_array1_fmpz( + fmpz * poly1, + const fmpz * poly2, + const ulong * exp2, + slong len2, + const fmpz * poly3, + const ulong * exp3, + slong len3); + +void _fmpz_mpoly_submul_array1_slong1( + ulong * poly1, + const slong * poly2, + const ulong * exp2, + slong len2, + const slong * poly3, + const ulong * exp3, + slong len3); +void _fmpz_mpoly_submul_array1_slong2_1( + ulong * poly1, + slong d, + const ulong exp2, + const slong * poly3, + const ulong * exp3, + slong len3); +void _fmpz_mpoly_submul_array1_slong2( + ulong * poly1, + const slong * poly2, + const ulong * exp2, + slong len2, + const slong * poly3, + const ulong * exp3, + slong len3); +void _fmpz_mpoly_submul_array1_slong_1( + ulong * poly1, + slong d, + const ulong exp2, + const slong * poly3, + const ulong * exp3, + slong len3); +void _fmpz_mpoly_submul_array1_slong( + ulong * poly1, + const slong * poly2, + const ulong * exp2, + slong len2, + const slong * poly3, + const ulong * exp3, + slong len3); +void _fmpz_mpoly_submul_array1_fmpz_1( + fmpz * poly1, + const fmpz_t d, + ulong exp2, + const fmpz * poly3, + const ulong * exp3, + slong len3); +void _fmpz_mpoly_submul_array1_fmpz( + fmpz * poly1, + const fmpz * poly2, + const ulong * exp2, + slong len2, + const fmpz * poly3, + const ulong * exp3, + slong len3); + +slong fmpz_mpoly_append_array_sm1_LEX( + fmpz_mpoly_t P, + slong Plen, + ulong * coeff_array, + const ulong * mults, + slong num, + slong array_size, + slong top); +slong fmpz_mpoly_append_array_sm2_LEX( + fmpz_mpoly_t P, + slong Plen, + ulong * coeff_array, + const ulong * mults, + slong num, + slong array_size, + slong top); +slong fmpz_mpoly_append_array_sm3_LEX( + fmpz_mpoly_t P, + slong Plen, + ulong * coeff_array, + const ulong * mults, + slong num, + slong array_size, + slong top); +slong fmpz_mpoly_append_array_fmpz_LEX( + fmpz_mpoly_t P, + slong Plen, + fmpz * coeff_array, + const ulong * mults, + slong num, + slong array_size, + slong top); + +slong fmpz_mpoly_append_array_sm1_DEGLEX( + fmpz_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb); +slong fmpz_mpoly_append_array_sm2_DEGLEX( + fmpz_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb); +slong fmpz_mpoly_append_array_sm3_DEGLEX( + fmpz_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb); +slong fmpz_mpoly_append_array_fmpz_DEGLEX( + fmpz_mpoly_t P, + slong Plen, + fmpz * coeff_array, + slong top, + slong nvars, + slong degb); + +slong fmpz_mpoly_append_array_sm1_DEGREVLEX( + fmpz_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb); +slong fmpz_mpoly_append_array_sm2_DEGREVLEX( + fmpz_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb); +slong fmpz_mpoly_append_array_sm3_DEGREVLEX( + fmpz_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb); +slong fmpz_mpoly_append_array_fmpz_DEGREVLEX( + fmpz_mpoly_t P, + slong Plen, + fmpz * coeff_array, + slong top, + slong nvars, + slong degb); + +slong _fmpz_mpoly_from_ulong_array1( + fmpz ** poly1, + ulong ** exp1, + slong * alloc, + ulong * poly2, + const slong * mults, + slong num, + slong bits, + slong k); +slong _fmpz_mpoly_from_ulong_array2( + fmpz ** poly1, + ulong ** exp1, + slong * alloc, + ulong * poly2, + const slong * mults, + slong num, + slong bits, + slong k); +slong _fmpz_mpoly_from_ulong_array( + fmpz ** poly1, + ulong ** exp1, + slong * alloc, + ulong * poly2, + const slong * mults, + slong num, + slong bits, + slong k); + +void _fmpz_mpoly_to_ulong_array1( + ulong * p, + const fmpz * coeffs, + const ulong * exps, + slong len); +void _fmpz_mpoly_to_ulong_array2( + ulong * p, + const fmpz * coeffs, + const ulong * exps, + slong len); +void _fmpz_mpoly_to_ulong_array( + ulong * p, + const fmpz * coeffs, + const ulong * exps, + slong len); + +void _fmpz_mpoly_to_fmpz_array( + fmpz * p, + const fmpz * coeffs, + const ulong * exps, + slong len); +slong _fmpz_mpoly_from_fmpz_array( + fmpz ** poly1, + ulong ** exp1, + slong * alloc, + fmpz * poly2, + const slong * mults, + slong num, + slong bits, + slong k); /* Misc arithmetic - has nothing to do with mpoly, should be moved out *******/ @@ -773,8 +2069,14 @@ mpz_srcptr _fmpz_mpoly_get_mpz_signed_uiuiui(ulong * sm, fmpz x, mpz_ptr t); ******************************************************************************/ -void fmpz_mpoly_remainder_test(const fmpz_mpoly_t r, const fmpz_mpoly_t g, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_remainder_strongtest(const fmpz_mpoly_t r, const fmpz_mpoly_t g, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_remainder_test( + const fmpz_mpoly_t r, + const fmpz_mpoly_t g, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_remainder_strongtest( + const fmpz_mpoly_t r, + const fmpz_mpoly_t g, + const fmpz_mpoly_ctx_t ctx); #ifdef __cplusplus } diff --git a/src/fmpz_mpoly_factor.h b/src/fmpz_mpoly_factor.h index 67cf4be9c5..7b25f5bccf 100644 --- a/src/fmpz_mpoly_factor.h +++ b/src/fmpz_mpoly_factor.h @@ -46,46 +46,120 @@ void fmpz_mpoly_factor_init(fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) f->alloc = 0; } -void fmpz_mpoly_factor_init2(fmpz_mpoly_factor_t f, slong alloc, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_factor_realloc(fmpz_mpoly_factor_t f, slong alloc, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_factor_init2( + fmpz_mpoly_factor_t f, + slong alloc, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_factor_realloc( + fmpz_mpoly_factor_t f, + slong alloc, + const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_factor_clear(fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_factor_fit_length(fmpz_mpoly_factor_t f, slong len, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_factor_fit_length( + fmpz_mpoly_factor_t f, + slong len, + const fmpz_mpoly_ctx_t ctx); -FMPZ_MPOLY_FACTOR_INLINE slong fmpz_mpoly_factor_length(const fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) { return f->num; } - -FMPZ_MPOLY_FACTOR_INLINE void fmpz_mpoly_factor_get_constant_fmpz(fmpz_t c, const fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) { fmpz_set(c, f->constant); } -FMPZ_MPOLY_FACTOR_INLINE void fmpz_mpoly_factor_get_constant_fmpq(fmpq_t c, const fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) { fmpz_set(fmpq_numref(c), f->constant); fmpz_set(fmpq_denref(c), f->constant_den); } - -FMPZ_MPOLY_FACTOR_INLINE void fmpz_mpoly_factor_get_base(fmpz_mpoly_t p, const fmpz_mpoly_factor_t f, slong i, const fmpz_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); fmpz_mpoly_set(p, f->poly + i, ctx); } - -FMPZ_MPOLY_FACTOR_INLINE void fmpz_mpoly_factor_swap_base(fmpz_mpoly_t p, fmpz_mpoly_factor_t f, slong i, const fmpz_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); fmpz_mpoly_swap(p, f->poly + i, ctx); } - -FMPZ_MPOLY_FACTOR_INLINE slong fmpz_mpoly_factor_get_exp_si(fmpz_mpoly_factor_t f, slong i, const fmpz_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); return fmpz_get_si(f->exp + i); } +FMPZ_MPOLY_FACTOR_INLINE +slong fmpz_mpoly_factor_length(const fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) +{ + return f->num; +} -void fmpz_mpoly_factor_set(fmpz_mpoly_factor_t f, const fmpz_mpoly_factor_t g, const fmpz_mpoly_ctx_t ctx); +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_mpoly_factor_get_constant_fmpz(fmpz_t c, const fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) +{ + fmpz_set(c, f->constant); +} +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_mpoly_factor_get_constant_fmpq(fmpq_t c, const fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) +{ + fmpz_set(fmpq_numref(c), f->constant); fmpz_set(fmpq_denref(c), f->constant_den); +} -int fmpz_mpoly_factor_cmp(const fmpz_mpoly_factor_t f, const fmpz_mpoly_factor_t g, const fmpz_mpoly_ctx_t ctx); +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_mpoly_factor_get_base(fmpz_mpoly_t p, const fmpz_mpoly_factor_t f, slong i, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); fmpz_mpoly_set(p, f->poly + i, ctx); +} -void fmpz_mpoly_factor_print_pretty(const fmpz_mpoly_factor_t f, const char ** vars, const fmpz_mpoly_ctx_t ctx); +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_mpoly_factor_swap_base(fmpz_mpoly_t p, fmpz_mpoly_factor_t f, slong i, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); fmpz_mpoly_swap(p, f->poly + i, ctx); +} -int fmpz_mpoly_factor_content(fmpz_mpoly_factor_t f, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); +FMPZ_MPOLY_FACTOR_INLINE +slong fmpz_mpoly_factor_get_exp_si(fmpz_mpoly_factor_t f, slong i, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); return fmpz_get_si(f->exp + i); +} -int fmpz_mpoly_factor_squarefree(fmpz_mpoly_factor_t f, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_factor(fmpz_mpoly_factor_t f, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_factor_set( + fmpz_mpoly_factor_t f, + const fmpz_mpoly_factor_t g, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_factor_cmp( + const fmpz_mpoly_factor_t f, + const fmpz_mpoly_factor_t g, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_factor_print_pretty( + const fmpz_mpoly_factor_t f, + const char ** vars, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_factor_content( + fmpz_mpoly_factor_t f, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_factor_squarefree( + fmpz_mpoly_factor_t f, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_factor( + fmpz_mpoly_factor_t f, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); -FMPZ_MPOLY_FACTOR_INLINE void fmpz_mpoly_factor_swap(fmpz_mpoly_factor_t f, fmpz_mpoly_factor_t g, const fmpz_mpoly_ctx_t ctx) { FLINT_SWAP(fmpz_mpoly_factor_struct, *f, *g); } +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_mpoly_factor_swap(fmpz_mpoly_factor_t f, fmpz_mpoly_factor_t g, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_SWAP(fmpz_mpoly_factor_struct, *f, *g); +} -FMPZ_MPOLY_FACTOR_INLINE void fmpz_mpoly_factor_set_fmpz(fmpz_mpoly_factor_t f, const fmpz_t a, const fmpz_mpoly_ctx_t ctx) { f->num = 0; fmpz_set(f->constant, a); } +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_mpoly_factor_set_fmpz(fmpz_mpoly_factor_t f, const fmpz_t a, const fmpz_mpoly_ctx_t ctx) +{ + f->num = 0; fmpz_set(f->constant, a); +} -FMPZ_MPOLY_FACTOR_INLINE void fmpz_mpoly_factor_zero(fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) { f->num = 0; fmpz_zero(f->constant); } -FMPZ_MPOLY_FACTOR_INLINE void fmpz_mpoly_factor_one(fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) { f->num = 0; fmpz_one(f->constant); } +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_mpoly_factor_zero(fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) +{ + f->num = 0; fmpz_zero(f->constant); +} +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_mpoly_factor_one(fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) +{ + f->num = 0; fmpz_one(f->constant); +} void fmpz_mpoly_factor_sort(fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_factor_expand(fmpz_mpoly_t A, const fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_factor_expand( + fmpz_mpoly_t A, + const fmpz_mpoly_factor_t f, + const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_factor_bound_si(fmpz_t B, const fmpz_t A, const slong * degs, slong nvars); +int fmpz_mpoly_factor_bound_si( + fmpz_t B, + const fmpz_t A, + const slong * degs, + slong nvars); FMPZ_MPOLY_FACTOR_INLINE int fmpz_mpoly_factor_matches(const fmpz_mpoly_t A, const fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx) @@ -121,17 +195,45 @@ void fmpz_mpoly_factor_append_ui(fmpz_mpoly_factor_t f, const fmpz_mpoly_t A, ul /*****************************************************************************/ -void fmpz_mpoly_interp_lift_p(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx, nmod_mpoly_t Ap, const nmod_mpoly_ctx_t ctxp); - -void fmpz_mpoly_interp_reduce_p(nmod_mpoly_t Ap, const nmod_mpoly_ctx_t ctxp, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); - -int fmpz_mpoly_interp_mcrt_p(flint_bitcnt_t * coeffbits, fmpz_mpoly_t H, const fmpz_mpoly_ctx_t ctx, const fmpz_t m, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctxp); - -void fmpz_mpoly_interp_reduce_p_mpolyn(nmod_mpolyn_t E, const nmod_mpoly_ctx_t pctx, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_interp_lift_p_mpolyn(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx, const nmod_mpolyn_t B, const nmod_mpoly_ctx_t pctx); - -int fmpz_mpoly_interp_crt_p_mpolyn(fmpz_mpoly_t F, fmpz_mpoly_t T, const fmpz_mpoly_ctx_t ctx, fmpz_t modulus, const nmod_mpolyn_t A, const nmod_mpoly_ctx_t pctx); +void fmpz_mpoly_interp_lift_p( + fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx, + nmod_mpoly_t Ap, + const nmod_mpoly_ctx_t ctxp); + +void fmpz_mpoly_interp_reduce_p( + nmod_mpoly_t Ap, + const nmod_mpoly_ctx_t ctxp, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_interp_mcrt_p( + flint_bitcnt_t * coeffbits, + fmpz_mpoly_t H, + const fmpz_mpoly_ctx_t ctx, + const fmpz_t m, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctxp); + +void fmpz_mpoly_interp_reduce_p_mpolyn( + nmod_mpolyn_t E, + const nmod_mpoly_ctx_t pctx, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_interp_lift_p_mpolyn( + fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx, + const nmod_mpolyn_t B, + const nmod_mpoly_ctx_t pctx); + +int fmpz_mpoly_interp_crt_p_mpolyn( + fmpz_mpoly_t F, + fmpz_mpoly_t T, + const fmpz_mpoly_ctx_t ctx, + fmpz_t modulus, + const nmod_mpolyn_t A, + const nmod_mpoly_ctx_t pctx); /*****************************************************************************/ @@ -144,37 +246,132 @@ typedef struct typedef fmpz_mpolyv_struct fmpz_mpolyv_t[1]; -FMPZ_MPOLY_FACTOR_INLINE void fmpz_mpolyv_init(fmpz_mpolyv_t A, const fmpz_mpoly_ctx_t ctx) { A->coeffs = NULL; A->alloc = 0; A->length = 0; } +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_mpolyv_init(fmpz_mpolyv_t A, const fmpz_mpoly_ctx_t ctx) +{ + A->coeffs = NULL; A->alloc = 0; A->length = 0; +} void fmpz_mpolyv_clear(fmpz_mpolyv_t A, const fmpz_mpoly_ctx_t ctx); -FMPZ_MPOLY_FACTOR_INLINE void fmpz_mpolyv_swap(fmpz_mpolyv_t A, fmpz_mpolyv_t B, const fmpz_mpoly_ctx_t ctx) { FLINT_SWAP(fmpz_mpolyv_struct, *A, *B); } +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_mpolyv_swap(fmpz_mpolyv_t A, fmpz_mpolyv_t B, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_SWAP(fmpz_mpolyv_struct, *A, *B); +} -void fmpz_mpolyv_print_pretty(const fmpz_mpolyv_t poly, const char ** x, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpolyv_print_pretty( + const fmpz_mpolyv_t poly, + const char ** x, + const fmpz_mpoly_ctx_t ctx); void fmpz_mpolyv_fit_length(fmpz_mpolyv_t A, slong length, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpolyv_set_coeff(fmpz_mpolyv_t A, slong i, fmpz_mpoly_t c, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_to_mpolyv(fmpz_mpolyv_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t xalpha, const fmpz_mpoly_ctx_t ctx); -void fmpz_mpoly_from_mpolyv(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mpolyv_t B, const fmpz_mpoly_t xalpha, const fmpz_mpoly_ctx_t ctx); - -int _fmpz_mpoly_vec_content_mpoly(fmpz_mpoly_t g, const fmpz_mpoly_struct * A, slong Alen, const fmpz_mpoly_ctx_t ctx); - -void _fmpz_mpoly_vec_divexact_mpoly(fmpz_mpoly_struct * A, slong Alen, const fmpz_mpoly_t c, const fmpz_mpoly_ctx_t ctx); - -void _fmpz_mpoly_vec_mul_mpoly(fmpz_mpoly_struct * A, slong Alen, const fmpz_mpoly_t c, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpolyv_set_coeff( + fmpz_mpolyv_t A, + slong i, + fmpz_mpoly_t c, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_to_mpolyv( + fmpz_mpolyv_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t xalpha, + const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_from_mpolyv( + fmpz_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_mpolyv_t B, + const fmpz_mpoly_t xalpha, + const fmpz_mpoly_ctx_t ctx); + +int _fmpz_mpoly_vec_content_mpoly( + fmpz_mpoly_t g, + const fmpz_mpoly_struct * A, + slong Alen, + const fmpz_mpoly_ctx_t ctx); + +void _fmpz_mpoly_vec_divexact_mpoly( + fmpz_mpoly_struct * A, + slong Alen, + const fmpz_mpoly_t c, + const fmpz_mpoly_ctx_t ctx); + +void _fmpz_mpoly_vec_mul_mpoly( + fmpz_mpoly_struct * A, + slong Alen, + const fmpz_mpoly_t c, + const fmpz_mpoly_ctx_t ctx); /*****************************************************************************/ -void fmpz_mpoly_to_mpolyl_perm_deflate(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t lctx, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx, const slong * perm, const ulong * shift, const ulong * stride); -void fmpz_mpoly_from_mpolyl_perm_inflate(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mpoly_ctx_t ctx, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t lctx, const slong * perm, const ulong * shift, const ulong * stride); - -int _fmpz_mpoly_gcd_algo(fmpz_mpoly_t G, fmpz_mpoly_t Abar, fmpz_mpoly_t Bbar, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx, unsigned int algo); -int fmpz_mpolyl_gcd_brown(fmpz_mpoly_t G, fmpz_mpoly_t Abar, fmpz_mpoly_t Bbar, fmpz_mpoly_t A, fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx, const mpoly_gcd_info_t I); -int fmpz_mpolyl_gcd_brown_threaded_pool(fmpz_mpoly_t G, fmpz_mpoly_t Abar, fmpz_mpoly_t Bbar, fmpz_mpoly_t A, fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx, const mpoly_gcd_info_t I, const thread_pool_handle * handles, slong num_handles); -int fmpz_mpolyl_gcd_zippel(fmpz_mpoly_t G, fmpz_mpoly_t Abar, fmpz_mpoly_t Bbar, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx, flint_rand_t randstate); -int fmpz_mpolyl_gcd_zippel2(fmpz_mpoly_t G, fmpz_mpoly_t Abar, fmpz_mpoly_t Bbar, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t Gamma, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpolyl_gcd_hensel(fmpz_mpoly_t G, slong Gdeg, fmpz_mpoly_t Abar, fmpz_mpoly_t Bbar, const fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_to_mpolyl_perm_deflate( + fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t lctx, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx, + const slong * perm, + const ulong * shift, + const ulong * stride); +void fmpz_mpoly_from_mpolyl_perm_inflate( + fmpz_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_mpoly_ctx_t ctx, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t lctx, + const slong * perm, + const ulong * shift, + const ulong * stride); + +int _fmpz_mpoly_gcd_algo( + fmpz_mpoly_t G, + fmpz_mpoly_t Abar, + fmpz_mpoly_t Bbar, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx, + unsigned int algo); +int fmpz_mpolyl_gcd_brown( + fmpz_mpoly_t G, + fmpz_mpoly_t Abar, + fmpz_mpoly_t Bbar, + fmpz_mpoly_t A, + fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx, + const mpoly_gcd_info_t I); +int fmpz_mpolyl_gcd_brown_threaded_pool( + fmpz_mpoly_t G, + fmpz_mpoly_t Abar, + fmpz_mpoly_t Bbar, + fmpz_mpoly_t A, + fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx, + const mpoly_gcd_info_t I, + const thread_pool_handle * handles, + slong num_handles); +int fmpz_mpolyl_gcd_zippel( + fmpz_mpoly_t G, + fmpz_mpoly_t Abar, + fmpz_mpoly_t Bbar, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx, + flint_rand_t randstate); +int fmpz_mpolyl_gcd_zippel2( + fmpz_mpoly_t G, + fmpz_mpoly_t Abar, + fmpz_mpoly_t Bbar, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t Gamma, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpolyl_gcd_hensel( + fmpz_mpoly_t G, + slong Gdeg, + fmpz_mpoly_t Abar, + fmpz_mpoly_t Bbar, + const fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_ctx_t ctx); /*****************************************************************************/ @@ -204,7 +401,10 @@ void fmpz_poly_pfrac_init(fmpz_poly_pfrac_t I); void fmpz_poly_pfrac_clear(fmpz_poly_pfrac_t I); int fmpz_poly_pfrac_precompute(fmpz_poly_pfrac_t I, const fmpz_poly_struct * b, slong r); -int fmpz_poly_pfrac_precomp(fmpz_poly_struct * c, const fmpz_poly_t A, fmpz_poly_pfrac_t I); +int fmpz_poly_pfrac_precomp( + fmpz_poly_struct * c, + const fmpz_poly_t A, + fmpz_poly_pfrac_t I); typedef struct { @@ -229,15 +429,41 @@ typedef struct typedef fmpz_mpoly_pfrac_struct fmpz_mpoly_pfrac_t[1]; -int fmpz_mpoly_pfrac_init(fmpz_mpoly_pfrac_t I, flint_bitcnt_t bits, slong r, slong w, const fmpz_mpoly_struct * betas, const fmpz * alpha, const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_pfrac_init( + fmpz_mpoly_pfrac_t I, + flint_bitcnt_t bits, + slong r, + slong w, + const fmpz_mpoly_struct * betas, + const fmpz * alpha, + const fmpz_mpoly_ctx_t ctx); void fmpz_mpoly_pfrac_clear(fmpz_mpoly_pfrac_t I, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_pfrac(slong l, fmpz_mpoly_t t, const slong * degs, fmpz_mpoly_pfrac_t I, const fmpz_mpoly_ctx_t ctx); - -int fmpz_mpoly_hlift(slong m, fmpz_mpoly_struct * f, slong r, const fmpz * alpha, const fmpz_mpoly_t A, const slong * degs, const fmpz_mpoly_ctx_t ctx); - -void _fmpz_mpoly_get_lead0(fmpz_mpoly_t c, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); -void _fmpz_mpoly_set_lead0(fmpz_mpoly_t A, const fmpz_mpoly_t B, const fmpz_mpoly_t c, const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_pfrac( + slong l, + fmpz_mpoly_t t, + const slong * degs, + fmpz_mpoly_pfrac_t I, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_hlift( + slong m, + fmpz_mpoly_struct * f, + slong r, + const fmpz * alpha, + const fmpz_mpoly_t A, + const slong * degs, + const fmpz_mpoly_ctx_t ctx); + +void _fmpz_mpoly_get_lead0( + fmpz_mpoly_t c, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); +void _fmpz_mpoly_set_lead0( + fmpz_mpoly_t A, + const fmpz_mpoly_t B, + const fmpz_mpoly_t c, + const fmpz_mpoly_ctx_t ctx); /*****************************************************************************/ @@ -250,28 +476,59 @@ typedef struct typedef fmpz_bpoly_struct fmpz_bpoly_t[1]; -FMPZ_MPOLY_FACTOR_INLINE void fmpz_bpoly_init(fmpz_bpoly_t A) { A->coeffs = NULL; A->alloc = 0; A->length = 0; } +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_bpoly_init(fmpz_bpoly_t A) +{ + A->coeffs = NULL; A->alloc = 0; A->length = 0; +} void fmpz_bpoly_realloc(fmpz_bpoly_t A, slong len); void fmpz_bpoly_clear(fmpz_bpoly_t A); -FMPZ_MPOLY_FACTOR_INLINE void fmpz_bpoly_swap(fmpz_bpoly_t A, fmpz_bpoly_t B) { FLINT_SWAP(fmpz_bpoly_struct, *A, *B); } +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_bpoly_swap(fmpz_bpoly_t A, fmpz_bpoly_t B) +{ + FLINT_SWAP(fmpz_bpoly_struct, *A, *B); +} -FMPZ_MPOLY_FACTOR_INLINE void fmpz_bpoly_fit_length(fmpz_bpoly_t A, slong len) { if (A->alloc < len) fmpz_bpoly_realloc(A, len); } +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_bpoly_fit_length(fmpz_bpoly_t A, slong len) +{ + if (A->alloc < len) fmpz_bpoly_realloc(A, len); +} void fmpz_bpoly_print_pretty(fmpz_bpoly_t A, const char * var0, const char * var1); -FMPZ_MPOLY_FACTOR_INLINE fmpz_poly_struct * fmpz_bpoly_lead(fmpz_bpoly_t A) { return A->coeffs + A->length - 1; } +FMPZ_MPOLY_FACTOR_INLINE +fmpz_poly_struct * fmpz_bpoly_lead(fmpz_bpoly_t A) +{ + return A->coeffs + A->length - 1; +} FMPZ_MPOLY_FACTOR_INLINE void fmpz_bpoly_zero(fmpz_bpoly_t A) { A->length = 0; } -FMPZ_MPOLY_FACTOR_INLINE slong fmpz_bpoly_degree0(const fmpz_bpoly_t A) { return A->length - 1; } +FMPZ_MPOLY_FACTOR_INLINE +slong fmpz_bpoly_degree0(const fmpz_bpoly_t A) +{ + return A->length - 1; +} slong fmpz_bpoly_degree1(const fmpz_bpoly_t A); void fmpz_bpoly_set_coeff(fmpz_bpoly_t A, slong exp0, slong exp1, const fmpz_t c); -void fmpz_mpoly_set_fmpz_bpoly(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz_bpoly_t B, slong var0, slong var1, const fmpz_mpoly_ctx_t ctx); - -void fmpz_mpoly_get_bpoly(fmpz_bpoly_t A, const fmpz_mpoly_t B, slong var0, slong var1, const fmpz_mpoly_ctx_t ctx); +void fmpz_mpoly_set_fmpz_bpoly( + fmpz_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_bpoly_t B, + slong var0, + slong var1, + const fmpz_mpoly_ctx_t ctx); + +void fmpz_mpoly_get_bpoly( + fmpz_bpoly_t A, + const fmpz_mpoly_t B, + slong var0, + slong var1, + const fmpz_mpoly_ctx_t ctx); typedef struct { @@ -282,46 +539,157 @@ typedef struct typedef fmpz_tpoly_struct fmpz_tpoly_t[1]; -FMPZ_MPOLY_FACTOR_INLINE void fmpz_tpoly_init(fmpz_tpoly_t A) { A->coeffs = NULL; A->alloc = 0; A->length = 0; } +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_tpoly_init(fmpz_tpoly_t A) +{ + A->coeffs = NULL; A->alloc = 0; A->length = 0; +} void fmpz_tpoly_clear(fmpz_tpoly_t A); -FMPZ_MPOLY_FACTOR_INLINE void fmpz_tpoly_swap(fmpz_tpoly_t A, fmpz_tpoly_t B) { FLINT_SWAP(fmpz_tpoly_struct, *A, *B); } +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_tpoly_swap(fmpz_tpoly_t A, fmpz_tpoly_t B) +{ + FLINT_SWAP(fmpz_tpoly_struct, *A, *B); +} void fmpz_tpoly_fit_length(fmpz_tpoly_t A, slong len); -int fmpz_bpoly_factor_ordered(fmpz_poly_t c, fmpz_tpoly_t F, fmpz_bpoly_t B, const fmpz_t alpha, const fmpz_poly_factor_t Bevalf); +int fmpz_bpoly_factor_ordered( + fmpz_poly_t c, + fmpz_tpoly_t F, + fmpz_bpoly_t B, + const fmpz_t alpha, + const fmpz_poly_factor_t Bevalf); void fmpz_bpoly_factor(fmpz_poly_t c, fmpz_tpoly_t F, fmpz_bpoly_t B); /*****************************************************************************/ -FMPZ_MPOLY_FACTOR_INLINE void fmpz_mpoly_unit_normalize(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) { FLINT_ASSERT(A->length > 0); if (fmpz_sgn(A->coeffs + 0) < 0) fmpz_mpoly_neg(A, A, ctx); } - -int _fmpz_mpoly_factor_squarefree(fmpz_mpoly_factor_t f, fmpz_mpoly_t A, const fmpz_t e, const fmpz_mpoly_ctx_t ctx); - -int fmpz_mpoly_factor_lcc_wang(fmpz_mpoly_struct * lc_divs, const fmpz_mpoly_factor_t lcAfac, const fmpz_t Auc, const fmpz_poly_struct * Auf, slong r, const fmpz * alpha, const fmpz_mpoly_ctx_t ctx); - -int fmpz_mpoly_factor_irred_zassenhaus(fmpz_mpolyv_t fac, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx, zassenhaus_prune_t Z); -int fmpz_mpoly_factor_irred_wang(fmpz_mpolyv_t fac, const fmpz_mpoly_t A, const fmpz_mpoly_factor_t lcAfac, int lcAfac_irred, const fmpz_mpoly_t lcA, const fmpz_mpoly_ctx_t ctx, flint_rand_t state, zassenhaus_prune_t Z, int allow_shift); -int fmpz_mpoly_factor_irred_zippel(fmpz_mpolyv_t fac, const fmpz_mpoly_t A, const fmpz_mpoly_factor_t lcAfac, int lcAfac_irred, const fmpz_mpoly_t lcA, const fmpz_mpoly_ctx_t ctx, flint_rand_t state, zassenhaus_prune_t Z); -int fmpz_mpoly_factor_irred(fmpz_mpoly_factor_t f, const fmpz_mpoly_ctx_t ctx, unsigned int algo); - -int fmpz_mpoly_factor_zassenhaus(fmpz_mpoly_factor_t f, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_factor_wang(fmpz_mpoly_factor_t f, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_factor_zippel(fmpz_mpoly_factor_t f, const fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx); - -int _fmpz_mpoly_evaluate_rest_fmpz(fmpz * E, slong * starts, slong * ends, slong * stops, ulong * es, const fmpz * Acoeffs, const ulong * Aexps, slong Alen, slong var, const fmpz * alphas, const slong * offsets, const slong * shifts, slong N, ulong mask, slong nvars); - -void _fmpz_mpoly_eval_rest_to_poly(fmpz_poly_t E, const fmpz_mpoly_t A, const fmpz * alphas, const fmpz_mpoly_ctx_t ctx); - -int fmpz_mpoly_factor_lcc_kaltofen_step(fmpz_mpoly_struct * divs /* length r */, slong r, fmpz_mpoly_factor_t Af /* squarefree factorization of A */, const fmpz_poly_struct * Au, slong v /* minor bivar var*/, const fmpz * alphas, const fmpz_mpoly_ctx_t ctx); -int fmpz_mpoly_factor_lcc_kaltofen(fmpz_mpoly_struct * divs, const fmpz_mpoly_factor_t lcAf_, const fmpz_mpoly_t A, slong r, const fmpz * alpha, slong * degs, const fmpz_poly_factor_t uf, const fmpz_mpoly_ctx_t ctx); +FMPZ_MPOLY_FACTOR_INLINE +void fmpz_mpoly_unit_normalize(fmpz_mpoly_t A, const fmpz_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(A->length > 0); if (fmpz_sgn(A->coeffs + 0) < 0) fmpz_mpoly_neg(A, A, ctx); +} -int fmpz_mpoly_evaluate_rest_except_one(fmpz_poly_t e, const fmpz_mpoly_t A, const fmpz * alphas, slong v, const fmpz_mpoly_ctx_t ctx); +int _fmpz_mpoly_factor_squarefree( + fmpz_mpoly_factor_t f, + fmpz_mpoly_t A, + const fmpz_t e, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_factor_lcc_wang( + fmpz_mpoly_struct * lc_divs, + const fmpz_mpoly_factor_t lcAfac, + const fmpz_t Auc, + const fmpz_poly_struct * Auf, + slong r, + const fmpz * alpha, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_factor_irred_zassenhaus( + fmpz_mpolyv_t fac, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx, + zassenhaus_prune_t Z); +int fmpz_mpoly_factor_irred_wang( + fmpz_mpolyv_t fac, + const fmpz_mpoly_t A, + const fmpz_mpoly_factor_t lcAfac, + int lcAfac_irred, + const fmpz_mpoly_t lcA, + const fmpz_mpoly_ctx_t ctx, + flint_rand_t state, + zassenhaus_prune_t Z, + int allow_shift); +int fmpz_mpoly_factor_irred_zippel( + fmpz_mpolyv_t fac, + const fmpz_mpoly_t A, + const fmpz_mpoly_factor_t lcAfac, + int lcAfac_irred, + const fmpz_mpoly_t lcA, + const fmpz_mpoly_ctx_t ctx, + flint_rand_t state, + zassenhaus_prune_t Z); +int fmpz_mpoly_factor_irred( + fmpz_mpoly_factor_t f, + const fmpz_mpoly_ctx_t ctx, + unsigned int algo); + +int fmpz_mpoly_factor_zassenhaus( + fmpz_mpoly_factor_t f, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_factor_wang( + fmpz_mpoly_factor_t f, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_factor_zippel( + fmpz_mpoly_factor_t f, + const fmpz_mpoly_t A, + const fmpz_mpoly_ctx_t ctx); + +int _fmpz_mpoly_evaluate_rest_fmpz( + fmpz * E, + slong * starts, + slong * ends, + slong * stops, + ulong * es, + const fmpz * Acoeffs, + const ulong * Aexps, + slong Alen, + slong var, + const fmpz * alphas, + const slong * offsets, + const slong * shifts, + slong N, + ulong mask, + slong nvars); + +void _fmpz_mpoly_eval_rest_to_poly( + fmpz_poly_t E, + const fmpz_mpoly_t A, + const fmpz * alphas, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_factor_lcc_kaltofen_step( + fmpz_mpoly_struct * divs /* length r */, + slong r, + fmpz_mpoly_factor_t Af /* squarefree factorization of A */, + const fmpz_poly_struct * Au, + slong v /* minor bivar var*/, + const fmpz * alphas, + const fmpz_mpoly_ctx_t ctx); +int fmpz_mpoly_factor_lcc_kaltofen( + fmpz_mpoly_struct * divs, + const fmpz_mpoly_factor_t lcAf_, + const fmpz_mpoly_t A, + slong r, + const fmpz * alpha, + slong * degs, + const fmpz_poly_factor_t uf, + const fmpz_mpoly_ctx_t ctx); + +int fmpz_mpoly_evaluate_rest_except_one( + fmpz_poly_t e, + const fmpz_mpoly_t A, + const fmpz * alphas, + slong v, + const fmpz_mpoly_ctx_t ctx); /****************************************************************************/ -void fmpz_mpoly_compression_do(fmpz_mpoly_t L, const fmpz_mpoly_ctx_t Lctx, fmpz * Acoeffs, slong Alen, mpoly_compression_t M); -void fmpz_mpoly_compression_undo(fmpz_mpoly_t A, flint_bitcnt_t Abits, const fmpz_mpoly_ctx_t Actx, fmpz_mpoly_t L, const fmpz_mpoly_ctx_t Lctx, mpoly_compression_t M); +void fmpz_mpoly_compression_do( + fmpz_mpoly_t L, + const fmpz_mpoly_ctx_t Lctx, + fmpz * Acoeffs, + slong Alen, + mpoly_compression_t M); +void fmpz_mpoly_compression_undo( + fmpz_mpoly_t A, + flint_bitcnt_t Abits, + const fmpz_mpoly_ctx_t Actx, + fmpz_mpoly_t L, + const fmpz_mpoly_ctx_t Lctx, + mpoly_compression_t M); #ifdef __cplusplus } diff --git a/src/fmpz_poly.h b/src/fmpz_poly.h index bc61003c7e..a5f89317c2 100644 --- a/src/fmpz_poly.h +++ b/src/fmpz_poly.h @@ -84,8 +84,16 @@ void fmpz_poly_attach_shift(fmpz_poly_t trunc, const fmpz_poly_t poly, slong n) /* Polynomial parameters ***************************************************/ -FMPZ_POLY_INLINE slong fmpz_poly_length(const fmpz_poly_t poly) { return poly->length; } -FMPZ_POLY_INLINE slong fmpz_poly_degree(const fmpz_poly_t poly) { return poly->length - 1; } +FMPZ_POLY_INLINE +slong fmpz_poly_length(const fmpz_poly_t poly) +{ + return poly->length; +} +FMPZ_POLY_INLINE +slong fmpz_poly_degree(const fmpz_poly_t poly) +{ + return poly->length - 1; +} /* Assignment and basic manipulation ***************************************/ @@ -103,8 +111,16 @@ char * fmpz_poly_get_str(const fmpz_poly_t poly); char * _fmpz_poly_get_str_pretty(const fmpz * poly, slong len, const char * x); char * fmpz_poly_get_str_pretty(const fmpz_poly_t poly, const char * x); -FMPZ_POLY_INLINE void fmpz_poly_zero(fmpz_poly_t poly) { _fmpz_poly_set_length(poly, 0); } -FMPZ_POLY_INLINE void fmpz_poly_one(fmpz_poly_t poly) { fmpz_poly_set_ui(poly, UWORD(1)); } +FMPZ_POLY_INLINE +void fmpz_poly_zero(fmpz_poly_t poly) +{ + _fmpz_poly_set_length(poly, 0); +} +FMPZ_POLY_INLINE +void fmpz_poly_one(fmpz_poly_t poly) +{ + fmpz_poly_set_ui(poly, UWORD(1)); +} void fmpz_poly_zero_coeffs(fmpz_poly_t poly, slong i, slong j); @@ -114,7 +130,11 @@ void _fmpz_poly_reverse(fmpz * res, const fmpz * poly, slong len, slong n); void fmpz_poly_reverse(fmpz_poly_t res, const fmpz_poly_t poly, slong n); ulong _fmpz_poly_deflation(const fmpz* a, slong len); -FMPZ_POLY_INLINE ulong fmpz_poly_deflation(const fmpz_poly_t input) { return _fmpz_poly_deflation(input->coeffs, input->length); } +FMPZ_POLY_INLINE +ulong fmpz_poly_deflation(const fmpz_poly_t input) +{ + return _fmpz_poly_deflation(input->coeffs, input->length); +} void fmpz_poly_deflate(fmpz_poly_t result, const fmpz_poly_t input, ulong deflation); void fmpz_poly_inflate(fmpz_poly_t result, const fmpz_poly_t input, ulong inflation); @@ -125,14 +145,42 @@ void fmpz_poly_set_trunc(fmpz_poly_t res, const fmpz_poly_t poly, slong n); /* Randomisation ***********************************************************/ -void fmpz_poly_randtest(fmpz_poly_t f, flint_rand_t state, slong len, flint_bitcnt_t bits); -void fmpz_poly_randtest_unsigned(fmpz_poly_t f, flint_rand_t state, slong len, flint_bitcnt_t bits); -void fmpz_poly_randtest_not_zero(fmpz_poly_t f, flint_rand_t state, slong len, flint_bitcnt_t bits); -void fmpz_poly_randtest_no_real_root(fmpz_poly_t p, flint_rand_t state, slong len, flint_bitcnt_t bits); - -void fmpz_poly_randtest_irreducible1(fmpz_poly_t pol, flint_rand_t state, slong len, mp_bitcnt_t bits); -void fmpz_poly_randtest_irreducible2(fmpz_poly_t pol, flint_rand_t state, slong len, mp_bitcnt_t bits); -void fmpz_poly_randtest_irreducible(fmpz_poly_t pol, flint_rand_t state, slong len, mp_bitcnt_t bits); +void fmpz_poly_randtest( + fmpz_poly_t f, + flint_rand_t state, + slong len, + flint_bitcnt_t bits); +void fmpz_poly_randtest_unsigned( + fmpz_poly_t f, + flint_rand_t state, + slong len, + flint_bitcnt_t bits); +void fmpz_poly_randtest_not_zero( + fmpz_poly_t f, + flint_rand_t state, + slong len, + flint_bitcnt_t bits); +void fmpz_poly_randtest_no_real_root( + fmpz_poly_t p, + flint_rand_t state, + slong len, + flint_bitcnt_t bits); + +void fmpz_poly_randtest_irreducible1( + fmpz_poly_t pol, + flint_rand_t state, + slong len, + mp_bitcnt_t bits); +void fmpz_poly_randtest_irreducible2( + fmpz_poly_t pol, + flint_rand_t state, + slong len, + mp_bitcnt_t bits); +void fmpz_poly_randtest_irreducible( + fmpz_poly_t pol, + flint_rand_t state, + slong len, + mp_bitcnt_t bits); /* Getting and setting coefficients ****************************************/ @@ -156,7 +204,11 @@ int fmpz_poly_equal_trunc(const fmpz_poly_t poly1, const fmpz_poly_t poly2, slon #define fmpz_poly_is_zero(poly) ((poly)->length == 0) int _fmpz_poly_is_one(const fmpz * poly, slong len); -FMPZ_POLY_INLINE int fmpz_poly_is_one(const fmpz_poly_t op) { return (op->length) == 1 && (*(op->coeffs) == WORD(1)); } +FMPZ_POLY_INLINE +int fmpz_poly_is_one(const fmpz_poly_t op) +{ + return (op->length) == 1 && (*(op->coeffs) == WORD(1)); +} FMPZ_POLY_INLINE int fmpz_poly_is_unit(const fmpz_poly_t op) { @@ -173,13 +225,31 @@ int fmpz_poly_equal_fmpz(const fmpz_poly_t poly, const fmpz_t c); /* Addition and subtraction ************************************************/ -void _fmpz_poly_add(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); +void _fmpz_poly_add( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); void fmpz_poly_add(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); -void fmpz_poly_add_series(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong n); - -void _fmpz_poly_sub(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); +void fmpz_poly_add_series( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong n); + +void _fmpz_poly_sub( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); void fmpz_poly_sub(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); -void fmpz_poly_sub_series(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong n); +void fmpz_poly_sub_series( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong n); void fmpz_poly_neg(fmpz_poly_t res, const fmpz_poly_t poly); @@ -196,31 +266,55 @@ void fmpz_poly_scalar_abs(fmpz_poly_t res, const fmpz_poly_t poly); void fmpz_poly_scalar_mul_si(fmpz_poly_t poly1, const fmpz_poly_t poly2, slong x); void fmpz_poly_scalar_mul_ui(fmpz_poly_t poly1, const fmpz_poly_t poly2, ulong x); -void fmpz_poly_scalar_mul_fmpz(fmpz_poly_t poly1, const fmpz_poly_t poly2, const fmpz_t x); +void fmpz_poly_scalar_mul_fmpz( + fmpz_poly_t poly1, + const fmpz_poly_t poly2, + const fmpz_t x); void fmpz_poly_scalar_mul_2exp(fmpz_poly_t poly1, const fmpz_poly_t poly2, ulong exp); void fmpz_poly_scalar_addmul_si(fmpz_poly_t poly1, const fmpz_poly_t poly2, slong x); void fmpz_poly_scalar_addmul_ui(fmpz_poly_t poly1, const fmpz_poly_t poly2, ulong x); -void fmpz_poly_scalar_addmul_fmpz(fmpz_poly_t poly1, const fmpz_poly_t poly2, const fmpz_t x); +void fmpz_poly_scalar_addmul_fmpz( + fmpz_poly_t poly1, + const fmpz_poly_t poly2, + const fmpz_t x); -void fmpz_poly_scalar_submul_fmpz(fmpz_poly_t poly1, const fmpz_poly_t poly2, const fmpz_t x); +void fmpz_poly_scalar_submul_fmpz( + fmpz_poly_t poly1, + const fmpz_poly_t poly2, + const fmpz_t x); void fmpz_poly_scalar_fdiv_si(fmpz_poly_t poly1, const fmpz_poly_t poly2, slong x); void fmpz_poly_scalar_fdiv_ui(fmpz_poly_t poly1, const fmpz_poly_t poly2, ulong x); -void fmpz_poly_scalar_fdiv_fmpz(fmpz_poly_t poly1, const fmpz_poly_t poly2, const fmpz_t x); +void fmpz_poly_scalar_fdiv_fmpz( + fmpz_poly_t poly1, + const fmpz_poly_t poly2, + const fmpz_t x); void fmpz_poly_scalar_fdiv_2exp(fmpz_poly_t poly1, const fmpz_poly_t poly2, ulong exp); void fmpz_poly_scalar_tdiv_si(fmpz_poly_t poly1, const fmpz_poly_t poly2, slong x); void fmpz_poly_scalar_tdiv_ui(fmpz_poly_t poly1, const fmpz_poly_t poly2, ulong x); -void fmpz_poly_scalar_tdiv_fmpz(fmpz_poly_t poly1, const fmpz_poly_t poly2, const fmpz_t x); +void fmpz_poly_scalar_tdiv_fmpz( + fmpz_poly_t poly1, + const fmpz_poly_t poly2, + const fmpz_t x); void fmpz_poly_scalar_tdiv_2exp(fmpz_poly_t poly1, const fmpz_poly_t poly2, ulong exp); void fmpz_poly_scalar_divexact_si(fmpz_poly_t poly1, const fmpz_poly_t poly2, slong x); void fmpz_poly_scalar_divexact_ui(fmpz_poly_t poly1, const fmpz_poly_t poly2, ulong x); -void fmpz_poly_scalar_divexact_fmpz(fmpz_poly_t poly1, const fmpz_poly_t poly2, const fmpz_t x); - -void fmpz_poly_scalar_mod_fmpz(fmpz_poly_t poly1, const fmpz_poly_t poly2, const fmpz_t x); -void fmpz_poly_scalar_smod_fmpz(fmpz_poly_t poly1, const fmpz_poly_t poly2, const fmpz_t x); +void fmpz_poly_scalar_divexact_fmpz( + fmpz_poly_t poly1, + const fmpz_poly_t poly2, + const fmpz_t x); + +void fmpz_poly_scalar_mod_fmpz( + fmpz_poly_t poly1, + const fmpz_poly_t poly2, + const fmpz_t x); +void fmpz_poly_scalar_smod_fmpz( + fmpz_poly_t poly1, + const fmpz_poly_t poly2, + const fmpz_t x); slong _fmpz_poly_remove_content_2exp(fmpz * pol, slong len); @@ -228,70 +322,221 @@ void _fmpz_poly_scale_2exp(fmpz * pol, slong len, slong k); /* Bit packing *************************************************************/ -void _fmpz_poly_bit_pack(mp_ptr arr, const fmpz * poly, slong len, flint_bitcnt_t bit_size, int negate); +void _fmpz_poly_bit_pack( + mp_ptr arr, + const fmpz * poly, + slong len, + flint_bitcnt_t bit_size, + int negate); void fmpz_poly_bit_pack(fmpz_t f, const fmpz_poly_t poly, flint_bitcnt_t bit_size); -int _fmpz_poly_bit_unpack(fmpz * poly, slong len, mp_srcptr arr, flint_bitcnt_t bit_size, int negate); +int _fmpz_poly_bit_unpack( + fmpz * poly, + slong len, + mp_srcptr arr, + flint_bitcnt_t bit_size, + int negate); void fmpz_poly_bit_unpack(fmpz_poly_t poly, const fmpz_t f, flint_bitcnt_t bit_size); -void _fmpz_poly_bit_unpack_unsigned(fmpz * poly, slong len, mp_srcptr arr, flint_bitcnt_t bit_size); -void fmpz_poly_bit_unpack_unsigned(fmpz_poly_t poly, const fmpz_t f, flint_bitcnt_t bit_size); +void _fmpz_poly_bit_unpack_unsigned( + fmpz * poly, + slong len, + mp_srcptr arr, + flint_bitcnt_t bit_size); +void fmpz_poly_bit_unpack_unsigned( + fmpz_poly_t poly, + const fmpz_t f, + flint_bitcnt_t bit_size); /* Multiplication **********************************************************/ -void _fmpz_poly_mul_classical(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -void fmpz_poly_mul_classical(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); - -void _fmpz_poly_mullow_classical(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, slong n); -void fmpz_poly_mullow_classical(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong n); - -void _fmpz_poly_mulhigh_classical(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, slong start); -void fmpz_poly_mulhigh_classical(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong start); - -void _fmpz_poly_mulmid_classical(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -void fmpz_poly_mulmid_classical(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); - -void _fmpz_poly_mul_karatsuba(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -void fmpz_poly_mul_karatsuba(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); - -void _fmpz_poly_mullow_karatsuba_n(fmpz * res, const fmpz * poly1, const fmpz * poly2, slong n); -void fmpz_poly_mullow_karatsuba_n(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong n); - -void _fmpz_poly_mullow_karatsuba(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, slong n); - -void _fmpz_poly_mulhigh_karatsuba_n(fmpz * res, const fmpz * poly1, const fmpz * poly2, slong len); -void fmpz_poly_mulhigh_karatsuba_n(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong length); - -void _fmpz_poly_mul_KS(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); +void _fmpz_poly_mul_classical( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +void fmpz_poly_mul_classical( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); + +void _fmpz_poly_mullow_classical( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + slong n); +void fmpz_poly_mullow_classical( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong n); + +void _fmpz_poly_mulhigh_classical( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + slong start); +void fmpz_poly_mulhigh_classical( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong start); + +void _fmpz_poly_mulmid_classical( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +void fmpz_poly_mulmid_classical( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); + +void _fmpz_poly_mul_karatsuba( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +void fmpz_poly_mul_karatsuba( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); + +void _fmpz_poly_mullow_karatsuba_n( + fmpz * res, + const fmpz * poly1, + const fmpz * poly2, + slong n); +void fmpz_poly_mullow_karatsuba_n( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong n); + +void _fmpz_poly_mullow_karatsuba( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + slong n); + +void _fmpz_poly_mulhigh_karatsuba_n( + fmpz * res, + const fmpz * poly1, + const fmpz * poly2, + slong len); +void fmpz_poly_mulhigh_karatsuba_n( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong length); + +void _fmpz_poly_mul_KS( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); void fmpz_poly_mul_KS(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); -void _fmpz_poly_mullow_KS(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, slong n); -void fmpz_poly_mullow_KS(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong n); - -void _fmpz_poly_mul_SS(fmpz * output, const fmpz * input1, slong length1, const fmpz * input2, slong length2); +void _fmpz_poly_mullow_KS( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + slong n); +void fmpz_poly_mullow_KS( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong n); + +void _fmpz_poly_mul_SS( + fmpz * output, + const fmpz * input1, + slong length1, + const fmpz * input2, + slong length2); void fmpz_poly_mul_SS(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); -void _fmpz_poly_mullow_SS(fmpz * output, const fmpz * input1, slong length1, const fmpz * input2, slong length2, slong n); -void fmpz_poly_mullow_SS(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong n); - -void _fmpz_poly_mul(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); +void _fmpz_poly_mullow_SS( + fmpz * output, + const fmpz * input1, + slong length1, + const fmpz * input2, + slong length2, + slong n); +void fmpz_poly_mullow_SS( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong n); + +void _fmpz_poly_mul( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); void fmpz_poly_mul(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); -void _fmpz_poly_mullow(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, slong n); -void fmpz_poly_mullow(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong n); - -void fmpz_poly_mulhigh_n(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong n); - -void _fmpz_poly_mulhigh(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, slong start); +void _fmpz_poly_mullow( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + slong n); +void fmpz_poly_mullow( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong n); + +void fmpz_poly_mulhigh_n( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong n); + +void _fmpz_poly_mulhigh( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + slong start); /* FFT precached multiplication **********************************************/ -void fmpz_poly_mul_SS_precache_init(fmpz_poly_mul_precache_t pre, slong len1, slong bits1, const fmpz_poly_t poly2); +void fmpz_poly_mul_SS_precache_init( + fmpz_poly_mul_precache_t pre, + slong len1, + slong bits1, + const fmpz_poly_t poly2); void fmpz_poly_mul_precache_clear(fmpz_poly_mul_precache_t pre); -void _fmpz_poly_mullow_SS_precache(fmpz * output, const fmpz * input1, slong len1, fmpz_poly_mul_precache_t pre, slong trunc); -void fmpz_poly_mullow_SS_precache(fmpz_poly_t res, const fmpz_poly_t poly1, fmpz_poly_mul_precache_t pre, slong n); +void _fmpz_poly_mullow_SS_precache( + fmpz * output, + const fmpz * input1, + slong len1, + fmpz_poly_mul_precache_t pre, + slong trunc); +void fmpz_poly_mullow_SS_precache( + fmpz_poly_t res, + const fmpz_poly_t poly1, + fmpz_poly_mul_precache_t pre, + slong n); FMPZ_POLY_INLINE void fmpz_poly_mul_SS_precache(fmpz_poly_t res, const fmpz_poly_t poly1, fmpz_poly_mul_precache_t pre) @@ -339,7 +584,12 @@ void fmpz_poly_pow_binomial(fmpz_poly_t res, const fmpz_poly_t poly, ulong e); void _fmpz_poly_pow_binexp(fmpz * res, const fmpz * poly, slong len, ulong e); void fmpz_poly_pow_binexp(fmpz_poly_t res, const fmpz_poly_t poly, ulong e); -void _fmpz_poly_pow_addchains(fmpz * res, const fmpz * poly, slong len, const int * a, int n); +void _fmpz_poly_pow_addchains( + fmpz * res, + const fmpz * poly, + slong len, + const int * a, + int n); void fmpz_poly_pow_addchains(fmpz_poly_t res, const fmpz_poly_t poly, ulong e); void _fmpz_poly_pow_small(fmpz * res, const fmpz * poly, slong len, ulong e); @@ -372,38 +622,125 @@ slong _fmpz_poly_hamming_weight(const fmpz * a, slong len); /* Greatest common divisor *************************************************/ -void _fmpz_poly_gcd_subresultant(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -void fmpz_poly_gcd_subresultant(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); - -int _fmpz_poly_gcd_heuristic(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -int fmpz_poly_gcd_heuristic(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); - -void _fmpz_poly_gcd_modular(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -void fmpz_poly_gcd_modular(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); - -void _fmpz_poly_gcd(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); +void _fmpz_poly_gcd_subresultant( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +void fmpz_poly_gcd_subresultant( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); + +int _fmpz_poly_gcd_heuristic( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +int fmpz_poly_gcd_heuristic( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); + +void _fmpz_poly_gcd_modular( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +void fmpz_poly_gcd_modular( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); + +void _fmpz_poly_gcd( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); void fmpz_poly_gcd(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); -void _fmpz_poly_lcm(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); +void _fmpz_poly_lcm( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); void fmpz_poly_lcm(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); -void _fmpz_poly_resultant_euclidean(fmpz_t res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -void fmpz_poly_resultant_euclidean(fmpz_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); - -void _fmpz_poly_resultant_modular(fmpz_t res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -void fmpz_poly_resultant_modular(fmpz_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); - -void _fmpz_poly_resultant(fmpz_t res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); +void _fmpz_poly_resultant_euclidean( + fmpz_t res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +void fmpz_poly_resultant_euclidean( + fmpz_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); + +void _fmpz_poly_resultant_modular( + fmpz_t res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +void fmpz_poly_resultant_modular( + fmpz_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); + +void _fmpz_poly_resultant( + fmpz_t res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); void fmpz_poly_resultant(fmpz_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); -void _fmpz_poly_resultant_modular_div(fmpz_t res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, const fmpz_t divisor, slong nbits); -void fmpz_poly_resultant_modular_div(fmpz_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, const fmpz_t divisor, slong nbits); - -void _fmpz_poly_xgcd_modular(fmpz_t r, fmpz * s, fmpz * t, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -void fmpz_poly_xgcd_modular(fmpz_t r, fmpz_poly_t s, fmpz_poly_t t, const fmpz_poly_t poly1, const fmpz_poly_t poly2); +void _fmpz_poly_resultant_modular_div( + fmpz_t res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + const fmpz_t divisor, + slong nbits); +void fmpz_poly_resultant_modular_div( + fmpz_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + const fmpz_t divisor, + slong nbits); + +void _fmpz_poly_xgcd_modular( + fmpz_t r, + fmpz * s, + fmpz * t, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +void fmpz_poly_xgcd_modular( + fmpz_t r, + fmpz_poly_t s, + fmpz_poly_t t, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); -FMPZ_POLY_INLINE void _fmpz_poly_xgcd(fmpz_t r, fmpz * s, fmpz * t, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2) { _fmpz_poly_xgcd_modular(r, s, t, poly1, len1, poly2, len2); } -FMPZ_POLY_INLINE void fmpz_poly_xgcd(fmpz_t r, fmpz_poly_t s, fmpz_poly_t t, const fmpz_poly_t poly1, const fmpz_poly_t poly2) { fmpz_poly_xgcd_modular(r, s, t, poly1, poly2); } +FMPZ_POLY_INLINE +void _fmpz_poly_xgcd(fmpz_t r, fmpz * s, fmpz * t, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2) +{ + _fmpz_poly_xgcd_modular(r, s, t, poly1, len1, poly2, len2); +} +FMPZ_POLY_INLINE +void fmpz_poly_xgcd(fmpz_t r, fmpz_poly_t s, fmpz_poly_t t, const fmpz_poly_t poly1, const fmpz_poly_t poly2) +{ + fmpz_poly_xgcd_modular(r, s, t, poly1, poly2); +} /* Discriminant ********************************************************/ @@ -425,38 +762,130 @@ int fmpz_poly_is_squarefree(const fmpz_poly_t poly); /* Euclidean division ******************************************************/ -int _fmpz_poly_divrem_basecase(fmpz * Q, fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB, int exact); -void fmpz_poly_divrem_basecase(fmpz_poly_t Q, fmpz_poly_t R, const fmpz_poly_t A, const fmpz_poly_t B); - -int _fmpz_poly_divrem_divconquer_recursive(fmpz * Q, fmpz * BQ, fmpz * W, const fmpz * A, const fmpz * B, slong lenB, int exact); - -int _fmpz_poly_divrem_divconquer(fmpz * Q, fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB, int exact); -void fmpz_poly_divrem_divconquer(fmpz_poly_t Q, fmpz_poly_t R, const fmpz_poly_t A, const fmpz_poly_t B); - -int _fmpz_poly_divrem(fmpz * Q, fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB, int exact); -void fmpz_poly_divrem(fmpz_poly_t Q, fmpz_poly_t R, const fmpz_poly_t A, const fmpz_poly_t B); - -int _fmpz_poly_div_basecase(fmpz * Q, fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB, int exact); +int _fmpz_poly_divrem_basecase( + fmpz * Q, + fmpz * R, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + int exact); +void fmpz_poly_divrem_basecase( + fmpz_poly_t Q, + fmpz_poly_t R, + const fmpz_poly_t A, + const fmpz_poly_t B); + +int _fmpz_poly_divrem_divconquer_recursive( + fmpz * Q, + fmpz * BQ, + fmpz * W, + const fmpz * A, + const fmpz * B, + slong lenB, + int exact); + +int _fmpz_poly_divrem_divconquer( + fmpz * Q, + fmpz * R, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + int exact); +void fmpz_poly_divrem_divconquer( + fmpz_poly_t Q, + fmpz_poly_t R, + const fmpz_poly_t A, + const fmpz_poly_t B); + +int _fmpz_poly_divrem( + fmpz * Q, + fmpz * R, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + int exact); +void fmpz_poly_divrem( + fmpz_poly_t Q, + fmpz_poly_t R, + const fmpz_poly_t A, + const fmpz_poly_t B); + +int _fmpz_poly_div_basecase( + fmpz * Q, + fmpz * R, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + int exact); void fmpz_poly_div_basecase(fmpz_poly_t Q, const fmpz_poly_t A, const fmpz_poly_t B); -int _fmpz_poly_divremlow_divconquer_recursive(fmpz * Q, fmpz * QB, const fmpz * A, const fmpz * B, slong lenB, int exact); - -int _fmpz_poly_div_divconquer_recursive(fmpz * Q, fmpz * temp, const fmpz * A, const fmpz * B, slong lenB, int exact); - -int _fmpz_poly_div_divconquer(fmpz * Q, const fmpz * A, slong lenA, const fmpz * B, slong lenB, int exact); +int _fmpz_poly_divremlow_divconquer_recursive( + fmpz * Q, + fmpz * QB, + const fmpz * A, + const fmpz * B, + slong lenB, + int exact); + +int _fmpz_poly_div_divconquer_recursive( + fmpz * Q, + fmpz * temp, + const fmpz * A, + const fmpz * B, + slong lenB, + int exact); + +int _fmpz_poly_div_divconquer( + fmpz * Q, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + int exact); void fmpz_poly_div_divconquer(fmpz_poly_t Q, const fmpz_poly_t A, const fmpz_poly_t B); -int _fmpz_poly_div(fmpz * Q, const fmpz * A, slong lenA, const fmpz * B, slong lenB, int exact); +int _fmpz_poly_div( + fmpz * Q, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + int exact); void fmpz_poly_div(fmpz_poly_t Q, const fmpz_poly_t A, const fmpz_poly_t B); void _fmpz_poly_preinvert(fmpz * B_inv, const fmpz * B, slong n); void fmpz_poly_preinvert(fmpz_poly_t B_inv, const fmpz_poly_t B); -void _fmpz_poly_div_preinv(fmpz * Q, const fmpz * A, slong len1, const fmpz * B, const fmpz * B_inv, slong len2); -void fmpz_poly_div_preinv(fmpz_poly_t Q, const fmpz_poly_t A, const fmpz_poly_t B, const fmpz_poly_t B_inv); - -void _fmpz_poly_divrem_preinv(fmpz * Q, fmpz * A, slong len1, const fmpz * B, const fmpz * B_inv, slong len2); -void fmpz_poly_divrem_preinv(fmpz_poly_t Q, fmpz_poly_t R, const fmpz_poly_t A, const fmpz_poly_t B, const fmpz_poly_t B_inv); +void _fmpz_poly_div_preinv( + fmpz * Q, + const fmpz * A, + slong len1, + const fmpz * B, + const fmpz * B_inv, + slong len2); +void fmpz_poly_div_preinv( + fmpz_poly_t Q, + const fmpz_poly_t A, + const fmpz_poly_t B, + const fmpz_poly_t B_inv); + +void _fmpz_poly_divrem_preinv( + fmpz * Q, + fmpz * A, + slong len1, + const fmpz * B, + const fmpz * B_inv, + slong len2); +void fmpz_poly_divrem_preinv( + fmpz_poly_t Q, + fmpz_poly_t R, + const fmpz_poly_t A, + const fmpz_poly_t B, + const fmpz_poly_t B_inv); fmpz ** _fmpz_poly_powers_precompute(const fmpz * B, slong len); void fmpz_poly_powers_precompute(fmpz_poly_powers_precomp_t pinv, fmpz_poly_t poly); @@ -464,10 +893,24 @@ void fmpz_poly_powers_precompute(fmpz_poly_powers_precomp_t pinv, fmpz_poly_t po void _fmpz_poly_powers_clear(fmpz ** powers, slong len); void fmpz_poly_powers_clear(fmpz_poly_powers_precomp_t pinv); -void _fmpz_poly_rem_powers_precomp(fmpz * A, slong m, const fmpz * B, slong n, fmpz ** const powers); -void fmpz_poly_rem_powers_precomp(fmpz_poly_t R, const fmpz_poly_t A, const fmpz_poly_t B, const fmpz_poly_powers_precomp_t B_inv); - -void _fmpz_poly_rem_basecase(fmpz * Q, const fmpz * A, slong lenA, const fmpz * B, slong lenB); +void _fmpz_poly_rem_powers_precomp( + fmpz * A, + slong m, + const fmpz * B, + slong n, + fmpz ** const powers); +void fmpz_poly_rem_powers_precomp( + fmpz_poly_t R, + const fmpz_poly_t A, + const fmpz_poly_t B, + const fmpz_poly_powers_precomp_t B_inv); + +void _fmpz_poly_rem_basecase( + fmpz * Q, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB); void fmpz_poly_rem_basecase(fmpz_poly_t R, const fmpz_poly_t A, const fmpz_poly_t B); void _fmpz_poly_rem(fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB); @@ -487,28 +930,77 @@ void fmpz_poly_inv_series_newton(fmpz_poly_t Qinv, const fmpz_poly_t Q, slong n) void _fmpz_poly_inv_series(fmpz * Qinv, const fmpz * Q, slong Qlen, slong n); void fmpz_poly_inv_series(fmpz_poly_t Qinv, const fmpz_poly_t Q, slong n); -void _fmpz_poly_div_series_basecase(fmpz * Q, const fmpz * A, slong Alen, const fmpz * B, slong Blen, slong n); -void fmpz_poly_div_series_basecase(fmpz_poly_t Q, const fmpz_poly_t A, const fmpz_poly_t B, slong n); - -void _fmpz_poly_div_series_divconquer(fmpz * Q, const fmpz * A, slong Alen, const fmpz * B, slong Blen, slong n); -void fmpz_poly_div_series_divconquer(fmpz_poly_t Q, const fmpz_poly_t A, const fmpz_poly_t B, slong n); - -void _fmpz_poly_div_series(fmpz * Q, const fmpz * A, slong Alen, const fmpz * B, slong Blen, slong n); -void fmpz_poly_div_series(fmpz_poly_t Q, const fmpz_poly_t A, const fmpz_poly_t B, slong n); +void _fmpz_poly_div_series_basecase( + fmpz * Q, + const fmpz * A, + slong Alen, + const fmpz * B, + slong Blen, + slong n); +void fmpz_poly_div_series_basecase( + fmpz_poly_t Q, + const fmpz_poly_t A, + const fmpz_poly_t B, + slong n); + +void _fmpz_poly_div_series_divconquer( + fmpz * Q, + const fmpz * A, + slong Alen, + const fmpz * B, + slong Blen, + slong n); +void fmpz_poly_div_series_divconquer( + fmpz_poly_t Q, + const fmpz_poly_t A, + const fmpz_poly_t B, + slong n); + +void _fmpz_poly_div_series( + fmpz * Q, + const fmpz * A, + slong Alen, + const fmpz * B, + slong Blen, + slong n); +void fmpz_poly_div_series( + fmpz_poly_t Q, + const fmpz_poly_t A, + const fmpz_poly_t B, + slong n); /* Divisibility testing ***************************************************/ int _fmpz_poly_divides(fmpz * q, const fmpz * a, slong len1, const fmpz * b, slong len2); int fmpz_poly_divides(fmpz_poly_t q, const fmpz_poly_t a, const fmpz_poly_t b); -slong fmpz_poly_remove(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); +slong fmpz_poly_remove( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); /* Pseudo division *********************************************************/ #ifdef FMPZ_H -void _fmpz_poly_pseudo_divrem_basecase(fmpz * Q, fmpz * R, ulong * d, const fmpz * A, slong A_len, const fmpz * B, slong B_len, const fmpz_preinvn_t inv); - -void _fmpz_poly_pseudo_divrem_divconquer(fmpz * Q, fmpz * R, ulong * d, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_preinvn_t inv); +void _fmpz_poly_pseudo_divrem_basecase( + fmpz * Q, + fmpz * R, + ulong * d, + const fmpz * A, + slong A_len, + const fmpz * B, + slong B_len, + const fmpz_preinvn_t inv); + +void _fmpz_poly_pseudo_divrem_divconquer( + fmpz * Q, + fmpz * R, + ulong * d, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_preinvn_t inv); FMPZ_POLY_INLINE void _fmpz_poly_pseudo_divrem(fmpz * Q, fmpz * R, ulong * d, const fmpz * A, slong A_len, const fmpz * B, slong B_len, const fmpz_preinvn_t inv) @@ -516,18 +1008,57 @@ void _fmpz_poly_pseudo_divrem(fmpz * Q, fmpz * R, ulong * d, const fmpz * A, slo _fmpz_poly_pseudo_divrem_divconquer(Q, R, d, A, A_len, B, B_len, inv); } -void _fmpz_poly_pseudo_div(fmpz * Q, ulong * d, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_preinvn_t inv); -void _fmpz_poly_pseudo_rem(fmpz * R, ulong * d, const fmpz * A, slong lenA, const fmpz * B, slong lenB, const fmpz_preinvn_t inv); +void _fmpz_poly_pseudo_div( + fmpz * Q, + ulong * d, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_preinvn_t inv); +void _fmpz_poly_pseudo_rem( + fmpz * R, + ulong * d, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB, + const fmpz_preinvn_t inv); #endif -void fmpz_poly_pseudo_divrem_basecase(fmpz_poly_t Q, fmpz_poly_t R, ulong * d, const fmpz_poly_t A, const fmpz_poly_t B); - -void fmpz_poly_pseudo_divrem_divconquer(fmpz_poly_t Q, fmpz_poly_t R, ulong * d, const fmpz_poly_t A, const fmpz_poly_t B); - -void _fmpz_poly_pseudo_divrem_cohen(fmpz * Q, fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB); -void fmpz_poly_pseudo_divrem_cohen(fmpz_poly_t Q, fmpz_poly_t R, const fmpz_poly_t A, const fmpz_poly_t B); - -void _fmpz_poly_pseudo_rem_cohen(fmpz * R, const fmpz * A, slong lenA, const fmpz * B, slong lenB); +void fmpz_poly_pseudo_divrem_basecase( + fmpz_poly_t Q, + fmpz_poly_t R, + ulong * d, + const fmpz_poly_t A, + const fmpz_poly_t B); + +void fmpz_poly_pseudo_divrem_divconquer( + fmpz_poly_t Q, + fmpz_poly_t R, + ulong * d, + const fmpz_poly_t A, + const fmpz_poly_t B); + +void _fmpz_poly_pseudo_divrem_cohen( + fmpz * Q, + fmpz * R, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB); +void fmpz_poly_pseudo_divrem_cohen( + fmpz_poly_t Q, + fmpz_poly_t R, + const fmpz_poly_t A, + const fmpz_poly_t B); + +void _fmpz_poly_pseudo_rem_cohen( + fmpz * R, + const fmpz * A, + slong lenA, + const fmpz * B, + slong lenB); void fmpz_poly_pseudo_rem_cohen(fmpz_poly_t R, const fmpz_poly_t A, const fmpz_poly_t B); FMPZ_POLY_INLINE @@ -536,11 +1067,29 @@ void fmpz_poly_pseudo_divrem(fmpz_poly_t Q, fmpz_poly_t R, ulong * d, const fmpz fmpz_poly_pseudo_divrem_divconquer(Q, R, d, A, B); } -void fmpz_poly_pseudo_div(fmpz_poly_t Q, ulong * d, const fmpz_poly_t A, const fmpz_poly_t B); -void fmpz_poly_pseudo_rem(fmpz_poly_t R, ulong * d, const fmpz_poly_t A, const fmpz_poly_t B); - -void fmpz_poly_divlow_smodp(fmpz * res, const fmpz_poly_t f, const fmpz_poly_t g, const fmpz_t p, slong n); -void fmpz_poly_divhigh_smodp(fmpz * res, const fmpz_poly_t f, const fmpz_poly_t g, const fmpz_t p, slong n); +void fmpz_poly_pseudo_div( + fmpz_poly_t Q, + ulong * d, + const fmpz_poly_t A, + const fmpz_poly_t B); +void fmpz_poly_pseudo_rem( + fmpz_poly_t R, + ulong * d, + const fmpz_poly_t A, + const fmpz_poly_t B); + +void fmpz_poly_divlow_smodp( + fmpz * res, + const fmpz_poly_t f, + const fmpz_poly_t g, + const fmpz_t p, + slong n); +void fmpz_poly_divhigh_smodp( + fmpz * res, + const fmpz_poly_t f, + const fmpz_poly_t g, + const fmpz_t p, + slong n); /* Derivative **************************************************************/ @@ -552,47 +1101,118 @@ void fmpz_poly_nth_derivative(fmpz_poly_t res, const fmpz_poly_t poly, ulong n); /* Evaluation **************************************************************/ -void _fmpz_poly_evaluate_divconquer_fmpz(fmpz_t res, const fmpz * poly, slong len, const fmpz_t a); -void fmpz_poly_evaluate_divconquer_fmpz(fmpz_t res, const fmpz_poly_t poly, const fmpz_t a); - -void _fmpz_poly_evaluate_horner_fmpz(fmpz_t res, const fmpz * f, slong len, const fmpz_t a); +void _fmpz_poly_evaluate_divconquer_fmpz( + fmpz_t res, + const fmpz * poly, + slong len, + const fmpz_t a); +void fmpz_poly_evaluate_divconquer_fmpz( + fmpz_t res, + const fmpz_poly_t poly, + const fmpz_t a); + +void _fmpz_poly_evaluate_horner_fmpz( + fmpz_t res, + const fmpz * f, + slong len, + const fmpz_t a); void fmpz_poly_evaluate_horner_fmpz(fmpz_t res, const fmpz_poly_t f, const fmpz_t a); void _fmpz_poly_evaluate_fmpz(fmpz_t res, const fmpz * f, slong len, const fmpz_t a); void fmpz_poly_evaluate_fmpz(fmpz_t res, const fmpz_poly_t f, const fmpz_t a); -void _fmpz_poly_evaluate_horner_fmpq(fmpz_t rnum, fmpz_t rden, const fmpz * f, slong len, const fmpz_t anum, const fmpz_t aden); +void _fmpz_poly_evaluate_horner_fmpq( + fmpz_t rnum, + fmpz_t rden, + const fmpz * f, + slong len, + const fmpz_t anum, + const fmpz_t aden); void fmpz_poly_evaluate_horner_fmpq(fmpq_t res, const fmpz_poly_t f, const fmpq_t a); -void _fmpz_poly_evaluate_divconquer_fmpq(fmpz_t rnum, fmpz_t rden, const fmpz * f, slong len, const fmpz_t anum, const fmpz_t aden); +void _fmpz_poly_evaluate_divconquer_fmpq( + fmpz_t rnum, + fmpz_t rden, + const fmpz * f, + slong len, + const fmpz_t anum, + const fmpz_t aden); void fmpz_poly_evaluate_divconquer_fmpq(fmpq_t res, const fmpz_poly_t f, const fmpq_t a); -void _fmpz_poly_evaluate_fmpq(fmpz_t rnum, fmpz_t rden, const fmpz * f, slong len, const fmpz_t anum, const fmpz_t aden); +void _fmpz_poly_evaluate_fmpq( + fmpz_t rnum, + fmpz_t rden, + const fmpz * f, + slong len, + const fmpz_t anum, + const fmpz_t aden); void fmpz_poly_evaluate_fmpq(fmpq_t res, const fmpz_poly_t f, const fmpq_t a); -mp_limb_t _fmpz_poly_evaluate_mod(const fmpz * poly, slong len, mp_limb_t a, mp_limb_t n, mp_limb_t ninv); +mp_limb_t _fmpz_poly_evaluate_mod( + const fmpz * poly, + slong len, + mp_limb_t a, + mp_limb_t n, + mp_limb_t ninv); mp_limb_t fmpz_poly_evaluate_mod(const fmpz_poly_t poly, mp_limb_t a, mp_limb_t n); double _fmpz_poly_evaluate_horner_d(const fmpz * poly, slong n, double d); double fmpz_poly_evaluate_horner_d(const fmpz_poly_t poly, double d); -double _fmpz_poly_evaluate_horner_d_2exp(slong * exp, const fmpz * poly, slong n, double d); +double _fmpz_poly_evaluate_horner_d_2exp( + slong * exp, + const fmpz * poly, + slong n, + double d); double fmpz_poly_evaluate_horner_d_2exp(slong * exp, const fmpz_poly_t poly, double d); -double _fmpz_poly_evaluate_horner_d_2exp2(slong * exp, const fmpz * poly, slong n, double d, slong dexp); +double _fmpz_poly_evaluate_horner_d_2exp2( + slong * exp, + const fmpz * poly, + slong n, + double d, + slong dexp); -double fmpz_poly_evaluate_horner_d_2exp2(slong * exp, const fmpz_poly_t poly, double d, slong dexp); +double fmpz_poly_evaluate_horner_d_2exp2( + slong * exp, + const fmpz_poly_t poly, + double d, + slong dexp); /* Composition *************************************************************/ -void _fmpz_poly_compose_horner(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -void fmpz_poly_compose_horner(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); - -void _fmpz_poly_compose_divconquer(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -void fmpz_poly_compose_divconquer(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); - -void _fmpz_poly_compose(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2); -void fmpz_poly_compose(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2); +void _fmpz_poly_compose_horner( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +void fmpz_poly_compose_horner( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); + +void _fmpz_poly_compose_divconquer( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +void fmpz_poly_compose_divconquer( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); + +void _fmpz_poly_compose( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2); +void fmpz_poly_compose( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2); /* Taylor shift ************************************************************/ @@ -600,7 +1220,10 @@ void _fmpz_poly_taylor_shift_horner(fmpz * poly, const fmpz_t c, slong n); void fmpz_poly_taylor_shift_horner(fmpz_poly_t g, const fmpz_poly_t f, const fmpz_t c); void _fmpz_poly_taylor_shift_divconquer(fmpz * poly, const fmpz_t c, slong n); -void fmpz_poly_taylor_shift_divconquer(fmpz_poly_t g, const fmpz_poly_t f, const fmpz_t c); +void fmpz_poly_taylor_shift_divconquer( + fmpz_poly_t g, + const fmpz_poly_t f, + const fmpz_t c); void _fmpz_poly_taylor_shift_multi_mod(fmpz * poly, const fmpz_t c, slong n); FMPZ_POLY_INLINE void fmpz_poly_taylor_shift_multi_mod(fmpz_poly_t g, const fmpz_poly_t f, const fmpz_t c) @@ -615,14 +1238,44 @@ void fmpz_poly_taylor_shift(fmpz_poly_t g, const fmpz_poly_t f, const fmpz_t c); /* Power series composition and compositional inverse **********************/ -void _fmpz_poly_compose_series_brent_kung(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, slong n); -void fmpz_poly_compose_series_brent_kung(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong n); - -void _fmpz_poly_compose_series_horner(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, slong n); -void fmpz_poly_compose_series_horner(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong n); - -void _fmpz_poly_compose_series(fmpz * res, const fmpz * poly1, slong len1, const fmpz * poly2, slong len2, slong n); -void fmpz_poly_compose_series(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_poly_t poly2, slong n); +void _fmpz_poly_compose_series_brent_kung( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + slong n); +void fmpz_poly_compose_series_brent_kung( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong n); + +void _fmpz_poly_compose_series_horner( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + slong n); +void fmpz_poly_compose_series_horner( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong n); + +void _fmpz_poly_compose_series( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz * poly2, + slong len2, + slong n); +void fmpz_poly_compose_series( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_poly_t poly2, + slong n); void _fmpz_poly_revert_series(fmpz * Qinv, const fmpz * Q, slong Qlen, slong n); void fmpz_poly_revert_series(fmpz_poly_t Qinv, const fmpz_poly_t Q, slong n); @@ -632,7 +1285,12 @@ void fmpz_poly_revert_series(fmpz_poly_t Qinv, const fmpz_poly_t Q, slong n); int _fmpz_poly_sqrtrem_classical(fmpz * res, fmpz * r, const fmpz * poly, slong len); int fmpz_poly_sqrtrem_classical(fmpz_poly_t b, fmpz_poly_t r, const fmpz_poly_t a); -int _fmpz_poly_sqrtrem_divconquer(fmpz * res, fmpz * r, const fmpz * poly, slong len, fmpz * temp); +int _fmpz_poly_sqrtrem_divconquer( + fmpz * res, + fmpz * r, + const fmpz * poly, + slong len, + fmpz * temp); int fmpz_poly_sqrtrem_divconquer(fmpz_poly_t b, fmpz_poly_t r, const fmpz_poly_t a); int _fmpz_poly_sqrt_classical(fmpz * res, const fmpz * poly, slong len, int exact); @@ -696,9 +1354,34 @@ void fmpz_poly_get_nmod_poly(nmod_poly_t res, const fmpz_poly_t poly); void fmpz_poly_set_nmod_poly(fmpz_poly_t res, const nmod_poly_t poly); void fmpz_poly_set_nmod_poly_unsigned(fmpz_poly_t res, const nmod_poly_t poly); -void _fmpz_poly_CRT_ui_precomp(fmpz * res, const fmpz * poly1, slong len1, const fmpz_t m1, mp_srcptr poly2, slong len2, mp_limb_t m2, mp_limb_t m2inv, fmpz_t m1m2, mp_limb_t c, int sign); -void _fmpz_poly_CRT_ui(fmpz * res, const fmpz * poly1, slong len1, const fmpz_t m1, mp_srcptr poly2, slong len2, mp_limb_t m2, mp_limb_t m2inv, int sign); -void fmpz_poly_CRT_ui(fmpz_poly_t res, const fmpz_poly_t poly1, const fmpz_t m1, const nmod_poly_t poly2, int sign); +void _fmpz_poly_CRT_ui_precomp( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz_t m1, + mp_srcptr poly2, + slong len2, + mp_limb_t m2, + mp_limb_t m2inv, + fmpz_t m1m2, + mp_limb_t c, + int sign); +void _fmpz_poly_CRT_ui( + fmpz * res, + const fmpz * poly1, + slong len1, + const fmpz_t m1, + mp_srcptr poly2, + slong len2, + mp_limb_t m2, + mp_limb_t m2inv, + int sign); +void fmpz_poly_CRT_ui( + fmpz_poly_t res, + const fmpz_poly_t poly1, + const fmpz_t m1, + const nmod_poly_t poly2, + int sign); /* Products *****************************************************************/ @@ -717,38 +1400,145 @@ void _fmpz_poly_newton_to_monomial(fmpz * poly, const fmpz * roots, slong n); /* Multipoint evaluation and interpolation **********************************/ -void fmpz_poly_evaluate_fmpz_vec(fmpz * res, const fmpz_poly_t f, const fmpz * a, slong n); +void fmpz_poly_evaluate_fmpz_vec( + fmpz * res, + const fmpz_poly_t f, + const fmpz * a, + slong n); -void fmpz_poly_interpolate_fmpz_vec(fmpz_poly_t poly, const fmpz * xs, const fmpz * ys, slong n); +void fmpz_poly_interpolate_fmpz_vec( + fmpz_poly_t poly, + const fmpz * xs, + const fmpz * ys, + slong n); /* Hensel lifting ************************************************************/ -void fmpz_poly_hensel_build_tree(slong * link, fmpz_poly_t * v, fmpz_poly_t * w, const nmod_poly_factor_t fac); - -void fmpz_poly_hensel_lift(fmpz_poly_t Gout, fmpz_poly_t Hout, fmpz_poly_t Aout, fmpz_poly_t Bout, const fmpz_poly_t f, const fmpz_poly_t g, const fmpz_poly_t h, const fmpz_poly_t a, const fmpz_poly_t b, const fmpz_t p, const fmpz_t p1); - -void _fmpz_poly_hensel_lift_without_inverse(fmpz * G, fmpz * H, const fmpz * f, slong lenF, const fmpz * g, slong lenG, const fmpz * h, slong lenH, const fmpz * a, slong lenA, const fmpz * b, slong lenB, const fmpz_t p, const fmpz_t p1); -void fmpz_poly_hensel_lift_without_inverse(fmpz_poly_t Gout, fmpz_poly_t Hout, const fmpz_poly_t f, const fmpz_poly_t g, const fmpz_poly_t h, const fmpz_poly_t a, const fmpz_poly_t b, const fmpz_t p, const fmpz_t p1); - -void _fmpz_poly_hensel_lift_only_inverse(fmpz * A, fmpz * B, const fmpz * G, slong lenG, const fmpz * H, slong lenH, const fmpz * a, slong lenA, const fmpz * b, slong lenB, const fmpz_t p, const fmpz_t p1); -void fmpz_poly_hensel_lift_only_inverse(fmpz_poly_t Aout, fmpz_poly_t Bout, const fmpz_poly_t G, const fmpz_poly_t H, const fmpz_poly_t a, const fmpz_poly_t b, const fmpz_t p, const fmpz_t p1); - -void fmpz_poly_hensel_lift_tree_recursive(slong * link, fmpz_poly_t * v, fmpz_poly_t * w, fmpz_poly_t f, slong j, slong inv, const fmpz_t p0, const fmpz_t p1); - -void fmpz_poly_hensel_lift_tree(slong *link, fmpz_poly_t *v, fmpz_poly_t *w, fmpz_poly_t f, slong r, const fmpz_t p, slong e0, slong e1, slong inv); - -slong _fmpz_poly_hensel_start_lift(fmpz_poly_factor_t lifted_fac, slong * link, fmpz_poly_t * v, fmpz_poly_t * w, const fmpz_poly_t f, const nmod_poly_factor_t local_fac, slong target_exp); - -slong _fmpz_poly_hensel_continue_lift(fmpz_poly_factor_t lifted_fac, slong * link, fmpz_poly_t * v, fmpz_poly_t * w, const fmpz_poly_t f, slong prev, slong curr, slong N, const fmpz_t p); - -void fmpz_poly_hensel_lift_once(fmpz_poly_factor_t lifted_fac, const fmpz_poly_t f, const nmod_poly_factor_t local_fac, slong N); +void fmpz_poly_hensel_build_tree( + slong * link, + fmpz_poly_t * v, + fmpz_poly_t * w, + const nmod_poly_factor_t fac); + +void fmpz_poly_hensel_lift( + fmpz_poly_t Gout, + fmpz_poly_t Hout, + fmpz_poly_t Aout, + fmpz_poly_t Bout, + const fmpz_poly_t f, + const fmpz_poly_t g, + const fmpz_poly_t h, + const fmpz_poly_t a, + const fmpz_poly_t b, + const fmpz_t p, + const fmpz_t p1); + +void _fmpz_poly_hensel_lift_without_inverse( + fmpz * G, + fmpz * H, + const fmpz * f, + slong lenF, + const fmpz * g, + slong lenG, + const fmpz * h, + slong lenH, + const fmpz * a, + slong lenA, + const fmpz * b, + slong lenB, + const fmpz_t p, + const fmpz_t p1); +void fmpz_poly_hensel_lift_without_inverse( + fmpz_poly_t Gout, + fmpz_poly_t Hout, + const fmpz_poly_t f, + const fmpz_poly_t g, + const fmpz_poly_t h, + const fmpz_poly_t a, + const fmpz_poly_t b, + const fmpz_t p, + const fmpz_t p1); + +void _fmpz_poly_hensel_lift_only_inverse( + fmpz * A, + fmpz * B, + const fmpz * G, + slong lenG, + const fmpz * H, + slong lenH, + const fmpz * a, + slong lenA, + const fmpz * b, + slong lenB, + const fmpz_t p, + const fmpz_t p1); +void fmpz_poly_hensel_lift_only_inverse( + fmpz_poly_t Aout, + fmpz_poly_t Bout, + const fmpz_poly_t G, + const fmpz_poly_t H, + const fmpz_poly_t a, + const fmpz_poly_t b, + const fmpz_t p, + const fmpz_t p1); + +void fmpz_poly_hensel_lift_tree_recursive( + slong * link, + fmpz_poly_t * v, + fmpz_poly_t * w, + fmpz_poly_t f, + slong j, + slong inv, + const fmpz_t p0, + const fmpz_t p1); + +void fmpz_poly_hensel_lift_tree( + slong *link, + fmpz_poly_t *v, + fmpz_poly_t *w, + fmpz_poly_t f, + slong r, + const fmpz_t p, + slong e0, + slong e1, + slong inv); + +slong _fmpz_poly_hensel_start_lift( + fmpz_poly_factor_t lifted_fac, + slong * link, + fmpz_poly_t * v, + fmpz_poly_t * w, + const fmpz_poly_t f, + const nmod_poly_factor_t local_fac, + slong target_exp); + +slong _fmpz_poly_hensel_continue_lift( + fmpz_poly_factor_t lifted_fac, + slong * link, + fmpz_poly_t * v, + fmpz_poly_t * w, + const fmpz_poly_t f, + slong prev, + slong curr, + slong N, + const fmpz_t p); + +void fmpz_poly_hensel_lift_once( + fmpz_poly_factor_t lifted_fac, + const fmpz_poly_t f, + const nmod_poly_factor_t local_fac, + slong N); /* Roots *********************************************************************/ void _fmpz_poly_bound_roots(fmpz_t bound, const fmpz * poly, slong len); void fmpz_poly_bound_roots(fmpz_t bound, const fmpz_poly_t poly); -void _fmpz_poly_num_real_roots_sturm(slong * n_neg, slong * n_pos, const fmpz * pol, slong len); +void _fmpz_poly_num_real_roots_sturm( + slong * n_neg, + slong * n_pos, + const fmpz * pol, + slong len); slong fmpz_poly_num_real_roots_sturm(const fmpz_poly_t poly); slong _fmpz_poly_num_real_roots(const fmpz * pol, slong len); @@ -760,7 +1550,12 @@ void fmpz_poly_CLD_bound(fmpz_t res, const fmpz_poly_t f, slong n); /* Special polynomials *******************************************************/ -void _fmpz_poly_cyclotomic(fmpz * a, ulong n, mp_ptr factors, slong num_factors, ulong phi); +void _fmpz_poly_cyclotomic( + fmpz * a, + ulong n, + mp_ptr factors, + slong num_factors, + ulong phi); void fmpz_poly_cyclotomic(fmpz_poly_t poly, ulong n); ulong _fmpz_poly_is_cyclotomic(const fmpz * poly, slong len); diff --git a/src/fmpz_poly_factor.h b/src/fmpz_poly_factor.h index 3a8153fee7..050e1c4d90 100644 --- a/src/fmpz_poly_factor.h +++ b/src/fmpz_poly_factor.h @@ -46,19 +46,46 @@ void fmpz_poly_factor_squarefree(fmpz_poly_factor_t fac, const fmpz_poly_t F); void fmpz_poly_factor_mignotte(fmpz_t B, const fmpz_poly_t f); -void fmpz_poly_factor_zassenhaus_recombination(fmpz_poly_factor_t final_fac, const fmpz_poly_factor_t lifted_fac, const fmpz_poly_t F, const fmpz_t P, slong exp); - -void _fmpz_poly_factor_zassenhaus(fmpz_poly_factor_t final_fac, slong exp, const fmpz_poly_t f, slong cutoff, int use_van_hoeij); +void fmpz_poly_factor_zassenhaus_recombination( + fmpz_poly_factor_t final_fac, + const fmpz_poly_factor_t lifted_fac, + const fmpz_poly_t F, + const fmpz_t P, + slong exp); + +void _fmpz_poly_factor_zassenhaus( + fmpz_poly_factor_t final_fac, + slong exp, + const fmpz_poly_t f, + slong cutoff, + int use_van_hoeij); void fmpz_poly_factor_zassenhaus(fmpz_poly_factor_t fac, const fmpz_poly_t G); void _fmpz_poly_factor_quadratic(fmpz_poly_factor_t fac, const fmpz_poly_t f, slong exp); void _fmpz_poly_factor_cubic(fmpz_poly_factor_t fac, const fmpz_poly_t f, slong exp); -slong _fmpz_poly_factor_CLD_mat(fmpz_mat_t res, const fmpz_poly_t f, fmpz_poly_factor_t lifted_fac, fmpz_t P, ulong k); - -int fmpz_poly_factor_van_hoeij_check_if_solved(fmpz_mat_t M, fmpz_poly_factor_t final_fac, fmpz_poly_factor_t lifted_fac, const fmpz_poly_t f, fmpz_t P, slong exp, fmpz_t lc); - -void fmpz_poly_factor_van_hoeij(fmpz_poly_factor_t final_fac, const nmod_poly_factor_t fac, const fmpz_poly_t f, slong exp, ulong p); +slong _fmpz_poly_factor_CLD_mat( + fmpz_mat_t res, + const fmpz_poly_t f, + fmpz_poly_factor_t lifted_fac, + fmpz_t P, + ulong k); + +int fmpz_poly_factor_van_hoeij_check_if_solved( + fmpz_mat_t M, + fmpz_poly_factor_t final_fac, + fmpz_poly_factor_t lifted_fac, + const fmpz_poly_t f, + fmpz_t P, + slong exp, + fmpz_t lc); + +void fmpz_poly_factor_van_hoeij( + fmpz_poly_factor_t final_fac, + const nmod_poly_factor_t fac, + const fmpz_poly_t f, + slong exp, + ulong p); void fmpz_poly_factor(fmpz_poly_factor_t fac, const fmpz_poly_t G); @@ -126,7 +153,13 @@ int zassenhaus_prune_degree_is_possible(const zassenhaus_prune_t Z, slong d) return Z->pos_degs[d]; } -void fmpz_poly_factor_zassenhaus_recombination_with_prune(fmpz_poly_factor_t final_fac, const fmpz_poly_factor_t lifted_fac, const fmpz_poly_t F, const fmpz_t P, slong exp, const zassenhaus_prune_t Z); +void fmpz_poly_factor_zassenhaus_recombination_with_prune( + fmpz_poly_factor_t final_fac, + const fmpz_poly_factor_t lifted_fac, + const fmpz_poly_t F, + const fmpz_t P, + slong exp, + const zassenhaus_prune_t Z); #ifdef __cplusplus } diff --git a/src/fmpz_poly_mat.h b/src/fmpz_poly_mat.h index 086c3a5ac5..801ca45e73 100644 --- a/src/fmpz_poly_mat.h +++ b/src/fmpz_poly_mat.h @@ -26,9 +26,21 @@ extern "C" { /* Types *********************************************************************/ -FMPZ_POLY_MAT_INLINE fmpz_poly_struct * fmpz_poly_mat_entry(const fmpz_poly_mat_t mat, slong i, slong j) { return mat->rows[i] + j; } -FMPZ_POLY_MAT_INLINE slong fmpz_poly_mat_nrows(const fmpz_poly_mat_t mat) { return mat->r; } -FMPZ_POLY_MAT_INLINE slong fmpz_poly_mat_ncols(const fmpz_poly_mat_t mat) { return mat->c; } +FMPZ_POLY_MAT_INLINE +fmpz_poly_struct * fmpz_poly_mat_entry(const fmpz_poly_mat_t mat, slong i, slong j) +{ + return mat->rows[i] + j; +} +FMPZ_POLY_MAT_INLINE +slong fmpz_poly_mat_nrows(const fmpz_poly_mat_t mat) +{ + return mat->r; +} +FMPZ_POLY_MAT_INLINE +slong fmpz_poly_mat_ncols(const fmpz_poly_mat_t mat) +{ + return mat->c; +} /* Memory management *********************************************************/ @@ -48,8 +60,16 @@ int fmpz_poly_mat_equal(const fmpz_poly_mat_t mat1, const fmpz_poly_mat_t mat2); int fmpz_poly_mat_is_zero(const fmpz_poly_mat_t mat); int fmpz_poly_mat_is_one(const fmpz_poly_mat_t mat); -FMPZ_POLY_MAT_INLINE int fmpz_poly_mat_is_empty(const fmpz_poly_mat_t mat) { return mat->r == 0 || mat->c == 0; } -FMPZ_POLY_MAT_INLINE int fmpz_poly_mat_is_square(const fmpz_poly_mat_t mat) { return mat->r == mat->c; } +FMPZ_POLY_MAT_INLINE +int fmpz_poly_mat_is_empty(const fmpz_poly_mat_t mat) +{ + return mat->r == 0 || mat->c == 0; +} +FMPZ_POLY_MAT_INLINE +int fmpz_poly_mat_is_square(const fmpz_poly_mat_t mat) +{ + return mat->r == mat->c; +} /* Standard matrices *********************************************************/ @@ -58,17 +78,42 @@ void fmpz_poly_mat_one(fmpz_poly_mat_t mat); /* Random matrices ***********************************************************/ -void fmpz_poly_mat_randtest(fmpz_poly_mat_t mat, flint_rand_t state, slong len, flint_bitcnt_t bits); -void fmpz_poly_mat_randtest_unsigned(fmpz_poly_mat_t mat, flint_rand_t state, slong len, flint_bitcnt_t bits); -void fmpz_poly_mat_randtest_sparse(fmpz_poly_mat_t A, flint_rand_t state, slong len, flint_bitcnt_t bits, float density); +void fmpz_poly_mat_randtest( + fmpz_poly_mat_t mat, + flint_rand_t state, + slong len, + flint_bitcnt_t bits); +void fmpz_poly_mat_randtest_unsigned( + fmpz_poly_mat_t mat, + flint_rand_t state, + slong len, + flint_bitcnt_t bits); +void fmpz_poly_mat_randtest_sparse( + fmpz_poly_mat_t A, + flint_rand_t state, + slong len, + flint_bitcnt_t bits, + float density); /* Windows and concatenation *************************************************/ -void fmpz_poly_mat_window_init(fmpz_poly_mat_t window, const fmpz_poly_mat_t mat, slong r1, slong c1, slong r2, slong c2); +void fmpz_poly_mat_window_init( + fmpz_poly_mat_t window, + const fmpz_poly_mat_t mat, + slong r1, + slong c1, + slong r2, + slong c2); void fmpz_poly_mat_window_clear(fmpz_poly_mat_t window); -void fmpz_poly_mat_concat_horizontal(fmpz_poly_mat_t res, const fmpz_poly_mat_t mat1, const fmpz_poly_mat_t mat2); -void fmpz_poly_mat_concat_vertical(fmpz_poly_mat_t res, const fmpz_poly_mat_t mat1, const fmpz_poly_mat_t mat2); +void fmpz_poly_mat_concat_horizontal( + fmpz_poly_mat_t res, + const fmpz_poly_mat_t mat1, + const fmpz_poly_mat_t mat2); +void fmpz_poly_mat_concat_vertical( + fmpz_poly_mat_t res, + const fmpz_poly_mat_t mat1, + const fmpz_poly_mat_t mat2); /* Input and output **********************************************************/ @@ -90,20 +135,45 @@ void fmpz_poly_mat_truncate(fmpz_poly_mat_t A, slong len); /* Scalar arithmetic *********************************************************/ -void fmpz_poly_mat_scalar_mul_fmpz(fmpz_poly_mat_t B, const fmpz_poly_mat_t A, const fmpz_t c); -void fmpz_poly_mat_scalar_mul_fmpz_poly(fmpz_poly_mat_t B, const fmpz_poly_mat_t A, const fmpz_poly_t c); +void fmpz_poly_mat_scalar_mul_fmpz( + fmpz_poly_mat_t B, + const fmpz_poly_mat_t A, + const fmpz_t c); +void fmpz_poly_mat_scalar_mul_fmpz_poly( + fmpz_poly_mat_t B, + const fmpz_poly_mat_t A, + const fmpz_poly_t c); /* Matrix arithmetic *********************************************************/ -void fmpz_poly_mat_add(fmpz_poly_mat_t C, const fmpz_poly_mat_t A, const fmpz_poly_mat_t B); -void fmpz_poly_mat_sub(fmpz_poly_mat_t C, const fmpz_poly_mat_t A, const fmpz_poly_mat_t B); +void fmpz_poly_mat_add( + fmpz_poly_mat_t C, + const fmpz_poly_mat_t A, + const fmpz_poly_mat_t B); +void fmpz_poly_mat_sub( + fmpz_poly_mat_t C, + const fmpz_poly_mat_t A, + const fmpz_poly_mat_t B); void fmpz_poly_mat_neg(fmpz_poly_mat_t B, const fmpz_poly_mat_t A); -void fmpz_poly_mat_mul_classical(fmpz_poly_mat_t C, const fmpz_poly_mat_t A, const fmpz_poly_mat_t B); -void fmpz_poly_mat_mul_KS(fmpz_poly_mat_t C, const fmpz_poly_mat_t A, const fmpz_poly_mat_t B); -void fmpz_poly_mat_mul(fmpz_poly_mat_t C, const fmpz_poly_mat_t A, const fmpz_poly_mat_t B); - -void fmpz_poly_mat_mullow(fmpz_poly_mat_t C, const fmpz_poly_mat_t A, const fmpz_poly_mat_t B, slong len); +void fmpz_poly_mat_mul_classical( + fmpz_poly_mat_t C, + const fmpz_poly_mat_t A, + const fmpz_poly_mat_t B); +void fmpz_poly_mat_mul_KS( + fmpz_poly_mat_t C, + const fmpz_poly_mat_t A, + const fmpz_poly_mat_t B); +void fmpz_poly_mat_mul( + fmpz_poly_mat_t C, + const fmpz_poly_mat_t A, + const fmpz_poly_mat_t B); + +void fmpz_poly_mat_mullow( + fmpz_poly_mat_t C, + const fmpz_poly_mat_t A, + const fmpz_poly_mat_t B, + slong len); void fmpz_poly_mat_sqr_classical(fmpz_poly_mat_t B, const fmpz_poly_mat_t A); void fmpz_poly_mat_sqr_KS(fmpz_poly_mat_t B, const fmpz_poly_mat_t A); @@ -113,7 +183,11 @@ void fmpz_poly_mat_sqrlow(fmpz_poly_mat_t B, const fmpz_poly_mat_t A, slong len) void fmpz_poly_mat_pow(fmpz_poly_mat_t B, const fmpz_poly_mat_t A, ulong exp); -void fmpz_poly_mat_pow_trunc(fmpz_poly_mat_t B, const fmpz_poly_mat_t A, ulong exp, slong len); +void fmpz_poly_mat_pow_trunc( + fmpz_poly_mat_t B, + const fmpz_poly_mat_t A, + ulong exp, + slong len); void fmpz_poly_mat_prod(fmpz_poly_mat_t res, fmpz_poly_mat_t * const factors, slong n); @@ -123,10 +197,23 @@ void fmpz_poly_mat_evaluate_fmpz(fmpz_mat_t B, const fmpz_poly_mat_t A, const fm /* Row reduction *************************************************************/ -slong fmpz_poly_mat_find_pivot_any(const fmpz_poly_mat_t mat, slong start_row, slong end_row, slong c); -slong fmpz_poly_mat_find_pivot_partial(const fmpz_poly_mat_t mat, slong start_row, slong end_row, slong c); - -slong fmpz_poly_mat_fflu(fmpz_poly_mat_t B, fmpz_poly_t den, slong * perm, const fmpz_poly_mat_t A, int rank_check); +slong fmpz_poly_mat_find_pivot_any( + const fmpz_poly_mat_t mat, + slong start_row, + slong end_row, + slong c); +slong fmpz_poly_mat_find_pivot_partial( + const fmpz_poly_mat_t mat, + slong start_row, + slong end_row, + slong c); + +slong fmpz_poly_mat_fflu( + fmpz_poly_mat_t B, + fmpz_poly_t den, + slong * perm, + const fmpz_poly_mat_t A, + int rank_check); slong fmpz_poly_mat_rref(fmpz_poly_mat_t B, fmpz_poly_t den, const fmpz_poly_mat_t A); @@ -152,9 +239,21 @@ slong fmpz_poly_mat_nullspace(fmpz_poly_mat_t res, const fmpz_poly_mat_t mat); /* Solving *******************************************************************/ -void fmpz_poly_mat_solve_fflu_precomp(fmpz_poly_mat_t X, const slong * perm, const fmpz_poly_mat_t FFLU, const fmpz_poly_mat_t B); -int fmpz_poly_mat_solve_fflu(fmpz_poly_mat_t X, fmpz_poly_t den, const fmpz_poly_mat_t A, const fmpz_poly_mat_t B); -int fmpz_poly_mat_solve(fmpz_poly_mat_t X, fmpz_poly_t den, const fmpz_poly_mat_t A, const fmpz_poly_mat_t B); +void fmpz_poly_mat_solve_fflu_precomp( + fmpz_poly_mat_t X, + const slong * perm, + const fmpz_poly_mat_t FFLU, + const fmpz_poly_mat_t B); +int fmpz_poly_mat_solve_fflu( + fmpz_poly_mat_t X, + fmpz_poly_t den, + const fmpz_poly_mat_t A, + const fmpz_poly_mat_t B); +int fmpz_poly_mat_solve( + fmpz_poly_mat_t X, + fmpz_poly_t den, + const fmpz_poly_mat_t A, + const fmpz_poly_mat_t B); #ifdef __cplusplus } diff --git a/src/fmpz_poly_q.h b/src/fmpz_poly_q.h index c184c20466..5accd8ccbf 100644 --- a/src/fmpz_poly_q.h +++ b/src/fmpz_poly_q.h @@ -41,8 +41,20 @@ void fmpz_poly_q_clear(fmpz_poly_q_t rop); /* Randomisation *************************************************************/ -void fmpz_poly_q_randtest(fmpz_poly_q_t poly, flint_rand_t state, slong len1, flint_bitcnt_t bits1, slong len2, flint_bitcnt_t bits2); -void fmpz_poly_q_randtest_not_zero(fmpz_poly_q_t poly, flint_rand_t state, slong len1, flint_bitcnt_t bits1, slong len2, flint_bitcnt_t bits2); +void fmpz_poly_q_randtest( + fmpz_poly_q_t poly, + flint_rand_t state, + slong len1, + flint_bitcnt_t bits1, + slong len2, + flint_bitcnt_t bits2); +void fmpz_poly_q_randtest_not_zero( + fmpz_poly_q_t poly, + flint_rand_t state, + slong len1, + flint_bitcnt_t bits1, + slong len2, + flint_bitcnt_t bits2); /* Assignment ****************************************************************/ @@ -51,45 +63,99 @@ void fmpz_poly_q_set(fmpz_poly_q_t rop, const fmpz_poly_q_t op); void fmpz_poly_q_swap(fmpz_poly_q_t op1, fmpz_poly_q_t op2); -FMPZ_POLY_Q_INLINE void fmpz_poly_q_zero(fmpz_poly_q_t rop) { fmpz_poly_zero(rop->num); fmpz_poly_set_si(rop->den, 1); } -FMPZ_POLY_Q_INLINE void fmpz_poly_q_one(fmpz_poly_q_t rop) { fmpz_poly_set_si(rop->num, 1); fmpz_poly_set_si(rop->den, 1); } +FMPZ_POLY_Q_INLINE +void fmpz_poly_q_zero(fmpz_poly_q_t rop) +{ + fmpz_poly_zero(rop->num); fmpz_poly_set_si(rop->den, 1); +} +FMPZ_POLY_Q_INLINE +void fmpz_poly_q_one(fmpz_poly_q_t rop) +{ + fmpz_poly_set_si(rop->num, 1); fmpz_poly_set_si(rop->den, 1); +} void fmpz_poly_q_inv(fmpz_poly_q_t rop, const fmpz_poly_q_t op); /* Comparison ****************************************************************/ -FMPZ_POLY_Q_INLINE int fmpz_poly_q_is_zero(const fmpz_poly_q_t op) { return fmpz_poly_is_zero(op->num); } -FMPZ_POLY_Q_INLINE int fmpz_poly_q_is_one(const fmpz_poly_q_t op) { return fmpz_poly_is_one(op->num) && fmpz_poly_is_one(op->den); } +FMPZ_POLY_Q_INLINE +int fmpz_poly_q_is_zero(const fmpz_poly_q_t op) +{ + return fmpz_poly_is_zero(op->num); +} +FMPZ_POLY_Q_INLINE +int fmpz_poly_q_is_one(const fmpz_poly_q_t op) +{ + return fmpz_poly_is_one(op->num) && fmpz_poly_is_one(op->den); +} -FMPZ_POLY_Q_INLINE int fmpz_poly_q_equal(const fmpz_poly_q_t op1, const fmpz_poly_q_t op2) { return fmpz_poly_equal(op1->num, op2->num) && fmpz_poly_equal(op1->den, op2->den); } +FMPZ_POLY_Q_INLINE +int fmpz_poly_q_equal(const fmpz_poly_q_t op1, const fmpz_poly_q_t op2) +{ + return fmpz_poly_equal(op1->num, op2->num) && fmpz_poly_equal(op1->den, op2->den); +} /* Addition and subtraction **************************************************/ void fmpz_poly_q_add_in_place(fmpz_poly_q_t rop, const fmpz_poly_q_t op); -void fmpz_poly_q_add(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2); +void fmpz_poly_q_add( + fmpz_poly_q_t rop, + const fmpz_poly_q_t op1, + const fmpz_poly_q_t op2); void fmpz_poly_q_sub_in_place(fmpz_poly_q_t rop, const fmpz_poly_q_t op); -void fmpz_poly_q_sub(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2); - -FMPZ_POLY_Q_INLINE void fmpz_poly_q_neg(fmpz_poly_q_t rop, const fmpz_poly_q_t op) { fmpz_poly_neg(rop->num, op->num); fmpz_poly_set(rop->den, op->den); } +void fmpz_poly_q_sub( + fmpz_poly_q_t rop, + const fmpz_poly_q_t op1, + const fmpz_poly_q_t op2); + +FMPZ_POLY_Q_INLINE +void fmpz_poly_q_neg(fmpz_poly_q_t rop, const fmpz_poly_q_t op) +{ + fmpz_poly_neg(rop->num, op->num); fmpz_poly_set(rop->den, op->den); +} -void fmpz_poly_q_addmul(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2); -void fmpz_poly_q_submul(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2); +void fmpz_poly_q_addmul( + fmpz_poly_q_t rop, + const fmpz_poly_q_t op1, + const fmpz_poly_q_t op2); +void fmpz_poly_q_submul( + fmpz_poly_q_t rop, + const fmpz_poly_q_t op1, + const fmpz_poly_q_t op2); /* Scalar multiplication and division ****************************************/ void fmpz_poly_q_scalar_mul_si(fmpz_poly_q_t rop, const fmpz_poly_q_t op, slong x); -void fmpz_poly_q_scalar_mul_fmpz(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpz_t x); -void fmpz_poly_q_scalar_mul_fmpq(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpq_t x); +void fmpz_poly_q_scalar_mul_fmpz( + fmpz_poly_q_t rop, + const fmpz_poly_q_t op, + const fmpz_t x); +void fmpz_poly_q_scalar_mul_fmpq( + fmpz_poly_q_t rop, + const fmpz_poly_q_t op, + const fmpq_t x); void fmpz_poly_q_scalar_div_si(fmpz_poly_q_t rop, const fmpz_poly_q_t op, slong x); -void fmpz_poly_q_scalar_div_fmpz(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpz_t x); -void fmpz_poly_q_scalar_div_fmpq(fmpz_poly_q_t rop, const fmpz_poly_q_t op, const fmpq_t x); +void fmpz_poly_q_scalar_div_fmpz( + fmpz_poly_q_t rop, + const fmpz_poly_q_t op, + const fmpz_t x); +void fmpz_poly_q_scalar_div_fmpq( + fmpz_poly_q_t rop, + const fmpz_poly_q_t op, + const fmpq_t x); /* Multiplication and division ***********************************************/ -void fmpz_poly_q_mul(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2); -void fmpz_poly_q_div(fmpz_poly_q_t rop, const fmpz_poly_q_t op1, const fmpz_poly_q_t op2); +void fmpz_poly_q_mul( + fmpz_poly_q_t rop, + const fmpz_poly_q_t op1, + const fmpz_poly_q_t op2); +void fmpz_poly_q_div( + fmpz_poly_q_t rop, + const fmpz_poly_q_t op1, + const fmpz_poly_q_t op2); /* Powering ******************************************************************/ diff --git a/src/fmpz_vec.h b/src/fmpz_vec.h index 3efe1d2731..7f554c3ea9 100644 --- a/src/fmpz_vec.h +++ b/src/fmpz_vec.h @@ -76,14 +76,22 @@ void _fmpz_vec_clear(fmpz * vec, slong len); /* Randomisation ***********************************************************/ void _fmpz_vec_randtest(fmpz * f, flint_rand_t state, slong len, flint_bitcnt_t bits); -void _fmpz_vec_randtest_unsigned(fmpz * f, flint_rand_t state, slong len, flint_bitcnt_t bits); +void _fmpz_vec_randtest_unsigned( + fmpz * f, + flint_rand_t state, + slong len, + flint_bitcnt_t bits); /* Norms *******************************************************************/ slong _fmpz_vec_max_bits(const fmpz * vec, slong len); slong _fmpz_vec_max_bits_ref(const fmpz * vec, slong len); -void _fmpz_vec_sum_max_bits(slong * sumabs, slong * maxabs, const fmpz * coeffs, slong length); +void _fmpz_vec_sum_max_bits( + slong * sumabs, + slong * maxabs, + const fmpz * coeffs, + slong length); mp_size_t _fmpz_vec_max_limbs(const fmpz * vec, slong len); @@ -105,8 +113,17 @@ int _fmpz_vec_read(fmpz ** vec, slong * len); void _fmpz_vec_set_nmod_vec(fmpz * res, mp_srcptr poly, slong len, nmod_t mod); void _fmpz_vec_get_nmod_vec(mp_ptr res, const fmpz * poly, slong len, nmod_t mod); -void _fmpz_vec_set_fft(fmpz * coeffs_m, slong length, const mp_ptr * coeffs_f, slong limbs, slong sign); -void _fmpz_vec_get_fft(mp_limb_t ** coeffs_f, const fmpz * coeffs_m, slong l, slong length); +void _fmpz_vec_set_fft( + fmpz * coeffs_m, + slong length, + const mp_ptr * coeffs_f, + slong limbs, + slong sign); +void _fmpz_vec_get_fft( + mp_limb_t ** coeffs_f, + const fmpz * coeffs_m, + slong l, + slong length); slong _fmpz_vec_get_d_vec_2exp(double * appv, const fmpz * vec, slong len); @@ -147,33 +164,67 @@ void _fmpz_vec_sub(fmpz * res, const fmpz * vec1, const fmpz * vec2, slong len2) void _fmpz_vec_scalar_mul_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c); void _fmpz_vec_scalar_mul_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c); -void _fmpz_vec_scalar_mul_fmpz(fmpz * vec1, const fmpz * vec2, slong len2, const fmpz_t x); +void _fmpz_vec_scalar_mul_fmpz( + fmpz * vec1, + const fmpz * vec2, + slong len2, + const fmpz_t x); void _fmpz_vec_scalar_mul_2exp(fmpz * vec1, const fmpz * vec2, slong len2, ulong exp); void _fmpz_vec_scalar_divexact_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c); void _fmpz_vec_scalar_divexact_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c); -void _fmpz_vec_scalar_divexact_fmpz(fmpz * vec1, const fmpz * vec2, slong len2, const fmpz_t x); +void _fmpz_vec_scalar_divexact_fmpz( + fmpz * vec1, + const fmpz * vec2, + slong len2, + const fmpz_t x); void _fmpz_vec_scalar_fdiv_q_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c); void _fmpz_vec_scalar_fdiv_q_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c); -void _fmpz_vec_scalar_fdiv_q_fmpz(fmpz * vec1, const fmpz * vec2, slong len2, const fmpz_t c); +void _fmpz_vec_scalar_fdiv_q_fmpz( + fmpz * vec1, + const fmpz * vec2, + slong len2, + const fmpz_t c); void _fmpz_vec_scalar_fdiv_q_2exp(fmpz * vec1, const fmpz * vec2, slong len2, ulong exp); void _fmpz_vec_scalar_fdiv_r_2exp(fmpz * vec1, const fmpz * vec2, slong len2, ulong exp); void _fmpz_vec_scalar_tdiv_q_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c); void _fmpz_vec_scalar_tdiv_q_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c); -void _fmpz_vec_scalar_tdiv_q_fmpz(fmpz * vec1, const fmpz * vec2, slong len2, const fmpz_t c); +void _fmpz_vec_scalar_tdiv_q_fmpz( + fmpz * vec1, + const fmpz * vec2, + slong len2, + const fmpz_t c); void _fmpz_vec_scalar_tdiv_q_2exp(fmpz * vec1, const fmpz * vec2, slong len2, ulong exp); void _fmpz_vec_scalar_addmul_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c); void _fmpz_vec_scalar_addmul_ui(fmpz * vec1, const fmpz * vec2, slong len2, ulong c); -void _fmpz_vec_scalar_addmul_fmpz(fmpz * poly1, const fmpz * poly2, slong len2, const fmpz_t x); -void _fmpz_vec_scalar_addmul_si_2exp(fmpz * vec1, const fmpz * vec2, slong len2, slong c, ulong exp); +void _fmpz_vec_scalar_addmul_fmpz( + fmpz * poly1, + const fmpz * poly2, + slong len2, + const fmpz_t x); +void _fmpz_vec_scalar_addmul_si_2exp( + fmpz * vec1, + const fmpz * vec2, + slong len2, + slong c, + ulong exp); void _fmpz_vec_scalar_submul_si(fmpz * vec1, const fmpz * vec2, slong len2, slong c); -void _fmpz_vec_scalar_submul_fmpz(fmpz * vec1, const fmpz * vec2, slong len2, const fmpz_t x); -void _fmpz_vec_scalar_submul_si_2exp(fmpz * vec1, const fmpz * vec2, slong len2, slong c, ulong exp); +void _fmpz_vec_scalar_submul_fmpz( + fmpz * vec1, + const fmpz * vec2, + slong len2, + const fmpz_t x); +void _fmpz_vec_scalar_submul_si_2exp( + fmpz * vec1, + const fmpz * vec2, + slong len2, + slong c, + ulong exp); /* Vector sum and product **************************************************/ @@ -189,14 +240,23 @@ void _fmpz_vec_scalar_smod_fmpz(fmpz *res, const fmpz *vec, slong len, const fmp /* Gaussian content ********************************************************/ void _fmpz_vec_content(fmpz_t res, const fmpz * vec, slong len); -void _fmpz_vec_content_chained(fmpz_t res, const fmpz * vec, slong len, const fmpz_t inp); +void _fmpz_vec_content_chained( + fmpz_t res, + const fmpz * vec, + slong len, + const fmpz_t inp); void _fmpz_vec_lcm(fmpz_t res, const fmpz * vec, slong len); /* Dot product *************************************************************/ void _fmpz_vec_dot(fmpz_t res, const fmpz * vec1, const fmpz * vec2, slong len2); -void _fmpz_vec_dot_ptr(fmpz_t c, const fmpz * vec1, fmpz ** const vec2, slong offset, slong len); +void _fmpz_vec_dot_ptr( + fmpz_t c, + const fmpz * vec1, + fmpz ** const vec2, + slong offset, + slong len); #ifdef __cplusplus } diff --git a/src/fq.h b/src/fq.h index 7826df34c0..9b1127a621 100644 --- a/src/fq.h +++ b/src/fq.h @@ -33,15 +33,27 @@ extern "C" { void fq_ctx_init(fq_ctx_t ctx, const fmpz_t p, slong d, const char *var); int _fq_ctx_init_conway(fq_ctx_t ctx, const fmpz_t p, slong d, const char *var); void fq_ctx_init_conway(fq_ctx_t ctx, const fmpz_t p, slong d, const char *var); -void fq_ctx_init_modulus(fq_ctx_t ctx, const fmpz_mod_poly_t modulus, const fmpz_mod_ctx_t ctxp, const char *var); +void fq_ctx_init_modulus( + fq_ctx_t ctx, + const fmpz_mod_poly_t modulus, + const fmpz_mod_ctx_t ctxp, + const char *var); void fq_ctx_clear(fq_ctx_t ctx); void fq_ctx_randtest(fq_ctx_t ctx, flint_rand_t state); void fq_ctx_randtest_reducible(fq_ctx_t ctx, flint_rand_t state); -FQ_INLINE const fmpz_mod_poly_struct * fq_ctx_modulus(const fq_ctx_t ctx) { return ctx->modulus; } -FQ_INLINE slong fq_ctx_degree(const fq_ctx_t ctx) { return ctx->modulus->length - 1; } +FQ_INLINE +const fmpz_mod_poly_struct * fq_ctx_modulus(const fq_ctx_t ctx) +{ + return ctx->modulus; +} +FQ_INLINE +slong fq_ctx_degree(const fq_ctx_t ctx) +{ + return ctx->modulus->length - 1; +} const fmpz * fq_ctx_prime(const fq_ctx_t ctx); void fq_ctx_order(fmpz_t f, const fq_ctx_t ctx); @@ -155,7 +167,11 @@ void fq_norm(fmpz_t rop, const fq_t op, const fq_ctx_t ctx); /* Bit packing ******************************************************/ void fq_bit_pack(fmpz_t f, const fq_t op, flint_bitcnt_t bit_size, const fq_ctx_t ctx); -void fq_bit_unpack(fq_t rop, const fmpz_t f, flint_bitcnt_t bit_size, const fq_ctx_t ctx); +void fq_bit_unpack( + fq_t rop, + const fmpz_t f, + flint_bitcnt_t bit_size, + const fq_ctx_t ctx); /* Inlines *******************************************************************/ diff --git a/src/fq_default.h b/src/fq_default.h index 0ea8cddea7..d5c083103a 100644 --- a/src/fq_default.h +++ b/src/fq_default.h @@ -99,13 +99,33 @@ void fq_default_ctx_clear(fq_default_ctx_t ctx) } } -void fq_default_ctx_init_modulus_type(fq_default_ctx_t ctx, const fmpz_mod_poly_t modulus, fmpz_mod_ctx_t mod_ctx, const char * var, int type); -void fq_default_ctx_init_modulus(fq_default_ctx_t ctx, const fmpz_mod_poly_t modulus, fmpz_mod_ctx_t mod_ctx, const char * var); +void fq_default_ctx_init_modulus_type( + fq_default_ctx_t ctx, + const fmpz_mod_poly_t modulus, + fmpz_mod_ctx_t mod_ctx, + const char * var, + int type); +void fq_default_ctx_init_modulus( + fq_default_ctx_t ctx, + const fmpz_mod_poly_t modulus, + fmpz_mod_ctx_t mod_ctx, + const char * var); + +void fq_default_ctx_init_modulus_nmod_type( + fq_default_ctx_t ctx, + const nmod_poly_t modulus, + const char * var, + int type); +void fq_default_ctx_init_modulus_nmod( + fq_default_ctx_t ctx, + const nmod_poly_t modulus, + const char * var); -void fq_default_ctx_init_modulus_nmod_type(fq_default_ctx_t ctx, const nmod_poly_t modulus, const char * var, int type); -void fq_default_ctx_init_modulus_nmod(fq_default_ctx_t ctx, const nmod_poly_t modulus, const char * var); - -FQ_DEFAULT_INLINE int fq_default_ctx_type(const fq_default_ctx_t ctx) { return ctx->type; } +FQ_DEFAULT_INLINE +int fq_default_ctx_type(const fq_default_ctx_t ctx) +{ + return ctx->type; +} FQ_DEFAULT_INLINE slong fq_default_ctx_degree(const fq_default_ctx_t ctx) @@ -1188,11 +1208,23 @@ int fq_default_get_fmpz(fmpz_t z, const fq_default_t op, const fq_default_ctx_t } } -void fq_default_get_fmpz_poly(fmpz_poly_t poly, const fq_default_t op, const fq_default_ctx_t ctx); -void fq_default_get_fmpz_mod_poly(fmpz_mod_poly_t poly, const fq_default_t op, const fq_default_ctx_t ctx); - -void fq_default_set_fmpz_poly(fq_default_t op, const fmpz_poly_t poly, const fq_default_ctx_t ctx); -void fq_default_set_fmpz_mod_poly(fq_default_t op, const fmpz_mod_poly_t poly, const fq_default_ctx_t ctx); +void fq_default_get_fmpz_poly( + fmpz_poly_t poly, + const fq_default_t op, + const fq_default_ctx_t ctx); +void fq_default_get_fmpz_mod_poly( + fmpz_mod_poly_t poly, + const fq_default_t op, + const fq_default_ctx_t ctx); + +void fq_default_set_fmpz_poly( + fq_default_t op, + const fmpz_poly_t poly, + const fq_default_ctx_t ctx); +void fq_default_set_fmpz_mod_poly( + fq_default_t op, + const fmpz_mod_poly_t poly, + const fq_default_ctx_t ctx); FQ_DEFAULT_INLINE void fq_default_get_coeff_fmpz(fmpz_t c, fq_default_t op, slong n, const fq_default_ctx_t ctx) @@ -1240,7 +1272,10 @@ void fq_default_get_coeff_fmpz(fmpz_t c, fq_default_t op, slong n, const fq_defa #ifdef FLINT_HAVE_FILE int fq_default_fprint(FILE * file, const fq_default_t op, const fq_default_ctx_t ctx); -int fq_default_fprint_pretty(FILE * file, const fq_default_t op, const fq_default_ctx_t ctx); +int fq_default_fprint_pretty( + FILE * file, + const fq_default_t op, + const fq_default_ctx_t ctx); #endif void fq_default_print(const fq_default_t op, const fq_default_ctx_t ctx); diff --git a/src/fq_default_mat.h b/src/fq_default_mat.h index 34b1aa2ce7..f079c2cf7d 100644 --- a/src/fq_default_mat.h +++ b/src/fq_default_mat.h @@ -340,7 +340,12 @@ void fq_default_mat_entry_set(fq_default_mat_t mat, slong i, slong j, const fq_d } } -void fq_default_mat_entry_set_fmpz(fq_default_mat_t mat, slong i, slong j, const fmpz_t x, const fq_default_ctx_t ctx); +void fq_default_mat_entry_set_fmpz( + fq_default_mat_t mat, + slong i, + slong j, + const fmpz_t x, + const fq_default_ctx_t ctx); FQ_DEFAULT_MAT_INLINE slong fq_default_mat_nrows(const fq_default_mat_t mat, const fq_default_ctx_t ctx) @@ -737,8 +742,14 @@ void fq_default_mat_concat_vertical(fq_default_mat_t res, const fq_default_mat_t /* Input and output *********************************************************/ #ifdef FLINT_HAVE_FILE -int fq_default_mat_fprint(FILE * file, const fq_default_mat_t mat, const fq_default_ctx_t ctx); -int fq_default_mat_fprint_pretty(FILE * file, const fq_default_mat_t mat, const fq_default_ctx_t ctx); +int fq_default_mat_fprint( + FILE * file, + const fq_default_mat_t mat, + const fq_default_ctx_t ctx); +int fq_default_mat_fprint_pretty( + FILE * file, + const fq_default_mat_t mat, + const fq_default_ctx_t ctx); #endif int fq_default_mat_print(const fq_default_mat_t mat, const fq_default_ctx_t ctx); diff --git a/src/fq_default_poly.h b/src/fq_default_poly.h index 4afec3acaa..46b75454e1 100644 --- a/src/fq_default_poly.h +++ b/src/fq_default_poly.h @@ -797,7 +797,10 @@ void fq_default_poly_set_fmpz_mod_poly(fq_default_poly_t rop, const fmpz_mod_pol } -void fq_default_poly_set_fmpz_poly(fq_default_poly_t rop, const fmpz_poly_t op, const fq_default_ctx_t ctx); +void fq_default_poly_set_fmpz_poly( + fq_default_poly_t rop, + const fmpz_poly_t op, + const fq_default_ctx_t ctx); /* Comparison **************************************************************/ @@ -1951,12 +1954,22 @@ void fq_default_poly_compose_mod(fq_default_poly_t res, const fq_default_poly_t /* Input and output ********************************************************/ #ifdef FLINT_HAVE_FILE -int fq_default_poly_fprint(FILE * file, const fq_default_poly_t poly, const fq_default_ctx_t ctx); -int fq_default_poly_fprint_pretty(FILE * file, const fq_default_poly_t poly, const char *x, const fq_default_ctx_t ctx); +int fq_default_poly_fprint( + FILE * file, + const fq_default_poly_t poly, + const fq_default_ctx_t ctx); +int fq_default_poly_fprint_pretty( + FILE * file, + const fq_default_poly_t poly, + const char *x, + const fq_default_ctx_t ctx); #endif int fq_default_poly_print(const fq_default_poly_t poly, const fq_default_ctx_t ctx); -int fq_default_poly_print_pretty(const fq_default_poly_t poly, const char *x, const fq_default_ctx_t ctx); +int fq_default_poly_print_pretty( + const fq_default_poly_t poly, + const char *x, + const fq_default_ctx_t ctx); FQ_DEFAULT_POLY_INLINE char * fq_default_poly_get_str_pretty(const fq_default_poly_t poly, const char *x, const fq_default_ctx_t ctx) diff --git a/src/fq_nmod.h b/src/fq_nmod.h index ebceb1b2f9..ac1b35686f 100644 --- a/src/fq_nmod.h +++ b/src/fq_nmod.h @@ -33,16 +33,35 @@ extern "C" { void fq_nmod_ctx_init(fq_nmod_ctx_t ctx, const fmpz_t p, slong d, const char * var); void fq_nmod_ctx_clear(fq_nmod_ctx_t ctx); -int _fq_nmod_ctx_init_conway(fq_nmod_ctx_t ctx, const fmpz_t p, slong d, const char * var); -void fq_nmod_ctx_init_conway(fq_nmod_ctx_t ctx, const fmpz_t p, slong d, const char * var); - -void fq_nmod_ctx_init_modulus(fq_nmod_ctx_t ctx, const nmod_poly_t modulus, const char * var); +int _fq_nmod_ctx_init_conway( + fq_nmod_ctx_t ctx, + const fmpz_t p, + slong d, + const char * var); +void fq_nmod_ctx_init_conway( + fq_nmod_ctx_t ctx, + const fmpz_t p, + slong d, + const char * var); + +void fq_nmod_ctx_init_modulus( + fq_nmod_ctx_t ctx, + const nmod_poly_t modulus, + const char * var); void fq_nmod_ctx_randtest(fq_nmod_ctx_t ctx, flint_rand_t state); void fq_nmod_ctx_randtest_reducible(fq_nmod_ctx_t ctx, flint_rand_t state); -FQ_NMOD_INLINE const nmod_poly_struct * fq_nmod_ctx_modulus(const fq_nmod_ctx_t ctx) { return ctx->modulus; } -FQ_NMOD_INLINE slong fq_nmod_ctx_degree(const fq_nmod_ctx_t ctx) { return ctx->modulus->length - 1; } +FQ_NMOD_INLINE +const nmod_poly_struct * fq_nmod_ctx_modulus(const fq_nmod_ctx_t ctx) +{ + return ctx->modulus; +} +FQ_NMOD_INLINE +slong fq_nmod_ctx_degree(const fq_nmod_ctx_t ctx) +{ + return ctx->modulus->length - 1; +} void fq_nmod_ctx_order(fmpz_t f, const fq_nmod_ctx_t ctx); #ifdef FLINT_HAVE_FILE @@ -64,24 +83,53 @@ void fq_nmod_reduce(fq_nmod_t rop, const fq_nmod_ctx_t ctx); /* Basic arithmetic **********************************************************/ -void fq_nmod_add(fq_nmod_t rop, const fq_nmod_t op1, const fq_nmod_t op2, const fq_nmod_ctx_t ctx); -void fq_nmod_sub(fq_nmod_t rop, const fq_nmod_t op1, const fq_nmod_t op2, const fq_nmod_ctx_t ctx); +void fq_nmod_add( + fq_nmod_t rop, + const fq_nmod_t op1, + const fq_nmod_t op2, + const fq_nmod_ctx_t ctx); +void fq_nmod_sub( + fq_nmod_t rop, + const fq_nmod_t op1, + const fq_nmod_t op2, + const fq_nmod_ctx_t ctx); void fq_nmod_neg(fq_nmod_t rop, const fq_nmod_t op1, const fq_nmod_ctx_t ctx); void fq_nmod_sub_one(fq_nmod_t rop, const fq_nmod_t op1, const fq_nmod_ctx_t ctx); void fq_nmod_mul_si(fq_nmod_t rop, const fq_nmod_t op, slong x, const fq_nmod_ctx_t ctx); void fq_nmod_mul_ui(fq_nmod_t rop, const fq_nmod_t op, ulong x, const fq_nmod_ctx_t ctx); -void fq_nmod_mul_fmpz(fq_nmod_t rop, const fq_nmod_t op, const fmpz_t x, const fq_nmod_ctx_t ctx); -void fq_nmod_mul(fq_nmod_t rop, const fq_nmod_t op1, const fq_nmod_t op2, const fq_nmod_ctx_t ctx); +void fq_nmod_mul_fmpz( + fq_nmod_t rop, + const fq_nmod_t op, + const fmpz_t x, + const fq_nmod_ctx_t ctx); +void fq_nmod_mul( + fq_nmod_t rop, + const fq_nmod_t op1, + const fq_nmod_t op2, + const fq_nmod_ctx_t ctx); void fq_nmod_sqr(fq_nmod_t rop, const fq_nmod_t op, const fq_nmod_ctx_t ctx); void fq_nmod_inv(fq_nmod_t rop, const fq_nmod_t op1, const fq_nmod_ctx_t ctx); -void fq_nmod_pow_ui(fq_nmod_t rop, const fq_nmod_t op1, const ulong e, const fq_nmod_ctx_t ctx); -void _fq_nmod_pow(mp_limb_t * rop, const mp_limb_t * op, slong len, const fmpz_t e, const fq_nmod_ctx_t ctx); -void fq_nmod_pow(fq_nmod_t rop, const fq_nmod_t op1, const fmpz_t e, const fq_nmod_ctx_t ctx); +void fq_nmod_pow_ui( + fq_nmod_t rop, + const fq_nmod_t op1, + const ulong e, + const fq_nmod_ctx_t ctx); +void _fq_nmod_pow( + mp_limb_t * rop, + const mp_limb_t * op, + slong len, + const fmpz_t e, + const fq_nmod_ctx_t ctx); +void fq_nmod_pow( + fq_nmod_t rop, + const fq_nmod_t op1, + const fmpz_t e, + const fq_nmod_ctx_t ctx); /* Roots ********************************************************************/ @@ -94,7 +142,10 @@ int fq_nmod_is_square(const fq_nmod_t op, const fq_nmod_ctx_t ctx); void fq_nmod_randtest(fq_nmod_t rop, flint_rand_t state, const fq_nmod_ctx_t ctx); void fq_nmod_randtest_dense(fq_nmod_t rop, flint_rand_t state, const fq_nmod_ctx_t ctx); -void fq_nmod_randtest_not_zero(fq_nmod_t rop, flint_rand_t state, const fq_nmod_ctx_t ctx); +void fq_nmod_randtest_not_zero( + fq_nmod_t rop, + flint_rand_t state, + const fq_nmod_ctx_t ctx); void fq_nmod_rand(fq_nmod_t rop, flint_rand_t state, const fq_nmod_ctx_t ctx); void fq_nmod_rand_not_zero(fq_nmod_t rop, flint_rand_t state, const fq_nmod_ctx_t ctx); @@ -139,19 +190,40 @@ char * fq_nmod_get_str_pretty(const fq_nmod_t op, const fq_nmod_ctx_t ctx); /* Special functions *********************************************************/ -void _fq_nmod_trace(fmpz_t rop, const mp_limb_t * op, slong len, const fq_nmod_ctx_t ctx); +void _fq_nmod_trace( + fmpz_t rop, + const mp_limb_t * op, + slong len, + const fq_nmod_ctx_t ctx); void fq_nmod_trace(fmpz_t rop, const fq_nmod_t op, const fq_nmod_ctx_t ctx); -void _fq_nmod_frobenius(mp_limb_t * rop, const mp_limb_t * op, slong len, slong e, const fq_nmod_ctx_t ctx); -void fq_nmod_frobenius(fq_nmod_t rop, const fq_nmod_t op, slong e, const fq_nmod_ctx_t ctx); +void _fq_nmod_frobenius( + mp_limb_t * rop, + const mp_limb_t * op, + slong len, + slong e, + const fq_nmod_ctx_t ctx); +void fq_nmod_frobenius( + fq_nmod_t rop, + const fq_nmod_t op, + slong e, + const fq_nmod_ctx_t ctx); void _fq_nmod_norm(fmpz_t rop, const mp_limb_t * op, slong len, const fq_nmod_ctx_t ctx); void fq_nmod_norm(fmpz_t rop, const fq_nmod_t op, const fq_nmod_ctx_t ctx); /* Bit packing ******************************************************/ -void fq_nmod_bit_pack(fmpz_t f, const fq_nmod_t op, flint_bitcnt_t bit_size, const fq_nmod_ctx_t ctx); -void fq_nmod_bit_unpack(fq_nmod_t rop, const fmpz_t f, flint_bitcnt_t bit_size, const fq_nmod_ctx_t ctx); +void fq_nmod_bit_pack( + fmpz_t f, + const fq_nmod_t op, + flint_bitcnt_t bit_size, + const fq_nmod_ctx_t ctx); +void fq_nmod_bit_unpack( + fq_nmod_t rop, + const fmpz_t f, + flint_bitcnt_t bit_size, + const fq_nmod_ctx_t ctx); /* Inlines *******************************************************************/ diff --git a/src/fq_nmod_embed.h b/src/fq_nmod_embed.h index a646893b52..e6b8299b82 100644 --- a/src/fq_nmod_embed.h +++ b/src/fq_nmod_embed.h @@ -26,11 +26,20 @@ #define B nmod #include "fq_embed_templates.h" -void TEMPLATE(T, modulus_pow_series_inv)(TEMPLATE(B, poly_t) res, const TEMPLATE(T, ctx_t) ctx, slong trunc); +void TEMPLATE( + T, + modulus_pow_series_inv)(TEMPLATE(B, + poly_t) res, + const TEMPLATE(T, + ctx_t) ctx, + slong trunc); #undef B #undef T -void fq_nmod_modulus_derivative_inv(fq_nmod_t m_prime, fq_nmod_t m_prime_inv, const fq_nmod_ctx_t ctx); +void fq_nmod_modulus_derivative_inv( + fq_nmod_t m_prime, + fq_nmod_t m_prime_inv, + const fq_nmod_ctx_t ctx); #endif diff --git a/src/fq_nmod_mpoly.h b/src/fq_nmod_mpoly.h index 28ea5d5c72..f4ee4c6d9b 100644 --- a/src/fq_nmod_mpoly.h +++ b/src/fq_nmod_mpoly.h @@ -112,22 +112,49 @@ typedef struct bad_fq_nmod_embed typedef bad_fq_nmod_embed_struct bad_fq_nmod_embed_t[1]; -void bad_fq_nmod_embed_array_init(bad_fq_nmod_embed_struct * emb, const fq_nmod_ctx_t bigctx, const fq_nmod_ctx_t smallctx); +void bad_fq_nmod_embed_array_init( + bad_fq_nmod_embed_struct * emb, + const fq_nmod_ctx_t bigctx, + const fq_nmod_ctx_t smallctx); void bad_fq_nmod_embed_clear(bad_fq_nmod_embed_t emb); -void bad_fq_nmod_embed_sm_to_lg(fq_nmod_t out, const fq_nmod_poly_t in, const bad_fq_nmod_embed_t emb); -void bad_fq_nmod_embed_lg_to_sm(fq_nmod_poly_t out, const fq_nmod_t in, const bad_fq_nmod_embed_t emb); - -void bad_n_fq_embed_sm_to_lg(mp_limb_t * out_, const n_poly_t in_, const bad_fq_nmod_embed_t emb); -void bad_n_fq_embed_lg_to_sm(n_poly_t out_, const mp_limb_t * in_, const bad_fq_nmod_embed_t emb); - -void bad_fq_nmod_embed_n_fq_sm_to_fq_nmod_lg(fq_nmod_t out, const n_poly_t in_, const bad_fq_nmod_embed_t emb); - -void bad_fq_nmod_embed_fq_nmod_lg_to_n_fq_sm(n_poly_t out_, const fq_nmod_t in, const bad_fq_nmod_embed_t emb); - -void bad_n_fq_embed_sm_elem_to_lg(mp_limb_t * out, const mp_limb_t * in, const bad_fq_nmod_embed_t emb); - -void bad_fq_nmod_embed_sm_elem_to_lg(fq_nmod_t out, const fq_nmod_t in, const bad_fq_nmod_embed_t emb); +void bad_fq_nmod_embed_sm_to_lg( + fq_nmod_t out, + const fq_nmod_poly_t in, + const bad_fq_nmod_embed_t emb); +void bad_fq_nmod_embed_lg_to_sm( + fq_nmod_poly_t out, + const fq_nmod_t in, + const bad_fq_nmod_embed_t emb); + +void bad_n_fq_embed_sm_to_lg( + mp_limb_t * out_, + const n_poly_t in_, + const bad_fq_nmod_embed_t emb); +void bad_n_fq_embed_lg_to_sm( + n_poly_t out_, + const mp_limb_t * in_, + const bad_fq_nmod_embed_t emb); + +void bad_fq_nmod_embed_n_fq_sm_to_fq_nmod_lg( + fq_nmod_t out, + const n_poly_t in_, + const bad_fq_nmod_embed_t emb); + +void bad_fq_nmod_embed_fq_nmod_lg_to_n_fq_sm( + n_poly_t out_, + const fq_nmod_t in, + const bad_fq_nmod_embed_t emb); + +void bad_n_fq_embed_sm_elem_to_lg( + mp_limb_t * out, + const mp_limb_t * in, + const bad_fq_nmod_embed_t emb); + +void bad_fq_nmod_embed_sm_elem_to_lg( + fq_nmod_t out, + const fq_nmod_t in, + const bad_fq_nmod_embed_t emb); typedef struct bad_fq_nmod_mpoly_embed_chooser { @@ -140,20 +167,54 @@ typedef struct bad_fq_nmod_mpoly_embed_chooser typedef bad_fq_nmod_mpoly_embed_chooser_struct bad_fq_nmod_mpoly_embed_chooser_t[1]; -bad_fq_nmod_embed_struct * bad_fq_nmod_mpoly_embed_chooser_init(bad_fq_nmod_mpoly_embed_chooser_t embc, fq_nmod_mpoly_ctx_t ectx, const fq_nmod_mpoly_ctx_t ctx, flint_rand_t randstate); -void bad_fq_nmod_mpoly_embed_chooser_clear(bad_fq_nmod_mpoly_embed_chooser_t embc, fq_nmod_mpoly_ctx_t ectx, const fq_nmod_mpoly_ctx_t ctx, flint_rand_t randstate); - -bad_fq_nmod_embed_struct * bad_fq_nmod_mpoly_embed_chooser_next(bad_fq_nmod_mpoly_embed_chooser_t embc, fq_nmod_mpoly_ctx_t ectx, const fq_nmod_mpoly_ctx_t ctx, flint_rand_t randstate); +bad_fq_nmod_embed_struct * bad_fq_nmod_mpoly_embed_chooser_init( + bad_fq_nmod_mpoly_embed_chooser_t embc, + fq_nmod_mpoly_ctx_t ectx, + const fq_nmod_mpoly_ctx_t ctx, + flint_rand_t randstate); +void bad_fq_nmod_mpoly_embed_chooser_clear( + bad_fq_nmod_mpoly_embed_chooser_t embc, + fq_nmod_mpoly_ctx_t ectx, + const fq_nmod_mpoly_ctx_t ctx, + flint_rand_t randstate); + +bad_fq_nmod_embed_struct * bad_fq_nmod_mpoly_embed_chooser_next( + bad_fq_nmod_mpoly_embed_chooser_t embc, + fq_nmod_mpoly_ctx_t ectx, + const fq_nmod_mpoly_ctx_t ctx, + flint_rand_t randstate); /* Context object ************************************************************/ -void fq_nmod_mpoly_ctx_init(fq_nmod_mpoly_ctx_t ctx, slong nvars, const ordering_t ord, const fq_nmod_ctx_t fqctx); -void fq_nmod_mpoly_ctx_init_deg(fq_nmod_mpoly_ctx_t ctx, slong nvars, const ordering_t ord, mp_limb_t p, slong deg); -void fq_nmod_mpoly_ctx_init_rand(fq_nmod_mpoly_ctx_t ctx, flint_rand_t state, slong max_nvars, flint_bitcnt_t p_bits, slong deg_bound); +void fq_nmod_mpoly_ctx_init( + fq_nmod_mpoly_ctx_t ctx, + slong nvars, + const ordering_t ord, + const fq_nmod_ctx_t fqctx); +void fq_nmod_mpoly_ctx_init_deg( + fq_nmod_mpoly_ctx_t ctx, + slong nvars, + const ordering_t ord, + mp_limb_t p, + slong deg); +void fq_nmod_mpoly_ctx_init_rand( + fq_nmod_mpoly_ctx_t ctx, + flint_rand_t state, + slong max_nvars, + flint_bitcnt_t p_bits, + slong deg_bound); void fq_nmod_mpoly_ctx_clear(fq_nmod_mpoly_ctx_t ctx); -FQ_NMOD_MPOLY_INLINE slong fq_nmod_mpoly_ctx_nvars(const fq_nmod_mpoly_ctx_t ctx) { return ctx->minfo->nvars; } -FQ_NMOD_MPOLY_INLINE ordering_t fq_nmod_mpoly_ctx_ord(const fq_nmod_mpoly_ctx_t ctx) { return ctx->minfo->ord; } +FQ_NMOD_MPOLY_INLINE +slong fq_nmod_mpoly_ctx_nvars(const fq_nmod_mpoly_ctx_t ctx) +{ + return ctx->minfo->nvars; +} +FQ_NMOD_MPOLY_INLINE +ordering_t fq_nmod_mpoly_ctx_ord(const fq_nmod_mpoly_ctx_t ctx) +{ + return ctx->minfo->ord; +} /* Memory management ********************************************************/ @@ -169,8 +230,15 @@ void fq_nmod_mpoly_init(fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) } void fq_nmod_mpoly_init2(fq_nmod_mpoly_t A, slong alloc, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_init3(fq_nmod_mpoly_t A, slong alloc, flint_bitcnt_t bits, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_realloc(fq_nmod_mpoly_t A, slong alloc, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_init3( + fq_nmod_mpoly_t A, + slong alloc, + flint_bitcnt_t bits, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_realloc( + fq_nmod_mpoly_t A, + slong alloc, + const fq_nmod_mpoly_ctx_t ctx); FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_clear(fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) @@ -182,8 +250,16 @@ void fq_nmod_mpoly_clear(fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) flint_free(A->exps); } -void fq_nmod_mpoly_fit_length_fit_bits(fq_nmod_mpoly_t A, slong len, flint_bitcnt_t bits, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_fit_length_reset_bits(fq_nmod_mpoly_t A, slong len, flint_bitcnt_t bits, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_fit_length_fit_bits( + fq_nmod_mpoly_t A, + slong len, + flint_bitcnt_t bits, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_fit_length_reset_bits( + fq_nmod_mpoly_t A, + slong len, + flint_bitcnt_t bits, + const fq_nmod_mpoly_ctx_t ctx); FQ_NMOD_MPOLY_INLINE void _fq_nmod_mpoly_fit_length(mp_limb_t ** coeffs, slong * coeffs_alloc, slong d, ulong ** exps, slong * exps_alloc, slong N, slong length) @@ -201,7 +277,10 @@ void _fq_nmod_mpoly_fit_length(mp_limb_t ** coeffs, slong * coeffs_alloc, slong } } -void fq_nmod_mpoly_fit_length(fq_nmod_mpoly_t A, slong length, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_fit_length( + fq_nmod_mpoly_t A, + slong length, + const fq_nmod_mpoly_ctx_t ctx); FQ_NMOD_MPOLY_INLINE void _fq_nmod_mpoly_set_length(fq_nmod_mpoly_t A, slong newlen, const fq_nmod_mpoly_ctx_t ctx) @@ -211,30 +290,61 @@ void _fq_nmod_mpoly_set_length(fq_nmod_mpoly_t A, slong newlen, const fq_nmod_mp A->length = newlen; } -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_truncate(fq_nmod_mpoly_t A, slong newlen, const fq_nmod_mpoly_ctx_t ctx) { if (A->length > newlen) A->length = newlen; } +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_truncate(fq_nmod_mpoly_t A, slong newlen, const fq_nmod_mpoly_ctx_t ctx) +{ + if (A->length > newlen) A->length = newlen; +} /* Input/output **************************************************************/ -int fq_nmod_mpoly_set_str_pretty(fq_nmod_mpoly_t A, const char * str, const char ** x, const fq_nmod_mpoly_ctx_t ctx); -char * fq_nmod_mpoly_get_str_pretty(const fq_nmod_mpoly_t A, const char ** x, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_set_str_pretty( + fq_nmod_mpoly_t A, + const char * str, + const char ** x, + const fq_nmod_mpoly_ctx_t ctx); +char * fq_nmod_mpoly_get_str_pretty( + const fq_nmod_mpoly_t A, + const char ** x, + const fq_nmod_mpoly_ctx_t ctx); #ifdef FLINT_HAVE_FILE -int fq_nmod_mpoly_fprint_pretty(FILE * file, const fq_nmod_mpoly_t A, const char ** x, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_fprint_pretty( + FILE * file, + const fq_nmod_mpoly_t A, + const char ** x, + const fq_nmod_mpoly_ctx_t ctx); #endif -int fq_nmod_mpoly_print_pretty(const fq_nmod_mpoly_t A, const char ** x, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_print_pretty( + const fq_nmod_mpoly_t A, + const char ** x, + const fq_nmod_mpoly_ctx_t ctx); /* Basic manipulation *******************************************************/ void fq_nmod_mpoly_gen(fq_nmod_mpoly_t A, slong var, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_is_gen(const fq_nmod_mpoly_t A, slong var, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_is_gen( + const fq_nmod_mpoly_t A, + slong var, + const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_set(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_set( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_equal(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_equal( + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_swap(fq_nmod_mpoly_t A, fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx) { FLINT_SWAP(fq_nmod_mpoly_struct, *A, *B); } +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_swap(fq_nmod_mpoly_t A, fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_SWAP(fq_nmod_mpoly_struct, *A, *B); +} /* Constants *****************************************************************/ @@ -248,36 +358,91 @@ mp_limb_t * fq_nmod_mpoly_get_nonzero_n_fq(const fq_nmod_mpoly_t A, const fq_nmo int fq_nmod_mpoly_is_fq_nmod(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_get_fq_nmod(fq_nmod_t c, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_get_fq_nmod( + fq_nmod_t c, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_set_ui(fq_nmod_mpoly_t A, ulong c, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_set_fmpz(fq_nmod_mpoly_t A, const fmpz_t c, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_set_fq_nmod(fq_nmod_mpoly_t A, const fq_nmod_t c, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_set_fmpz( + fq_nmod_mpoly_t A, + const fmpz_t c, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_set_fq_nmod( + fq_nmod_mpoly_t A, + const fq_nmod_t c, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_set_fq_nmod_gen(fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_set_n_fq(fq_nmod_mpoly_t A, const mp_limb_t * c, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_set_n_fq( + fq_nmod_mpoly_t A, + const mp_limb_t * c, + const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_equal_fq_nmod(const fq_nmod_mpoly_t A, const fq_nmod_t c, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_equal_fq_nmod( + const fq_nmod_mpoly_t A, + const fq_nmod_t c, + const fq_nmod_mpoly_ctx_t ctx); -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_zero(fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { _fq_nmod_mpoly_set_length(A, 0, ctx); } +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_zero(fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + _fq_nmod_mpoly_set_length(A, 0, ctx); +} void fq_nmod_mpoly_one(fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -FQ_NMOD_MPOLY_INLINE int fq_nmod_mpoly_is_zero(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { return A->length == 0; } +FQ_NMOD_MPOLY_INLINE +int fq_nmod_mpoly_is_zero(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + return A->length == 0; +} int fq_nmod_mpoly_is_one(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); /* Degrees *******************************************************************/ -FQ_NMOD_MPOLY_INLINE int fq_nmod_mpoly_degrees_fit_si(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_degrees_fit_si(A->exps, A->length, A->bits, ctx->minfo); } +FQ_NMOD_MPOLY_INLINE +int fq_nmod_mpoly_degrees_fit_si(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_degrees_fit_si(A->exps, A->length, A->bits, ctx->minfo); +} -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_degrees_si(slong * degs, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { mpoly_degrees_si(degs, A->exps, A->length, A->bits, ctx->minfo); } -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_degrees_fmpz(fmpz ** degs, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { mpoly_degrees_pfmpz(degs, A->exps, A->length, A->bits, ctx->minfo); } +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_degrees_si(slong * degs, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + mpoly_degrees_si(degs, A->exps, A->length, A->bits, ctx->minfo); +} +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_degrees_fmpz(fmpz ** degs, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + mpoly_degrees_pfmpz(degs, A->exps, A->length, A->bits, ctx->minfo); +} -FQ_NMOD_MPOLY_INLINE slong fq_nmod_mpoly_degree_si(const fq_nmod_mpoly_t A, slong var, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); return mpoly_degree_si(A->exps, A->length, A->bits, var, ctx->minfo); } -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_degree_fmpz(fmpz_t deg, const fq_nmod_mpoly_t A, slong var, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); mpoly_degree_fmpz(deg, A->exps, A->length, A->bits, var, ctx->minfo); } +FQ_NMOD_MPOLY_INLINE +slong fq_nmod_mpoly_degree_si(const fq_nmod_mpoly_t A, slong var, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); return mpoly_degree_si(A->exps, A->length, A->bits, var, ctx->minfo); +} +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_degree_fmpz(fmpz_t deg, const fq_nmod_mpoly_t A, slong var, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); mpoly_degree_fmpz(deg, A->exps, A->length, A->bits, var, ctx->minfo); +} -FQ_NMOD_MPOLY_INLINE int fq_nmod_mpoly_total_degree_fits_si(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { return mpoly_total_degree_fits_si(A->exps, A->length, A->bits, ctx->minfo); } +FQ_NMOD_MPOLY_INLINE +int fq_nmod_mpoly_total_degree_fits_si(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + return mpoly_total_degree_fits_si(A->exps, A->length, A->bits, ctx->minfo); +} -FQ_NMOD_MPOLY_INLINE slong fq_nmod_mpoly_total_degree_si(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { return mpoly_total_degree_si(A->exps, A->length, A->bits, ctx->minfo); } -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_total_degree_fmpz(fmpz_t td, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { mpoly_total_degree_fmpz(td, A->exps, A->length, A->bits, ctx->minfo); } +FQ_NMOD_MPOLY_INLINE +slong fq_nmod_mpoly_total_degree_si(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + return mpoly_total_degree_si(A->exps, A->length, A->bits, ctx->minfo); +} +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_total_degree_fmpz(fmpz_t td, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + mpoly_total_degree_fmpz(td, A->exps, A->length, A->bits, ctx->minfo); +} FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_used_vars(int * used, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) @@ -292,160 +457,521 @@ void fq_nmod_mpoly_used_vars(int * used, const fq_nmod_mpoly_t A, const fq_nmod_ /* Coefficients **************************************************************/ -void fq_nmod_mpoly_get_coeff_fq_nmod_ui(fq_nmod_t c, const fq_nmod_mpoly_t A, const ulong * exp, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_get_coeff_fq_nmod_fmpz(fq_nmod_t c, const fq_nmod_mpoly_t A, fmpz * const * exp, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_get_coeff_fq_nmod_monomial(fq_nmod_t c, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t M, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_get_coeff_fq_nmod_ui( + fq_nmod_t c, + const fq_nmod_mpoly_t A, + const ulong * exp, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_get_coeff_fq_nmod_fmpz( + fq_nmod_t c, + const fq_nmod_mpoly_t A, + fmpz * const * exp, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_get_coeff_fq_nmod_monomial( + fq_nmod_t c, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t M, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_set_coeff_fq_nmod_ui( + fq_nmod_mpoly_t A, + const fq_nmod_t c, + const ulong * exp, + const fq_nmod_mpoly_ctx_t ctx); +void _fq_nmod_mpoly_set_coeff_fq_nmod_fmpz( + fq_nmod_mpoly_t A, + const fq_nmod_t c, + const fmpz * exp, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_set_coeff_fq_nmod_fmpz( + fq_nmod_mpoly_t A, + const fq_nmod_t c, + fmpz * const * exp, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_set_coeff_fq_nmod_monomial( + fq_nmod_mpoly_t A, + const fq_nmod_t c, + const fq_nmod_mpoly_t M, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_get_coeff_vars_ui( + fq_nmod_mpoly_t C, + const fq_nmod_mpoly_t A, + const slong * vars, + const ulong * exps, + slong length, + const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_set_coeff_fq_nmod_ui(fq_nmod_mpoly_t A, const fq_nmod_t c, const ulong * exp, const fq_nmod_mpoly_ctx_t ctx); -void _fq_nmod_mpoly_set_coeff_fq_nmod_fmpz(fq_nmod_mpoly_t A, const fq_nmod_t c, const fmpz * exp, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_set_coeff_fq_nmod_fmpz(fq_nmod_mpoly_t A, const fq_nmod_t c, fmpz * const * exp, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_set_coeff_fq_nmod_monomial(fq_nmod_mpoly_t A, const fq_nmod_t c, const fq_nmod_mpoly_t M, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_get_coeff_vars_ui(fq_nmod_mpoly_t C, const fq_nmod_mpoly_t A, const slong * vars, const ulong * exps, slong length, const fq_nmod_mpoly_ctx_t ctx); - -FQ_NMOD_MPOLY_INLINE mp_limb_t * _fq_nmod_mpoly_leadcoeff(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(A->length > 0); return A->coeffs + 0; } +FQ_NMOD_MPOLY_INLINE +mp_limb_t * _fq_nmod_mpoly_leadcoeff(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(A->length > 0); return A->coeffs + 0; +} -FQ_NMOD_MPOLY_INLINE int fq_nmod_mpoly_is_monic(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { return A->length > 0 && _n_fq_is_one(A->coeffs + 0, fq_nmod_ctx_degree(ctx->fqctx)); } +FQ_NMOD_MPOLY_INLINE +int fq_nmod_mpoly_is_monic(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + return A->length > 0 && _n_fq_is_one(A->coeffs + 0, fq_nmod_ctx_degree(ctx->fqctx)); +} /* conversion ****************************************************************/ -int fq_nmod_mpoly_is_fq_nmod_poly(const fq_nmod_mpoly_t A, slong var, const fq_nmod_mpoly_ctx_t ctx); - -int fq_nmod_mpoly_get_fq_nmod_poly(fq_nmod_poly_t A, const fq_nmod_mpoly_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); - -void _fq_nmod_mpoly_set_fq_nmod_poly(fq_nmod_mpoly_t A, flint_bitcnt_t Abits, const fq_nmod_struct * Bcoeffs, slong Blen, slong var, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_set_fq_nmod_poly(fq_nmod_mpoly_t A, const fq_nmod_poly_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_is_fq_nmod_poly( + const fq_nmod_mpoly_t A, + slong var, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpoly_get_fq_nmod_poly( + fq_nmod_poly_t A, + const fq_nmod_mpoly_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); + +void _fq_nmod_mpoly_set_fq_nmod_poly( + fq_nmod_mpoly_t A, + flint_bitcnt_t Abits, + const fq_nmod_struct * Bcoeffs, + slong Blen, + slong var, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_set_fq_nmod_poly( + fq_nmod_mpoly_t A, + const fq_nmod_poly_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); /* comparison ****************************************************************/ -int fq_nmod_mpoly_cmp(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_cmp( + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); /* container operations ******************************************************/ int fq_nmod_mpoly_is_canonical(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -FQ_NMOD_MPOLY_INLINE slong fq_nmod_mpoly_length(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { return A->length; } - -void fq_nmod_mpoly_resize(fq_nmod_mpoly_t A, slong new_length, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_get_term_coeff_fq_nmod(fq_nmod_t c, const fq_nmod_mpoly_t A, slong i, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_set_term_coeff_fq_nmod(fq_nmod_mpoly_t A, slong i, const fq_nmod_t c, const fq_nmod_mpoly_ctx_t ctx); - -FQ_NMOD_MPOLY_INLINE int fq_nmod_mpoly_term_exp_fits_si(const fq_nmod_mpoly_t A, slong i, const fq_nmod_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_si(A->exps, A->bits, i, ctx->minfo); } -FQ_NMOD_MPOLY_INLINE int fq_nmod_mpoly_term_exp_fits_ui(const fq_nmod_mpoly_t A, slong i, const fq_nmod_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_ui(A->exps, A->bits, i, ctx->minfo); } - -void fq_nmod_mpoly_get_term_exp_si(slong * exp, const fq_nmod_mpoly_t A, slong i, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_get_term_exp_ui(ulong * exp, const fq_nmod_mpoly_t A, slong i, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_get_term_exp_fmpz(fmpz ** exp, const fq_nmod_mpoly_t A, slong i, const fq_nmod_mpoly_ctx_t ctx); - -slong fq_nmod_mpoly_get_term_var_exp_si(const fq_nmod_mpoly_t A, slong i, slong var, const fq_nmod_mpoly_ctx_t ctx); -ulong fq_nmod_mpoly_get_term_var_exp_ui(const fq_nmod_mpoly_t A, slong i, slong var, const fq_nmod_mpoly_ctx_t ctx); +FQ_NMOD_MPOLY_INLINE +slong fq_nmod_mpoly_length(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + return A->length; +} -void fq_nmod_mpoly_set_term_exp_ui(fq_nmod_mpoly_t A, slong i, const ulong * exp, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_set_term_exp_fmpz(fq_nmod_mpoly_t A, slong i, fmpz * const * exp, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_resize( + fq_nmod_mpoly_t A, + slong new_length, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_get_term_coeff_fq_nmod( + fq_nmod_t c, + const fq_nmod_mpoly_t A, + slong i, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_set_term_coeff_fq_nmod( + fq_nmod_mpoly_t A, + slong i, + const fq_nmod_t c, + const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_get_term(fq_nmod_mpoly_t M, const fq_nmod_mpoly_t A, slong i, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_get_term_monomial(fq_nmod_mpoly_t M, const fq_nmod_mpoly_t A, slong i, const fq_nmod_mpoly_ctx_t ctx); +FQ_NMOD_MPOLY_INLINE +int fq_nmod_mpoly_term_exp_fits_si(const fq_nmod_mpoly_t A, slong i, const fq_nmod_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_si(A->exps, A->bits, i, ctx->minfo); +} +FQ_NMOD_MPOLY_INLINE +int fq_nmod_mpoly_term_exp_fits_ui(const fq_nmod_mpoly_t A, slong i, const fq_nmod_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_ui(A->exps, A->bits, i, ctx->minfo); +} -void fq_nmod_mpoly_push_term_fq_nmod_ui(fq_nmod_mpoly_t A, const fq_nmod_t c, const ulong * exp, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_push_term_fq_nmod_fmpz(fq_nmod_mpoly_t A, const fq_nmod_t c, fmpz * const * exp, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_push_term_fq_nmod_ffmpz(fq_nmod_mpoly_t A, const fq_nmod_t c, const fmpz * exp, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_get_term_exp_si( + slong * exp, + const fq_nmod_mpoly_t A, + slong i, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_get_term_exp_ui( + ulong * exp, + const fq_nmod_mpoly_t A, + slong i, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_get_term_exp_fmpz( + fmpz ** exp, + const fq_nmod_mpoly_t A, + slong i, + const fq_nmod_mpoly_ctx_t ctx); + +slong fq_nmod_mpoly_get_term_var_exp_si( + const fq_nmod_mpoly_t A, + slong i, + slong var, + const fq_nmod_mpoly_ctx_t ctx); +ulong fq_nmod_mpoly_get_term_var_exp_ui( + const fq_nmod_mpoly_t A, + slong i, + slong var, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_set_term_exp_ui( + fq_nmod_mpoly_t A, + slong i, + const ulong * exp, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_set_term_exp_fmpz( + fq_nmod_mpoly_t A, + slong i, + fmpz * const * exp, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_get_term( + fq_nmod_mpoly_t M, + const fq_nmod_mpoly_t A, + slong i, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_get_term_monomial( + fq_nmod_mpoly_t M, + const fq_nmod_mpoly_t A, + slong i, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_push_term_fq_nmod_ui( + fq_nmod_mpoly_t A, + const fq_nmod_t c, + const ulong * exp, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_push_term_fq_nmod_fmpz( + fq_nmod_mpoly_t A, + const fq_nmod_t c, + fmpz * const * exp, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_push_term_fq_nmod_ffmpz( + fq_nmod_mpoly_t A, + const fq_nmod_t c, + const fmpz * exp, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_sort_terms(fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_combine_like_terms(fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_reverse(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_reverse( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_assert_canonical(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -void _fq_nmod_mpoly_radix_sort1(fq_nmod_mpoly_t A, slong left, slong right, flint_bitcnt_t pos, ulong cmpmask, ulong totalmask, slong d); -void _fq_nmod_mpoly_radix_sort(fq_nmod_mpoly_t A, slong left, slong right, flint_bitcnt_t pos, slong N, ulong * cmpmask, slong d); - -void _fq_nmod_mpoly_push_exp_ui(fq_nmod_mpoly_t A, const ulong * exp, const fq_nmod_mpoly_ctx_t ctx); -void _fq_nmod_mpoly_push_exp_ffmpz(fq_nmod_mpoly_t A, const fmpz * exp, const fq_nmod_mpoly_ctx_t ctx); -void _fq_nmod_mpoly_push_exp_pfmpz(fq_nmod_mpoly_t A, fmpz * const * exp, const fq_nmod_mpoly_ctx_t ctx); +void _fq_nmod_mpoly_radix_sort1( + fq_nmod_mpoly_t A, + slong left, + slong right, + flint_bitcnt_t pos, + ulong cmpmask, + ulong totalmask, + slong d); +void _fq_nmod_mpoly_radix_sort( + fq_nmod_mpoly_t A, + slong left, + slong right, + flint_bitcnt_t pos, + slong N, + ulong * cmpmask, + slong d); + +void _fq_nmod_mpoly_push_exp_ui( + fq_nmod_mpoly_t A, + const ulong * exp, + const fq_nmod_mpoly_ctx_t ctx); +void _fq_nmod_mpoly_push_exp_ffmpz( + fq_nmod_mpoly_t A, + const fmpz * exp, + const fq_nmod_mpoly_ctx_t ctx); +void _fq_nmod_mpoly_push_exp_pfmpz( + fq_nmod_mpoly_t A, + fmpz * const * exp, + const fq_nmod_mpoly_ctx_t ctx); /* Random generation *********************************************************/ -void fq_nmod_mpoly_randtest_bound(fq_nmod_mpoly_t A, flint_rand_t state, slong length, ulong exp_bound, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_randtest_bounds(fq_nmod_mpoly_t A, flint_rand_t state, slong length, ulong * exp_bounds, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_randtest_bits(fq_nmod_mpoly_t A, flint_rand_t state, slong length, flint_bitcnt_t exp_bits, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_randtest_bound( + fq_nmod_mpoly_t A, + flint_rand_t state, + slong length, + ulong exp_bound, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_randtest_bounds( + fq_nmod_mpoly_t A, + flint_rand_t state, + slong length, + ulong * exp_bounds, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_randtest_bits( + fq_nmod_mpoly_t A, + flint_rand_t state, + slong length, + flint_bitcnt_t exp_bits, + const fq_nmod_mpoly_ctx_t ctx); /* Addition/Subtraction ******************************************************/ -void fq_nmod_mpoly_add_fq_nmod(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_t c, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_add_n_fq(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const mp_limb_t * c, const fq_nmod_mpoly_ctx_t ctx); -slong _fq_nmod_mpoly_add(mp_limb_t * coeff1, ulong * exp1, mp_limb_t * coeff2, const ulong * exp2, slong len2, mp_limb_t * coeff3, const ulong * exp3, slong len3, slong N, const ulong * cmpmask, const fq_nmod_ctx_t fqctx); -void fq_nmod_mpoly_add(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_t C, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_sub_fq_nmod(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_t C, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_sub(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_t C, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_neg(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_add_fq_nmod( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_t c, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_add_n_fq( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const mp_limb_t * c, + const fq_nmod_mpoly_ctx_t ctx); +slong _fq_nmod_mpoly_add( + mp_limb_t * coeff1, + ulong * exp1, + mp_limb_t * coeff2, + const ulong * exp2, + slong len2, + mp_limb_t * coeff3, + const ulong * exp3, + slong len3, + slong N, + const ulong * cmpmask, + const fq_nmod_ctx_t fqctx); +void fq_nmod_mpoly_add( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_t C, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_sub_fq_nmod( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_t C, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_sub( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_t C, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_neg( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); /* Scalar operations *********************************************************/ -void fq_nmod_mpoly_scalar_mul_fq_nmod(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_t c, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_scalar_mul_n_fq(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const mp_limb_t * c, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_make_monic(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_scalar_addmul_fq_nmod(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_t C, const fq_nmod_t e, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_scalar_mul_fq_nmod( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_t c, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_scalar_mul_n_fq( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const mp_limb_t * c, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_make_monic( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_scalar_addmul_fq_nmod( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_t C, + const fq_nmod_t e, + const fq_nmod_mpoly_ctx_t ctx); /* Differentiation **********************************************************/ -void fq_nmod_mpoly_derivative(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_derivative( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); /* Evaluation ****************************************************************/ -void fq_nmod_mpoly_evaluate_one_fq_nmod(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, slong var, const fq_nmod_t val, const fq_nmod_mpoly_ctx_t ctx); - -void _fq_nmod_mpoly_eval_all_fq_nmod(fq_nmod_t ev, const mp_limb_t * Acoeffs, const ulong * Aexps, slong Alen, flint_bitcnt_t Abits, fq_nmod_struct * const * alphas, const mpoly_ctx_t mctx, const fq_nmod_ctx_t fqctx); -void fq_nmod_mpoly_evaluate_all_fq_nmod(fq_nmod_t ev, const fq_nmod_mpoly_t A, fq_nmod_struct * const * vals, const fq_nmod_mpoly_ctx_t ctx); - -int fq_nmod_mpoly_compose_fq_nmod_poly(fq_nmod_poly_t A, const fq_nmod_mpoly_t B, fq_nmod_poly_struct * const * C, const fq_nmod_mpoly_ctx_t ctx); - -void _fq_nmod_mpoly_compose_mat(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fmpz_mat_t M, const fq_nmod_mpoly_ctx_t ctxB, const fq_nmod_mpoly_ctx_t ctxAC); - -int fq_nmod_mpoly_compose_fq_nmod_mpoly_geobucket(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, fq_nmod_mpoly_struct * const * C, const fq_nmod_mpoly_ctx_t ctxB, const fq_nmod_mpoly_ctx_t ctxAC); -int fq_nmod_mpoly_compose_fq_nmod_mpoly_horner(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, fq_nmod_mpoly_struct * const * C, const fq_nmod_mpoly_ctx_t ctxB, const fq_nmod_mpoly_ctx_t ctxAC); -int fq_nmod_mpoly_compose_fq_nmod_mpoly(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, fq_nmod_mpoly_struct * const * C, const fq_nmod_mpoly_ctx_t ctxB, const fq_nmod_mpoly_ctx_t ctxAC); - -void fq_nmod_mpoly_compose_fq_nmod_mpoly_gen(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const slong * c, const fq_nmod_mpoly_ctx_t ctxB, const fq_nmod_mpoly_ctx_t ctxAC); +void fq_nmod_mpoly_evaluate_one_fq_nmod( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + slong var, + const fq_nmod_t val, + const fq_nmod_mpoly_ctx_t ctx); + +void _fq_nmod_mpoly_eval_all_fq_nmod( + fq_nmod_t ev, + const mp_limb_t * Acoeffs, + const ulong * Aexps, + slong Alen, + flint_bitcnt_t Abits, + fq_nmod_struct * const * alphas, + const mpoly_ctx_t mctx, + const fq_nmod_ctx_t fqctx); +void fq_nmod_mpoly_evaluate_all_fq_nmod( + fq_nmod_t ev, + const fq_nmod_mpoly_t A, + fq_nmod_struct * const * vals, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpoly_compose_fq_nmod_poly( + fq_nmod_poly_t A, + const fq_nmod_mpoly_t B, + fq_nmod_poly_struct * const * C, + const fq_nmod_mpoly_ctx_t ctx); + +void _fq_nmod_mpoly_compose_mat( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fmpz_mat_t M, + const fq_nmod_mpoly_ctx_t ctxB, + const fq_nmod_mpoly_ctx_t ctxAC); + +int fq_nmod_mpoly_compose_fq_nmod_mpoly_geobucket( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + fq_nmod_mpoly_struct * const * C, + const fq_nmod_mpoly_ctx_t ctxB, + const fq_nmod_mpoly_ctx_t ctxAC); +int fq_nmod_mpoly_compose_fq_nmod_mpoly_horner( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + fq_nmod_mpoly_struct * const * C, + const fq_nmod_mpoly_ctx_t ctxB, + const fq_nmod_mpoly_ctx_t ctxAC); +int fq_nmod_mpoly_compose_fq_nmod_mpoly( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + fq_nmod_mpoly_struct * const * C, + const fq_nmod_mpoly_ctx_t ctxB, + const fq_nmod_mpoly_ctx_t ctxAC); + +void fq_nmod_mpoly_compose_fq_nmod_mpoly_gen( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const slong * c, + const fq_nmod_mpoly_ctx_t ctxB, + const fq_nmod_mpoly_ctx_t ctxAC); /* Multiplication ************************************************************/ -void _fq_nmod_mpoly_mul_johnson(fq_nmod_mpoly_t A, const mp_limb_t * Bcoeffs, const ulong * Bexps, slong Blen, const mp_limb_t * Ccoeffs, const ulong * Cexps, slong Clen, flint_bitcnt_t bits, slong N, const ulong * cmpmask, const fq_nmod_ctx_t ctx); -void fq_nmod_mpoly_mul_johnson(fq_nmod_mpoly_t poly1, const fq_nmod_mpoly_t poly2, const fq_nmod_mpoly_t poly3, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_mul(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_t C, const fq_nmod_mpoly_ctx_t ctx); +void _fq_nmod_mpoly_mul_johnson( + fq_nmod_mpoly_t A, + const mp_limb_t * Bcoeffs, + const ulong * Bexps, + slong Blen, + const mp_limb_t * Ccoeffs, + const ulong * Cexps, + slong Clen, + flint_bitcnt_t bits, + slong N, + const ulong * cmpmask, + const fq_nmod_ctx_t ctx); +void fq_nmod_mpoly_mul_johnson( + fq_nmod_mpoly_t poly1, + const fq_nmod_mpoly_t poly2, + const fq_nmod_mpoly_t poly3, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_mul( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_t C, + const fq_nmod_mpoly_ctx_t ctx); /* Powering ******************************************************************/ -int fq_nmod_mpoly_pow_ui(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, ulong k, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_pow_fmpz(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fmpz_t k, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_pow_ui( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + ulong k, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_pow_fmpz( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fmpz_t k, + const fq_nmod_mpoly_ctx_t ctx); /* Division ******************************************************************/ -int _fq_nmod_mpoly_divides_monagan_pearce(fq_nmod_mpoly_t A, const mp_limb_t * coeff2, const ulong * exp2, slong len2, const mp_limb_t * coeff3, const ulong * exp3, slong len3, flint_bitcnt_t bits, slong N, const ulong * cmpmask, const fq_nmod_ctx_t fqctx); -int fq_nmod_mpoly_divides_monagan_pearce(fq_nmod_mpoly_t poly1, const fq_nmod_mpoly_t poly2, const fq_nmod_mpoly_t poly3, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_divides(fq_nmod_mpoly_t Q, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_div_monagan_pearce(fq_nmod_mpoly_t q, const fq_nmod_mpoly_t poly2, const fq_nmod_mpoly_t poly3, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_div(fq_nmod_mpoly_t Q, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_divrem_monagan_pearce(fq_nmod_mpoly_t q, fq_nmod_mpoly_t r, const fq_nmod_mpoly_t poly2, const fq_nmod_mpoly_t poly3, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_divrem(fq_nmod_mpoly_t Q, fq_nmod_mpoly_t R, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); +int _fq_nmod_mpoly_divides_monagan_pearce( + fq_nmod_mpoly_t A, + const mp_limb_t * coeff2, + const ulong * exp2, + slong len2, + const mp_limb_t * coeff3, + const ulong * exp3, + slong len3, + flint_bitcnt_t bits, + slong N, + const ulong * cmpmask, + const fq_nmod_ctx_t fqctx); +int fq_nmod_mpoly_divides_monagan_pearce( + fq_nmod_mpoly_t poly1, + const fq_nmod_mpoly_t poly2, + const fq_nmod_mpoly_t poly3, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_divides( + fq_nmod_mpoly_t Q, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_div_monagan_pearce( + fq_nmod_mpoly_t q, + const fq_nmod_mpoly_t poly2, + const fq_nmod_mpoly_t poly3, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_div( + fq_nmod_mpoly_t Q, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_divrem_monagan_pearce( + fq_nmod_mpoly_t q, + fq_nmod_mpoly_t r, + const fq_nmod_mpoly_t poly2, + const fq_nmod_mpoly_t poly3, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_divrem( + fq_nmod_mpoly_t Q, + fq_nmod_mpoly_t R, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_divrem_ideal_monagan_pearce( + fq_nmod_mpoly_struct ** q, + fq_nmod_mpoly_t r, + const fq_nmod_mpoly_t poly2, + fq_nmod_mpoly_struct * const * poly3, + slong len, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_divrem_ideal( + fq_nmod_mpoly_struct ** Q, + fq_nmod_mpoly_t R, + const fq_nmod_mpoly_t A, + fq_nmod_mpoly_struct * const * B, + slong len, + const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_divrem_ideal_monagan_pearce(fq_nmod_mpoly_struct ** q, fq_nmod_mpoly_t r, const fq_nmod_mpoly_t poly2, fq_nmod_mpoly_struct * const * poly3, slong len, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_divrem_ideal(fq_nmod_mpoly_struct ** Q, fq_nmod_mpoly_t R, const fq_nmod_mpoly_t A, fq_nmod_mpoly_struct * const * B, slong len, const fq_nmod_mpoly_ctx_t ctx); - -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_divexact(fq_nmod_mpoly_t Q, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx) { if (fq_nmod_mpoly_divides(Q, A, B, ctx)) return; else flint_throw(FLINT_ERROR, "fq_nmod_mpoly_divexact: nonexact division"); } +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_divexact(fq_nmod_mpoly_t Q, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx) +{ + if (fq_nmod_mpoly_divides(Q, A, B, ctx)) return; else flint_throw(FLINT_ERROR, "fq_nmod_mpoly_divexact: nonexact division"); +} /* Square root ***************************************************************/ -int fq_nmod_mpoly_sqrt_heap(fq_nmod_mpoly_t Q, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -FQ_NMOD_MPOLY_INLINE int fq_nmod_mpoly_sqrt(fq_nmod_mpoly_t Q, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) { return fq_nmod_mpoly_sqrt_heap(Q, A, ctx); } +int fq_nmod_mpoly_sqrt_heap( + fq_nmod_mpoly_t Q, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); +FQ_NMOD_MPOLY_INLINE +int fq_nmod_mpoly_sqrt(fq_nmod_mpoly_t Q, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + return fq_nmod_mpoly_sqrt_heap(Q, A, ctx); +} FQ_NMOD_MPOLY_INLINE int fq_nmod_mpoly_is_square(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx) @@ -458,27 +984,86 @@ int fq_nmod_mpoly_is_square(const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t c return res; } -int fq_nmod_mpoly_quadratic_root(fq_nmod_mpoly_t Q, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_quadratic_root( + fq_nmod_mpoly_t Q, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); /* GCD ***********************************************************************/ -void fq_nmod_mpoly_term_content(fq_nmod_mpoly_t M, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); - -int fq_nmod_mpoly_content_vars(fq_nmod_mpoly_t g, const fq_nmod_mpoly_t A, slong * vars, slong vars_length, const fq_nmod_mpoly_ctx_t ctx); - -int _fq_nmod_mpoly_gcd_algo(fq_nmod_mpoly_t G, fq_nmod_mpoly_t Abar, fq_nmod_mpoly_t Bbar, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx, unsigned int algo); - -int fq_nmod_mpoly_gcd_cofactors(fq_nmod_mpoly_t G, fq_nmod_mpoly_t Abar, fq_nmod_mpoly_t Bbar, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_gcd_brown(fq_nmod_mpoly_t G, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_gcd_hensel(fq_nmod_mpoly_t G, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_gcd_zippel(fq_nmod_mpoly_t G, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_gcd_zippel2(fq_nmod_mpoly_t G, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_gcd(fq_nmod_mpoly_t G, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_deflation(fmpz * shift, fmpz * stride, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_deflate(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fmpz * shift, const fmpz * stride, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_inflate(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fmpz * shift, const fmpz * stride, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_term_content( + fq_nmod_mpoly_t M, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpoly_content_vars( + fq_nmod_mpoly_t g, + const fq_nmod_mpoly_t A, + slong * vars, + slong vars_length, + const fq_nmod_mpoly_ctx_t ctx); + +int _fq_nmod_mpoly_gcd_algo( + fq_nmod_mpoly_t G, + fq_nmod_mpoly_t Abar, + fq_nmod_mpoly_t Bbar, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx, + unsigned int algo); + +int fq_nmod_mpoly_gcd_cofactors( + fq_nmod_mpoly_t G, + fq_nmod_mpoly_t Abar, + fq_nmod_mpoly_t Bbar, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_gcd_brown( + fq_nmod_mpoly_t G, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_gcd_hensel( + fq_nmod_mpoly_t G, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_gcd_zippel( + fq_nmod_mpoly_t G, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_gcd_zippel2( + fq_nmod_mpoly_t G, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_gcd( + fq_nmod_mpoly_t G, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_deflation( + fmpz * shift, + fmpz * stride, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_deflate( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fmpz * shift, + const fmpz * stride, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_inflate( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fmpz * shift, + const fmpz * stride, + const fq_nmod_mpoly_ctx_t ctx); /****************************************************************************** @@ -488,25 +1073,101 @@ void fq_nmod_mpoly_inflate(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fmp void mpoly_void_ring_init_fq_nmod_mpoly_ctx(mpoly_void_ring_t R, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyl_lead_coeff(fq_nmod_mpoly_t c, const fq_nmod_mpoly_t A, slong num_vars, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_to_mpolyl_perm_deflate(fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t lctx, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx, const slong * perm, const ulong * shift, const ulong * stride); - -void fq_nmod_mpoly_from_mpolyl_perm_inflate(fq_nmod_mpoly_t A, flint_bitcnt_t Abits, const fq_nmod_mpoly_ctx_t ctx, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t lctx, const slong * perm, const ulong * shift, const ulong * stride); - -int fq_nmod_mpolyl_gcd_zippel_smprime(fq_nmod_mpoly_t rG, const slong * rGdegs, fq_nmod_mpoly_t rAbar, fq_nmod_mpoly_t rBbar, const fq_nmod_mpoly_t A, const slong * Adegs, const fq_nmod_mpoly_t B, const slong * Bdegs, const fq_nmod_mpoly_t gamma, const slong * gammadegs, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpolyl_gcd_zippel_lgprime(fq_nmod_mpoly_t rG, const slong * rGdegs, fq_nmod_mpoly_t rAbar, fq_nmod_mpoly_t rBbar, const fq_nmod_mpoly_t A, const slong * Adegs, const fq_nmod_mpoly_t B, const slong * Bdegs, const fq_nmod_mpoly_t gamma, const slong * gammadegs, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpolyl_gcd_hensel_smprime(fq_nmod_mpoly_t G, slong Gdeg, fq_nmod_mpoly_t Abar, fq_nmod_mpoly_t Bbar, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); - -int fq_nmod_mpolyl_content(fq_nmod_mpoly_t g, const fq_nmod_mpoly_t A, slong num_vars, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_pow_rmul(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, ulong k, const fq_nmod_mpoly_ctx_t ctx); - -void _fq_nmod_mpoly_to_fq_nmod_poly_deflate(fq_nmod_poly_t A, const fq_nmod_mpoly_t B, slong var, const ulong * Bshift, const ulong * Bstride, const fq_nmod_mpoly_ctx_t ctx); -void _fq_nmod_mpoly_from_fq_nmod_poly_inflate(fq_nmod_mpoly_t A, flint_bitcnt_t Abits, const fq_nmod_poly_t B, slong var, const ulong * Ashift, const ulong * Astride, const fq_nmod_mpoly_ctx_t ctx); - -int fq_nmod_mpoly_repack_bits_inplace(fq_nmod_mpoly_t A, flint_bitcnt_t Abits, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_repack_bits(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, flint_bitcnt_t Abits, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyl_lead_coeff( + fq_nmod_mpoly_t c, + const fq_nmod_mpoly_t A, + slong num_vars, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_to_mpolyl_perm_deflate( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t lctx, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx, + const slong * perm, + const ulong * shift, + const ulong * stride); + +void fq_nmod_mpoly_from_mpolyl_perm_inflate( + fq_nmod_mpoly_t A, + flint_bitcnt_t Abits, + const fq_nmod_mpoly_ctx_t ctx, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t lctx, + const slong * perm, + const ulong * shift, + const ulong * stride); + +int fq_nmod_mpolyl_gcd_zippel_smprime( + fq_nmod_mpoly_t rG, + const slong * rGdegs, + fq_nmod_mpoly_t rAbar, + fq_nmod_mpoly_t rBbar, + const fq_nmod_mpoly_t A, + const slong * Adegs, + const fq_nmod_mpoly_t B, + const slong * Bdegs, + const fq_nmod_mpoly_t gamma, + const slong * gammadegs, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpolyl_gcd_zippel_lgprime( + fq_nmod_mpoly_t rG, + const slong * rGdegs, + fq_nmod_mpoly_t rAbar, + fq_nmod_mpoly_t rBbar, + const fq_nmod_mpoly_t A, + const slong * Adegs, + const fq_nmod_mpoly_t B, + const slong * Bdegs, + const fq_nmod_mpoly_t gamma, + const slong * gammadegs, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpolyl_gcd_hensel_smprime( + fq_nmod_mpoly_t G, + slong Gdeg, + fq_nmod_mpoly_t Abar, + fq_nmod_mpoly_t Bbar, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpolyl_content( + fq_nmod_mpoly_t g, + const fq_nmod_mpoly_t A, + slong num_vars, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_pow_rmul( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + ulong k, + const fq_nmod_mpoly_ctx_t ctx); + +void _fq_nmod_mpoly_to_fq_nmod_poly_deflate( + fq_nmod_poly_t A, + const fq_nmod_mpoly_t B, + slong var, + const ulong * Bshift, + const ulong * Bstride, + const fq_nmod_mpoly_ctx_t ctx); +void _fq_nmod_mpoly_from_fq_nmod_poly_inflate( + fq_nmod_mpoly_t A, + flint_bitcnt_t Abits, + const fq_nmod_poly_t B, + slong var, + const ulong * Ashift, + const ulong * Astride, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpoly_repack_bits_inplace( + fq_nmod_mpoly_t A, + flint_bitcnt_t Abits, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_repack_bits( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + flint_bitcnt_t Abits, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_ctx_change_modulus(fq_nmod_mpoly_ctx_t ctx, slong deg); @@ -515,96 +1176,250 @@ void fq_nmod_mpoly_ctx_change_modulus(fq_nmod_mpoly_ctx_t ctx, slong deg); void fq_nmod_mpoly_univar_init(fq_nmod_mpoly_univar_t A, const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_univar_clear(fq_nmod_mpoly_univar_t A, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_univar_fit_length(fq_nmod_mpoly_univar_t A, slong length, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_univar_fit_length( + fq_nmod_mpoly_univar_t A, + slong length, + const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_univar_print_pretty(const fq_nmod_mpoly_univar_t A, const char ** x, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_univar_print_pretty( + const fq_nmod_mpoly_univar_t A, + const char ** x, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_univar_assert_canonical(fq_nmod_mpoly_univar_t A, const fq_nmod_mpoly_ctx_t ctx); -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_univar_zero(fq_nmod_mpoly_univar_t A, const fq_nmod_mpoly_ctx_t ctx) { A->length = 0; } - -void fq_nmod_mpoly_univar_set_coeff_ui(fq_nmod_mpoly_univar_t A, ulong e, const fq_nmod_mpoly_t c, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_to_univar(fq_nmod_mpoly_univar_t A, const fq_nmod_mpoly_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); -void _fq_nmod_mpoly_from_univar(fq_nmod_mpoly_t A, flint_bitcnt_t Abits, const fq_nmod_mpoly_univar_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_from_univar(fq_nmod_mpoly_t A, const fq_nmod_mpoly_univar_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); - -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_univar_swap(fq_nmod_mpoly_univar_t A, fq_nmod_mpoly_univar_t B, const fq_nmod_mpoly_ctx_t ctx) { FLINT_SWAP(fq_nmod_mpoly_univar_struct, *A, *B); } - -FQ_NMOD_MPOLY_INLINE int fq_nmod_mpoly_univar_degree_fits_si(const fq_nmod_mpoly_univar_t A, const fq_nmod_mpoly_ctx_t ctx) { return A->length == 0 || fmpz_fits_si(A->exps + 0); } - -FQ_NMOD_MPOLY_INLINE slong fq_nmod_mpoly_univar_length(const fq_nmod_mpoly_univar_t A, const fq_nmod_mpoly_ctx_t ctx) { return A->length; } +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_univar_zero(fq_nmod_mpoly_univar_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + A->length = 0; +} -FQ_NMOD_MPOLY_INLINE slong fq_nmod_mpoly_univar_get_term_exp_si(fq_nmod_mpoly_univar_t A, slong i, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) A->length); return fmpz_get_si(A->exps + i); } +void fq_nmod_mpoly_univar_set_coeff_ui( + fq_nmod_mpoly_univar_t A, + ulong e, + const fq_nmod_mpoly_t c, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_to_univar( + fq_nmod_mpoly_univar_t A, + const fq_nmod_mpoly_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); +void _fq_nmod_mpoly_from_univar( + fq_nmod_mpoly_t A, + flint_bitcnt_t Abits, + const fq_nmod_mpoly_univar_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_from_univar( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_univar_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_univar_get_term_coeff(fq_nmod_mpoly_t c, const fq_nmod_mpoly_univar_t A, slong i, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) A->length); fq_nmod_mpoly_set(c, A->coeffs + i, ctx); } +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_univar_swap(fq_nmod_mpoly_univar_t A, fq_nmod_mpoly_univar_t B, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_SWAP(fq_nmod_mpoly_univar_struct, *A, *B); +} -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpoly_univar_swap_term_coeff(fq_nmod_mpoly_t c, fq_nmod_mpoly_univar_t A, slong i, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) A->length); fq_nmod_mpoly_swap(c, A->coeffs + i, ctx); } +FQ_NMOD_MPOLY_INLINE +int fq_nmod_mpoly_univar_degree_fits_si(const fq_nmod_mpoly_univar_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + return A->length == 0 || fmpz_fits_si(A->exps + 0); +} -int fq_nmod_mpoly_univar_pseudo_gcd(fq_nmod_mpoly_univar_t Gx, const fq_nmod_mpoly_univar_t Ax, const fq_nmod_mpoly_univar_t Bx, const fq_nmod_mpoly_ctx_t ctx); +FQ_NMOD_MPOLY_INLINE +slong fq_nmod_mpoly_univar_length(const fq_nmod_mpoly_univar_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + return A->length; +} -int fq_nmod_mpoly_univar_resultant(fq_nmod_mpoly_t R, const fq_nmod_mpoly_univar_t Ax, const fq_nmod_mpoly_univar_t Bx, const fq_nmod_mpoly_ctx_t ctx); +FQ_NMOD_MPOLY_INLINE +slong fq_nmod_mpoly_univar_get_term_exp_si(fq_nmod_mpoly_univar_t A, slong i, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) A->length); return fmpz_get_si(A->exps + i); +} -int fq_nmod_mpoly_univar_discriminant(fq_nmod_mpoly_t D, const fq_nmod_mpoly_univar_t Fx, const fq_nmod_mpoly_ctx_t ctx); +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_univar_get_term_coeff(fq_nmod_mpoly_t c, const fq_nmod_mpoly_univar_t A, slong i, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) A->length); fq_nmod_mpoly_set(c, A->coeffs + i, ctx); +} -int fq_nmod_mpoly_resultant(fq_nmod_mpoly_t R, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpoly_univar_swap_term_coeff(fq_nmod_mpoly_t c, fq_nmod_mpoly_univar_t A, slong i, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) A->length); fq_nmod_mpoly_swap(c, A->coeffs + i, ctx); +} -int fq_nmod_mpoly_discriminant(fq_nmod_mpoly_t R, const fq_nmod_mpoly_t A, slong var, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_univar_pseudo_gcd( + fq_nmod_mpoly_univar_t Gx, + const fq_nmod_mpoly_univar_t Ax, + const fq_nmod_mpoly_univar_t Bx, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpoly_univar_resultant( + fq_nmod_mpoly_t R, + const fq_nmod_mpoly_univar_t Ax, + const fq_nmod_mpoly_univar_t Bx, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpoly_univar_discriminant( + fq_nmod_mpoly_t D, + const fq_nmod_mpoly_univar_t Fx, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpoly_resultant( + fq_nmod_mpoly_t R, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpoly_discriminant( + fq_nmod_mpoly_t R, + const fq_nmod_mpoly_t A, + slong var, + const fq_nmod_mpoly_ctx_t ctx); /* mpolyu ********************************************************************/ int fq_nmod_mpolyu_is_canonical(const fq_nmod_mpolyu_t poly, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyu_init(fq_nmod_mpolyu_t A, flint_bitcnt_t bits, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyu_init( + fq_nmod_mpolyu_t A, + flint_bitcnt_t bits, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpolyu_clear(fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t uctx); -FQ_NMOD_MPOLY_INLINE void fq_nmod_mpolyu_swap(fq_nmod_mpolyu_t A, fq_nmod_mpolyu_t B, const fq_nmod_mpoly_ctx_t uctx) { FLINT_SWAP(fq_nmod_mpolyu_struct, *A, *B); } +FQ_NMOD_MPOLY_INLINE +void fq_nmod_mpolyu_swap(fq_nmod_mpolyu_t A, fq_nmod_mpolyu_t B, const fq_nmod_mpoly_ctx_t uctx) +{ + FLINT_SWAP(fq_nmod_mpolyu_struct, *A, *B); +} void fq_nmod_mpolyu_zero(fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t uctx); void fq_nmod_mpolyu_one(fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t uctx); int fq_nmod_mpolyu_is_one(fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t uctx); -void fq_nmod_mpolyu_print_pretty(const fq_nmod_mpolyu_t poly, const char ** x, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyu_print_pretty( + const fq_nmod_mpolyu_t poly, + const char ** x, + const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyu_fit_length(fq_nmod_mpolyu_t A, slong length, const fq_nmod_mpoly_ctx_t uctx); +void fq_nmod_mpolyu_fit_length( + fq_nmod_mpolyu_t A, + slong length, + const fq_nmod_mpoly_ctx_t uctx); -void fq_nmod_mpolyu_degrees_si(slong * degs, const fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyu_degrees_si( + slong * degs, + const fq_nmod_mpolyu_t A, + const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyu_repack_bits_inplace(fq_nmod_mpolyu_t A, flint_bitcnt_t bits, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyu_repack_bits_inplace( + fq_nmod_mpolyu_t A, + flint_bitcnt_t bits, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpolyu_shift_right(fq_nmod_mpolyu_t A, ulong s); void fq_nmod_mpolyu_shift_left(fq_nmod_mpolyu_t A, ulong s); -int fq_nmod_mpolyu_content_mpoly(fq_nmod_mpoly_t g, const fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpolyu_scalar_mul_fq_nmod(fq_nmod_mpolyu_t A, fq_nmod_t c, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpolyu_set(fq_nmod_mpolyu_t A, const fq_nmod_mpolyu_t B, const fq_nmod_mpoly_ctx_t uctx); - -void fq_nmod_mpolyu_evaluate_one_fq_nmod(fq_nmod_mpolyu_t E, fq_nmod_mpolyu_t A, slong var, const fq_nmod_t alpha, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpolyu_setform(fq_nmod_mpolyu_t A, fq_nmod_mpolyu_t B, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpolyu_content_mpoly( + fq_nmod_mpoly_t g, + const fq_nmod_mpolyu_t A, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpolyu_scalar_mul_fq_nmod( + fq_nmod_mpolyu_t A, + fq_nmod_t c, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpolyu_set( + fq_nmod_mpolyu_t A, + const fq_nmod_mpolyu_t B, + const fq_nmod_mpoly_ctx_t uctx); + +void fq_nmod_mpolyu_evaluate_one_fq_nmod( + fq_nmod_mpolyu_t E, + fq_nmod_mpolyu_t A, + slong var, + const fq_nmod_t alpha, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpolyu_setform( + fq_nmod_mpolyu_t A, + fq_nmod_mpolyu_t B, + const fq_nmod_mpoly_ctx_t ctx); + +fq_nmod_mpoly_struct * _fq_nmod_mpolyu_get_coeff( + fq_nmod_mpolyu_t A, + ulong pow, + const fq_nmod_mpoly_ctx_t uctx); + +void fq_nmod_mpoly_to_mpolyu_perm_deflate( + fq_nmod_mpolyu_t A, + const fq_nmod_mpoly_ctx_t uctx, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx, + const slong * perm, + const ulong * shift, + const ulong * stride); +void fq_nmod_mpoly_from_mpolyu_perm_inflate( + fq_nmod_mpoly_t A, + flint_bitcnt_t Abits, + const fq_nmod_mpoly_ctx_t ctx, + const fq_nmod_mpolyu_t B, + const fq_nmod_mpoly_ctx_t uctx, + const slong * perm, + const ulong * shift, + const ulong * stride); + +int fq_nmod_mpolyuu_divides( + fq_nmod_mpolyu_t Q, + const fq_nmod_mpolyu_t A, + const fq_nmod_mpolyu_t B, + slong nmainvars, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpolyu_divexact_mpoly_inplace( + fq_nmod_mpolyu_t A, + fq_nmod_mpoly_t c, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpolyu_mul_mpoly_inplace( + fq_nmod_mpolyu_t A, + fq_nmod_mpoly_t c, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyu_mul_mpoly( + fq_nmod_mpolyu_t A, + fq_nmod_mpolyu_t B, + fq_nmod_mpoly_t c, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpolyu_gcdm_zippel( + fq_nmod_mpolyu_t G, + fq_nmod_mpolyu_t Abar, + fq_nmod_mpolyu_t Bbar, + fq_nmod_mpolyu_t A, + fq_nmod_mpolyu_t B, + fq_nmod_mpoly_ctx_t ctx, + flint_rand_t randstate); -fq_nmod_mpoly_struct * _fq_nmod_mpolyu_get_coeff(fq_nmod_mpolyu_t A, ulong pow, const fq_nmod_mpoly_ctx_t uctx); - -void fq_nmod_mpoly_to_mpolyu_perm_deflate(fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t uctx, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx, const slong * perm, const ulong * shift, const ulong * stride); -void fq_nmod_mpoly_from_mpolyu_perm_inflate(fq_nmod_mpoly_t A, flint_bitcnt_t Abits, const fq_nmod_mpoly_ctx_t ctx, const fq_nmod_mpolyu_t B, const fq_nmod_mpoly_ctx_t uctx, const slong * perm, const ulong * shift, const ulong * stride); - -int fq_nmod_mpolyuu_divides(fq_nmod_mpolyu_t Q, const fq_nmod_mpolyu_t A, const fq_nmod_mpolyu_t B, slong nmainvars, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpolyu_divexact_mpoly_inplace(fq_nmod_mpolyu_t A, fq_nmod_mpoly_t c, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpolyu_mul_mpoly_inplace(fq_nmod_mpolyu_t A, fq_nmod_mpoly_t c, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyu_mul_mpoly(fq_nmod_mpolyu_t A, fq_nmod_mpolyu_t B, fq_nmod_mpoly_t c, const fq_nmod_mpoly_ctx_t ctx); - -int fq_nmod_mpolyu_gcdm_zippel(fq_nmod_mpolyu_t G, fq_nmod_mpolyu_t Abar, fq_nmod_mpolyu_t Bbar, fq_nmod_mpolyu_t A, fq_nmod_mpolyu_t B, fq_nmod_mpoly_ctx_t ctx, flint_rand_t randstate); - -FQ_NMOD_MPOLY_INLINE mp_limb_t * fq_nmod_mpolyu_leadcoeff(const fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(A->length > 0); return _fq_nmod_mpoly_leadcoeff(A->coeffs + 0, ctx); } +FQ_NMOD_MPOLY_INLINE +mp_limb_t * fq_nmod_mpolyu_leadcoeff(const fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(A->length > 0); return _fq_nmod_mpoly_leadcoeff(A->coeffs + 0, ctx); +} /* mpolyn ********************************************************************/ -void fq_nmod_mpolyn_init(fq_nmod_mpolyn_t A, flint_bitcnt_t bits, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_init( + fq_nmod_mpolyn_t A, + flint_bitcnt_t bits, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpolyn_clear(fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpolyn_swap(fq_nmod_mpolyn_t A, fq_nmod_mpolyn_t B); @@ -616,13 +1431,25 @@ void fq_nmod_mpolyn_one(fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ctx); int fq_nmod_mpolyn_is_zero(fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyn_print_pretty(const fq_nmod_mpolyn_t A, const char ** x_in, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_print_pretty( + const fq_nmod_mpolyn_t A, + const char ** x_in, + const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyn_fit_length(fq_nmod_mpolyn_t A, slong length, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_fit_length( + fq_nmod_mpolyn_t A, + slong length, + const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyn_fit_bits(fq_nmod_mpolyn_t A, slong bits, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_fit_bits( + fq_nmod_mpolyn_t A, + slong bits, + const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyn_set(fq_nmod_mpolyn_t A, const fq_nmod_mpolyn_t B, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_set( + fq_nmod_mpolyn_t A, + const fq_nmod_mpolyn_t B, + const fq_nmod_mpoly_ctx_t ctx); FQ_NMOD_MPOLY_INLINE mp_limb_t * fq_nmod_mpolyn_leadcoeff(fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ctx) @@ -635,135 +1462,527 @@ mp_limb_t * fq_nmod_mpolyn_leadcoeff(fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx return leadpoly->coeffs + d*(leadpoly->length - 1); } -FQ_NMOD_MPOLY_INLINE n_poly_struct * fq_nmod_mpolyn_leadcoeff_poly(const fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(A->length > 0); return A->coeffs + 0; } +FQ_NMOD_MPOLY_INLINE +n_poly_struct * fq_nmod_mpolyn_leadcoeff_poly(const fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(A->length > 0); return A->coeffs + 0; +} /* mpolyun *******************************************************************/ -void fq_nmod_mpoly_to_mpolyn_perm_deflate(fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t nctx, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx, const slong * perm, const ulong * shift, const ulong * stride); -void fq_nmod_mpoly_from_mpolyn_perm_inflate(fq_nmod_mpoly_t A, flint_bitcnt_t Abits, const fq_nmod_mpoly_ctx_t ctx, const fq_nmod_mpolyn_t B, const fq_nmod_mpoly_ctx_t nctx, const slong * perm, const ulong * shift, const ulong * stride); - -void fq_nmod_mpolyun_init(fq_nmod_mpolyun_t A, flint_bitcnt_t bits, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_to_mpolyn_perm_deflate( + fq_nmod_mpolyn_t A, + const fq_nmod_mpoly_ctx_t nctx, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx, + const slong * perm, + const ulong * shift, + const ulong * stride); +void fq_nmod_mpoly_from_mpolyn_perm_inflate( + fq_nmod_mpoly_t A, + flint_bitcnt_t Abits, + const fq_nmod_mpoly_ctx_t ctx, + const fq_nmod_mpolyn_t B, + const fq_nmod_mpoly_ctx_t nctx, + const slong * perm, + const ulong * shift, + const ulong * stride); + +void fq_nmod_mpolyun_init( + fq_nmod_mpolyun_t A, + flint_bitcnt_t bits, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpolyun_clear(fq_nmod_mpolyun_t A, const fq_nmod_mpoly_ctx_t ctx); int fq_nmod_mpolyun_is_canonical(const fq_nmod_mpolyun_t A, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyun_print_pretty(const fq_nmod_mpolyun_t poly, const char ** x, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyun_print_pretty( + const fq_nmod_mpolyun_t poly, + const char ** x, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpolyun_swap(fq_nmod_mpolyun_t A, fq_nmod_mpolyun_t B); void fq_nmod_mpolyun_zero(fq_nmod_mpolyun_t A, const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpolyun_one(fq_nmod_mpolyun_t A, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyun_fit_length(fq_nmod_mpolyun_t A, slong length, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyun_fit_length( + fq_nmod_mpolyun_t A, + slong length, + const fq_nmod_mpoly_ctx_t ctx); int fq_nmod_mpolyn_is_nonzero_fq_nmod(const fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ctx); int fq_nmod_mpolyun_is_nonzero_fq_nmod(const fq_nmod_mpolyun_t A, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyn_scalar_mul_fq_nmod(fq_nmod_mpolyn_t A, const fq_nmod_t c, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyun_scalar_mul_fq_nmod(fq_nmod_mpolyun_t A, const fq_nmod_t c, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_scalar_mul_fq_nmod( + fq_nmod_mpolyn_t A, + const fq_nmod_t c, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyun_scalar_mul_fq_nmod( + fq_nmod_mpolyun_t A, + const fq_nmod_t c, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpolyun_shift_right(fq_nmod_mpolyun_t A, ulong s); void fq_nmod_mpolyun_shift_left(fq_nmod_mpolyun_t A, ulong s); -void fq_nmod_mpolyn_mul_poly(fq_nmod_mpolyn_t A, const fq_nmod_mpolyn_t B, const fq_nmod_poly_t c, const fq_nmod_mpoly_ctx_t ctx, fq_nmod_poly_t t); -void fq_nmod_mpolyun_mul_poly(fq_nmod_mpolyun_t A, const fq_nmod_mpolyun_t B, const fq_nmod_poly_t c, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpolyn_divexact_poly(fq_nmod_mpolyn_t A, const fq_nmod_mpolyn_t B, const fq_nmod_poly_t c, const fq_nmod_mpoly_ctx_t ctx, fq_nmod_poly_t q, fq_nmod_poly_t r); -void fq_nmod_mpolyun_divexact_poly(fq_nmod_mpolyun_t A, const fq_nmod_mpolyun_t B, const fq_nmod_poly_t c, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpolyn_content_poly(fq_nmod_poly_t g, fq_nmod_mpolyn_t B, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyun_content_poly(fq_nmod_poly_t g, fq_nmod_mpolyun_t B, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_mul_poly( + fq_nmod_mpolyn_t A, + const fq_nmod_mpolyn_t B, + const fq_nmod_poly_t c, + const fq_nmod_mpoly_ctx_t ctx, + fq_nmod_poly_t t); +void fq_nmod_mpolyun_mul_poly( + fq_nmod_mpolyun_t A, + const fq_nmod_mpolyun_t B, + const fq_nmod_poly_t c, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpolyn_divexact_poly( + fq_nmod_mpolyn_t A, + const fq_nmod_mpolyn_t B, + const fq_nmod_poly_t c, + const fq_nmod_mpoly_ctx_t ctx, + fq_nmod_poly_t q, + fq_nmod_poly_t r); +void fq_nmod_mpolyun_divexact_poly( + fq_nmod_mpolyun_t A, + const fq_nmod_mpolyun_t B, + const fq_nmod_poly_t c, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpolyn_content_poly( + fq_nmod_poly_t g, + fq_nmod_mpolyn_t B, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyun_content_poly( + fq_nmod_poly_t g, + fq_nmod_mpolyun_t B, + const fq_nmod_mpoly_ctx_t ctx); slong fq_nmod_mpolyn_lastdeg(fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ctx); slong fq_nmod_mpolyun_lastdeg(fq_nmod_mpolyun_t A, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyun_set(fq_nmod_mpolyun_t A, const fq_nmod_mpolyun_t B, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyun_set( + fq_nmod_mpolyun_t A, + const fq_nmod_mpolyun_t B, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_cvtto_mpolyn( + fq_nmod_mpolyn_t A, + const fq_nmod_mpoly_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyu_cvtto_mpolyun( + fq_nmod_mpolyun_t A, + const fq_nmod_mpolyu_t B, + slong k, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_cvtfrom_mpolyn( + fq_nmod_mpoly_t A, + fq_nmod_mpolyn_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyu_cvtfrom_mpolyun( + fq_nmod_mpolyu_t A, + fq_nmod_mpolyun_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_cvtto_mpolyn(fq_nmod_mpolyn_t A, const fq_nmod_mpoly_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyu_cvtto_mpolyun(fq_nmod_mpolyun_t A, const fq_nmod_mpolyu_t B, slong k, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_cvtfrom_mpolyn(fq_nmod_mpoly_t A, fq_nmod_mpolyn_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyu_cvtfrom_mpolyun(fq_nmod_mpolyu_t A, fq_nmod_mpolyun_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); - -FQ_NMOD_MPOLY_INLINE n_poly_struct * fq_nmod_mpolyun_leadcoeff_poly(const fq_nmod_mpolyun_t A, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(A->length > 0); return fq_nmod_mpolyn_leadcoeff_poly(A->coeffs + 0, ctx); } +FQ_NMOD_MPOLY_INLINE +n_poly_struct * fq_nmod_mpolyun_leadcoeff_poly(const fq_nmod_mpolyun_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(A->length > 0); return fq_nmod_mpolyn_leadcoeff_poly(A->coeffs + 0, ctx); +} /*** gcd *********************************************************************/ void fq_nmod_next_not_zero(fq_nmod_t alpha, const fq_nmod_ctx_t fqctx); int fq_nmod_next(fq_nmod_t alpha, const fq_nmod_ctx_t fqctx); -nmod_gcds_ret_t fq_nmod_mpolyu_gcds_zippel(fq_nmod_mpolyu_t G, fq_nmod_mpolyu_t A, fq_nmod_mpolyu_t B, fq_nmod_mpolyu_t f, slong var, const fq_nmod_mpoly_ctx_t ctx, flint_rand_t randstate, slong * degbound); - -int fq_nmod_mpolyu_gcdp_zippel_univar(fq_nmod_mpolyu_t G, fq_nmod_mpolyu_t Abar, fq_nmod_mpolyu_t Bbar, fq_nmod_mpolyu_t A, fq_nmod_mpolyu_t B, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpolyu_gcdp_zippel_univar_no_cofactors(fq_nmod_mpolyu_t G, fq_nmod_mpolyu_t A, fq_nmod_mpolyu_t B, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpolyu_gcdp_zippel(fq_nmod_mpolyu_t G, fq_nmod_mpolyu_t Abar, fq_nmod_mpolyu_t Bbar, fq_nmod_mpolyu_t A, fq_nmod_mpolyu_t B, slong var, const fq_nmod_mpoly_ctx_t ctx, flint_rand_t randstate); - -int fq_nmod_mpolyn_gcd_brown_smprime(fq_nmod_mpolyn_t G, fq_nmod_mpolyn_t Abar, fq_nmod_mpolyn_t Bbar, fq_nmod_mpolyn_t A, fq_nmod_mpolyn_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpolyn_gcd_brown_lgprime(fq_nmod_mpolyn_t G, fq_nmod_mpolyn_t Abar, fq_nmod_mpolyn_t Bbar, fq_nmod_mpolyn_t A, fq_nmod_mpolyn_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); - -void _fq_nmod_mpoly_monomial_evals2_cache(n_fq_polyun_t E, const ulong * Aexps, flint_bitcnt_t Abits, slong Alen, const fq_nmod_struct * betas, slong m, const fq_nmod_mpoly_ctx_t ctx); -void _fq_nmod_mpoly_monomial_evals_cache(n_fq_poly_t E, const ulong * Aexps, flint_bitcnt_t Abits, slong Alen, const fq_nmod_struct * betas, slong start, slong stop, const fq_nmod_mpoly_ctx_t ctx); - -void n_fq_bpoly_eval_step_sep(n_fq_bpoly_t E, n_fq_polyun_t cur, const n_fq_polyun_t inc, const fq_nmod_mpoly_t A, const fq_nmod_ctx_t ctx); - -void n_fq_polyun_zip_start(n_fq_polyun_t Z, n_fq_polyun_t H, slong req_images, const fq_nmod_ctx_t ctx); - -int n_fq_polyu2n_add_zip_must_match(n_fq_polyun_t Z, const n_fq_bpoly_t A, slong cur_length, const fq_nmod_ctx_t ctx); - -int n_fq_polyun_zip_solve(fq_nmod_mpoly_t A, n_fq_polyun_t Z, n_fq_polyun_t H, n_fq_polyun_t M, const fq_nmod_mpoly_ctx_t ctx); +nmod_gcds_ret_t fq_nmod_mpolyu_gcds_zippel( + fq_nmod_mpolyu_t G, + fq_nmod_mpolyu_t A, + fq_nmod_mpolyu_t B, + fq_nmod_mpolyu_t f, + slong var, + const fq_nmod_mpoly_ctx_t ctx, + flint_rand_t randstate, + slong * degbound); + +int fq_nmod_mpolyu_gcdp_zippel_univar( + fq_nmod_mpolyu_t G, + fq_nmod_mpolyu_t Abar, + fq_nmod_mpolyu_t Bbar, + fq_nmod_mpolyu_t A, + fq_nmod_mpolyu_t B, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpolyu_gcdp_zippel_univar_no_cofactors( + fq_nmod_mpolyu_t G, + fq_nmod_mpolyu_t A, + fq_nmod_mpolyu_t B, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpolyu_gcdp_zippel( + fq_nmod_mpolyu_t G, + fq_nmod_mpolyu_t Abar, + fq_nmod_mpolyu_t Bbar, + fq_nmod_mpolyu_t A, + fq_nmod_mpolyu_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx, + flint_rand_t randstate); + +int fq_nmod_mpolyn_gcd_brown_smprime( + fq_nmod_mpolyn_t G, + fq_nmod_mpolyn_t Abar, + fq_nmod_mpolyn_t Bbar, + fq_nmod_mpolyn_t A, + fq_nmod_mpolyn_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpolyn_gcd_brown_lgprime( + fq_nmod_mpolyn_t G, + fq_nmod_mpolyn_t Abar, + fq_nmod_mpolyn_t Bbar, + fq_nmod_mpolyn_t A, + fq_nmod_mpolyn_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); + +void _fq_nmod_mpoly_monomial_evals2_cache( + n_fq_polyun_t E, + const ulong * Aexps, + flint_bitcnt_t Abits, + slong Alen, + const fq_nmod_struct * betas, + slong m, + const fq_nmod_mpoly_ctx_t ctx); +void _fq_nmod_mpoly_monomial_evals_cache( + n_fq_poly_t E, + const ulong * Aexps, + flint_bitcnt_t Abits, + slong Alen, + const fq_nmod_struct * betas, + slong start, + slong stop, + const fq_nmod_mpoly_ctx_t ctx); + +void n_fq_bpoly_eval_step_sep( + n_fq_bpoly_t E, + n_fq_polyun_t cur, + const n_fq_polyun_t inc, + const fq_nmod_mpoly_t A, + const fq_nmod_ctx_t ctx); + +void n_fq_polyun_zip_start( + n_fq_polyun_t Z, + n_fq_polyun_t H, + slong req_images, + const fq_nmod_ctx_t ctx); + +int n_fq_polyu2n_add_zip_must_match( + n_fq_polyun_t Z, + const n_fq_bpoly_t A, + slong cur_length, + const fq_nmod_ctx_t ctx); + +int n_fq_polyun_zip_solve( + fq_nmod_mpoly_t A, + n_fq_polyun_t Z, + n_fq_polyun_t H, + n_fq_polyun_t M, + const fq_nmod_mpoly_ctx_t ctx); /* gcd_helper_eval_interp ****************************************************/ -int nmod_mpolyn_interp_crt_lg_poly(slong * lastdeg_, nmod_mpolyn_t F, nmod_mpolyn_t T, n_poly_t modulus, const nmod_mpoly_ctx_t ctx, fq_nmod_poly_t A, const fq_nmod_ctx_t fqctx); -int nmod_mpolyn_interp_crt_lg_bpoly(slong * lastdeg, nmod_mpolyn_t F, nmod_mpolyn_t T, n_fq_poly_t modulus, const nmod_mpoly_ctx_t smctx, n_fq_bpoly_t A, const fq_nmod_mpoly_ctx_t lgctx); -int nmod_mpolyn_interp_crt_lg_mpolyn(slong * lastdeg_, nmod_mpolyn_t F, nmod_mpolyn_t T, n_poly_t modulus, slong var, const nmod_mpoly_ctx_t ctx, fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ectx); - -void nmod_mpolyn_interp_lift_lg_poly(slong * lastdeg_, nmod_mpolyn_t A, const nmod_mpoly_ctx_t ctx, const fq_nmod_poly_t B, const fq_nmod_ctx_t fqctx); -void nmod_mpolyn_interp_lift_lg_bpoly(slong * lastdeg_, nmod_mpolyn_t F, const nmod_mpoly_ctx_t smctx, n_fq_bpoly_t A, const fq_nmod_mpoly_ctx_t lgctx); -void nmod_mpolyn_interp_lift_lg_mpoly(nmod_mpolyn_t A, const nmod_mpoly_ctx_t ctx, fq_nmod_mpoly_t Ap, const fq_nmod_mpoly_ctx_t ctxp); -void nmod_mpolyn_interp_lift_lg_mpolyn(slong * lastdeg, nmod_mpolyn_t A, slong var, const nmod_mpoly_ctx_t ctx, fq_nmod_mpolyn_t B, const fq_nmod_mpoly_ctx_t ectx); - -void nmod_mpolyn_interp_reduce_lg_poly(fq_nmod_poly_t E, const fq_nmod_ctx_t fqctx, const nmod_mpolyn_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyn_interp_reduce_lg_mpoly(fq_nmod_mpoly_t A, nmod_mpolyn_t B, const fq_nmod_mpoly_ctx_t ffctx, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyn_interp_reduce_lg_mpolyn(fq_nmod_mpolyn_t E, fq_nmod_mpoly_ctx_t ectx, nmod_mpolyn_t A, slong var, const nmod_mpoly_ctx_t ctx); - -int nmod_mpolyn_interp_mcrt_lg_mpoly(slong * lastdeg_, nmod_mpolyn_t H, const nmod_mpoly_ctx_t smctx, const n_poly_t m, const mp_limb_t * inv_m_eval,fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t lgctx); - -void nmod_mpolyun_interp_lift_lg_mpolyu(nmod_mpolyun_t A, const nmod_mpoly_ctx_t ctx, fq_nmod_mpolyu_t Ap, const fq_nmod_mpoly_ctx_t ctxp); -void nmod_mpolyun_interp_reduce_lg_mpolyu(fq_nmod_mpolyu_t A, nmod_mpolyun_t B, const fq_nmod_mpoly_ctx_t ffctx, const nmod_mpoly_ctx_t ctx); -int nmod_mpolyun_interp_crt_lg_mpolyu(slong * lastdeg, nmod_mpolyun_t F, nmod_mpolyun_t T, n_poly_t m, const nmod_mpoly_ctx_t ctx, fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t ffctx); -int nmod_mpolyun_interp_mcrt_lg_mpolyu(slong * lastdeg, nmod_mpolyun_t H, const nmod_mpoly_ctx_t ctx, n_poly_t m, fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t ctxp); - -void fq_nmod_mpolyn_interp_reduce_sm_poly(fq_nmod_poly_t E, const fq_nmod_mpolyn_t A, const fq_nmod_t alpha, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyn_interp_reduce_sm_mpolyn(fq_nmod_mpolyn_t E, fq_nmod_mpolyn_t A, slong var, fq_nmod_t alpha, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyn_interp_lift_sm_poly(fq_nmod_mpolyn_t A, const fq_nmod_poly_t B, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyn_interp_lift_sm_bpoly(fq_nmod_mpolyn_t F, n_fq_bpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyn_interp_lift_sm_mpoly(fq_nmod_mpolyn_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyn_interp_lift_sm_mpolyn(fq_nmod_mpolyn_t A, fq_nmod_mpolyn_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpolyn_interp_crt_sm_poly(slong * lastdeg_, fq_nmod_mpolyn_t F, fq_nmod_mpolyn_t T, const fq_nmod_poly_t A, const fq_nmod_poly_t modulus, const fq_nmod_t alpha, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpolyn_interp_crt_sm_bpoly(slong * lastdeg, fq_nmod_mpolyn_t F, fq_nmod_mpolyn_t T, const n_fq_bpoly_t A, const n_fq_poly_t modulus, n_fq_poly_t alphapow, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpolyn_interp_crt_sm_mpolyn(slong * lastdeg_, fq_nmod_mpolyn_t F, fq_nmod_mpolyn_t T, fq_nmod_mpolyn_t A, slong var, fq_nmod_poly_t modulus, const fq_nmod_t alpha, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpolyn_interp_mcrt_sm_mpoly(slong * lastdeg_, fq_nmod_mpolyn_t F, fq_nmod_mpoly_t A, const n_fq_poly_t modulus, n_fq_poly_t alphapow, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpolyn_interp_reduce_lg_poly(fq_nmod_poly_t E, const fq_nmod_mpoly_ctx_t ectx, fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ctx, const bad_fq_nmod_embed_t emb); -void fq_nmod_mpolyn_interp_reduce_lg_mpoly(fq_nmod_mpoly_t A, fq_nmod_mpolyn_t B, const fq_nmod_mpoly_ctx_t ectx, const fq_nmod_mpoly_ctx_t ctx, const bad_fq_nmod_embed_t emb); -void fq_nmod_mpolyn_interp_reduce_lg_mpolyn(fq_nmod_mpolyn_t E, const fq_nmod_mpoly_ctx_t ectx, fq_nmod_mpolyn_t A, slong var, const fq_nmod_mpoly_ctx_t ctx, const bad_fq_nmod_embed_t emb); -void fq_nmod_mpolyn_interp_lift_lg_poly(slong * lastdeg_, fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ctx, fq_nmod_poly_t B, const fq_nmod_mpoly_ctx_t ectx, const bad_fq_nmod_embed_t emb); -void fq_nmod_mpolyn_interp_lift_lg_bpoly(slong * lastdeg_, fq_nmod_mpolyn_t F, const fq_nmod_mpoly_ctx_t smctx, n_fq_bpoly_t A, const fq_nmod_mpoly_ctx_t lgctx, const bad_fq_nmod_embed_t emb); -void fq_nmod_mpolyn_interp_lift_lg_mpoly(fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ctx,fq_nmod_mpoly_t B, const fq_nmod_mpoly_ctx_t ectx, const bad_fq_nmod_embed_t emb); -void fq_nmod_mpolyn_interp_lift_lg_mpolyn(slong * lastdeg_, fq_nmod_mpolyn_t A, slong var, const fq_nmod_mpoly_ctx_t ctx, fq_nmod_mpolyn_t B, const fq_nmod_mpoly_ctx_t ectx, const bad_fq_nmod_embed_t emb); -int fq_nmod_mpolyn_interp_crt_lg_poly(slong * lastdeg_, fq_nmod_mpolyn_t F, fq_nmod_mpolyn_t T, fq_nmod_poly_t modulus, const fq_nmod_mpoly_ctx_t ctx, fq_nmod_poly_t A, const fq_nmod_mpoly_ctx_t ectx, const bad_fq_nmod_embed_t emb); -int fq_nmod_mpolyn_interp_crt_lg_bpoly(slong * lastdeg, fq_nmod_mpolyn_t F, fq_nmod_mpolyn_t T, n_fq_poly_t modulus, const fq_nmod_mpoly_ctx_t smctx, n_fq_bpoly_t A, const fq_nmod_mpoly_ctx_t lgctx, const bad_fq_nmod_embed_t emb); -int fq_nmod_mpolyn_interp_crt_lg_mpolyn(slong * lastdeg_, fq_nmod_mpolyn_t F, fq_nmod_mpolyn_t T, fq_nmod_poly_t modulus, slong var, const fq_nmod_mpoly_ctx_t ctx, fq_nmod_mpolyn_t A, const fq_nmod_mpoly_ctx_t ectx, const bad_fq_nmod_embed_t emb); - -void fq_nmod_mpolyun_interp_reduce_sm_mpolyu(fq_nmod_mpolyu_t B, fq_nmod_mpolyun_t A, fq_nmod_t alpha, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpolyun_interp_lift_sm_mpolyu(fq_nmod_mpolyun_t A, const fq_nmod_mpolyu_t B, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpolyun_interp_crt_sm_mpolyu(slong * lastdeg, fq_nmod_mpolyun_t F, fq_nmod_mpolyun_t T, fq_nmod_mpolyu_t A, fq_nmod_poly_t modulus, fq_nmod_t alpha, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpolyun_interp_reduce_lg_mpolyu(fq_nmod_mpolyu_t A, fq_nmod_mpolyun_t B, const fq_nmod_mpoly_ctx_t ectx, const fq_nmod_mpoly_ctx_t ctx, const bad_fq_nmod_embed_t emb); -void fq_nmod_mpolyun_interp_lift_lg_mpolyu(fq_nmod_mpolyun_t A, const fq_nmod_mpoly_ctx_t ctx, fq_nmod_mpolyu_t B, const fq_nmod_mpoly_ctx_t ectx, const bad_fq_nmod_embed_t emb); -int fq_nmod_mpolyun_interp_crt_lg_mpolyu(slong * lastdeg, fq_nmod_mpolyun_t F, fq_nmod_mpolyun_t T, fq_nmod_poly_t m, const fq_nmod_mpoly_ctx_t ctx, fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t ectx, const bad_fq_nmod_embed_t emb); -int fq_nmod_mpolyun_interp_mcrt_lg_mpolyu(slong * lastdeg, fq_nmod_mpolyun_t H, const fq_nmod_mpoly_ctx_t ctx, fq_nmod_poly_t m, fq_nmod_mpolyu_t A, const fq_nmod_mpoly_ctx_t ectx, bad_fq_nmod_embed_t emb); +int nmod_mpolyn_interp_crt_lg_poly( + slong * lastdeg_, + nmod_mpolyn_t F, + nmod_mpolyn_t T, + n_poly_t modulus, + const nmod_mpoly_ctx_t ctx, + fq_nmod_poly_t A, + const fq_nmod_ctx_t fqctx); +int nmod_mpolyn_interp_crt_lg_bpoly( + slong * lastdeg, + nmod_mpolyn_t F, + nmod_mpolyn_t T, + n_fq_poly_t modulus, + const nmod_mpoly_ctx_t smctx, + n_fq_bpoly_t A, + const fq_nmod_mpoly_ctx_t lgctx); +int nmod_mpolyn_interp_crt_lg_mpolyn( + slong * lastdeg_, + nmod_mpolyn_t F, + nmod_mpolyn_t T, + n_poly_t modulus, + slong var, + const nmod_mpoly_ctx_t ctx, + fq_nmod_mpolyn_t A, + const fq_nmod_mpoly_ctx_t ectx); + +void nmod_mpolyn_interp_lift_lg_poly( + slong * lastdeg_, + nmod_mpolyn_t A, + const nmod_mpoly_ctx_t ctx, + const fq_nmod_poly_t B, + const fq_nmod_ctx_t fqctx); +void nmod_mpolyn_interp_lift_lg_bpoly( + slong * lastdeg_, + nmod_mpolyn_t F, + const nmod_mpoly_ctx_t smctx, + n_fq_bpoly_t A, + const fq_nmod_mpoly_ctx_t lgctx); +void nmod_mpolyn_interp_lift_lg_mpoly( + nmod_mpolyn_t A, + const nmod_mpoly_ctx_t ctx, + fq_nmod_mpoly_t Ap, + const fq_nmod_mpoly_ctx_t ctxp); +void nmod_mpolyn_interp_lift_lg_mpolyn( + slong * lastdeg, + nmod_mpolyn_t A, + slong var, + const nmod_mpoly_ctx_t ctx, + fq_nmod_mpolyn_t B, + const fq_nmod_mpoly_ctx_t ectx); + +void nmod_mpolyn_interp_reduce_lg_poly( + fq_nmod_poly_t E, + const fq_nmod_ctx_t fqctx, + const nmod_mpolyn_t A, + const nmod_mpoly_ctx_t ctx); +void nmod_mpolyn_interp_reduce_lg_mpoly( + fq_nmod_mpoly_t A, + nmod_mpolyn_t B, + const fq_nmod_mpoly_ctx_t ffctx, + const nmod_mpoly_ctx_t ctx); +void nmod_mpolyn_interp_reduce_lg_mpolyn( + fq_nmod_mpolyn_t E, + fq_nmod_mpoly_ctx_t ectx, + nmod_mpolyn_t A, + slong var, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpolyn_interp_mcrt_lg_mpoly( + slong * lastdeg_, + nmod_mpolyn_t H, + const nmod_mpoly_ctx_t smctx, + const n_poly_t m, + const mp_limb_t * inv_m_eval, + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t lgctx); + +void nmod_mpolyun_interp_lift_lg_mpolyu( + nmod_mpolyun_t A, + const nmod_mpoly_ctx_t ctx, + fq_nmod_mpolyu_t Ap, + const fq_nmod_mpoly_ctx_t ctxp); +void nmod_mpolyun_interp_reduce_lg_mpolyu( + fq_nmod_mpolyu_t A, + nmod_mpolyun_t B, + const fq_nmod_mpoly_ctx_t ffctx, + const nmod_mpoly_ctx_t ctx); +int nmod_mpolyun_interp_crt_lg_mpolyu( + slong * lastdeg, + nmod_mpolyun_t F, + nmod_mpolyun_t T, + n_poly_t m, + const nmod_mpoly_ctx_t ctx, + fq_nmod_mpolyu_t A, + const fq_nmod_mpoly_ctx_t ffctx); +int nmod_mpolyun_interp_mcrt_lg_mpolyu( + slong * lastdeg, + nmod_mpolyun_t H, + const nmod_mpoly_ctx_t ctx, + n_poly_t m, + fq_nmod_mpolyu_t A, + const fq_nmod_mpoly_ctx_t ctxp); + +void fq_nmod_mpolyn_interp_reduce_sm_poly( + fq_nmod_poly_t E, + const fq_nmod_mpolyn_t A, + const fq_nmod_t alpha, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_interp_reduce_sm_mpolyn( + fq_nmod_mpolyn_t E, + fq_nmod_mpolyn_t A, + slong var, + fq_nmod_t alpha, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_interp_lift_sm_poly( + fq_nmod_mpolyn_t A, + const fq_nmod_poly_t B, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_interp_lift_sm_bpoly( + fq_nmod_mpolyn_t F, + n_fq_bpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_interp_lift_sm_mpoly( + fq_nmod_mpolyn_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyn_interp_lift_sm_mpolyn( + fq_nmod_mpolyn_t A, + fq_nmod_mpolyn_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpolyn_interp_crt_sm_poly( + slong * lastdeg_, + fq_nmod_mpolyn_t F, + fq_nmod_mpolyn_t T, + const fq_nmod_poly_t A, + const fq_nmod_poly_t modulus, + const fq_nmod_t alpha, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpolyn_interp_crt_sm_bpoly( + slong * lastdeg, + fq_nmod_mpolyn_t F, + fq_nmod_mpolyn_t T, + const n_fq_bpoly_t A, + const n_fq_poly_t modulus, + n_fq_poly_t alphapow, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpolyn_interp_crt_sm_mpolyn( + slong * lastdeg_, + fq_nmod_mpolyn_t F, + fq_nmod_mpolyn_t T, + fq_nmod_mpolyn_t A, + slong var, + fq_nmod_poly_t modulus, + const fq_nmod_t alpha, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpolyn_interp_mcrt_sm_mpoly( + slong * lastdeg_, + fq_nmod_mpolyn_t F, + fq_nmod_mpoly_t A, + const n_fq_poly_t modulus, + n_fq_poly_t alphapow, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpolyn_interp_reduce_lg_poly( + fq_nmod_poly_t E, + const fq_nmod_mpoly_ctx_t ectx, + fq_nmod_mpolyn_t A, + const fq_nmod_mpoly_ctx_t ctx, + const bad_fq_nmod_embed_t emb); +void fq_nmod_mpolyn_interp_reduce_lg_mpoly( + fq_nmod_mpoly_t A, + fq_nmod_mpolyn_t B, + const fq_nmod_mpoly_ctx_t ectx, + const fq_nmod_mpoly_ctx_t ctx, + const bad_fq_nmod_embed_t emb); +void fq_nmod_mpolyn_interp_reduce_lg_mpolyn( + fq_nmod_mpolyn_t E, + const fq_nmod_mpoly_ctx_t ectx, + fq_nmod_mpolyn_t A, + slong var, + const fq_nmod_mpoly_ctx_t ctx, + const bad_fq_nmod_embed_t emb); +void fq_nmod_mpolyn_interp_lift_lg_poly( + slong * lastdeg_, + fq_nmod_mpolyn_t A, + const fq_nmod_mpoly_ctx_t ctx, + fq_nmod_poly_t B, + const fq_nmod_mpoly_ctx_t ectx, + const bad_fq_nmod_embed_t emb); +void fq_nmod_mpolyn_interp_lift_lg_bpoly( + slong * lastdeg_, + fq_nmod_mpolyn_t F, + const fq_nmod_mpoly_ctx_t smctx, + n_fq_bpoly_t A, + const fq_nmod_mpoly_ctx_t lgctx, + const bad_fq_nmod_embed_t emb); +void fq_nmod_mpolyn_interp_lift_lg_mpoly( + fq_nmod_mpolyn_t A, + const fq_nmod_mpoly_ctx_t ctx, + fq_nmod_mpoly_t B, + const fq_nmod_mpoly_ctx_t ectx, + const bad_fq_nmod_embed_t emb); +void fq_nmod_mpolyn_interp_lift_lg_mpolyn( + slong * lastdeg_, + fq_nmod_mpolyn_t A, + slong var, + const fq_nmod_mpoly_ctx_t ctx, + fq_nmod_mpolyn_t B, + const fq_nmod_mpoly_ctx_t ectx, + const bad_fq_nmod_embed_t emb); +int fq_nmod_mpolyn_interp_crt_lg_poly( + slong * lastdeg_, + fq_nmod_mpolyn_t F, + fq_nmod_mpolyn_t T, + fq_nmod_poly_t modulus, + const fq_nmod_mpoly_ctx_t ctx, + fq_nmod_poly_t A, + const fq_nmod_mpoly_ctx_t ectx, + const bad_fq_nmod_embed_t emb); +int fq_nmod_mpolyn_interp_crt_lg_bpoly( + slong * lastdeg, + fq_nmod_mpolyn_t F, + fq_nmod_mpolyn_t T, + n_fq_poly_t modulus, + const fq_nmod_mpoly_ctx_t smctx, + n_fq_bpoly_t A, + const fq_nmod_mpoly_ctx_t lgctx, + const bad_fq_nmod_embed_t emb); +int fq_nmod_mpolyn_interp_crt_lg_mpolyn( + slong * lastdeg_, + fq_nmod_mpolyn_t F, + fq_nmod_mpolyn_t T, + fq_nmod_poly_t modulus, + slong var, + const fq_nmod_mpoly_ctx_t ctx, + fq_nmod_mpolyn_t A, + const fq_nmod_mpoly_ctx_t ectx, + const bad_fq_nmod_embed_t emb); + +void fq_nmod_mpolyun_interp_reduce_sm_mpolyu( + fq_nmod_mpolyu_t B, + fq_nmod_mpolyun_t A, + fq_nmod_t alpha, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyun_interp_lift_sm_mpolyu( + fq_nmod_mpolyun_t A, + const fq_nmod_mpolyu_t B, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpolyun_interp_crt_sm_mpolyu( + slong * lastdeg, + fq_nmod_mpolyun_t F, + fq_nmod_mpolyun_t T, + fq_nmod_mpolyu_t A, + fq_nmod_poly_t modulus, + fq_nmod_t alpha, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpolyun_interp_reduce_lg_mpolyu( + fq_nmod_mpolyu_t A, + fq_nmod_mpolyun_t B, + const fq_nmod_mpoly_ctx_t ectx, + const fq_nmod_mpoly_ctx_t ctx, + const bad_fq_nmod_embed_t emb); +void fq_nmod_mpolyun_interp_lift_lg_mpolyu( + fq_nmod_mpolyun_t A, + const fq_nmod_mpoly_ctx_t ctx, + fq_nmod_mpolyu_t B, + const fq_nmod_mpoly_ctx_t ectx, + const bad_fq_nmod_embed_t emb); +int fq_nmod_mpolyun_interp_crt_lg_mpolyu( + slong * lastdeg, + fq_nmod_mpolyun_t F, + fq_nmod_mpolyun_t T, + fq_nmod_poly_t m, + const fq_nmod_mpoly_ctx_t ctx, + fq_nmod_mpolyu_t A, + const fq_nmod_mpoly_ctx_t ectx, + const bad_fq_nmod_embed_t emb); +int fq_nmod_mpolyun_interp_mcrt_lg_mpolyu( + slong * lastdeg, + fq_nmod_mpolyun_t H, + const fq_nmod_mpoly_ctx_t ctx, + fq_nmod_poly_t m, + fq_nmod_mpolyu_t A, + const fq_nmod_mpoly_ctx_t ectx, + bad_fq_nmod_embed_t emb); /* geobuckets ****************************************************************/ @@ -779,14 +1998,29 @@ typedef fq_nmod_mpoly_geobucket_struct fq_nmod_mpoly_geobucket_t[1]; void fq_nmod_mpoly_geobucket_init(fq_nmod_mpoly_geobucket_t B, const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_geobucket_clear(fq_nmod_mpoly_geobucket_t B, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_geobucket_empty(fq_nmod_mpoly_t p, fq_nmod_mpoly_geobucket_t B, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_geobucket_fit_length(fq_nmod_mpoly_geobucket_t B, slong i, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_geobucket_set(fq_nmod_mpoly_geobucket_t B, fq_nmod_mpoly_t p, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_geobucket_add(fq_nmod_mpoly_geobucket_t B, fq_nmod_mpoly_t p, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_geobucket_sub(fq_nmod_mpoly_geobucket_t B, fq_nmod_mpoly_t p, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_geobucket_empty( + fq_nmod_mpoly_t p, + fq_nmod_mpoly_geobucket_t B, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_geobucket_fit_length( + fq_nmod_mpoly_geobucket_t B, + slong i, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_geobucket_set( + fq_nmod_mpoly_geobucket_t B, + fq_nmod_mpoly_t p, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_geobucket_add( + fq_nmod_mpoly_geobucket_t B, + fq_nmod_mpoly_t p, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_geobucket_sub( + fq_nmod_mpoly_geobucket_t B, + fq_nmod_mpoly_t p, + const fq_nmod_mpoly_ctx_t ctx); /****************************************************************************** @@ -794,7 +2028,10 @@ void fq_nmod_mpoly_geobucket_sub(fq_nmod_mpoly_geobucket_t B, fq_nmod_mpoly_t p, ******************************************************************************/ -void fq_nmod_mpoly_remainder_strongtest(const fq_nmod_mpoly_t r, const fq_nmod_mpoly_t g, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_remainder_strongtest( + const fq_nmod_mpoly_t r, + const fq_nmod_mpoly_t g, + const fq_nmod_mpoly_ctx_t ctx); #ifndef FQ_NMOD_H # undef fq_nmod_ctx_degree diff --git a/src/fq_nmod_mpoly_factor.h b/src/fq_nmod_mpoly_factor.h index 002d8c6838..651c47336a 100644 --- a/src/fq_nmod_mpoly_factor.h +++ b/src/fq_nmod_mpoly_factor.h @@ -28,42 +28,109 @@ extern "C" { /*****************************************************************************/ void fq_nmod_mpoly_factor_init(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_factor_realloc(fq_nmod_mpoly_factor_t f, slong alloc, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_factor_realloc( + fq_nmod_mpoly_factor_t f, + slong alloc, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_factor_clear(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_factor_fit_length(fq_nmod_mpoly_factor_t f, slong len, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_factor_fit_length( + fq_nmod_mpoly_factor_t f, + slong len, + const fq_nmod_mpoly_ctx_t ctx); -FQ_NMOD_MPOLY_FACTOR_INLINE slong fq_nmod_mpoly_factor_length(const fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_ctx_t ctx) { return f->num; } - -FQ_NMOD_MPOLY_FACTOR_INLINE void fq_nmod_mpoly_factor_get_constant_fq_nmod(fq_nmod_t c, const fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_ctx_t ctx) { fq_nmod_set(c, f->constant, ctx->fqctx); } - -FQ_NMOD_MPOLY_FACTOR_INLINE void fq_nmod_mpoly_factor_get_base(fq_nmod_mpoly_t p, const fq_nmod_mpoly_factor_t f, slong i, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); fq_nmod_mpoly_set(p, f->poly + i, ctx); } - -FQ_NMOD_MPOLY_FACTOR_INLINE void fq_nmod_mpoly_factor_swap_base(fq_nmod_mpoly_t p, const fq_nmod_mpoly_factor_t f, slong i, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); fq_nmod_mpoly_swap(p, f->poly + i, ctx); } +FQ_NMOD_MPOLY_FACTOR_INLINE +slong fq_nmod_mpoly_factor_length(const fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_ctx_t ctx) +{ + return f->num; +} -FQ_NMOD_MPOLY_FACTOR_INLINE slong fq_nmod_mpoly_factor_get_exp_si(fq_nmod_mpoly_factor_t f, slong i, const fq_nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); return fmpz_get_si(f->exp + i); } +FQ_NMOD_MPOLY_FACTOR_INLINE +void fq_nmod_mpoly_factor_get_constant_fq_nmod(fq_nmod_t c, const fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_ctx_t ctx) +{ + fq_nmod_set(c, f->constant, ctx->fqctx); +} -void fq_nmod_mpoly_factor_set(fq_nmod_mpoly_factor_t a, const fq_nmod_mpoly_factor_t b, const fq_nmod_mpoly_ctx_t ctx); +FQ_NMOD_MPOLY_FACTOR_INLINE +void fq_nmod_mpoly_factor_get_base(fq_nmod_mpoly_t p, const fq_nmod_mpoly_factor_t f, slong i, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); fq_nmod_mpoly_set(p, f->poly + i, ctx); +} -void fq_nmod_mpoly_factor_print_pretty(const fq_nmod_mpoly_factor_t f, const char ** vars, const fq_nmod_mpoly_ctx_t ctx); +FQ_NMOD_MPOLY_FACTOR_INLINE +void fq_nmod_mpoly_factor_swap_base(fq_nmod_mpoly_t p, const fq_nmod_mpoly_factor_t f, slong i, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); fq_nmod_mpoly_swap(p, f->poly + i, ctx); +} -void fq_nmod_mpoly_factor_append_ui(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_t A, ulong e, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_factor_append_fmpz(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_t A, const fmpz_t e, const fq_nmod_mpoly_ctx_t ctx); +FQ_NMOD_MPOLY_FACTOR_INLINE +slong fq_nmod_mpoly_factor_get_exp_si(fq_nmod_mpoly_factor_t f, slong i, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); return fmpz_get_si(f->exp + i); +} -int fq_nmod_mpoly_factor_content(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_factor_separable(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx, int sep); -int fq_nmod_mpoly_factor_squarefree(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_factor(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_factor_set( + fq_nmod_mpoly_factor_t a, + const fq_nmod_mpoly_factor_t b, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_factor_print_pretty( + const fq_nmod_mpoly_factor_t f, + const char ** vars, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_factor_append_ui( + fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_t A, + ulong e, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_factor_append_fmpz( + fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_t A, + const fmpz_t e, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpoly_factor_content( + fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_factor_separable( + fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx, + int sep); +int fq_nmod_mpoly_factor_squarefree( + fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_factor( + fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_factor_sort(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_factor_cmp(const fq_nmod_mpoly_factor_t A, const fq_nmod_mpoly_factor_t B, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_factor_cmp( + const fq_nmod_mpoly_factor_t A, + const fq_nmod_mpoly_factor_t B, + const fq_nmod_mpoly_ctx_t ctx); -FQ_NMOD_MPOLY_FACTOR_INLINE void fq_nmod_mpoly_factor_swap(fq_nmod_mpoly_factor_t A, fq_nmod_mpoly_factor_t B, const fq_nmod_mpoly_ctx_t ctx) { FLINT_SWAP(fq_nmod_mpoly_factor_struct, *A, *B); } +FQ_NMOD_MPOLY_FACTOR_INLINE +void fq_nmod_mpoly_factor_swap(fq_nmod_mpoly_factor_t A, fq_nmod_mpoly_factor_t B, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_SWAP(fq_nmod_mpoly_factor_struct, *A, *B); +} -FQ_NMOD_MPOLY_FACTOR_INLINE void fq_nmod_mpoly_factor_one(fq_nmod_mpoly_factor_t a, const fq_nmod_mpoly_ctx_t ctx) { fq_nmod_one(a->constant, ctx->fqctx); a->num = 0; } +FQ_NMOD_MPOLY_FACTOR_INLINE +void fq_nmod_mpoly_factor_one(fq_nmod_mpoly_factor_t a, const fq_nmod_mpoly_ctx_t ctx) +{ + fq_nmod_one(a->constant, ctx->fqctx); a->num = 0; +} -int fq_nmod_mpoly_factor_expand(fq_nmod_mpoly_t A, const fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_factor_expand( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_ctx_t ctx); FQ_NMOD_MPOLY_FACTOR_INLINE int fq_nmod_mpoly_factor_matches(const fq_nmod_mpoly_t a, const fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_ctx_t ctx) @@ -77,39 +144,110 @@ int fq_nmod_mpoly_factor_matches(const fq_nmod_mpoly_t a, const fq_nmod_mpoly_fa return matches; } -void _fq_nmod_mpoly_get_lead0(fq_nmod_mpoly_t c, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -void _fq_nmod_mpoly_set_lead0(fq_nmod_mpoly_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_t c, const fq_nmod_mpoly_ctx_t ctx); +void _fq_nmod_mpoly_get_lead0( + fq_nmod_mpoly_t c, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); +void _fq_nmod_mpoly_set_lead0( + fq_nmod_mpoly_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_t c, + const fq_nmod_mpoly_ctx_t ctx); /*****************************************************************************/ -void n_fq_bpoly_mul(n_bpoly_t A, const n_bpoly_t B, const n_bpoly_t C, const fq_nmod_ctx_t ctx); -void n_fq_bpoly_mul_series(n_bpoly_t A, const n_bpoly_t B, const n_bpoly_t C, slong order, const fq_nmod_ctx_t ctx); - -void n_fq_bpoly_add(n_bpoly_t A, const n_bpoly_t B, const n_bpoly_t C, const fq_nmod_ctx_t ctx); -void n_fq_bpoly_sub(n_bpoly_t A, const n_bpoly_t B, const n_bpoly_t C, const fq_nmod_ctx_t ctx); - -void n_fq_bpoly_divrem_series(n_bpoly_t Q, n_bpoly_t R, const n_bpoly_t A, const n_bpoly_t B, slong order, const fq_nmod_ctx_t ctx); - -int n_fq_bpoly_divides(n_bpoly_t Q, const n_bpoly_t A, const n_bpoly_t B, const fq_nmod_ctx_t ctx); +void n_fq_bpoly_mul( + n_bpoly_t A, + const n_bpoly_t B, + const n_bpoly_t C, + const fq_nmod_ctx_t ctx); +void n_fq_bpoly_mul_series( + n_bpoly_t A, + const n_bpoly_t B, + const n_bpoly_t C, + slong order, + const fq_nmod_ctx_t ctx); + +void n_fq_bpoly_add( + n_bpoly_t A, + const n_bpoly_t B, + const n_bpoly_t C, + const fq_nmod_ctx_t ctx); +void n_fq_bpoly_sub( + n_bpoly_t A, + const n_bpoly_t B, + const n_bpoly_t C, + const fq_nmod_ctx_t ctx); + +void n_fq_bpoly_divrem_series( + n_bpoly_t Q, + n_bpoly_t R, + const n_bpoly_t A, + const n_bpoly_t B, + slong order, + const fq_nmod_ctx_t ctx); + +int n_fq_bpoly_divides( + n_bpoly_t Q, + const n_bpoly_t A, + const n_bpoly_t B, + const fq_nmod_ctx_t ctx); void n_fq_bpoly_make_primitive(n_poly_t g, n_bpoly_t A, const fq_nmod_ctx_t ctx); -void fq_nmod_mpoly_get_n_fq_bpoly(n_bpoly_t A, const fq_nmod_mpoly_t B, slong varx, slong vary, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_set_n_fq_bpoly(fq_nmod_mpoly_t A, flint_bitcnt_t Abits, const n_bpoly_t B, slong varx, slong vary, const fq_nmod_mpoly_ctx_t ctx); - -int n_fq_bpoly_factor_smprime(n_poly_t c, n_tpoly_t F, n_bpoly_t B, int allow_shift, const fq_nmod_ctx_t ctx); -int n_fq_bpoly_factor_lgprime(n_poly_t c, n_tpoly_t F, n_bpoly_t B, const fq_nmod_ctx_t ctx, flint_rand_t state); +void fq_nmod_mpoly_get_n_fq_bpoly( + n_bpoly_t A, + const fq_nmod_mpoly_t B, + slong varx, + slong vary, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_set_n_fq_bpoly( + fq_nmod_mpoly_t A, + flint_bitcnt_t Abits, + const n_bpoly_t B, + slong varx, + slong vary, + const fq_nmod_mpoly_ctx_t ctx); + +int n_fq_bpoly_factor_smprime( + n_poly_t c, + n_tpoly_t F, + n_bpoly_t B, + int allow_shift, + const fq_nmod_ctx_t ctx); +int n_fq_bpoly_factor_lgprime( + n_poly_t c, + n_tpoly_t F, + n_bpoly_t B, + const fq_nmod_ctx_t ctx, + flint_rand_t state); /*****************************************************************************/ -void n_polyu3_fq_print_pretty(const n_polyu_t A, const char * var0, const char * var1, const char * var2, const fq_nmod_ctx_t ctx); +void n_polyu3_fq_print_pretty( + const n_polyu_t A, + const char * var0, + const char * var1, + const char * var2, + const fq_nmod_ctx_t ctx); int n_polyu_fq_is_canonical(const n_polyu_t A, const fq_nmod_ctx_t ctx); /*****************************************************************************/ -void n_polyu2n_fq_print_pretty(const n_polyun_t A, const char * var0, const char * var1, const char * varlast, const fq_nmod_ctx_t ctx); -void n_polyu3n_fq_print_pretty(const n_polyun_t A, const char * var0, const char * var1, const char * var2, const char * varlast, const fq_nmod_ctx_t ctx); +void n_polyu2n_fq_print_pretty( + const n_polyun_t A, + const char * var0, + const char * var1, + const char * varlast, + const fq_nmod_ctx_t ctx); +void n_polyu3n_fq_print_pretty( + const n_polyun_t A, + const char * var0, + const char * var1, + const char * var2, + const char * varlast, + const fq_nmod_ctx_t ctx); int n_polyun_fq_is_canonical(const n_polyun_t A, const fq_nmod_ctx_t ctx); @@ -124,45 +262,138 @@ typedef struct typedef fq_nmod_mpolyv_struct fq_nmod_mpolyv_t[1]; -FQ_NMOD_MPOLY_FACTOR_INLINE void fq_nmod_mpolyv_init(fq_nmod_mpolyv_t A, const fq_nmod_mpoly_ctx_t ctx) { A->coeffs = NULL; A->alloc = 0; A->length = 0; } +FQ_NMOD_MPOLY_FACTOR_INLINE +void fq_nmod_mpolyv_init(fq_nmod_mpolyv_t A, const fq_nmod_mpoly_ctx_t ctx) +{ + A->coeffs = NULL; A->alloc = 0; A->length = 0; +} void fq_nmod_mpolyv_clear(fq_nmod_mpolyv_t A, const fq_nmod_mpoly_ctx_t ctx); -FQ_NMOD_MPOLY_FACTOR_INLINE void fq_nmod_mpolyv_swap(fq_nmod_mpolyv_t A, fq_nmod_mpolyv_t B, const fq_nmod_mpoly_ctx_t ctx) { FLINT_SWAP(fq_nmod_mpolyv_struct, *A, *B); } - -void fq_nmod_mpolyv_print_pretty(const fq_nmod_mpolyv_t poly, const char ** x, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpolyv_fit_length(fq_nmod_mpolyv_t A, slong length, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpolyv_set_coeff(fq_nmod_mpolyv_t A, slong i, fq_nmod_mpoly_t c, const fq_nmod_mpoly_ctx_t ctx); - -void fq_nmod_mpoly_to_mpolyv(fq_nmod_mpolyv_t A, const fq_nmod_mpoly_t B, const fq_nmod_mpoly_t xalpha, const fq_nmod_mpoly_ctx_t ctx); -void fq_nmod_mpoly_from_mpolyv(fq_nmod_mpoly_t A, flint_bitcnt_t Abits, const fq_nmod_mpolyv_t B, const fq_nmod_mpoly_t xalpha, const fq_nmod_mpoly_ctx_t ctx); - -int _fq_nmod_mpoly_vec_content_mpoly(fq_nmod_mpoly_t g, const fq_nmod_mpoly_struct * A, slong Alen, const fq_nmod_mpoly_ctx_t ctx); - -void _fq_nmod_mpoly_vec_divexact_mpoly(fq_nmod_mpoly_struct * A, slong Alen, const fq_nmod_mpoly_t c, const fq_nmod_mpoly_ctx_t ctx); +FQ_NMOD_MPOLY_FACTOR_INLINE +void fq_nmod_mpolyv_swap(fq_nmod_mpolyv_t A, fq_nmod_mpolyv_t B, const fq_nmod_mpoly_ctx_t ctx) +{ + FLINT_SWAP(fq_nmod_mpolyv_struct, *A, *B); +} -void _fq_nmod_mpoly_vec_mul_mpoly(fq_nmod_mpoly_struct * A, slong Alen, const fq_nmod_mpoly_t c, const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpolyv_print_pretty( + const fq_nmod_mpolyv_t poly, + const char ** x, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpolyv_fit_length( + fq_nmod_mpolyv_t A, + slong length, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpolyv_set_coeff( + fq_nmod_mpolyv_t A, + slong i, + fq_nmod_mpoly_t c, + const fq_nmod_mpoly_ctx_t ctx); + +void fq_nmod_mpoly_to_mpolyv( + fq_nmod_mpolyv_t A, + const fq_nmod_mpoly_t B, + const fq_nmod_mpoly_t xalpha, + const fq_nmod_mpoly_ctx_t ctx); +void fq_nmod_mpoly_from_mpolyv( + fq_nmod_mpoly_t A, + flint_bitcnt_t Abits, + const fq_nmod_mpolyv_t B, + const fq_nmod_mpoly_t xalpha, + const fq_nmod_mpoly_ctx_t ctx); + +int _fq_nmod_mpoly_vec_content_mpoly( + fq_nmod_mpoly_t g, + const fq_nmod_mpoly_struct * A, + slong Alen, + const fq_nmod_mpoly_ctx_t ctx); + +void _fq_nmod_mpoly_vec_divexact_mpoly( + fq_nmod_mpoly_struct * A, + slong Alen, + const fq_nmod_mpoly_t c, + const fq_nmod_mpoly_ctx_t ctx); + +void _fq_nmod_mpoly_vec_mul_mpoly( + fq_nmod_mpoly_struct * A, + slong Alen, + const fq_nmod_mpoly_t c, + const fq_nmod_mpoly_ctx_t ctx); /*****************************************************************************/ -int _fq_nmod_mpoly_factor_separable(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx, int sep); - -int fq_nmod_mpoly_factor_lcc_wang(fq_nmod_mpoly_struct * lc_divs, const fq_nmod_mpoly_factor_t lcAfac, const n_poly_t Auc, const n_bpoly_struct * Auf, slong r, const n_poly_struct * alpha, const fq_nmod_mpoly_ctx_t ctx); - -int fq_nmod_mpoly_factor_irred_smprime_zassenhaus(fq_nmod_mpolyv_t fac, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx, flint_rand_t state); -int fq_nmod_mpoly_factor_irred_lgprime_zassenhaus(fq_nmod_mpolyv_t fac, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx, flint_rand_t state); - -int fq_nmod_mpoly_factor_irred_smprime_wang(fq_nmod_mpolyv_t fac, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_factor_t lcAfac, const fq_nmod_mpoly_t lcA, const fq_nmod_mpoly_ctx_t ctx, flint_rand_t state); -int fq_nmod_mpoly_factor_irred_lgprime_wang(fq_nmod_mpolyv_t Af, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_factor_t lcAfac, const fq_nmod_mpoly_t lcA, const fq_nmod_mpoly_ctx_t ctx, flint_rand_t state); - -int fq_nmod_mpoly_factor_irred_smprime_zippel(fq_nmod_mpolyv_t fac, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_factor_t lcAfac, const fq_nmod_mpoly_t lcA, const fq_nmod_mpoly_ctx_t ctx, flint_rand_t state); -int fq_nmod_mpoly_factor_irred_lgprime_zippel(fq_nmod_mpolyv_t Af, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_factor_t lcAfac, const fq_nmod_mpoly_t lcA, const fq_nmod_mpoly_ctx_t ctx, flint_rand_t state); +int _fq_nmod_mpoly_factor_separable( + fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx, + int sep); + +int fq_nmod_mpoly_factor_lcc_wang( + fq_nmod_mpoly_struct * lc_divs, + const fq_nmod_mpoly_factor_t lcAfac, + const n_poly_t Auc, + const n_bpoly_struct * Auf, + slong r, + const n_poly_struct * alpha, + const fq_nmod_mpoly_ctx_t ctx); + +int fq_nmod_mpoly_factor_irred_smprime_zassenhaus( + fq_nmod_mpolyv_t fac, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx, + flint_rand_t state); +int fq_nmod_mpoly_factor_irred_lgprime_zassenhaus( + fq_nmod_mpolyv_t fac, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx, + flint_rand_t state); + +int fq_nmod_mpoly_factor_irred_smprime_wang( + fq_nmod_mpolyv_t fac, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_factor_t lcAfac, + const fq_nmod_mpoly_t lcA, + const fq_nmod_mpoly_ctx_t ctx, + flint_rand_t state); +int fq_nmod_mpoly_factor_irred_lgprime_wang( + fq_nmod_mpolyv_t Af, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_factor_t lcAfac, + const fq_nmod_mpoly_t lcA, + const fq_nmod_mpoly_ctx_t ctx, + flint_rand_t state); + +int fq_nmod_mpoly_factor_irred_smprime_zippel( + fq_nmod_mpolyv_t fac, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_factor_t lcAfac, + const fq_nmod_mpoly_t lcA, + const fq_nmod_mpoly_ctx_t ctx, + flint_rand_t state); +int fq_nmod_mpoly_factor_irred_lgprime_zippel( + fq_nmod_mpolyv_t Af, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_factor_t lcAfac, + const fq_nmod_mpoly_t lcA, + const fq_nmod_mpoly_ctx_t ctx, + flint_rand_t state); /*****************************************************************************/ -void fq_nmod_mpoly_compression_do(fq_nmod_mpoly_t L, const fq_nmod_mpoly_ctx_t Lctx, mp_limb_t * Acoeffs, slong Alen, mpoly_compression_t M); -void fq_nmod_mpoly_compression_undo(fq_nmod_mpoly_t A, flint_bitcnt_t Abits, const fq_nmod_mpoly_ctx_t Actx, fq_nmod_mpoly_t L, const fq_nmod_mpoly_ctx_t Lctx, mpoly_compression_t M); +void fq_nmod_mpoly_compression_do( + fq_nmod_mpoly_t L, + const fq_nmod_mpoly_ctx_t Lctx, + mp_limb_t * Acoeffs, + slong Alen, + mpoly_compression_t M); +void fq_nmod_mpoly_compression_undo( + fq_nmod_mpoly_t A, + flint_bitcnt_t Abits, + const fq_nmod_mpoly_ctx_t Actx, + fq_nmod_mpoly_t L, + const fq_nmod_mpoly_ctx_t Lctx, + mpoly_compression_t M); /*****************************************************************************/ @@ -192,29 +423,123 @@ typedef struct typedef fq_nmod_mpoly_pfrac_struct fq_nmod_mpoly_pfrac_t[1]; -int fq_nmod_mpoly_pfrac_init(fq_nmod_mpoly_pfrac_t I, flint_bitcnt_t bits, slong l, slong r, const fq_nmod_mpoly_struct * betas, const fq_nmod_struct * alpha, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_pfrac_init( + fq_nmod_mpoly_pfrac_t I, + flint_bitcnt_t bits, + slong l, + slong r, + const fq_nmod_mpoly_struct * betas, + const fq_nmod_struct * alpha, + const fq_nmod_mpoly_ctx_t ctx); void fq_nmod_mpoly_pfrac_clear(fq_nmod_mpoly_pfrac_t I, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_pfrac(slong r, fq_nmod_mpoly_t t, const slong * deg, fq_nmod_mpoly_pfrac_t I, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_hlift(slong m, fq_nmod_mpoly_struct * f /* length r */, slong r, const fq_nmod_struct * alpha, const fq_nmod_mpoly_t A, const slong * degs, const fq_nmod_mpoly_ctx_t ctx); - -int n_fq_bpoly_hlift2_cubic(n_fq_bpoly_t A /* clobbered (shifted by alpha) */, n_fq_bpoly_t B0, n_fq_bpoly_t B1, const fq_nmod_t alpha_, slong degree_inner /* required degree in x */, const fq_nmod_ctx_t ctx, nmod_eval_interp_t E, n_poly_bpoly_stack_t St); -int n_fq_bpoly_hlift2(n_bpoly_t A /* clobbered (shifted by alpha) */, n_bpoly_t B0, n_bpoly_t B1, const fq_nmod_t alpha, slong degree_inner /* required degree in x */, const fq_nmod_ctx_t ctx, n_poly_bpoly_stack_t St); - -int n_fq_bpoly_hlift_cubic(n_fq_bpoly_t A /* clobbered (shifted by alpha) */, n_fq_bpoly_t B0, n_fq_bpoly_t B1, const fq_nmod_t alpha_, slong degree_inner /* required degree in x */, const fq_nmod_ctx_t ctx, nmod_eval_interp_t E, n_poly_bpoly_stack_t St); -int n_fq_bpoly_hlift(slong r, n_bpoly_t A /* clobbered (shifted by alpha) */, n_bpoly_struct * B, const fq_nmod_t alpha, slong degree_inner /* required degree in x */, const fq_nmod_ctx_t ctx, n_poly_bpoly_stack_t St); - -int n_fq_polyu3_hlift(slong r, n_polyun_struct * BB, n_polyu_t A, n_polyu_struct * B, const fq_nmod_t beta, slong degree_inner /* required degree in x */, const fq_nmod_ctx_t ctx, n_poly_bpoly_stack_t St); - -int fq_nmod_mpoly_factor_algo(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx, unsigned int algo); -int fq_nmod_mpoly_factor_wang(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_factor_zassenhaus(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); -int fq_nmod_mpoly_factor_zippel(fq_nmod_mpoly_factor_t f, const fq_nmod_mpoly_t A, const fq_nmod_mpoly_ctx_t ctx); - -int _fq_nmod_mpoly_eval_rest_n_fq_poly(n_poly_struct * E, slong * starts, slong * ends, slong * stops, ulong * es, const mp_limb_t * Acoeffs, const ulong * Aexps, slong Alen, slong var, const n_fq_poly_struct * alphas, const slong * offsets, const slong * shifts, slong N, ulong mask, slong nvars, const fq_nmod_ctx_t ctx); -void _fq_nmod_mpoly_eval_rest_to_n_fq_bpoly(n_bpoly_t E, const fq_nmod_mpoly_t A, const n_poly_struct * alphabetas, const fq_nmod_mpoly_ctx_t ctx); - -void _fq_nmod_mpoly_set_n_fq_bpoly_gen1_zero(fq_nmod_mpoly_t A, flint_bitcnt_t Abits, const n_bpoly_t B, slong var, const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_pfrac( + slong r, + fq_nmod_mpoly_t t, + const slong * deg, + fq_nmod_mpoly_pfrac_t I, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_hlift( + slong m, + fq_nmod_mpoly_struct * f /* length r */, + slong r, + const fq_nmod_struct * alpha, + const fq_nmod_mpoly_t A, + const slong * degs, + const fq_nmod_mpoly_ctx_t ctx); + +int n_fq_bpoly_hlift2_cubic( + n_fq_bpoly_t A /* clobbered (shifted by alpha) */, + n_fq_bpoly_t B0, + n_fq_bpoly_t B1, + const fq_nmod_t alpha_, + slong degree_inner /* required degree in x */, + const fq_nmod_ctx_t ctx, + nmod_eval_interp_t E, + n_poly_bpoly_stack_t St); +int n_fq_bpoly_hlift2( + n_bpoly_t A /* clobbered (shifted by alpha) */, + n_bpoly_t B0, + n_bpoly_t B1, + const fq_nmod_t alpha, + slong degree_inner /* required degree in x */, + const fq_nmod_ctx_t ctx, + n_poly_bpoly_stack_t St); + +int n_fq_bpoly_hlift_cubic( + n_fq_bpoly_t A /* clobbered (shifted by alpha) */, + n_fq_bpoly_t B0, + n_fq_bpoly_t B1, + const fq_nmod_t alpha_, + slong degree_inner /* required degree in x */, + const fq_nmod_ctx_t ctx, + nmod_eval_interp_t E, + n_poly_bpoly_stack_t St); +int n_fq_bpoly_hlift( + slong r, + n_bpoly_t A /* clobbered (shifted by alpha) */, + n_bpoly_struct * B, + const fq_nmod_t alpha, + slong degree_inner /* required degree in x */, + const fq_nmod_ctx_t ctx, + n_poly_bpoly_stack_t St); + +int n_fq_polyu3_hlift( + slong r, + n_polyun_struct * BB, + n_polyu_t A, + n_polyu_struct * B, + const fq_nmod_t beta, + slong degree_inner /* required degree in x */, + const fq_nmod_ctx_t ctx, + n_poly_bpoly_stack_t St); + +int fq_nmod_mpoly_factor_algo( + fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx, + unsigned int algo); +int fq_nmod_mpoly_factor_wang( + fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_factor_zassenhaus( + fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); +int fq_nmod_mpoly_factor_zippel( + fq_nmod_mpoly_factor_t f, + const fq_nmod_mpoly_t A, + const fq_nmod_mpoly_ctx_t ctx); + +int _fq_nmod_mpoly_eval_rest_n_fq_poly( + n_poly_struct * E, slong * starts, + slong * ends, + slong * stops, + ulong * es, + const mp_limb_t * Acoeffs, + const ulong * Aexps, + slong Alen, + slong var, + const n_fq_poly_struct * alphas, + const slong * offsets, + const slong * shifts, + slong N, + ulong mask, + slong nvars, + const fq_nmod_ctx_t ctx); +void _fq_nmod_mpoly_eval_rest_to_n_fq_bpoly( + n_bpoly_t E, + const fq_nmod_mpoly_t A, + const n_poly_struct * alphabetas, + const fq_nmod_mpoly_ctx_t ctx); + +void _fq_nmod_mpoly_set_n_fq_bpoly_gen1_zero( + fq_nmod_mpoly_t A, + flint_bitcnt_t Abits, + const n_bpoly_t B, + slong var, + const fq_nmod_mpoly_ctx_t ctx); #ifdef __cplusplus } diff --git a/src/fq_nmod_poly_factor.h b/src/fq_nmod_poly_factor.h index 176e00f3f5..6e584a695e 100644 --- a/src/fq_nmod_poly_factor.h +++ b/src/fq_nmod_poly_factor.h @@ -36,6 +36,10 @@ int FQ_NMOD_POLY_ITERATED_FROBENIUS_CUTOFF(const fq_nmod_ctx_t ctx, slong length /* Inlines *******************************************************************/ -void fq_nmod_poly_factor_get_poly(fq_nmod_poly_t z, const fq_nmod_poly_factor_t fac, slong i, const fq_nmod_ctx_t ctx); +void fq_nmod_poly_factor_get_poly( + fq_nmod_poly_t z, + const fq_nmod_poly_factor_t fac, + slong i, + const fq_nmod_ctx_t ctx); #endif diff --git a/src/fq_poly_factor.h b/src/fq_poly_factor.h index 2abd33dd65..93d6161999 100644 --- a/src/fq_poly_factor.h +++ b/src/fq_poly_factor.h @@ -36,6 +36,10 @@ int FQ_POLY_ITERATED_FROBENIUS_CUTOFF(const fq_ctx_t ctx, slong length); /* Inlines *******************************************************************/ -void fq_poly_factor_get_poly(fq_poly_t z, const fq_poly_factor_t fac, slong i, const fq_ctx_t ctx); +void fq_poly_factor_get_poly( + fq_poly_t z, + const fq_poly_factor_t fac, + slong i, + const fq_ctx_t ctx); #endif diff --git a/src/fq_zech.h b/src/fq_zech.h index 2b87c19bfd..c36a6afef4 100644 --- a/src/fq_zech.h +++ b/src/fq_zech.h @@ -37,13 +37,31 @@ void fq_zech_ctx_clear(fq_zech_ctx_t ctx); int fq_zech_ctx_init_fq_nmod_ctx_check(fq_zech_ctx_t ctx, fq_nmod_ctx_t ctxn); void fq_zech_ctx_init_fq_nmod_ctx(fq_zech_ctx_t ctx, fq_nmod_ctx_t ctxn); -int _fq_zech_ctx_init_conway(fq_zech_ctx_t ctx, const fmpz_t p, slong d, const char * var); -void fq_zech_ctx_init_conway(fq_zech_ctx_t ctx, const fmpz_t p, slong d, const char * var); - -void fq_zech_ctx_init_random(fq_zech_ctx_t ctx, const fmpz_t p, slong d, const char * var); - -int fq_zech_ctx_init_modulus_check(fq_zech_ctx_t ctx, const nmod_poly_t modulus, const char * var); -void fq_zech_ctx_init_modulus(fq_zech_ctx_t ctx, const nmod_poly_t modulus, const char * var); +int _fq_zech_ctx_init_conway( + fq_zech_ctx_t ctx, + const fmpz_t p, + slong d, + const char * var); +void fq_zech_ctx_init_conway( + fq_zech_ctx_t ctx, + const fmpz_t p, + slong d, + const char * var); + +void fq_zech_ctx_init_random( + fq_zech_ctx_t ctx, + const fmpz_t p, + slong d, + const char * var); + +int fq_zech_ctx_init_modulus_check( + fq_zech_ctx_t ctx, + const nmod_poly_t modulus, + const char * var); +void fq_zech_ctx_init_modulus( + fq_zech_ctx_t ctx, + const nmod_poly_t modulus, + const char * var); void fq_zech_ctx_randtest(fq_zech_ctx_t ctx, flint_rand_t state); void fq_zech_ctx_randtest_reducible(fq_zech_ctx_t ctx, flint_rand_t state); @@ -53,7 +71,11 @@ const nmod_poly_struct * fq_zech_ctx_modulus(const fq_zech_ctx_t ctx); slong fq_zech_ctx_degree(const fq_zech_ctx_t ctx); void fq_zech_ctx_order(fmpz_t f, const fq_zech_ctx_t ctx); -FQ_ZECH_INLINE mp_limb_t fq_zech_ctx_order_ui(const fq_zech_ctx_t ctx) { return ctx->qm1 + 1; } +FQ_ZECH_INLINE +mp_limb_t fq_zech_ctx_order_ui(const fq_zech_ctx_t ctx) +{ + return ctx->qm1 + 1; +} #ifdef FLINT_HAVE_FILE int fq_zech_ctx_fprint(FILE * file, const fq_zech_ctx_t ctx); @@ -63,9 +85,21 @@ void fq_zech_ctx_print(const fq_zech_ctx_t ctx); /* Memory management *********************************************************/ -FQ_ZECH_INLINE void fq_zech_init(fq_zech_t rop, const fq_zech_ctx_t ctx) { rop->value = ctx->qm1; } -FQ_ZECH_INLINE void fq_zech_init2(fq_zech_t rop, const fq_zech_ctx_t ctx) { rop->value = ctx->qm1; } -FQ_ZECH_INLINE void fq_zech_clear(fq_zech_t rop, const fq_zech_ctx_t ctx) { /* empty */ } +FQ_ZECH_INLINE +void fq_zech_init(fq_zech_t rop, const fq_zech_ctx_t ctx) +{ + rop->value = ctx->qm1; +} +FQ_ZECH_INLINE +void fq_zech_init2(fq_zech_t rop, const fq_zech_ctx_t ctx) +{ + rop->value = ctx->qm1; +} +FQ_ZECH_INLINE +void fq_zech_clear(fq_zech_t rop, const fq_zech_ctx_t ctx) +{ + /* empty */ +} FQ_ZECH_INLINE void fq_zech_reduce(fq_zech_t rop, const fq_zech_ctx_t ctx) @@ -79,24 +113,56 @@ fq_zech_reduce(fq_zech_t rop, const fq_zech_ctx_t ctx) /* Basic arithmetic **********************************************************/ -void fq_zech_add(fq_zech_t rop, const fq_zech_t op1, const fq_zech_t op2, const fq_zech_ctx_t ctx); -void fq_zech_sub(fq_zech_t rop, const fq_zech_t op1, const fq_zech_t op2, const fq_zech_ctx_t ctx); +void fq_zech_add( + fq_zech_t rop, + const fq_zech_t op1, + const fq_zech_t op2, + const fq_zech_ctx_t ctx); +void fq_zech_sub( + fq_zech_t rop, + const fq_zech_t op1, + const fq_zech_t op2, + const fq_zech_ctx_t ctx); void fq_zech_neg(fq_zech_t rop, const fq_zech_t op1, const fq_zech_ctx_t ctx); void fq_zech_sub_one(fq_zech_t rop, const fq_zech_t op1, const fq_zech_ctx_t ctx); void fq_zech_mul_si(fq_zech_t rop, const fq_zech_t op, slong x, const fq_zech_ctx_t ctx); void fq_zech_mul_ui(fq_zech_t rop, const fq_zech_t op, ulong x, const fq_zech_ctx_t ctx); -void fq_zech_mul_fmpz(fq_zech_t rop, const fq_zech_t op, const fmpz_t x, const fq_zech_ctx_t ctx); -void fq_zech_mul(fq_zech_t rop, const fq_zech_t op1, const fq_zech_t op2, const fq_zech_ctx_t ctx); +void fq_zech_mul_fmpz( + fq_zech_t rop, + const fq_zech_t op, + const fmpz_t x, + const fq_zech_ctx_t ctx); +void fq_zech_mul( + fq_zech_t rop, + const fq_zech_t op1, + const fq_zech_t op2, + const fq_zech_ctx_t ctx); void fq_zech_sqr(fq_zech_t rop, const fq_zech_t op, const fq_zech_ctx_t ctx); void fq_zech_inv(fq_zech_t rop, const fq_zech_t op1, const fq_zech_ctx_t ctx); -void _fq_zech_pow(fmpz * rop, const fmpz * op, slong len, const fmpz_t e, const fmpz * a, const slong * j, slong lena, const fmpz_t p); -void fq_zech_pow(fq_zech_t rop, const fq_zech_t op1, const fmpz_t e, const fq_zech_ctx_t ctx); -void fq_zech_pow_ui(fq_zech_t rop, const fq_zech_t op1, const ulong e, const fq_zech_ctx_t ctx); +void _fq_zech_pow( + fmpz * rop, + const fmpz * op, + slong len, + const fmpz_t e, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p); +void fq_zech_pow( + fq_zech_t rop, + const fq_zech_t op1, + const fmpz_t e, + const fq_zech_ctx_t ctx); +void fq_zech_pow_ui( + fq_zech_t rop, + const fq_zech_t op1, + const ulong e, + const fq_zech_ctx_t ctx); /* Roots *********************************************************************/ @@ -110,7 +176,10 @@ int fq_zech_is_square(const fq_zech_t op1, const fq_zech_ctx_t ctx); void fq_zech_randtest(fq_zech_t rop, flint_rand_t state, const fq_zech_ctx_t ctx); -void fq_zech_randtest_not_zero(fq_zech_t rop, flint_rand_t state, const fq_zech_ctx_t ctx); +void fq_zech_randtest_not_zero( + fq_zech_t rop, + flint_rand_t state, + const fq_zech_ctx_t ctx); void fq_zech_rand(fq_zech_t rop, flint_rand_t state, const fq_zech_ctx_t ctx); @@ -118,10 +187,22 @@ void fq_zech_rand_not_zero(fq_zech_t rop, flint_rand_t state, const fq_zech_ctx_ /* Comparison ****************************************************************/ -FQ_ZECH_INLINE int fq_zech_equal(const fq_zech_t op1, const fq_zech_t op2, const fq_zech_ctx_t ctx) { return op1->value == op2->value; } +FQ_ZECH_INLINE +int fq_zech_equal(const fq_zech_t op1, const fq_zech_t op2, const fq_zech_ctx_t ctx) +{ + return op1->value == op2->value; +} -FQ_ZECH_INLINE int fq_zech_is_zero(const fq_zech_t op, const fq_zech_ctx_t ctx) { return op->value == ctx->qm1; } -FQ_ZECH_INLINE int fq_zech_is_one(const fq_zech_t op, const fq_zech_ctx_t ctx) { return op->value == 0; } +FQ_ZECH_INLINE +int fq_zech_is_zero(const fq_zech_t op, const fq_zech_ctx_t ctx) +{ + return op->value == ctx->qm1; +} +FQ_ZECH_INLINE +int fq_zech_is_one(const fq_zech_t op, const fq_zech_ctx_t ctx) +{ + return op->value == 0; +} /* Assignments and conversions ***********************************************/ @@ -130,7 +211,11 @@ void fq_zech_set_ui(fq_zech_t rop, const ulong x, const fq_zech_ctx_t ctx); void fq_zech_set_fmpz(fq_zech_t rop, const fmpz_t x, const fq_zech_ctx_t ctx); void fq_zech_set_nmod_poly(fq_zech_t a, const nmod_poly_t b, const fq_zech_ctx_t ctx); void fq_zech_set_fq_nmod(fq_zech_t rop, const fq_nmod_t op, const fq_zech_ctx_t ctx); -FQ_ZECH_INLINE void fq_zech_set(fq_zech_t rop, const fq_zech_t op, const fq_zech_ctx_t ctx) { rop->value = op->value; } +FQ_ZECH_INLINE +void fq_zech_set(fq_zech_t rop, const fq_zech_t op, const fq_zech_ctx_t ctx) +{ + rop->value = op->value; +} int fq_zech_get_fmpz(fmpz_t a, const fq_zech_t op, const fq_zech_ctx_t ctx); void fq_zech_get_nmod_poly(nmod_poly_t a, const fq_zech_t b, const fq_zech_ctx_t ctx); @@ -145,9 +230,21 @@ fq_zech_swap(fq_zech_t op1, fq_zech_t op2, const fq_zech_ctx_t ctx) op1->value = temp; } -FQ_ZECH_INLINE void fq_zech_zero(fq_zech_t rop, const fq_zech_ctx_t ctx) { rop->value = ctx->qm1; } -FQ_ZECH_INLINE void fq_zech_one(fq_zech_t rop, const fq_zech_ctx_t ctx) { rop->value = 0; } -FQ_ZECH_INLINE void fq_zech_gen(fq_zech_t rop, const fq_zech_ctx_t ctx) { rop->value = 1; } +FQ_ZECH_INLINE +void fq_zech_zero(fq_zech_t rop, const fq_zech_ctx_t ctx) +{ + rop->value = ctx->qm1; +} +FQ_ZECH_INLINE +void fq_zech_one(fq_zech_t rop, const fq_zech_ctx_t ctx) +{ + rop->value = 0; +} +FQ_ZECH_INLINE +void fq_zech_gen(fq_zech_t rop, const fq_zech_ctx_t ctx) +{ + rop->value = 1; +} /* Output ********************************************************************/ @@ -166,14 +263,26 @@ char * fq_zech_get_str_pretty(const fq_zech_t op, const fq_zech_ctx_t ctx); void fq_zech_trace(fmpz_t rop, const fq_zech_t op, const fq_zech_ctx_t ctx); -void fq_zech_frobenius(fq_zech_t rop, const fq_zech_t op, slong e, const fq_zech_ctx_t ctx); +void fq_zech_frobenius( + fq_zech_t rop, + const fq_zech_t op, + slong e, + const fq_zech_ctx_t ctx); void fq_zech_norm(fmpz_t rop, const fq_zech_t op, const fq_zech_ctx_t ctx); /* Bit packing ******************************************************/ -void fq_zech_bit_pack(fmpz_t f, const fq_zech_t op, flint_bitcnt_t bit_size, const fq_zech_ctx_t ctx); -void fq_zech_bit_unpack(fq_zech_t rop, const fmpz_t f, flint_bitcnt_t bit_size, const fq_zech_ctx_t ctx); +void fq_zech_bit_pack( + fmpz_t f, + const fq_zech_t op, + flint_bitcnt_t bit_size, + const fq_zech_ctx_t ctx); +void fq_zech_bit_unpack( + fq_zech_t rop, + const fmpz_t f, + flint_bitcnt_t bit_size, + const fq_zech_ctx_t ctx); /* Inlines *******************************************************************/ diff --git a/src/fq_zech_embed.h b/src/fq_zech_embed.h index e5dc3fd3fc..caf957b796 100644 --- a/src/fq_zech_embed.h +++ b/src/fq_zech_embed.h @@ -26,11 +26,20 @@ #define B nmod #include "fq_embed_templates.h" -void TEMPLATE(T, modulus_pow_series_inv)(TEMPLATE(B, poly_t) res, const TEMPLATE(T, ctx_t) ctx, slong trunc); +void TEMPLATE( + T, + modulus_pow_series_inv)(TEMPLATE(B, + poly_t) res, + const TEMPLATE(T, + ctx_t) ctx, + slong trunc); #undef B #undef T -void fq_zech_modulus_derivative_inv(fq_zech_t m_prime, fq_zech_t m_prime_inv, const fq_zech_ctx_t ctx); +void fq_zech_modulus_derivative_inv( + fq_zech_t m_prime, + fq_zech_t m_prime_inv, + const fq_zech_ctx_t ctx); #endif diff --git a/src/fq_zech_mpoly.h b/src/fq_zech_mpoly.h index b70421db1d..03afdc11de 100644 --- a/src/fq_zech_mpoly.h +++ b/src/fq_zech_mpoly.h @@ -26,7 +26,11 @@ 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; } +FQ_ZECH_MPOLY_INLINE +nmod_t fq_zech_ctx_mod(const fq_zech_ctx_t ctx) +{ + return ctx->fq_nmod_ctx->mod; +} /* Internal type definitions *************************************************/ @@ -104,29 +108,74 @@ typedef fq_zech_mpoly_geobucket_struct fq_zech_mpoly_geobucket_t[1]; /* Context object ************************************************************/ -void fq_zech_mpoly_ctx_init(fq_zech_mpoly_ctx_t ctx, slong nvars, const ordering_t ord, const fq_zech_ctx_t fqctx); -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); +void fq_zech_mpoly_ctx_init( + fq_zech_mpoly_ctx_t ctx, + slong nvars, + const ordering_t ord, + const fq_zech_ctx_t fqctx); +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); 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; } +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 ********************************************************/ void fq_zech_mpoly_init(fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); void fq_zech_mpoly_init2(fq_zech_mpoly_t A, slong alloc, const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpoly_init3(fq_zech_mpoly_t A, slong alloc, flint_bitcnt_t bits, const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpoly_realloc(fq_zech_mpoly_t A, slong alloc, const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpoly_init3( + fq_zech_mpoly_t A, + slong alloc, + flint_bitcnt_t bits, + const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpoly_realloc( + fq_zech_mpoly_t A, + slong alloc, + const fq_zech_mpoly_ctx_t ctx); void fq_zech_mpoly_clear(fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); -void _fq_zech_mpoly_fit_length(fq_zech_struct ** coeff, ulong ** exps, slong * alloc, slong len, slong N, const fq_zech_ctx_t fqctx); -void fq_zech_mpoly_fit_length(fq_zech_mpoly_t A, slong length, const fq_zech_mpoly_ctx_t ctx); +void _fq_zech_mpoly_fit_length( + fq_zech_struct ** coeff, + ulong ** exps, + slong * alloc, + slong len, + slong N, + const fq_zech_ctx_t fqctx); +void fq_zech_mpoly_fit_length( + fq_zech_mpoly_t A, + slong length, + const fq_zech_mpoly_ctx_t ctx); + +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); -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); - -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_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_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) @@ -148,236 +197,711 @@ void fq_zech_mpoly_fit_bits(fq_zech_mpoly_t A, slong bits, const fq_zech_mpoly_c /* Input/output **************************************************************/ -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); +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); -char * fq_zech_mpoly_get_str_pretty(const fq_zech_mpoly_t A, const char ** x, const fq_zech_mpoly_ctx_t ctx); +char * fq_zech_mpoly_get_str_pretty( + const fq_zech_mpoly_t A, + const char ** x, + const fq_zech_mpoly_ctx_t ctx); #ifdef FLINT_HAVE_FILE -int fq_zech_mpoly_fprint_pretty(FILE * file, const fq_zech_mpoly_t A, const char ** x, const fq_zech_mpoly_ctx_t ctx); +int fq_zech_mpoly_fprint_pretty( + FILE * file, + const fq_zech_mpoly_t A, + const char ** x, + const fq_zech_mpoly_ctx_t ctx); #endif -int fq_zech_mpoly_print_pretty(const fq_zech_mpoly_t A, const char ** x, const fq_zech_mpoly_ctx_t ctx); +int fq_zech_mpoly_print_pretty( + const fq_zech_mpoly_t A, + const char ** x, + const fq_zech_mpoly_ctx_t ctx); /* Basic manipulation *******************************************************/ void fq_zech_mpoly_gen(fq_zech_mpoly_t A, slong var, const fq_zech_mpoly_ctx_t ctx); -int fq_zech_mpoly_is_gen(const fq_zech_mpoly_t A, slong var, const fq_zech_mpoly_ctx_t ctx); +int fq_zech_mpoly_is_gen( + const fq_zech_mpoly_t A, + slong var, + const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpoly_set(fq_zech_mpoly_t A, const fq_zech_mpoly_t B, const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpoly_set( + fq_zech_mpoly_t A, + const fq_zech_mpoly_t B, + const fq_zech_mpoly_ctx_t ctx); -int fq_zech_mpoly_equal(const fq_zech_mpoly_t A, const fq_zech_mpoly_t B, const fq_zech_mpoly_ctx_t ctx); +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) { FLINT_SWAP(fq_zech_mpoly_struct, *A, *B); } +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) +{ + FLINT_SWAP(fq_zech_mpoly_struct, *A, *B); +} /* Constants *****************************************************************/ int fq_zech_mpoly_is_fq_zech(const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpoly_get_fq_zech(fq_zech_t c, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpoly_get_fq_zech( + fq_zech_t c, + const fq_zech_mpoly_t A, + const fq_zech_mpoly_ctx_t ctx); void fq_zech_mpoly_set_ui(fq_zech_mpoly_t A, ulong c, const fq_zech_mpoly_ctx_t ctx); void fq_zech_mpoly_set_fq_zech_gen(fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpoly_set_fq_zech(fq_zech_mpoly_t A, const fq_zech_t c, const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpoly_set_fq_zech( + 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 +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); +} -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); +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 int fq_zech_mpoly_is_zero(const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx) { return A->length == 0; } +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; +} 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 +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_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_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_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 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 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 +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 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 +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 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); } -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); +} +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); +} /* Coefficients **************************************************************/ -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); -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); -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); - -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); -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); -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); -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); +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); +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); +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); + +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); +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); +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); +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); + +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); -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; } +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 ****************************************************************/ -int fq_zech_mpoly_cmp(const fq_zech_mpoly_t A, const fq_zech_mpoly_t B, const fq_zech_mpoly_ctx_t ctx); +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 ******************************************************/ 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; } - -void fq_zech_mpoly_resize(fq_zech_mpoly_t A, slong new_length, const fq_zech_mpoly_ctx_t ctx); - -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); -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_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); } -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); } - -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); -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); -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); - -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); -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); +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; +} -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); -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); +void fq_zech_mpoly_resize( + fq_zech_mpoly_t A, + slong new_length, + const fq_zech_mpoly_ctx_t ctx); + +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); +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); -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); -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); +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); +} +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); +} -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); -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); +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); +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); +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); + +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); +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); + +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); +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); + +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); +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); + +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); +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); void fq_zech_mpoly_sort_terms(fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); void fq_zech_mpoly_combine_like_terms(fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpoly_reverse(fq_zech_mpoly_t A, const fq_zech_mpoly_t B, const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpoly_reverse( + fq_zech_mpoly_t A, + const fq_zech_mpoly_t B, + const fq_zech_mpoly_ctx_t ctx); void fq_zech_mpoly_assert_canonical(const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); -void _fq_zech_mpoly_radix_sort1(fq_zech_mpoly_t A, slong left, slong right, flint_bitcnt_t pos, ulong cmpmask, ulong totalmask); -void _fq_zech_mpoly_radix_sort(fq_zech_mpoly_t A, slong left, slong right, flint_bitcnt_t pos, slong N, ulong * cmpmask); - -void _fq_zech_mpoly_push_exp_ui(fq_zech_mpoly_t A, const ulong * exp, const fq_zech_mpoly_ctx_t ctx); -void _fq_zech_mpoly_push_exp_ffmpz(fq_zech_mpoly_t A, const fmpz * exp, const fq_zech_mpoly_ctx_t ctx); -void _fq_zech_mpoly_push_exp_pfmpz(fq_zech_mpoly_t A, fmpz * const * exp, const fq_zech_mpoly_ctx_t ctx); +void _fq_zech_mpoly_radix_sort1( + fq_zech_mpoly_t A, + slong left, + slong right, + flint_bitcnt_t pos, + ulong cmpmask, + ulong totalmask); +void _fq_zech_mpoly_radix_sort( + fq_zech_mpoly_t A, + slong left, + slong right, + flint_bitcnt_t pos, + slong N, + ulong * cmpmask); + +void _fq_zech_mpoly_push_exp_ui( + fq_zech_mpoly_t A, + const ulong * exp, + const fq_zech_mpoly_ctx_t ctx); +void _fq_zech_mpoly_push_exp_ffmpz( + fq_zech_mpoly_t A, + const fmpz * exp, + const fq_zech_mpoly_ctx_t ctx); +void _fq_zech_mpoly_push_exp_pfmpz( + fq_zech_mpoly_t A, + fmpz * const * exp, + const fq_zech_mpoly_ctx_t ctx); /* Random generation *********************************************************/ -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); -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); -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); +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); +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); +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 ******************************************************/ -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); -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); - -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); -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); -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); - -void fq_zech_mpoly_neg(fq_zech_mpoly_t A, const fq_zech_mpoly_t B, const fq_zech_mpoly_ctx_t ctx); +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); +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); + +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); +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); +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); + +void fq_zech_mpoly_neg( + fq_zech_mpoly_t A, + const fq_zech_mpoly_t B, + const fq_zech_mpoly_ctx_t ctx); /* Scalar operations *********************************************************/ -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); +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); -void fq_zech_mpoly_make_monic(fq_zech_mpoly_t A, const fq_zech_mpoly_t B, const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpoly_make_monic( + fq_zech_mpoly_t A, + const fq_zech_mpoly_t B, + const fq_zech_mpoly_ctx_t ctx); -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); +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 **********************************************************/ -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); +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 ****************************************************************/ -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); - -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); -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); - -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); - -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); - -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); -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); -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); - -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); +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); + +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); +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); + +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); + +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); + +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); +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); +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); + +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 ************************************************************/ -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); -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); -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); +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); +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); +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); /* Powering ******************************************************************/ -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); -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); +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); +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); /* Division ******************************************************************/ -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); -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); - -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); -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); - -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); -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); - -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); -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); +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); +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); + +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); +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); + +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); +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); + +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); +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); /* GCD ***********************************************************************/ -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); -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); -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); -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); -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); -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); - -void fq_zech_mpoly_deflation(fmpz * shift, fmpz * stride, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); - -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); -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); +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); +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); +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); +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); +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); +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); + +void fq_zech_mpoly_deflation( + fmpz * shift, + fmpz * stride, + const fq_zech_mpoly_t A, + const fq_zech_mpoly_ctx_t ctx); + +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); +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 ***************************************************************/ void fq_zech_mpoly_univar_init(fq_zech_mpoly_univar_t A, const fq_zech_mpoly_ctx_t ctx); void fq_zech_mpoly_univar_clear(fq_zech_mpoly_univar_t A, const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpoly_univar_fit_length(fq_zech_mpoly_univar_t A, slong length, const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpoly_univar_fit_length( + fq_zech_mpoly_univar_t A, + slong length, + const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpoly_univar_print_pretty(const fq_zech_mpoly_univar_t A, const char ** x, const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpoly_univar_print_pretty( + const fq_zech_mpoly_univar_t A, + const char ** x, + const fq_zech_mpoly_ctx_t ctx); void fq_zech_mpoly_univar_assert_canonical(fq_zech_mpoly_univar_t A, const fq_zech_mpoly_ctx_t ctx); -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); -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); -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); +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); +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); +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) { FLINT_SWAP(fq_zech_mpoly_univar_struct, *A, *B); } +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) +{ + FLINT_SWAP(fq_zech_mpoly_univar_struct, *A, *B); +} -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 +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_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 +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_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); } +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); +} /****************************************************************************** @@ -385,25 +909,55 @@ FQ_ZECH_MPOLY_INLINE void fq_zech_mpoly_univar_swap_term_coeff(fq_zech_mpoly_t c ******************************************************************************/ -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); -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); - -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); - -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); - -int fq_zech_mpoly_repack_bits_inplace(fq_zech_mpoly_t A, flint_bitcnt_t Abits, const fq_zech_mpoly_ctx_t ctx); +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); +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); + +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); + +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); + +int fq_zech_mpoly_repack_bits_inplace( + fq_zech_mpoly_t A, + flint_bitcnt_t Abits, + const fq_zech_mpoly_ctx_t ctx); void fq_zech_mpoly_ctx_change_modulus(fq_zech_mpoly_ctx_t ctx, slong deg); -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); -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); +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); +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 ********************************************************************/ int fq_zech_mpolyu_is_canonical(const fq_zech_mpolyu_t poly, const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpolyu_init(fq_zech_mpolyu_t A, flint_bitcnt_t bits, const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpolyu_init( + fq_zech_mpolyu_t A, + flint_bitcnt_t bits, + const fq_zech_mpoly_ctx_t ctx); void fq_zech_mpolyu_clear(fq_zech_mpolyu_t A, const fq_zech_mpoly_ctx_t uctx); void fq_zech_mpolyu_swap(fq_zech_mpolyu_t A, fq_zech_mpolyu_t B); @@ -413,9 +967,15 @@ void fq_zech_mpolyu_one(fq_zech_mpolyu_t A, const fq_zech_mpoly_ctx_t uctx); int fq_zech_mpolyu_is_one(fq_zech_mpolyu_t A, const fq_zech_mpoly_ctx_t uctx); -void fq_zech_mpolyu_print_pretty(const fq_zech_mpolyu_t poly, const char ** x, const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpolyu_print_pretty( + const fq_zech_mpolyu_t poly, + const char ** x, + const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpolyu_fit_length(fq_zech_mpolyu_t A, slong length, const fq_zech_mpoly_ctx_t uctx); +void fq_zech_mpolyu_fit_length( + fq_zech_mpolyu_t A, + slong length, + const fq_zech_mpoly_ctx_t uctx); #ifdef __cplusplus } diff --git a/src/fq_zech_mpoly_factor.h b/src/fq_zech_mpoly_factor.h index 580b7a6e31..2e8d8142a7 100644 --- a/src/fq_zech_mpoly_factor.h +++ b/src/fq_zech_mpoly_factor.h @@ -66,117 +66,309 @@ 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; } +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; +} void fq_zech_bpoly_realloc(fq_zech_bpoly_t A, slong len, const fq_zech_ctx_t ctx); 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) { FLINT_SWAP(fq_zech_bpoly_struct, *A, *B); } +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) +{ + FLINT_SWAP(fq_zech_bpoly_struct, *A, *B); +} -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--; } +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--; +} -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_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 +void fq_zech_bpoly_zero(fq_zech_bpoly_t A, const fq_zech_ctx_t ctx) +{ + A->length = 0; +} void fq_zech_bpoly_one(fq_zech_bpoly_t A, const fq_zech_ctx_t ctx); -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; } +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; +} -int fq_zech_bpoly_fq_equal(const fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_ctx_t ctx); -int fq_zech_bpoly_equal(const fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_ctx_t ctx); +int fq_zech_bpoly_fq_equal( + const fq_zech_bpoly_t A, + const fq_zech_bpoly_t B, + const fq_zech_ctx_t ctx); +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 slong fq_zech_bpoly_degree0(const fq_zech_bpoly_t A, const fq_zech_ctx_t ctx) { return A->length - 1; } +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; +} slong fq_zech_bpoly_degree1(const fq_zech_bpoly_t A, 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); } - -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); - -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); - -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); -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); - -void fq_zech_bpoly_set_poly_var0(fq_zech_bpoly_t A, const fq_zech_poly_t B, const fq_zech_ctx_t ctx); -void fq_zech_bpoly_set_poly_var1(fq_zech_bpoly_t A, const fq_zech_poly_t B, const fq_zech_ctx_t ctx); - -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); - -void fq_zech_bpoly_set(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); +} -void fq_zech_bpoly_print_pretty(const fq_zech_bpoly_t A, const char * var0, const char * var1, const fq_zech_ctx_t ctx); +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); + +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); + +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); +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); + +void fq_zech_bpoly_set_poly_var0( + fq_zech_bpoly_t A, + const fq_zech_poly_t B, + const fq_zech_ctx_t ctx); +void fq_zech_bpoly_set_poly_var1( + fq_zech_bpoly_t A, + const fq_zech_poly_t B, + const fq_zech_ctx_t ctx); + +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); + +void fq_zech_bpoly_set( + fq_zech_bpoly_t A, + const fq_zech_bpoly_t B, + const fq_zech_ctx_t ctx); + +void fq_zech_bpoly_print_pretty( + const fq_zech_bpoly_t A, + const char * var0, + const char * var1, + const fq_zech_ctx_t ctx); int fq_zech_bpoly_is_canonical(const fq_zech_bpoly_t A, const fq_zech_ctx_t ctx); void fq_zech_bpoly_make_monic(fq_zech_bpoly_t A, slong order, const fq_zech_ctx_t ctx); -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); -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); - -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); -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); - -void fq_zech_bpoly_derivative(fq_zech_bpoly_t A, const fq_zech_bpoly_t B, const fq_zech_ctx_t ctx); - -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); - -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); - -void fq_zech_bpoly_make_primitive(fq_zech_poly_t g, fq_zech_bpoly_t A, const fq_zech_ctx_t ctx); - -void fq_zech_bpoly_taylor_shift_var0(fq_zech_bpoly_t A, const fq_zech_t alpha, const fq_zech_ctx_t ctx); -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); - -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); -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); +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); +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); + +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); +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); + +void fq_zech_bpoly_derivative( + fq_zech_bpoly_t A, + const fq_zech_bpoly_t B, + const fq_zech_ctx_t ctx); + +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); + +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); + +void fq_zech_bpoly_make_primitive( + fq_zech_poly_t g, + fq_zech_bpoly_t A, + const fq_zech_ctx_t ctx); + +void fq_zech_bpoly_taylor_shift_var0( + fq_zech_bpoly_t A, + const fq_zech_t alpha, + const fq_zech_ctx_t ctx); +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); + +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); +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_init(fq_zech_tpoly_t A, const fq_zech_ctx_t ctx) +{ + A->coeffs = NULL; A->alloc = 0; A->length = 0; +} void fq_zech_tpoly_clear(fq_zech_tpoly_t A, const fq_zech_ctx_t ctx); -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) { FLINT_SWAP(fq_zech_tpoly_struct, *A, *B); } +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) +{ + FLINT_SWAP(fq_zech_tpoly_struct, *A, *B); +} void fq_zech_tpoly_fit_length(fq_zech_tpoly_t A, slong len, 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; } +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; +} void fq_zech_polyu_realloc(fq_zech_polyu_t A, slong len, const fq_zech_ctx_t ctx); void fq_zech_polyu_clear(fq_zech_polyu_t A, 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_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) { FLINT_SWAP(fq_zech_polyu_struct, *A, *B); } +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) +{ + FLINT_SWAP(fq_zech_polyu_struct, *A, *B); +} -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); +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); -void fq_zech_polyu3_degrees(slong * deg0, slong * deg1, slong * deg2, const fq_zech_polyu_t A); +void fq_zech_polyu3_degrees( + slong * deg0, + slong * deg1, + slong * deg2, + const fq_zech_polyu_t A); 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; } +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; +} void fq_zech_polyun_realloc(fq_zech_polyun_t A, slong len, const fq_zech_ctx_t ctx); void fq_zech_polyun_clear(fq_zech_polyun_t A, 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_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) { FLINT_SWAP(fq_zech_polyun_struct, *A, *B); } +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) +{ + FLINT_SWAP(fq_zech_polyun_struct, *A, *B); +} -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); -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); +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); +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); int fq_zech_polyun_is_canonical(const fq_zech_polyun_t A, const fq_zech_ctx_t ctx); /*****************************************************************************/ -int fq_zech_mpoly_is_fq_zech_poly(const fq_zech_mpoly_t A, slong var, const fq_zech_mpoly_ctx_t ctx); - -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); - -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); -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); +int fq_zech_mpoly_is_fq_zech_poly( + const fq_zech_mpoly_t A, + slong var, + const fq_zech_mpoly_ctx_t ctx); + +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); + +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); +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); /*****************************************************************************/ @@ -192,27 +384,64 @@ typedef struct typedef fq_zech_mpoly_factor_struct fq_zech_mpoly_factor_t[1]; void fq_zech_mpoly_factor_init(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpoly_factor_realloc(fq_zech_mpoly_factor_t f, slong alloc, const fq_zech_mpoly_ctx_t ctx); +void fq_zech_mpoly_factor_realloc( + fq_zech_mpoly_factor_t f, + slong alloc, + const fq_zech_mpoly_ctx_t ctx); void fq_zech_mpoly_factor_clear(fq_zech_mpoly_factor_t f, const fq_zech_mpoly_ctx_t ctx); -void fq_zech_mpoly_factor_fit_length(fq_zech_mpoly_factor_t f, slong len, const fq_zech_mpoly_ctx_t ctx); - -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); - -void fq_zech_mpoly_factor_print_pretty(const fq_zech_mpoly_factor_t f, const char ** vars, const fq_zech_mpoly_ctx_t ctx); - -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); -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); +void fq_zech_mpoly_factor_fit_length( + fq_zech_mpoly_factor_t f, + slong len, + const fq_zech_mpoly_ctx_t ctx); + +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); + +void fq_zech_mpoly_factor_print_pretty( + const fq_zech_mpoly_factor_t f, + const char ** vars, + const fq_zech_mpoly_ctx_t ctx); + +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); +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); + +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); + +int fq_zech_mpoly_factor( + fq_zech_mpoly_factor_t f, + const fq_zech_mpoly_t A, + const fq_zech_mpoly_ctx_t ctx); -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); - -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) { FLINT_SWAP(fq_zech_mpoly_factor_struct, *A, *B); } +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) +{ + FLINT_SWAP(fq_zech_mpoly_factor_struct, *A, *B); +} -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; } +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; +} -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); +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) @@ -226,8 +455,15 @@ int fq_zech_mpoly_factor_matches(const fq_zech_mpoly_t a, const fq_zech_mpoly_fa return matches; } -void _fq_zech_mpoly_get_lead0(fq_zech_mpoly_t c, const fq_zech_mpoly_t A, const fq_zech_mpoly_ctx_t ctx); -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); +void _fq_zech_mpoly_get_lead0( + fq_zech_mpoly_t c, + const fq_zech_mpoly_t A, + const fq_zech_mpoly_ctx_t ctx); +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); /*****************************************************************************/ @@ -240,39 +476,110 @@ typedef 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_init(fq_zech_mpolyv_t A, const fq_zech_mpoly_ctx_t ctx) +{ + A->coeffs = NULL; A->alloc = 0; A->length = 0; +} void fq_zech_mpolyv_clear(fq_zech_mpolyv_t A, const fq_zech_mpoly_ctx_t ctx); -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) { FLINT_SWAP(fq_zech_mpolyv_struct, *A, *B); } - -void fq_zech_mpolyv_print_pretty(const fq_zech_mpolyv_t poly, const char ** x, const fq_zech_mpoly_ctx_t ctx); - -void fq_zech_mpolyv_fit_length(fq_zech_mpolyv_t A, slong length, const fq_zech_mpoly_ctx_t ctx); - -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); - -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); +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) +{ + FLINT_SWAP(fq_zech_mpolyv_struct, *A, *B); +} -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); +void fq_zech_mpolyv_print_pretty( + const fq_zech_mpolyv_t poly, + const char ** x, + const fq_zech_mpoly_ctx_t ctx); + +void fq_zech_mpolyv_fit_length( + fq_zech_mpolyv_t A, + slong length, + const fq_zech_mpoly_ctx_t ctx); + +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); + +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); + +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); /*****************************************************************************/ -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); +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); -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); +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); /*****************************************************************************/ -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); - -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); -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); - -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); -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); - -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); -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); +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); + +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); +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); + +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); +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); + +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); +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); /*****************************************************************************/ @@ -301,31 +608,117 @@ typedef struct typedef fq_zech_mpoly_pfrac_struct fq_zech_mpoly_pfrac_t[1]; -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); +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); void fq_zech_mpoly_pfrac_clear(fq_zech_mpoly_pfrac_t I, const fq_zech_mpoly_ctx_t ctx); -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); -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); - -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); -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); - -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); - -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); -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); -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); -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); - -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); - -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); - -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); - -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); - -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); +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); +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); + +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); +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); + +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); + +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); +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); +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); +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); + +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); + +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); + +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); + +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); + +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 } diff --git a/src/fq_zech_poly_factor.h b/src/fq_zech_poly_factor.h index d6dba4b71b..8beb8d271b 100644 --- a/src/fq_zech_poly_factor.h +++ b/src/fq_zech_poly_factor.h @@ -34,6 +34,10 @@ int FQ_ZECH_POLY_ITERATED_FROBENIUS_CUTOFF(const fq_zech_ctx_t ctx, slong length #undef CAP_T #undef T -void fq_zech_poly_factor_get_poly(fq_zech_poly_t z, const fq_zech_poly_factor_t fac, slong i, const fq_zech_ctx_t ctx); +void fq_zech_poly_factor_get_poly( + fq_zech_poly_t z, + const fq_zech_poly_factor_t fac, + slong i, + const fq_zech_ctx_t ctx); #endif diff --git a/src/mpf_mat.h b/src/mpf_mat.h index 027c772379..c040079f8f 100644 --- a/src/mpf_mat.h +++ b/src/mpf_mat.h @@ -37,7 +37,11 @@ typedef struct typedef mpf_mat_struct mpf_mat_t[1]; -MPF_MAT_INLINE mpf * mpf_mat_entry(const mpf_mat_t mat, slong i, slong j) { return mat->rows[i] + j; } +MPF_MAT_INLINE +mpf * mpf_mat_entry(const mpf_mat_t mat, slong i, slong j) +{ + return mat->rows[i] + j; +} MPF_MAT_INLINE slong mpf_mat_nrows(const mpf_mat_t mat) { return mat->r; } MPF_MAT_INLINE slong mpf_mat_ncols(const mpf_mat_t mat) { return mat->c; } @@ -62,12 +66,23 @@ mpf_mat_swap_entrywise(mpf_mat_t mat1, mpf_mat_t mat2) void mpf_mat_set(mpf_mat_t mat1, const mpf_mat_t mat2); int mpf_mat_equal(const mpf_mat_t mat1, const mpf_mat_t mat2); -int mpf_mat_approx_equal(const mpf_mat_t mat1, const mpf_mat_t mat2, flint_bitcnt_t bits); +int mpf_mat_approx_equal( + const mpf_mat_t mat1, + const mpf_mat_t mat2, + flint_bitcnt_t bits); int mpf_mat_is_zero(const mpf_mat_t mat); -MPF_MAT_INLINE int mpf_mat_is_empty(const mpf_mat_t mat) { return mat->r == 0 || mat->c == 0; } -MPF_MAT_INLINE int mpf_mat_is_square(const mpf_mat_t mat) { return mat->r == mat->c; } +MPF_MAT_INLINE +int mpf_mat_is_empty(const mpf_mat_t mat) +{ + return mat->r == 0 || mat->c == 0; +} +MPF_MAT_INLINE +int mpf_mat_is_square(const mpf_mat_t mat) +{ + return mat->r == mat->c; +} void mpf_mat_zero(mpf_mat_t mat); void mpf_mat_one(mpf_mat_t mat); diff --git a/src/mpf_vec.h b/src/mpf_vec.h index f6a47cfae4..95a43666a6 100644 --- a/src/mpf_vec.h +++ b/src/mpf_vec.h @@ -51,7 +51,11 @@ void _mpf_vec_set_fmpz_vec(mpf * appv, const fmpz * vec, slong len); int _mpf_vec_equal(const mpf * vec1, const mpf * vec2, slong len); -int _mpf_vec_approx_equal(const mpf * vec1, const mpf * vec2, slong len, flint_bitcnt_t bits); +int _mpf_vec_approx_equal( + const mpf * vec1, + const mpf * vec2, + slong len, + flint_bitcnt_t bits); int _mpf_vec_is_zero(const mpf * vec, slong len); @@ -68,7 +72,12 @@ void _mpf_vec_scalar_mul_mpf(mpf * res, const mpf * vec, slong len, mpf_t c); /* Dot product and norm **************************************/ -int _mpf_vec_dot2(mpf_t res, const mpf * vec1, const mpf * vec2, slong len2, flint_bitcnt_t prec); +int _mpf_vec_dot2( + mpf_t res, + const mpf * vec1, + const mpf * vec2, + slong len2, + flint_bitcnt_t prec); void _mpf_vec_dot(mpf_t res, const mpf * vec1, const mpf * vec2, slong len2); void _mpf_vec_norm2(mpf_t res, const mpf * vec, slong len, flint_bitcnt_t prec); diff --git a/src/mpfr_mat.h b/src/mpfr_mat.h index 860cd2bb8f..eb5ae3f6a0 100644 --- a/src/mpfr_mat.h +++ b/src/mpfr_mat.h @@ -37,7 +37,11 @@ typedef struct /* fmpz_mat_t allows reference-like semantics for fmpz_mat_struct */ typedef mpfr_mat_struct mpfr_mat_t[1]; -MPFR_MAT_INLINE __mpfr_struct * mpfr_mat_entry(const mpfr_mat_t mat, slong i, slong j) { return mat->rows[i] + j; } +MPFR_MAT_INLINE +__mpfr_struct * mpfr_mat_entry(const mpfr_mat_t mat, slong i, slong j) +{ + return mat->rows[i] + j; +} MPFR_MAT_INLINE slong mpfr_mat_nrows(const mpfr_mat_t mat) { return mat->r; } MPFR_MAT_INLINE slong mpfr_mat_ncols(const mpfr_mat_t mat) { return mat->c; } @@ -69,7 +73,11 @@ void mpfr_mat_randtest(mpfr_mat_t mat, flint_rand_t state); /* Multiplication ***********************************************************/ -void mpfr_mat_mul_classical(mpfr_mat_t C, const mpfr_mat_t A, const mpfr_mat_t B, mpfr_rnd_t rnd); +void mpfr_mat_mul_classical( + mpfr_mat_t C, + const mpfr_mat_t A, + const mpfr_mat_t B, + mpfr_rnd_t rnd); #ifdef __cplusplus } diff --git a/src/mpfr_vec.h b/src/mpfr_vec.h index 276ca28a01..05e157a52c 100644 --- a/src/mpfr_vec.h +++ b/src/mpfr_vec.h @@ -39,9 +39,17 @@ int _mpfr_vec_equal(mpfr_srcptr vec1, mpfr_srcptr vec2, slong len); void _mpfr_vec_add(mpfr_ptr res, mpfr_srcptr vec1, mpfr_srcptr vec2, slong length); void _mpfr_vec_scalar_mul_mpfr(mpfr_ptr res, mpfr_srcptr vec, slong length, mpfr_t c); -void _mpfr_vec_scalar_mul_2exp(mpfr_ptr res, mpfr_srcptr vec, slong length, flint_bitcnt_t exp); - -void _mpfr_vec_scalar_product(mpfr_t res, mpfr_srcptr vec1, mpfr_srcptr vec2, slong length); +void _mpfr_vec_scalar_mul_2exp( + mpfr_ptr res, + mpfr_srcptr vec, + slong length, + flint_bitcnt_t exp); + +void _mpfr_vec_scalar_product( + mpfr_t res, + mpfr_srcptr vec1, + mpfr_srcptr vec2, + slong length); #ifdef __cplusplus } diff --git a/src/mpn_extras.h b/src/mpn_extras.h index afe11faf71..e04773e52e 100644 --- a/src/mpn_extras.h +++ b/src/mpn_extras.h @@ -62,7 +62,12 @@ double flint_mpn_get_d(mp_srcptr ptr, mp_size_t size, mp_size_t sign, long exp); #define FLINT_MPN_MUL_THRESHOLD 400 -mp_limb_t flint_mpn_mul_large(mp_ptr r1, mp_srcptr i1, mp_size_t n1, mp_srcptr i2, mp_size_t n2); +mp_limb_t flint_mpn_mul_large( + mp_ptr r1, + mp_srcptr i1, + mp_size_t n1, + mp_srcptr i2, + mp_size_t n2); MPN_EXTRAS_INLINE mp_limb_t flint_mpn_mul(mp_ptr z, mp_srcptr x, mp_size_t xn, mp_srcptr y, mp_size_t yn) @@ -145,7 +150,11 @@ void flint_mpn_sqr(mp_ptr z, mp_srcptr x, mp_size_t n) # define mpn_modexact_1_odd __gmpn_modexact_1_odd mp_limb_t mpn_modexact_1_odd(mp_srcptr, mp_size_t, mp_limb_t); -MPN_EXTRAS_INLINE int flint_mpn_divisible_1_odd(mp_srcptr x, mp_size_t xsize, mp_limb_t d) { return mpn_modexact_1_odd(x, xsize, d) == 0; } +MPN_EXTRAS_INLINE +int flint_mpn_divisible_1_odd(mp_srcptr x, mp_size_t xsize, mp_limb_t d) +{ + return mpn_modexact_1_odd(x, xsize, d) == 0; +} #else # include "gmpcompat.h" @@ -194,22 +203,60 @@ void flint_mpn_debug(mp_srcptr x, mp_size_t xsize); mp_size_t flint_mpn_remove_2exp(mp_ptr x, mp_size_t xsize, flint_bitcnt_t *bits); -mp_size_t flint_mpn_remove_power_ascending(mp_ptr x, mp_size_t xsize, mp_ptr p, mp_size_t psize, ulong *exp); +mp_size_t flint_mpn_remove_power_ascending( + mp_ptr x, + mp_size_t xsize, + mp_ptr p, + mp_size_t psize, + ulong *exp); int flint_mpn_factor_trial(mp_srcptr x, mp_size_t xsize, slong start, slong stop); -int flint_mpn_factor_trial_tree(slong * factors, mp_srcptr x, mp_size_t xsize, slong num_primes); - -mp_size_t flint_mpn_fmms1(mp_ptr y, mp_limb_t a1, mp_srcptr x1, mp_limb_t a2, mp_srcptr x2, mp_size_t n); - -int flint_mpn_divides(mp_ptr q, mp_srcptr array1, mp_size_t limbs1, mp_srcptr arrayg, mp_size_t limbsg, mp_ptr temp); - -mp_size_t flint_mpn_gcd_full2(mp_ptr arrayg, mp_srcptr array1, mp_size_t limbs1, mp_srcptr array2, mp_size_t limbs2, mp_ptr temp); -mp_size_t flint_mpn_gcd_full(mp_ptr arrayg, mp_srcptr array1, mp_size_t limbs1, mp_srcptr array2, mp_size_t limbs2); +int flint_mpn_factor_trial_tree( + slong * factors, + mp_srcptr x, + mp_size_t xsize, + slong num_primes); + +mp_size_t flint_mpn_fmms1( + mp_ptr y, + mp_limb_t a1, + mp_srcptr x1, + mp_limb_t a2, + mp_srcptr x2, + mp_size_t n); + +int flint_mpn_divides( + mp_ptr q, + mp_srcptr array1, + mp_size_t limbs1, + mp_srcptr arrayg, + mp_size_t limbsg, + mp_ptr temp); + +mp_size_t flint_mpn_gcd_full2( + mp_ptr arrayg, + mp_srcptr array1, + mp_size_t limbs1, + mp_srcptr array2, + mp_size_t limbs2, + mp_ptr temp); +mp_size_t flint_mpn_gcd_full( + mp_ptr arrayg, + mp_srcptr array1, + mp_size_t limbs1, + mp_srcptr array2, + mp_size_t limbs2); mp_limb_t flint_mpn_preinv1(mp_limb_t d, mp_limb_t d2); -mp_limb_t flint_mpn_divrem_preinv1(mp_ptr q, mp_ptr a, mp_size_t m, mp_srcptr b, mp_size_t n, mp_limb_t dinv); +mp_limb_t flint_mpn_divrem_preinv1( + mp_ptr q, + mp_ptr a, + mp_size_t m, + mp_srcptr b, + mp_size_t n, + mp_limb_t dinv); #define flint_mpn_divrem21_preinv(q, a_hi, a_lo, dinv) \ do { \ @@ -220,15 +267,48 @@ mp_limb_t flint_mpn_divrem_preinv1(mp_ptr q, mp_ptr a, mp_size_t m, mp_srcptr b, add_ssaaaa((q), __q2, (q), __q2, (a_hi), (a_lo)); \ } while (0) -void flint_mpn_mulmod_preinv1(mp_ptr r, mp_srcptr a, mp_srcptr b, mp_size_t n, mp_srcptr d, mp_limb_t dinv, ulong norm); -void flint_mpn_mulmod_preinvn(mp_ptr r, mp_srcptr a, mp_srcptr b, mp_size_t n, mp_srcptr d, mp_srcptr dinv, ulong norm); -int flint_mpn_mulmod_2expp1_basecase(mp_ptr xp, mp_srcptr yp, mp_srcptr zp, int c, flint_bitcnt_t b, mp_ptr tp); +void flint_mpn_mulmod_preinv1( + mp_ptr r, + mp_srcptr a, + mp_srcptr b, + mp_size_t n, + mp_srcptr d, + mp_limb_t dinv, + ulong norm); +void flint_mpn_mulmod_preinvn( + mp_ptr r, + mp_srcptr a, + mp_srcptr b, + mp_size_t n, + mp_srcptr d, + mp_srcptr dinv, + ulong norm); +int flint_mpn_mulmod_2expp1_basecase( + mp_ptr xp, + mp_srcptr yp, + mp_srcptr zp, + int c, + flint_bitcnt_t b, + mp_ptr tp); void flint_mpn_preinvn(mp_ptr dinv, mp_srcptr d, mp_size_t n); -void flint_mpn_mod_preinvn(mp_ptr r, mp_srcptr a, mp_size_t m, mp_srcptr d, mp_size_t n, mp_srcptr dinv); - -mp_limb_t flint_mpn_divrem_preinvn(mp_ptr q, mp_ptr r, mp_srcptr a, mp_size_t m, mp_srcptr d, mp_size_t n, mp_srcptr dinv); +void flint_mpn_mod_preinvn( + mp_ptr r, + mp_srcptr a, + mp_size_t m, + mp_srcptr d, + mp_size_t n, + mp_srcptr dinv); + +mp_limb_t flint_mpn_divrem_preinvn( + mp_ptr q, + mp_ptr r, + mp_srcptr a, + mp_size_t m, + mp_srcptr d, + mp_size_t n, + mp_srcptr dinv); MPN_EXTRAS_INLINE void flint_mpn_rrandom(mp_limb_t *rp, gmp_randstate_t state, mp_size_t n) diff --git a/src/mpoly.h b/src/mpoly.h index a6d8d0ebf0..3e70c517f0 100644 --- a/src/mpoly.h +++ b/src/mpoly.h @@ -55,7 +55,11 @@ void mpoly_ctx_init(mpoly_ctx_t ctx, slong nvars, const ordering_t ord); void mpoly_ctx_init_rand(mpoly_ctx_t mctx, flint_rand_t state, slong max_nvars); void mpoly_ctx_clear(mpoly_ctx_t mctx); -void mpoly_monomial_randbits_fmpz(fmpz * exp, flint_rand_t state, flint_bitcnt_t exp_bits, const mpoly_ctx_t mctx); +void mpoly_monomial_randbits_fmpz( + fmpz * exp, + flint_rand_t state, + flint_bitcnt_t exp_bits, + const mpoly_ctx_t mctx); /* number of words used by an exponent vector packed into "bits" bits: @@ -208,10 +212,22 @@ slong mpoly_rbtree_fmpz_head(const mpoly_rbtree_fmpz_t T) /* Orderings *****************************************************************/ -MPOLY_INLINE ordering_t mpoly_ordering_randtest(flint_rand_t state) { return (ordering_t) n_randint(state, MPOLY_NUM_ORDERINGS); } +MPOLY_INLINE +ordering_t mpoly_ordering_randtest(flint_rand_t state) +{ + return (ordering_t) n_randint(state, MPOLY_NUM_ORDERINGS); +} -MPOLY_INLINE int mpoly_ordering_isdeg(const mpoly_ctx_t mctx) { return mctx->ord == ORD_DEGLEX || mctx->ord == ORD_DEGREVLEX; } -MPOLY_INLINE int mpoly_ordering_isrev(const mpoly_ctx_t mctx) { return mctx->ord == ORD_DEGREVLEX; } +MPOLY_INLINE +int mpoly_ordering_isdeg(const mpoly_ctx_t mctx) +{ + return mctx->ord == ORD_DEGLEX || mctx->ord == ORD_DEGREVLEX; +} +MPOLY_INLINE +int mpoly_ordering_isrev(const mpoly_ctx_t mctx) +{ + return mctx->ord == ORD_DEGREVLEX; +} void mpoly_ordering_print(ordering_t ord); @@ -708,8 +724,16 @@ int mpoly_monomial_cmp1(ulong a, ulong b, ulong cmpmask) return 0; } -MPOLY_INLINE int mpoly_monomial_gt1(ulong a, ulong b, ulong cmpmask) { return (a ^ cmpmask) > (b ^ cmpmask); } -MPOLY_INLINE int mpoly_monomial_ge1(ulong a, ulong b, ulong cmpmask) { return (a ^ cmpmask) >= (b ^ cmpmask); } +MPOLY_INLINE +int mpoly_monomial_gt1(ulong a, ulong b, ulong cmpmask) +{ + return (a ^ cmpmask) > (b ^ cmpmask); +} +MPOLY_INLINE +int mpoly_monomial_ge1(ulong a, ulong b, ulong cmpmask) +{ + return (a ^ cmpmask) >= (b ^ cmpmask); +} MPOLY_INLINE int mpoly_monomial_lt(const ulong * exp3, const ulong * exp2, slong N, const ulong * cmpmask) @@ -893,9 +917,21 @@ slong mpoly_geobucket_clog4(slong x) /* single-limb packings ******************************************************/ -MPOLY_INLINE ulong pack_exp2(ulong e0, ulong e1) { return (e0 << (1 * (FLINT_BITS / 2))) + (e1 << (0 * (FLINT_BITS / 2))); } -MPOLY_INLINE ulong pack_exp3(ulong e0, ulong e1, ulong e2) { return (e0 << (2 * (FLINT_BITS / 3))) + (e1 << (1 * (FLINT_BITS / 3))) + (e2 << (0 * (FLINT_BITS / 3))); } -MPOLY_INLINE ulong extract_exp(ulong e, int idx, int nvars) { return (e >> (idx * (FLINT_BITS / nvars))) & ((-UWORD(1)) >> (FLINT_BITS - FLINT_BITS / nvars)); } +MPOLY_INLINE +ulong pack_exp2(ulong e0, ulong e1) +{ + return (e0 << (1 * (FLINT_BITS / 2))) + (e1 << (0 * (FLINT_BITS / 2))); +} +MPOLY_INLINE +ulong pack_exp3(ulong e0, ulong e1, ulong e2) +{ + return (e0 << (2 * (FLINT_BITS / 3))) + (e1 << (1 * (FLINT_BITS / 3))) + (e2 << (0 * (FLINT_BITS / 3))); +} +MPOLY_INLINE +ulong extract_exp(ulong e, int idx, int nvars) +{ + return (e >> (idx * (FLINT_BITS / nvars))) & ((-UWORD(1)) >> (FLINT_BITS - FLINT_BITS / nvars)); +} ulong _mpoly_bidegree(const ulong * Aexps, flint_bitcnt_t Abits, const mpoly_ctx_t mctx); @@ -907,55 +943,155 @@ void mpoly_gen_fields_fmpz(fmpz * exp, slong var, const mpoly_ctx_t mctx); flint_bitcnt_t mpoly_gen_bits_required(slong var, const mpoly_ctx_t mctx); /* return the index in the fields where the generator of index v is stored */ -MPOLY_INLINE slong mpoly_gen_index(slong v, const mpoly_ctx_t mctx) { return mctx->rev ? v : mctx->nvars - 1 - v; } +MPOLY_INLINE +slong mpoly_gen_index(slong v, const mpoly_ctx_t mctx) +{ + return mctx->rev ? v : mctx->nvars - 1 - v; +} -void mpoly_gen_offset_shift_sp(slong * offset, slong * shift, slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx); +void mpoly_gen_offset_shift_sp( + slong * offset, + slong * shift, + slong var, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); -void mpoly_gen_monomial_offset_shift_sp(ulong * mexp, slong * offset, slong * shift, slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx); +void mpoly_gen_monomial_offset_shift_sp( + ulong * mexp, + slong * offset, + slong * shift, + slong var, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); -void mpoly_gen_monomial_sp(ulong * oneexp, slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx); +void mpoly_gen_monomial_sp( + ulong * oneexp, + slong var, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); slong mpoly_gen_offset_mp(slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -slong mpoly_gen_monomial_offset_mp(ulong * mexp, slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx); +slong mpoly_gen_monomial_offset_mp( + ulong * mexp, + slong var, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); void fmpz_mat_mul_vec(fmpz * v, const fmpz_mat_t M, fmpz * u); -void mpoly_compose_mat_gen(fmpz_mat_t M, const slong * c, const mpoly_ctx_t mctxB, const mpoly_ctx_t mctxAC); +void mpoly_compose_mat_gen( + fmpz_mat_t M, + const slong * c, + const mpoly_ctx_t mctxB, + const mpoly_ctx_t mctxAC); -void mpoly_compose_mat_fill_column(fmpz_mat_t M, const ulong * Cexp, flint_bitcnt_t Cbits, slong Bvar, const mpoly_ctx_t mctxB, const mpoly_ctx_t mctxAC); +void mpoly_compose_mat_fill_column( + fmpz_mat_t M, + const ulong * Cexp, + flint_bitcnt_t Cbits, + slong Bvar, + const mpoly_ctx_t mctxB, + const mpoly_ctx_t mctxAC); /* Monomial arrays ***********************************************************/ -void mpoly_get_cmpmask(ulong * cmpmask, slong N, flint_bitcnt_t bits, const mpoly_ctx_t mctx); - -void mpoly_get_ovfmask(ulong * ovfmask, slong N, flint_bitcnt_t bits, const mpoly_ctx_t mctx); - -int mpoly_monomials_cmp(const ulong * Aexps, flint_bitcnt_t Abits, const ulong * Bexps, flint_bitcnt_t Bbits, slong length, const mpoly_ctx_t mctx); +void mpoly_get_cmpmask( + ulong * cmpmask, + slong N, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); + +void mpoly_get_ovfmask( + ulong * ovfmask, + slong N, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); + +int mpoly_monomials_cmp( + const ulong * Aexps, + flint_bitcnt_t Abits, + const ulong * Bexps, + flint_bitcnt_t Bbits, + slong length, + const mpoly_ctx_t mctx); flint_bitcnt_t mpoly_exp_bits_required_ui(const ulong * user_exp, const mpoly_ctx_t mctx); flint_bitcnt_t mpoly_exp_bits_required_ffmpz(const fmpz * user_exp, const mpoly_ctx_t mctx); flint_bitcnt_t mpoly_exp_bits_required_pfmpz(fmpz * const * user_exp, const mpoly_ctx_t mctx); -MPOLY_INLINE flint_bitcnt_t mpoly_gen_pow_exp_bits_required(slong v, ulong e, const mpoly_ctx_t mctx) { return 1 + FLINT_BIT_COUNT(e); /* only lex and deg supported */ } - -int mpoly_is_poly(const ulong * Aexps, slong Alen, flint_bitcnt_t Abits, slong var, const mpoly_ctx_t mctx); - -void mpoly_pack_vec_ui(ulong * exp1, const ulong * exp2, flint_bitcnt_t bits, slong nfields, slong len); -void mpoly_pack_vec_fmpz(ulong * exp1, const fmpz * exp2, flint_bitcnt_t bits, slong nfields, slong len); - -void mpoly_unpack_vec_ui(ulong * exp1, const ulong * exp2, flint_bitcnt_t bits, slong nfields, slong len); -void mpoly_unpack_vec_fmpz(fmpz * exp1, const ulong * exp2, flint_bitcnt_t bits, slong nfields, slong len); - -void mpoly_get_monomial_ui_unpacked_ffmpz(ulong * user_exps, const fmpz * poly_exps, const mpoly_ctx_t mctx); -void mpoly_get_monomial_ffmpz_unpacked_ffmpz(fmpz * user_exps, const fmpz * poly_exps, const mpoly_ctx_t mctx); -void mpoly_get_monomial_pfmpz_unpacked_ffmpz(fmpz ** user_exps, const fmpz * poly_exps, const mpoly_ctx_t mctx); - -void mpoly_get_monomial_ui_unpacked_ui(ulong * user_exps, const ulong * poly_exps, const mpoly_ctx_t mctx); - -void mpoly_get_monomial_si_mp(slong * user_exps, const ulong * poly_exps, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -void mpoly_get_monomial_ui_sp(ulong * user_exps, const ulong * poly_exps, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -void mpoly_get_monomial_ui_mp(ulong * user_exps, const ulong * poly_exps, flint_bitcnt_t bits, const mpoly_ctx_t mctx); +MPOLY_INLINE +flint_bitcnt_t mpoly_gen_pow_exp_bits_required(slong v, ulong e, const mpoly_ctx_t mctx) +{ + return 1 + FLINT_BIT_COUNT(e); /* only lex and deg supported */ +} + +int mpoly_is_poly( + const ulong * Aexps, + slong Alen, + flint_bitcnt_t Abits, + slong var, + const mpoly_ctx_t mctx); + +void mpoly_pack_vec_ui( + ulong * exp1, + const ulong * exp2, + flint_bitcnt_t bits, + slong nfields, + slong len); +void mpoly_pack_vec_fmpz( + ulong * exp1, + const fmpz * exp2, + flint_bitcnt_t bits, + slong nfields, + slong len); + +void mpoly_unpack_vec_ui( + ulong * exp1, + const ulong * exp2, + flint_bitcnt_t bits, + slong nfields, + slong len); +void mpoly_unpack_vec_fmpz( + fmpz * exp1, + const ulong * exp2, + flint_bitcnt_t bits, + slong nfields, + slong len); + +void mpoly_get_monomial_ui_unpacked_ffmpz( + ulong * user_exps, + const fmpz * poly_exps, + const mpoly_ctx_t mctx); +void mpoly_get_monomial_ffmpz_unpacked_ffmpz( + fmpz * user_exps, + const fmpz * poly_exps, + const mpoly_ctx_t mctx); +void mpoly_get_monomial_pfmpz_unpacked_ffmpz( + fmpz ** user_exps, + const fmpz * poly_exps, + const mpoly_ctx_t mctx); + +void mpoly_get_monomial_ui_unpacked_ui( + ulong * user_exps, + const ulong * poly_exps, + const mpoly_ctx_t mctx); + +void mpoly_get_monomial_si_mp( + slong * user_exps, + const ulong * poly_exps, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +void mpoly_get_monomial_ui_sp( + ulong * user_exps, + const ulong * poly_exps, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +void mpoly_get_monomial_ui_mp( + ulong * user_exps, + const ulong * poly_exps, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); MPOLY_INLINE void mpoly_get_monomial_ui(ulong * user_exps, const ulong * poly_exps, flint_bitcnt_t bits, const mpoly_ctx_t mctx) @@ -976,9 +1112,21 @@ void mpoly_get_monomial_si(slong * user_exps, const ulong * poly_exps, flint_bit mpoly_get_monomial_si_mp(user_exps, poly_exps, bits, mctx); } -slong mpoly_get_monomial_var_exp_si_mp(const ulong * poly_exps, slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -ulong mpoly_get_monomial_var_exp_ui_sp(const ulong * poly_exps, slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -ulong mpoly_get_monomial_var_exp_ui_mp(const ulong * poly_exps, slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx); +slong mpoly_get_monomial_var_exp_si_mp( + const ulong * poly_exps, + slong var, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +ulong mpoly_get_monomial_var_exp_ui_sp( + const ulong * poly_exps, + slong var, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +ulong mpoly_get_monomial_var_exp_ui_mp( + const ulong * poly_exps, + slong var, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); MPOLY_INLINE ulong mpoly_get_monomial_var_exp_ui(const ulong * poly_exps, slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx) @@ -998,86 +1146,365 @@ slong mpoly_get_monomial_var_exp_si(const ulong * poly_exps, slong var, flint_bi return mpoly_get_monomial_var_exp_si_mp(poly_exps, var, bits, mctx); } -void mpoly_get_monomial_ffmpz(fmpz * exps, const ulong * poly_exps, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -void mpoly_get_monomial_pfmpz(fmpz ** exps, const ulong * poly_exps, flint_bitcnt_t bits, const mpoly_ctx_t mctx); - -void mpoly_set_monomial_ui(ulong * exp1, const ulong * exp2, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -void mpoly_set_monomial_ffmpz(ulong * exp1, const fmpz * exp2, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -void mpoly_set_monomial_pfmpz(ulong * exp1, fmpz * const * exp2, flint_bitcnt_t bits, const mpoly_ctx_t mctx); - -int mpoly_repack_monomials(ulong * exps1, flint_bitcnt_t bits1, const ulong * exps2, flint_bitcnt_t bits2, slong len, const mpoly_ctx_t mctx); - -void mpoly_pack_monomials_tight(ulong * exp1, const ulong * exp2, slong len, const slong * mults, slong num, slong bits); -void mpoly_unpack_monomials_tight(ulong * e1, ulong * e2, slong len, slong * mults, slong num, slong bits); - -int mpoly_monomial_exists(slong * index, const ulong * poly_exps, const ulong * exp, slong len, slong N, const ulong * cmpmask); +void mpoly_get_monomial_ffmpz( + fmpz * exps, + const ulong * poly_exps, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +void mpoly_get_monomial_pfmpz( + fmpz ** exps, + const ulong * poly_exps, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); + +void mpoly_set_monomial_ui( + ulong * exp1, + const ulong * exp2, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +void mpoly_set_monomial_ffmpz( + ulong * exp1, + const fmpz * exp2, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +void mpoly_set_monomial_pfmpz( + ulong * exp1, + fmpz * const * exp2, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); + +int mpoly_repack_monomials( + ulong * exps1, + flint_bitcnt_t bits1, + const ulong * exps2, + flint_bitcnt_t bits2, + slong len, + const mpoly_ctx_t mctx); + +void mpoly_pack_monomials_tight( + ulong * exp1, + const ulong * exp2, + slong len, + const slong * mults, + slong num, + slong bits); +void mpoly_unpack_monomials_tight( + ulong * e1, + ulong * e2, + slong len, + slong * mults, + slong num, + slong bits); + +int mpoly_monomial_exists( + slong * index, + const ulong * poly_exps, + const ulong * exp, + slong len, + slong N, + const ulong * cmpmask); slong mpoly_monomial_index1_nomask(ulong * Aexps, slong Alen, ulong e); -slong mpoly_monomial_index_ui(const ulong * Aexp, flint_bitcnt_t Abits, slong Alength, const ulong * exp, const mpoly_ctx_t mctx); -slong mpoly_monomial_index_pfmpz(const ulong * Aexp, flint_bitcnt_t Abits, slong Alength, fmpz * const * exp, const mpoly_ctx_t mctx); - -slong mpoly_monomial_index_monomial(const ulong * Aexp, flint_bitcnt_t Abits, slong Alength, const ulong * Mexp, flint_bitcnt_t Mbits, const mpoly_ctx_t mctx); - -void mpoly_min_fields_ui_sp(ulong * min_fields, const ulong * poly_exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -void mpoly_min_fields_fmpz(fmpz * min_fields, const ulong * poly_exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); - -void mpoly_max_fields_ui_sp(ulong * max_fields, const ulong * poly_exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -void mpoly_max_fields_fmpz(fmpz * max_fields, const ulong * poly_exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); - -int mpoly_degrees_fit_si(const ulong * poly_exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); - -void mpoly_degrees_si(slong * user_degs, const ulong * poly_exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -void mpoly_degrees_si_threaded(slong * user_degs, const ulong * poly_exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx, const thread_pool_handle * handles, slong num_handles); - -void mpoly_degrees_ffmpz(fmpz * user_degs, const ulong * poly_exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -void mpoly_degrees_pfmpz(fmpz ** user_degs, const ulong * poly_exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); - -slong mpoly_degree_si(const ulong * poly_exps, slong len, flint_bitcnt_t bits, slong var, const mpoly_ctx_t mctx); -void mpoly_degree_fmpz(fmpz_t deg, const ulong * poly_exps, slong len, flint_bitcnt_t bits, slong var, const mpoly_ctx_t mctx); - -int mpoly_total_degree_fits_si(const ulong * exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); - -slong mpoly_total_degree_si(const ulong * exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -void mpoly_total_degree_fmpz(fmpz_t totdeg, const ulong * exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -void mpoly_total_degree_fmpz_ref(fmpz_t totdeg, const ulong * exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); - -void mpoly_used_vars_or(int * used, const ulong * exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); - -int mpoly_monomial_cmp_general(ulong * Aexp, flint_bitcnt_t Abits, ulong * Bexp, flint_bitcnt_t Bbits, const mpoly_ctx_t mctx); - -void mpoly_search_monomials(slong ** e_ind, ulong * e, slong * e_score, slong * t1, slong * t2, slong *t3, slong lower, slong upper, const ulong * a, slong a_len, const ulong * b, slong b_len, slong N, const ulong * cmpmask); - -void mpoly_main_variable_split_LEX(slong * ind, ulong * pexp, const ulong * Aexp, slong l1, slong Alen, const ulong * mults, slong num, slong Abits); -void mpoly_main_variable_split_DEG(slong * ind, ulong * pexp, const ulong * Aexp, slong l1, slong Alen, ulong deg, slong num, slong Abits); - -int mpoly_term_exp_fits_si(ulong * exps, flint_bitcnt_t bits, slong n, const mpoly_ctx_t mctx); -int mpoly_term_exp_fits_ui(ulong * exps, flint_bitcnt_t bits, slong n, const mpoly_ctx_t mctx); +slong mpoly_monomial_index_ui( + const ulong * Aexp, + flint_bitcnt_t Abits, + slong Alength, + const ulong * exp, + const mpoly_ctx_t mctx); +slong mpoly_monomial_index_pfmpz( + const ulong * Aexp, + flint_bitcnt_t Abits, + slong Alength, + fmpz * const * exp, + const mpoly_ctx_t mctx); + +slong mpoly_monomial_index_monomial( + const ulong * Aexp, + flint_bitcnt_t Abits, + slong Alength, + const ulong * Mexp, + flint_bitcnt_t Mbits, + const mpoly_ctx_t mctx); + +void mpoly_min_fields_ui_sp( + ulong * min_fields, + const ulong * poly_exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +void mpoly_min_fields_fmpz( + fmpz * min_fields, + const ulong * poly_exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); + +void mpoly_max_fields_ui_sp( + ulong * max_fields, + const ulong * poly_exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +void mpoly_max_fields_fmpz( + fmpz * max_fields, + const ulong * poly_exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); + +int mpoly_degrees_fit_si( + const ulong * poly_exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); + +void mpoly_degrees_si( + slong * user_degs, + const ulong * poly_exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +void mpoly_degrees_si_threaded( + slong * user_degs, + const ulong * poly_exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx, + const thread_pool_handle * handles, + slong num_handles); + +void mpoly_degrees_ffmpz( + fmpz * user_degs, + const ulong * poly_exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +void mpoly_degrees_pfmpz( + fmpz ** user_degs, + const ulong * poly_exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); + +slong mpoly_degree_si( + const ulong * poly_exps, + slong len, + flint_bitcnt_t bits, + slong var, + const mpoly_ctx_t mctx); +void mpoly_degree_fmpz( + fmpz_t deg, + const ulong * poly_exps, + slong len, + flint_bitcnt_t bits, + slong var, + const mpoly_ctx_t mctx); + +int mpoly_total_degree_fits_si( + const ulong * exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); + +slong mpoly_total_degree_si( + const ulong * exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +void mpoly_total_degree_fmpz( + fmpz_t totdeg, + const ulong * exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +void mpoly_total_degree_fmpz_ref( + fmpz_t totdeg, + const ulong * exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); + +void mpoly_used_vars_or( + int * used, + const ulong * exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); + +int mpoly_monomial_cmp_general( + ulong * Aexp, + flint_bitcnt_t Abits, + ulong * Bexp, + flint_bitcnt_t Bbits, + const mpoly_ctx_t mctx); + +void mpoly_search_monomials( + slong ** e_ind, + ulong * e, + slong * e_score, + slong * t1, + slong * t2, + slong *t3, + slong lower, + slong upper, + const ulong * a, + slong a_len, + const ulong * b, + slong b_len, + slong N, + const ulong * cmpmask); + +void mpoly_main_variable_split_LEX( + slong * ind, + ulong * pexp, + const ulong * Aexp, + slong l1, + slong Alen, + const ulong * mults, + slong num, + slong Abits); +void mpoly_main_variable_split_DEG( + slong * ind, + ulong * pexp, + const ulong * Aexp, + slong l1, + slong Alen, + ulong deg, + slong num, + slong Abits); + +int mpoly_term_exp_fits_si( + ulong * exps, + flint_bitcnt_t bits, + slong n, + const mpoly_ctx_t mctx); +int mpoly_term_exp_fits_ui( + ulong * exps, + flint_bitcnt_t bits, + slong n, + const mpoly_ctx_t mctx); int mpoly_is_gen(ulong * exps, slong var, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -int mpoly_monomials_valid_test(ulong * exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -int mpoly_monomials_overflow_test(ulong * exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); -int mpoly_monomials_inorder_test(ulong * exps, slong len, flint_bitcnt_t bits, const mpoly_ctx_t mctx); +int mpoly_monomials_valid_test( + ulong * exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +int mpoly_monomials_overflow_test( + ulong * exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); +int mpoly_monomials_inorder_test( + ulong * exps, + slong len, + flint_bitcnt_t bits, + const mpoly_ctx_t mctx); void mpoly_reverse(ulong * Aexp, const ulong * Bexp, slong len, slong N); -void mpoly_monomials_deflation(fmpz * shift, fmpz * stride, const ulong * Aexps, flint_bitcnt_t Abits, slong Alength, const mpoly_ctx_t mctx); -void mpoly_monomials_deflate(ulong * Aexps, flint_bitcnt_t Abits, const ulong * Bexps, flint_bitcnt_t Bbits, slong Blength, const fmpz * shift, const fmpz * stride, const mpoly_ctx_t mctx); -void mpoly_monomials_inflate(ulong * Aexps, flint_bitcnt_t Abits, const ulong * Bexps, flint_bitcnt_t Bbits, slong Blength, const fmpz * shift, const fmpz * stride, const mpoly_ctx_t mctx); - -void _mpoly_gen_shift_right(ulong * Aexp, flint_bitcnt_t Abits, slong Alength, slong var, ulong amount, const mpoly_ctx_t mctx); -void _mpoly_gen_shift_right_fmpz(ulong * Aexp, flint_bitcnt_t Abits, slong Alength, slong var, const fmpz_t amount, const mpoly_ctx_t mctx); -void _mpoly_gen_shift_left(ulong * Aexp, flint_bitcnt_t Abits, slong Alength, slong var, ulong amount, const mpoly_ctx_t mctx); - -void mpoly_monomials_shift_right_ui(ulong * Aexps, flint_bitcnt_t Abits, slong Alength, const ulong * user_exps, const mpoly_ctx_t mctx); -void mpoly_monomials_shift_right_ffmpz(ulong * Aexps, flint_bitcnt_t Abits, slong Alength, const fmpz * user_exps, const mpoly_ctx_t mctx); - -void mpoly1_fill_marks(ulong ** Dcoeffs, slong * Dlen, slong * Dalloc, const ulong * Aexps, slong Alen, flint_bitcnt_t Abits, const mpoly_ctx_t mctx); -void mpoly2_fill_marks(ulong ** Dcoeffs, slong * Dlen, slong * Dalloc, const ulong * Aexps, slong Alen, flint_bitcnt_t Abits, const mpoly_ctx_t mctx); - -void mpoly_to_mpolyl_perm_deflate(ulong * Aexps, flint_bitcnt_t Abits, const mpoly_ctx_t Actx, ulong * Bexps, flint_bitcnt_t Bbits, const mpoly_ctx_t Bctx, slong length, const slong * perm, const ulong * shift, const ulong * stride); -void mpoly_from_mpolyl_perm_inflate(ulong * Bexps, flint_bitcnt_t Bbits, const mpoly_ctx_t Bctx, ulong * Aexps, flint_bitcnt_t Abits, const mpoly_ctx_t Actx, slong length, const slong * perm, const ulong * shift, const ulong * stride); +void mpoly_monomials_deflation( + fmpz * shift, + fmpz * stride, + const ulong * Aexps, + flint_bitcnt_t Abits, + slong Alength, + const mpoly_ctx_t mctx); +void mpoly_monomials_deflate( + ulong * Aexps, + flint_bitcnt_t Abits, + const ulong * Bexps, + flint_bitcnt_t Bbits, + slong Blength, + const fmpz * shift, + const fmpz * stride, + const mpoly_ctx_t mctx); +void mpoly_monomials_inflate( + ulong * Aexps, + flint_bitcnt_t Abits, + const ulong * Bexps, + flint_bitcnt_t Bbits, + slong Blength, + const fmpz * shift, + const fmpz * stride, + const mpoly_ctx_t mctx); + +void _mpoly_gen_shift_right( + ulong * Aexp, + flint_bitcnt_t Abits, + slong Alength, + slong var, + ulong amount, + const mpoly_ctx_t mctx); +void _mpoly_gen_shift_right_fmpz( + ulong * Aexp, + flint_bitcnt_t Abits, + slong Alength, + slong var, + const fmpz_t amount, + const mpoly_ctx_t mctx); +void _mpoly_gen_shift_left( + ulong * Aexp, + flint_bitcnt_t Abits, + slong Alength, + slong var, + ulong amount, + const mpoly_ctx_t mctx); + +void mpoly_monomials_shift_right_ui( + ulong * Aexps, + flint_bitcnt_t Abits, + slong Alength, + const ulong * user_exps, + const mpoly_ctx_t mctx); +void mpoly_monomials_shift_right_ffmpz( + ulong * Aexps, + flint_bitcnt_t Abits, + slong Alength, + const fmpz * user_exps, + const mpoly_ctx_t mctx); + +void mpoly1_fill_marks( + ulong ** Dcoeffs, + slong * Dlen, + slong * Dalloc, + const ulong * Aexps, + slong Alen, + flint_bitcnt_t Abits, + const mpoly_ctx_t mctx); +void mpoly2_fill_marks( + ulong ** Dcoeffs, + slong * Dlen, + slong * Dalloc, + const ulong * Aexps, + slong Alen, + flint_bitcnt_t Abits, + const mpoly_ctx_t mctx); + +void mpoly_to_mpolyl_perm_deflate( + ulong * Aexps, + flint_bitcnt_t Abits, + const mpoly_ctx_t Actx, + ulong * Bexps, + flint_bitcnt_t Bbits, + const mpoly_ctx_t Bctx, + slong length, + const slong * perm, + const ulong * shift, + const ulong * stride); +void mpoly_from_mpolyl_perm_inflate( + ulong * Bexps, + flint_bitcnt_t Bbits, + const mpoly_ctx_t Bctx, + ulong * Aexps, + flint_bitcnt_t Abits, + const mpoly_ctx_t Actx, + slong length, + const slong * perm, + const ulong * shift, + const ulong * stride); /* gcd ***********************************************************************/ @@ -1133,20 +1560,75 @@ typedef mpoly_gcd_info_struct mpoly_gcd_info_t[1]; void mpoly_gcd_info_init(mpoly_gcd_info_t I, slong nvars); void mpoly_gcd_info_clear(mpoly_gcd_info_t I); -void mpoly_gcd_info_limits(ulong * Amax_exp, ulong * Amin_exp, slong * Amax_exp_count, slong * Amin_exp_count, const ulong * Aexps, flint_bitcnt_t Abits, slong Alength, const mpoly_ctx_t mctx); -void mpoly_gcd_info_stride(ulong * strides, const ulong * Aexps, flint_bitcnt_t Abits, slong Alength, const ulong * Amax_exp, const ulong * Amin_exp, const ulong * Bexps, flint_bitcnt_t Bbits, slong Blength, const ulong * Bmax_exp, const ulong * Bmin_exp, const mpoly_ctx_t mctx); - -void mpoly_gcd_info_set_perm(mpoly_gcd_info_t I, slong Alength, slong Blength, const mpoly_ctx_t mctx); - -slong mpoly_gcd_info_get_brown_upper_limit(const mpoly_gcd_info_t I, slong var, slong bound); - -void mpoly_gcd_info_measure_hensel(mpoly_gcd_info_t I, slong Alength, slong Blength, const mpoly_ctx_t mctx); -void mpoly_gcd_info_measure_brown(mpoly_gcd_info_t I, slong Alength, slong Blength, const mpoly_ctx_t mctx); -void mpoly_gcd_info_measure_bma(mpoly_gcd_info_t I, slong Alength, slong Blength, const mpoly_ctx_t mctx); -void mpoly_gcd_info_measure_zippel(mpoly_gcd_info_t I, slong Alength, slong Blength, const mpoly_ctx_t mctx); -void mpoly_gcd_info_measure_zippel2(mpoly_gcd_info_t I, slong Alength, slong Blength, const mpoly_ctx_t mctx); - -int mpoly_monomial_cofactors(fmpz * Abarexps, fmpz * Bbarexps, const ulong * Aexps, flint_bitcnt_t Abits, const ulong * Bexps, flint_bitcnt_t Bbits, slong length, const mpoly_ctx_t mctx); +void mpoly_gcd_info_limits( + ulong * Amax_exp, + ulong * Amin_exp, + slong * Amax_exp_count, + slong * Amin_exp_count, + const ulong * Aexps, + flint_bitcnt_t Abits, + slong Alength, + const mpoly_ctx_t mctx); +void mpoly_gcd_info_stride( + ulong * strides, + const ulong * Aexps, + flint_bitcnt_t Abits, + slong Alength, + const ulong * Amax_exp, + const ulong * Amin_exp, + const ulong * Bexps, + flint_bitcnt_t Bbits, + slong Blength, + const ulong * Bmax_exp, + const ulong * Bmin_exp, + const mpoly_ctx_t mctx); + +void mpoly_gcd_info_set_perm( + mpoly_gcd_info_t I, + slong Alength, + slong Blength, + const mpoly_ctx_t mctx); + +slong mpoly_gcd_info_get_brown_upper_limit( + const mpoly_gcd_info_t I, + slong var, + slong bound); + +void mpoly_gcd_info_measure_hensel( + mpoly_gcd_info_t I, + slong Alength, + slong Blength, + const mpoly_ctx_t mctx); +void mpoly_gcd_info_measure_brown( + mpoly_gcd_info_t I, + slong Alength, + slong Blength, + const mpoly_ctx_t mctx); +void mpoly_gcd_info_measure_bma( + mpoly_gcd_info_t I, + slong Alength, + slong Blength, + const mpoly_ctx_t mctx); +void mpoly_gcd_info_measure_zippel( + mpoly_gcd_info_t I, + slong Alength, + slong Blength, + const mpoly_ctx_t mctx); +void mpoly_gcd_info_measure_zippel2( + mpoly_gcd_info_t I, + slong Alength, + slong Blength, + const mpoly_ctx_t mctx); + +int mpoly_monomial_cofactors( + fmpz * Abarexps, + fmpz * Bbarexps, + const ulong * Aexps, + flint_bitcnt_t Abits, + const ulong * Bexps, + flint_bitcnt_t Bbits, + slong length, + const mpoly_ctx_t mctx); /* factoring ****************************************************************/ @@ -1155,14 +1637,40 @@ int mpoly_monomial_cofactors(fmpz * Abarexps, fmpz * Bbarexps, const ulong * Aex #define MPOLY_FACTOR_USE_ZIP 4 #define MPOLY_FACTOR_USE_ALL 7 -int mpoly_is_proved_not_square(const ulong * Aexps, slong Alen, flint_bitcnt_t Abits, slong N, ulong * t); - -void mpoly_remove_var_powers(fmpz * var_powers, ulong * Aexps, flint_bitcnt_t Abits, slong Alen, const mpoly_ctx_t mctx); - -slong _mpoly_compress_exps(slong * V, slong * D, slong * deg, slong * S, slong n, slong l); - -int _mpoly_test_irreducible(slong * Aexps, slong stride, slong Alen, slong nvars, flint_rand_t state, slong tries_left); -int mpoly_test_irreducible(ulong * Aexps, flint_bitcnt_t Abits, slong Alen, const mpoly_ctx_t ctx); +int mpoly_is_proved_not_square( + const ulong * Aexps, + slong Alen, + flint_bitcnt_t Abits, + slong N, + ulong * t); + +void mpoly_remove_var_powers( + fmpz * var_powers, + ulong * Aexps, + flint_bitcnt_t Abits, + slong Alen, + const mpoly_ctx_t mctx); + +slong _mpoly_compress_exps( + slong * V, + slong * D, + slong * deg, + slong * S, + slong n, + slong l); + +int _mpoly_test_irreducible( + slong * Aexps, + slong stride, + slong Alen, + slong nvars, + flint_rand_t state, + slong tries_left); +int mpoly_test_irreducible( + ulong * Aexps, + flint_bitcnt_t Abits, + slong Alen, + const mpoly_ctx_t ctx); typedef struct { @@ -1185,7 +1693,12 @@ typedef mpoly_compression_struct mpoly_compression_t[1]; void mpoly_compression_init(mpoly_compression_t M); void mpoly_compression_clear(mpoly_compression_t M); -void mpoly_compression_set(mpoly_compression_t M, const ulong * Aexps, flint_bitcnt_t Abits, slong Alen, const mpoly_ctx_t mctx); +void mpoly_compression_set( + mpoly_compression_t M, + const ulong * Aexps, + flint_bitcnt_t Abits, + slong Alen, + const mpoly_ctx_t mctx); void mpoly_bivar_cld_bounds(slong * l, slong n); @@ -1212,10 +1725,27 @@ void _slong_array_fit_length(slong ** array, slong * alloc, slong len) } while (0) void * _mpoly_heap_pop1(mpoly_heap1_s * heap, slong * heap_len, ulong maskhi); -void * _mpoly_heap_pop(mpoly_heap_s * heap, slong * heap_len, slong N, const ulong * cmpmask); - -void _mpoly_heap_insert1(mpoly_heap1_s * heap, ulong exp, void * x, slong * next_loc, slong * heap_len, ulong maskhi); -int _mpoly_heap_insert(mpoly_heap_s * heap, ulong * exp, void * x, slong * next_loc, slong * heap_len, slong N, const ulong * cmpmask); +void * _mpoly_heap_pop( + mpoly_heap_s * heap, + slong * heap_len, + slong N, + const ulong * cmpmask); + +void _mpoly_heap_insert1( + mpoly_heap1_s * heap, + ulong exp, + void * x, + slong * next_loc, + slong * heap_len, + ulong maskhi); +int _mpoly_heap_insert( + mpoly_heap_s * heap, + ulong * exp, + void * x, + slong * next_loc, + slong * heap_len, + slong N, + const ulong * cmpmask); /* generic parsing ***********************************************************/ @@ -1263,9 +1793,17 @@ void mpoly_univar_swap(mpoly_univar_t A, mpoly_univar_t B); void mpoly_univar_fit_length(mpoly_univar_t A, slong len, mpoly_void_ring_t R); -int mpoly_univar_pseudo_gcd_ducos(mpoly_univar_t G, mpoly_univar_t B, mpoly_univar_t A, mpoly_void_ring_t R); - -int mpoly_univar_resultant(void * r, mpoly_univar_t fx, mpoly_univar_t gx, mpoly_void_ring_t R); +int mpoly_univar_pseudo_gcd_ducos( + mpoly_univar_t G, + mpoly_univar_t B, + mpoly_univar_t A, + mpoly_void_ring_t R); + +int mpoly_univar_resultant( + void * r, + mpoly_univar_t fx, + mpoly_univar_t gx, + mpoly_void_ring_t R); int mpoly_univar_discriminant(void * d, mpoly_univar_t fx, mpoly_void_ring_t R); diff --git a/src/n_poly.h b/src/n_poly.h index 619cfbe3e7..660f2376d6 100644 --- a/src/n_poly.h +++ b/src/n_poly.h @@ -83,7 +83,11 @@ int n_poly_is_canonical(const n_poly_t A); void n_poly_print_pretty(const n_poly_t A, const char * x); -N_POLY_INLINE void n_poly_fit_length(n_poly_t A, slong len) { if (len > A->alloc) n_poly_realloc(A, len); } +N_POLY_INLINE +void n_poly_fit_length(n_poly_t A, slong len) +{ + if (len > A->alloc) n_poly_realloc(A, len); +} N_POLY_INLINE void nmod_poly_mock(nmod_poly_t a, const n_poly_t b, nmod_t mod) @@ -110,7 +114,11 @@ void n_poly_set(n_poly_t A, const n_poly_t B) A->length = B->length; } -N_POLY_INLINE void n_poly_swap(n_poly_t A, n_poly_t B) { FLINT_SWAP(n_poly_struct, *A, *B); } +N_POLY_INLINE +void n_poly_swap(n_poly_t A, n_poly_t B) +{ + FLINT_SWAP(n_poly_struct, *A, *B); +} N_POLY_INLINE void _n_poly_normalise(n_poly_t A) @@ -119,14 +127,30 @@ void _n_poly_normalise(n_poly_t A) A->length--; } -N_POLY_INLINE slong n_poly_degree(const n_poly_t A) { FLINT_ASSERT(A->length >= 0); return A->length - 1; } -N_POLY_INLINE mp_limb_t n_poly_lead(const n_poly_t A) { FLINT_ASSERT(A->length > 0); return A->coeffs[A->length - 1]; } +N_POLY_INLINE +slong n_poly_degree(const n_poly_t A) +{ + FLINT_ASSERT(A->length >= 0); return A->length - 1; +} +N_POLY_INLINE +mp_limb_t n_poly_lead(const n_poly_t A) +{ + FLINT_ASSERT(A->length > 0); return A->coeffs[A->length - 1]; +} N_POLY_INLINE int n_poly_is_zero(const n_poly_t poly) { return poly->length == 0; } -N_POLY_INLINE int n_poly_is_one(const n_poly_t A) { return A->length == 1 && A->coeffs[0] == 1; } +N_POLY_INLINE +int n_poly_is_one(const n_poly_t A) +{ + return A->length == 1 && A->coeffs[0] == 1; +} N_POLY_INLINE void n_poly_zero(n_poly_t res) { res->length = 0; } -N_POLY_INLINE void n_poly_one(n_poly_t A) { n_poly_fit_length(A, 1); A->length = 1; A->coeffs[0] = 1; } +N_POLY_INLINE +void n_poly_one(n_poly_t A) +{ + n_poly_fit_length(A, 1); A->length = 1; A->coeffs[0] = 1; +} N_POLY_INLINE void n_poly_set_ui(n_poly_t A, mp_limb_t c) @@ -164,9 +188,17 @@ void n_poly_mod_make_monic(n_poly_t A, const n_poly_t B, nmod_t mod) _nmod_poly_make_monic(A->coeffs, B->coeffs, B->length, mod); } -N_POLY_INLINE void n_poly_mod_taylor_shift(n_poly_t g, mp_limb_t c, nmod_t mod) { _nmod_poly_taylor_shift(g->coeffs, c, g->length, mod); } +N_POLY_INLINE +void n_poly_mod_taylor_shift(n_poly_t g, mp_limb_t c, nmod_t mod) +{ + _nmod_poly_taylor_shift(g->coeffs, c, g->length, mod); +} -N_POLY_INLINE ulong n_poly_get_coeff(const n_poly_t poly, slong j) { return (j >= poly->length) ? 0 : poly->coeffs[j]; } +N_POLY_INLINE +ulong n_poly_get_coeff(const n_poly_t poly, slong j) +{ + return (j >= poly->length) ? 0 : poly->coeffs[j]; +} N_POLY_INLINE void n_poly_set_coeff_nonzero(n_poly_t A, slong j, ulong c) @@ -244,13 +276,21 @@ void _n_poly_mod_scalar_mul_nmod(n_poly_t A, const n_poly_t B, mp_limb_t c, nmod A->length = B->length; } -N_POLY_INLINE void _n_poly_mod_scalar_mul_nmod_inplace(n_poly_t A, mp_limb_t c, nmod_t mod) { _nmod_vec_scalar_mul_nmod(A->coeffs, A->coeffs, A->length, c, mod); } +N_POLY_INLINE +void _n_poly_mod_scalar_mul_nmod_inplace(n_poly_t A, mp_limb_t c, nmod_t mod) +{ + _nmod_vec_scalar_mul_nmod(A->coeffs, A->coeffs, A->length, c, mod); +} void n_poly_mod_scalar_mul_ui(n_poly_t A, const n_poly_t B, mp_limb_t c, nmod_t ctx); mp_limb_t n_poly_mod_eval_step2(n_poly_t Acur, const n_poly_t Ainc, nmod_t mod); -N_POLY_INLINE mp_limb_t n_poly_mod_evaluate_nmod(const n_poly_t A, mp_limb_t c, nmod_t mod) { return _nmod_poly_evaluate_nmod(A->coeffs, A->length, c, mod); } +N_POLY_INLINE +mp_limb_t n_poly_mod_evaluate_nmod(const n_poly_t A, mp_limb_t c, nmod_t mod) +{ + return _nmod_poly_evaluate_nmod(A->coeffs, A->length, c, mod); +} void n_poly_mod_add_ui(n_poly_t res, const n_poly_t poly, ulong c, nmod_t ctx); @@ -292,13 +332,29 @@ void n_poly_mod_product_roots_nmod_vec(n_poly_t A, mp_srcptr r, slong n, nmod_t void n_poly_mod_shift_left_scalar_addmul(n_poly_t A, slong k, mp_limb_t c, nmod_t mod); -void n_poly_mod_addmul_linear(n_poly_t A, const n_poly_t B, const n_poly_t C, mp_limb_t d1, mp_limb_t d0, nmod_t mod); - -void n_poly_mod_scalar_addmul_nmod(n_poly_t A, const n_poly_t B, const n_poly_t C, mp_limb_t d0, nmod_t ctx); +void n_poly_mod_addmul_linear( + n_poly_t A, + const n_poly_t B, + const n_poly_t C, + mp_limb_t d1, + mp_limb_t d0, + nmod_t mod); + +void n_poly_mod_scalar_addmul_nmod( + n_poly_t A, + const n_poly_t B, + const n_poly_t C, + mp_limb_t d0, + nmod_t ctx); mp_limb_t _n_poly_eval_pow(n_poly_t P, n_poly_t alphapow, int nlimbs, nmod_t ctx); mp_limb_t n_poly_mod_eval_pow(n_poly_t P, n_poly_t alphapow, nmod_t ctx); -void n_poly_mod_eval2_pow(mp_limb_t * vp, mp_limb_t * vm, const n_poly_t P, n_poly_t alphapow, nmod_t ctx); +void n_poly_mod_eval2_pow( + mp_limb_t * vp, + mp_limb_t * vm, + const n_poly_t P, + n_poly_t alphapow, + nmod_t ctx); mp_limb_t n_poly_mod_div_root(n_poly_t Q, const n_poly_t A, mp_limb_t c, nmod_t ctx); @@ -387,30 +443,66 @@ void _n_poly_mod_divrem(n_poly_t Q, n_poly_t R, const n_poly_t A, const n_poly_t ulong n_poly_mod_remove(n_poly_t f, const n_poly_t p, nmod_t ctx); void n_poly_mod_mul(n_poly_t A, const n_poly_t B, const n_poly_t C, nmod_t mod); -void n_poly_mod_mullow(n_poly_t A, const n_poly_t B, const n_poly_t C, slong n, nmod_t mod); +void n_poly_mod_mullow( + n_poly_t A, + const n_poly_t B, + const n_poly_t C, + slong n, + nmod_t mod); void n_poly_mod_pow(n_poly_t res, const n_poly_t poly, ulong e, nmod_t ctx); void n_poly_mod_div(n_poly_t Q, const n_poly_t A, const n_poly_t B, nmod_t mod); void n_poly_mod_rem(n_poly_t R, const n_poly_t A, const n_poly_t B, nmod_t mod); -void n_poly_mod_divrem(n_poly_t Q, n_poly_t R, const n_poly_t A, const n_poly_t B, nmod_t mod); - -void n_poly_mod_mulmod(n_poly_t res, const n_poly_t poly1, const n_poly_t poly2, const n_poly_t f, nmod_t mod); +void n_poly_mod_divrem( + n_poly_t Q, + n_poly_t R, + const n_poly_t A, + const n_poly_t B, + nmod_t mod); + +void n_poly_mod_mulmod( + n_poly_t res, + const n_poly_t poly1, + const n_poly_t poly2, + const n_poly_t f, + nmod_t mod); int n_poly_mod_invmod(n_poly_t A, const n_poly_t B, const n_poly_t P, nmod_t mod); void n_poly_mod_gcd(n_poly_t G, const n_poly_t A, const n_poly_t B, nmod_t mod); -void n_poly_mod_xgcd(n_poly_t G, n_poly_t S, n_poly_t T, const n_poly_t A, const n_poly_t B, nmod_t mod); +void n_poly_mod_xgcd( + n_poly_t G, + n_poly_t S, + n_poly_t T, + const n_poly_t A, + const n_poly_t B, + nmod_t mod); void n_poly_mod_inv_series(n_poly_t Qinv, const n_poly_t Q, slong n, nmod_t mod); -void n_poly_mod_div_series(n_poly_t Q, const n_poly_t A, const n_poly_t B, slong order, nmod_t ctx); +void n_poly_mod_div_series( + n_poly_t Q, + const n_poly_t A, + const n_poly_t B, + slong order, + nmod_t ctx); void n_poly_reverse(n_poly_t output, const n_poly_t input, slong m); -void n_poly_mod_mulmod_preinv(n_poly_t A, const n_poly_t B, const n_poly_t C, const n_poly_t M, const n_poly_t Minv, nmod_t ctx); +void n_poly_mod_mulmod_preinv( + n_poly_t A, + const n_poly_t B, + const n_poly_t C, + const n_poly_t M, + const n_poly_t Minv, + nmod_t ctx); /*****************************************************************************/ -N_POLY_INLINE nmod_t fq_nmod_ctx_mod(const fq_nmod_ctx_t ctx) { return ctx->modulus->mod; } +N_POLY_INLINE +nmod_t fq_nmod_ctx_mod(const fq_nmod_ctx_t ctx) +{ + return ctx->modulus->mod; +} N_POLY_INLINE int _n_fq_is_zero(const mp_limb_t * a, slong d) @@ -443,7 +535,11 @@ int _n_fq_is_one(const mp_limb_t * a, slong d) return 1; } -N_POLY_INLINE int n_fq_is_one(const mp_limb_t * a, const fq_nmod_ctx_t ctx) { return _n_fq_is_one(a, fq_nmod_ctx_degree(ctx)); } +N_POLY_INLINE +int n_fq_is_one(const mp_limb_t * a, const fq_nmod_ctx_t ctx) +{ + return _n_fq_is_one(a, fq_nmod_ctx_degree(ctx)); +} N_POLY_INLINE int _n_fq_is_ui(const mp_limb_t * a, slong d) @@ -525,12 +621,24 @@ void n_fq_set_fq_nmod(mp_limb_t * a, const fq_nmod_t b, const fq_nmod_ctx_t ctx) void n_fq_get_n_poly(n_poly_t a, const mp_limb_t * b, const fq_nmod_ctx_t ctx); -void _n_fq_set_n_poly(mp_limb_t * a, const mp_limb_t * bcoeffs, slong blen, const fq_nmod_ctx_t ctx); +void _n_fq_set_n_poly( + mp_limb_t * a, + const mp_limb_t * bcoeffs, + slong blen, + const fq_nmod_ctx_t ctx); void n_fq_add_si(mp_limb_t * a, const mp_limb_t * b, slong c, const fq_nmod_ctx_t ctx); -void n_fq_add_fq_nmod(mp_limb_t * a, const mp_limb_t * b, const fq_nmod_t c, const fq_nmod_ctx_t ctx); +void n_fq_add_fq_nmod( + mp_limb_t * a, + const mp_limb_t * b, + const fq_nmod_t c, + const fq_nmod_ctx_t ctx); -void n_fq_sub_fq_nmod(mp_limb_t * a, const mp_limb_t * b, const fq_nmod_t c, const fq_nmod_ctx_t ctx); +void n_fq_sub_fq_nmod( + mp_limb_t * a, + const mp_limb_t * b, + const fq_nmod_t c, + const fq_nmod_ctx_t ctx); N_POLY_INLINE void _n_fq_add(mp_limb_t * a /* length d */, const mp_limb_t * b /* length d */, const mp_limb_t * c /* length d */, slong d, nmod_t mod) @@ -577,12 +685,26 @@ void _n_fq_mul_ui(mp_limb_t * a /* length d */, const mp_limb_t * b /* length d _nmod_vec_scalar_mul_nmod(a, b, d, c, mod); } -void _n_fq_madd2(mp_limb_t * a /* length 2d-1 */, const mp_limb_t * b /* length d */, const mp_limb_t * c /* length d */, const fq_nmod_ctx_t ctx, mp_limb_t * t /* length 2d */); +void _n_fq_madd2( + mp_limb_t * a /* length 2d-1 */, + const mp_limb_t * b /* length d */, + const mp_limb_t * c /* length d */, + const fq_nmod_ctx_t ctx, + mp_limb_t * t /* length 2d */); -void _n_fq_mul2(mp_limb_t * t /* length 2d-1 */, const mp_limb_t * b /* length d */, const mp_limb_t * c /* length d */, const fq_nmod_ctx_t ctx); +void _n_fq_mul2( + mp_limb_t * t /* length 2d-1 */, + const mp_limb_t * b /* length d */, + const mp_limb_t * c /* length d */, + const fq_nmod_ctx_t ctx); #define N_FQ_REDUCE_ITCH 2 -void _n_fq_reduce(mp_limb_t * a, mp_limb_t * b, slong blen, const fq_nmod_ctx_t ctx, mp_limb_t * t); +void _n_fq_reduce( + mp_limb_t * a, + mp_limb_t * b, + slong blen, + const fq_nmod_ctx_t ctx, + mp_limb_t * t); /* same itch as reduce */ N_POLY_INLINE @@ -623,29 +745,78 @@ void _n_fq_reduce2_lazy1(mp_limb_t * a /* length 6d, 2d used */, slong d, nmod_t void _n_fq_reduce2_lazy2(mp_limb_t * a /* length 6d, 4d used */, slong d, nmod_t ctx); void _n_fq_reduce2_lazy3(mp_limb_t * a /* length 6d */, slong d, nmod_t ctx); -void _n_fq_madd2_lazy1(mp_limb_t * a /* length 6d, 2d used */, const mp_limb_t * b /* length d */, const mp_limb_t * c /* length d */, slong d); -void _n_fq_madd2_lazy2(mp_limb_t * a /* length 6d, 4d used */, const mp_limb_t * b /* length d */, const mp_limb_t * c /* length d */, slong d); -void _n_fq_madd2_lazy3(mp_limb_t * a /* length 6d */, const mp_limb_t * b /* length d */, const mp_limb_t * c /* length d */, slong d); - -void _n_fq_mul2_lazy1(mp_limb_t * a /* length 6d, 2d used */, const mp_limb_t * b /* length d */, const mp_limb_t * c /* length d */, slong d); -void _n_fq_mul2_lazy2(mp_limb_t * a /* length 6d, 4d used */, const mp_limb_t * b /* length d */, const mp_limb_t * c /* length d */, slong d); -void _n_fq_mul2_lazy3(mp_limb_t * a /* length 6d */, const mp_limb_t * b /* length d */, const mp_limb_t * c /* length d */, slong d); +void _n_fq_madd2_lazy1( + mp_limb_t * a /* length 6d, + 2d used */, + const mp_limb_t * b /* length d */, + const mp_limb_t * c /* length d */, + slong d); +void _n_fq_madd2_lazy2( + mp_limb_t * a /* length 6d, + 4d used */, + const mp_limb_t * b /* length d */, + const mp_limb_t * c /* length d */, + slong d); +void _n_fq_madd2_lazy3( + mp_limb_t * a /* length 6d */, + const mp_limb_t * b /* length d */, + const mp_limb_t * c /* length d */, + slong d); + +void _n_fq_mul2_lazy1( + mp_limb_t * a /* length 6d, + 2d used */, + const mp_limb_t * b /* length d */, + const mp_limb_t * c /* length d */, + slong d); +void _n_fq_mul2_lazy2( + mp_limb_t * a /* length 6d, + 4d used */, + const mp_limb_t * b /* length d */, + const mp_limb_t * c /* length d */, + slong d); +void _n_fq_mul2_lazy3( + mp_limb_t * a /* length 6d */, + const mp_limb_t * b /* length d */, + const mp_limb_t * c /* length d */, + slong d); #define N_FQ_INV_ITCH 1 -void _n_fq_inv(mp_limb_t * a, const mp_limb_t * b, const fq_nmod_ctx_t ctx, mp_limb_t * t); +void _n_fq_inv( + mp_limb_t * a, + const mp_limb_t * b, + const fq_nmod_ctx_t ctx, + mp_limb_t * t); #define N_FQ_MUL_INV_ITCH FLINT_MAX(N_FQ_MUL_ITCH, N_FQ_INV_ITCH) void _n_fq_pow_ui(mp_limb_t * a, const mp_limb_t * b, ulong e, const fq_nmod_ctx_t ctx); void n_fq_pow_ui(mp_limb_t * a, const mp_limb_t * b, ulong e, const fq_nmod_ctx_t ctx); -void n_fq_pow_fmpz(mp_limb_t * a, const mp_limb_t * b, const fmpz_t e, const fq_nmod_ctx_t ctx); - -void n_fq_mul_fq_nmod(mp_limb_t * a, const mp_limb_t * b, const fq_nmod_t c, const fq_nmod_ctx_t ctx); -void n_fq_mul(mp_limb_t * a, const mp_limb_t * b, const mp_limb_t * c, const fq_nmod_ctx_t ctx); +void n_fq_pow_fmpz( + mp_limb_t * a, + const mp_limb_t * b, + const fmpz_t e, + const fq_nmod_ctx_t ctx); + +void n_fq_mul_fq_nmod( + mp_limb_t * a, + const mp_limb_t * b, + const fq_nmod_t c, + const fq_nmod_ctx_t ctx); +void n_fq_mul( + mp_limb_t * a, + const mp_limb_t * b, + const mp_limb_t * c, + const fq_nmod_ctx_t ctx); void n_fq_inv(mp_limb_t * a, const mp_limb_t * b, const fq_nmod_ctx_t ctx); -void n_fq_addmul(mp_limb_t * a, const mp_limb_t * b, const mp_limb_t * c, const mp_limb_t * d, const fq_nmod_ctx_t ctx); +void n_fq_addmul( + mp_limb_t * a, + const mp_limb_t * b, + const mp_limb_t * c, + const mp_limb_t * d, + const fq_nmod_ctx_t ctx); /*****************************************************************************/ @@ -670,7 +841,11 @@ void n_fq_addmul(mp_limb_t * a, const mp_limb_t * b, const mp_limb_t * c, const void n_fq_poly_init2(n_fq_poly_t A, slong alloc, const fq_nmod_ctx_t ctx); void _n_fq_poly_one(n_fq_poly_t A, slong d); -N_POLY_INLINE void n_fq_poly_one(n_fq_poly_t A, const fq_nmod_ctx_t ctx) { _n_fq_poly_one(A, fq_nmod_ctx_degree(ctx)); } +N_POLY_INLINE +void n_fq_poly_one(n_fq_poly_t A, const fq_nmod_ctx_t ctx) +{ + _n_fq_poly_one(A, fq_nmod_ctx_degree(ctx)); +} int n_fq_poly_is_one(n_fq_poly_t A, const fq_nmod_ctx_t ctx); @@ -683,74 +858,212 @@ void _n_fq_poly_normalise(n_fq_poly_t A, slong d) A->length--; } -void n_fq_poly_print_pretty(const n_fq_poly_t A, const char * x, const fq_nmod_ctx_t ctx); +void n_fq_poly_print_pretty( + const n_fq_poly_t A, + const char * x, + const fq_nmod_ctx_t ctx); int n_fq_poly_equal(const n_fq_poly_t A, const n_fq_poly_t B, const fq_nmod_ctx_t ctx); void n_fq_poly_set(n_fq_poly_t A, const n_fq_poly_t B, const fq_nmod_ctx_t ctx); -void n_fq_poly_randtest(n_fq_poly_t A, flint_rand_t state, slong len, const fq_nmod_ctx_t ctx); +void n_fq_poly_randtest( + n_fq_poly_t A, + flint_rand_t state, + slong len, + const fq_nmod_ctx_t ctx); void n_fq_poly_make_monic(n_fq_poly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx); -void n_fq_poly_get_coeff_fq_nmod(fq_nmod_t c, const n_poly_t A, slong e, const fq_nmod_ctx_t ctx); -void n_fq_poly_get_coeff_n_fq(mp_limb_t * c, const n_poly_t A, slong e, const fq_nmod_ctx_t ctx); - -void n_fq_poly_set_coeff_fq_nmod(n_poly_t A, slong j, const fq_nmod_t c, const fq_nmod_ctx_t ctx); -void n_fq_poly_set_coeff_n_fq(n_poly_t A, slong j, const mp_limb_t * c, const fq_nmod_ctx_t ctx); - -void n_fq_poly_scalar_mul_ui(n_poly_t A, const n_poly_t B, ulong c, const fq_nmod_ctx_t ctx); -void n_fq_poly_scalar_mul_n_fq(n_poly_t A, const n_poly_t B, const mp_limb_t * c, const fq_nmod_ctx_t ctx); - -void n_fq_poly_scalar_addmul_n_fq(n_fq_poly_t A, const n_fq_poly_t B, const n_fq_poly_t C, const mp_limb_t * d, const fq_nmod_ctx_t ctx); - -void n_fq_poly_shift_left_scalar_submul(n_poly_t A, slong k, const mp_limb_t * c, const fq_nmod_ctx_t ctx); - -void n_fq_poly_evaluate_fq_nmod(fq_nmod_t e, const n_poly_t A, const fq_nmod_t c, const fq_nmod_ctx_t ctx); -void n_fq_poly_evaluate_n_fq(mp_limb_t * e, const n_poly_t A, const mp_limb_t * c, const fq_nmod_ctx_t ctx); - -void n_fq_poly_get_fq_nmod_poly(fq_nmod_poly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx); +void n_fq_poly_get_coeff_fq_nmod( + fq_nmod_t c, + const n_poly_t A, + slong e, + const fq_nmod_ctx_t ctx); +void n_fq_poly_get_coeff_n_fq( + mp_limb_t * c, + const n_poly_t A, + slong e, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_set_coeff_fq_nmod( + n_poly_t A, + slong j, + const fq_nmod_t c, + const fq_nmod_ctx_t ctx); +void n_fq_poly_set_coeff_n_fq( + n_poly_t A, + slong j, + const mp_limb_t * c, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_scalar_mul_ui( + n_poly_t A, + const n_poly_t B, + ulong c, + const fq_nmod_ctx_t ctx); +void n_fq_poly_scalar_mul_n_fq( + n_poly_t A, + const n_poly_t B, + const mp_limb_t * c, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_scalar_addmul_n_fq( + n_fq_poly_t A, + const n_fq_poly_t B, + const n_fq_poly_t C, + const mp_limb_t * d, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_shift_left_scalar_submul( + n_poly_t A, + slong k, + const mp_limb_t * c, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_evaluate_fq_nmod( + fq_nmod_t e, + const n_poly_t A, + const fq_nmod_t c, + const fq_nmod_ctx_t ctx); +void n_fq_poly_evaluate_n_fq( + mp_limb_t * e, + const n_poly_t A, + const mp_limb_t * c, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_get_fq_nmod_poly( + fq_nmod_poly_t A, + const n_poly_t B, + const fq_nmod_ctx_t ctx); void n_fq_poly_set_n_fq(n_poly_t A, const mp_limb_t * c, const fq_nmod_ctx_t ctx); void n_fq_poly_set_fq_nmod(n_poly_t A, const fq_nmod_t c, const fq_nmod_ctx_t ctx); -void n_fq_poly_set_fq_nmod_poly(n_poly_t A, const fq_nmod_poly_t B, const fq_nmod_ctx_t ctx); - -void n_fq_poly_shift_right(n_poly_t A, const n_poly_t B, slong n, const fq_nmod_ctx_t ctx); -void n_fq_poly_shift_left(n_poly_t A, const n_poly_t B, slong n, const fq_nmod_ctx_t ctx); +void n_fq_poly_set_fq_nmod_poly( + n_poly_t A, + const fq_nmod_poly_t B, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_shift_right( + n_poly_t A, + const n_poly_t B, + slong n, + const fq_nmod_ctx_t ctx); +void n_fq_poly_shift_left( + n_poly_t A, + const n_poly_t B, + slong n, + const fq_nmod_ctx_t ctx); void n_fq_poly_truncate(n_poly_t A, slong len, const fq_nmod_ctx_t ctx); void n_fq_poly_add_si(n_poly_t A, const n_poly_t B, slong c, const fq_nmod_ctx_t ctx); -void n_fq_poly_add(n_poly_t A, const n_poly_t B, const n_poly_t C, const fq_nmod_ctx_t ctx); -void n_fq_poly_sub(n_poly_t A, const n_poly_t B, const n_poly_t C, const fq_nmod_ctx_t ctx); +void n_fq_poly_add( + n_poly_t A, + const n_poly_t B, + const n_poly_t C, + const fq_nmod_ctx_t ctx); +void n_fq_poly_sub( + n_poly_t A, + const n_poly_t B, + const n_poly_t C, + const fq_nmod_ctx_t ctx); void n_fq_poly_neg(n_poly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx); -void _n_fq_poly_mul_(mp_limb_t * A, const mp_limb_t * B, slong Blen, const mp_limb_t * C, slong Clen, const fq_nmod_ctx_t ctx, n_poly_stack_t St); -void n_fq_poly_mul_(n_poly_t A, const n_poly_t B, const n_poly_t C, const fq_nmod_ctx_t ctx, n_poly_stack_t St); -void n_fq_poly_mul(n_poly_t A, const n_poly_t B, const n_poly_t C, const fq_nmod_ctx_t ctx); - -void n_fq_poly_mullow(n_poly_t A, const n_poly_t B, const n_poly_t C, slong order, const fq_nmod_ctx_t ctx); +void _n_fq_poly_mul_( + mp_limb_t * A, + const mp_limb_t * B, + slong Blen, + const mp_limb_t * C, + slong Clen, + const fq_nmod_ctx_t ctx, + n_poly_stack_t St); +void n_fq_poly_mul_( + n_poly_t A, + const n_poly_t B, + const n_poly_t C, + const fq_nmod_ctx_t ctx, + n_poly_stack_t St); +void n_fq_poly_mul( + n_poly_t A, + const n_poly_t B, + const n_poly_t C, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_mullow( + n_poly_t A, + const n_poly_t B, + const n_poly_t C, + slong order, + const fq_nmod_ctx_t ctx); void n_fq_poly_pow(n_poly_t A, const n_poly_t B, ulong e, const fq_nmod_ctx_t ctx); ulong n_fq_poly_remove(n_poly_t f, const n_poly_t g, const fq_nmod_ctx_t ctx); -void n_fq_poly_divrem_divconquer_(n_poly_t Q, n_poly_t R, const n_poly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx, n_poly_stack_t St); -N_POLY_INLINE void n_fq_poly_divrem_(n_poly_t Q, n_poly_t R, const n_poly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx, n_poly_stack_t St) { n_fq_poly_divrem_divconquer_(Q, R, A, B, ctx, St); } -void n_fq_poly_divrem(n_poly_t Q, n_poly_t R, const n_poly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx); - -void n_fq_poly_rem(n_poly_t R, const n_poly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx); - -void n_fq_poly_gcd_(n_poly_t G, const n_poly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx, n_poly_stack_t St); -void n_fq_poly_gcd(n_poly_t G, const n_poly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx); - -void n_fq_poly_xgcd(n_poly_t G, n_poly_t S, n_poly_t T, const n_poly_t B, const n_poly_t C, const fq_nmod_ctx_t ctx); - -void n_fq_poly_mulmod(n_poly_t A, const n_poly_t B, const n_poly_t C, const n_poly_t M, const fq_nmod_ctx_t ctx); - -void n_fq_poly_inv_series(n_poly_t A, const n_poly_t B, slong order, const fq_nmod_ctx_t ctx); - -void n_fq_poly_eval_pow(mp_limb_t * ev, const n_fq_poly_t A, n_fq_poly_t alphapow, const fq_nmod_ctx_t ctx); +void n_fq_poly_divrem_divconquer_( + n_poly_t Q, + n_poly_t R, + const n_poly_t A, + const n_poly_t B, + const fq_nmod_ctx_t ctx, + n_poly_stack_t St); +N_POLY_INLINE +void n_fq_poly_divrem_(n_poly_t Q, n_poly_t R, const n_poly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx, n_poly_stack_t St) +{ + n_fq_poly_divrem_divconquer_(Q, R, A, B, ctx, St); +} +void n_fq_poly_divrem( + n_poly_t Q, + n_poly_t R, + const n_poly_t A, + const n_poly_t B, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_rem( + n_poly_t R, + const n_poly_t A, + const n_poly_t B, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_gcd_( + n_poly_t G, + const n_poly_t A, + const n_poly_t B, + const fq_nmod_ctx_t ctx, + n_poly_stack_t St); +void n_fq_poly_gcd( + n_poly_t G, + const n_poly_t A, + const n_poly_t B, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_xgcd( + n_poly_t G, + n_poly_t S, + n_poly_t T, + const n_poly_t B, + const n_poly_t C, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_mulmod( + n_poly_t A, + const n_poly_t B, + const n_poly_t C, + const n_poly_t M, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_inv_series( + n_poly_t A, + const n_poly_t B, + slong order, + const fq_nmod_ctx_t ctx); + +void n_fq_poly_eval_pow( + mp_limb_t * ev, + const n_fq_poly_t A, + n_fq_poly_t alphapow, + const fq_nmod_ctx_t ctx); /*****************************************************************************/ @@ -796,7 +1109,11 @@ void n_bpoly_one(n_bpoly_t A); N_POLY_INLINE int n_bpoly_is_zero(const n_bpoly_t A) { return A->length == 0; } void _n_bpoly_set(n_bpoly_t A, const n_bpoly_t B); -N_POLY_INLINE void n_bpoly_set(n_bpoly_t A, const n_bpoly_t B) { if (A != B) _n_bpoly_set(A, B); } +N_POLY_INLINE +void n_bpoly_set(n_bpoly_t A, const n_bpoly_t B) +{ + if (A != B) _n_bpoly_set(A, B); +} int n_bpoly_equal(const n_bpoly_t A, const n_bpoly_t B); @@ -841,7 +1158,11 @@ void n_bpoly_mod_content_last(n_poly_t g, const n_bpoly_t A, nmod_t ctx); void n_bpoly_mod_divexact_last(n_bpoly_t A, const n_poly_t b, nmod_t ctx); void n_bpoly_mod_taylor_shift_gen0(n_bpoly_t A, mp_limb_t c, nmod_t ctx); -void n_bpoly_mod_taylor_shift_gen1(n_bpoly_t A, const n_bpoly_t B, mp_limb_t c, nmod_t ctx); +void n_bpoly_mod_taylor_shift_gen1( + n_bpoly_t A, + const n_bpoly_t B, + mp_limb_t c, + nmod_t ctx); void n_bpoly_mod_add(n_bpoly_t A, const n_bpoly_t B, const n_bpoly_t C, nmod_t ctx); void n_bpoly_mod_sub(n_bpoly_t A, const n_bpoly_t B, const n_bpoly_t C, nmod_t ctx); @@ -853,43 +1174,135 @@ void n_bpoly_mod_mul(n_bpoly_t A, const n_bpoly_t B, const n_bpoly_t C, nmod_t c int n_bpoly_mod_divides(n_bpoly_t Q, const n_bpoly_t A, const n_bpoly_t B, nmod_t ctx); -void n_bpoly_mod_mul_series(n_bpoly_t A, const n_bpoly_t B, const n_bpoly_t C, slong order, nmod_t ctx); - -void n_bpoly_mod_divrem_series(n_bpoly_t Q, n_bpoly_t R, const n_bpoly_t A, const n_bpoly_t B, slong order, nmod_t ctx); - -void n_bpoly_mod_interp_reduce_2sm_poly(n_poly_t Ap, n_poly_t Am, const n_bpoly_t A, n_poly_t alphapow, nmod_t mod); - -void n_bpoly_mod_interp_lift_2sm_poly(slong * deg1, n_bpoly_t T, const n_poly_t A, const n_poly_t B, mp_limb_t alpha, nmod_t mod); - -int n_bpoly_mod_interp_crt_2sm_poly(slong * deg1, n_bpoly_t F, n_bpoly_t T, n_poly_t A, n_poly_t B, const n_poly_t modulus, n_poly_t alphapow, nmod_t mod); - -int n_bpoly_mod_gcd_brown_smprime(n_bpoly_t G, n_bpoly_t Abar, n_bpoly_t Bbar, n_bpoly_t A, n_bpoly_t B, nmod_t ctx, n_poly_bpoly_stack_t Sp); -int n_polyu1n_mod_gcd_brown_smprime(n_polyun_t G, n_polyun_t Abar, n_polyun_t Bbar,n_polyun_t A, n_polyun_t B, nmod_t ctx, n_poly_polyun_stack_t St); +void n_bpoly_mod_mul_series( + n_bpoly_t A, + const n_bpoly_t B, + const n_bpoly_t C, + slong order, + nmod_t ctx); + +void n_bpoly_mod_divrem_series( + n_bpoly_t Q, + n_bpoly_t R, + const n_bpoly_t A, + const n_bpoly_t B, + slong order, + nmod_t ctx); + +void n_bpoly_mod_interp_reduce_2sm_poly( + n_poly_t Ap, + n_poly_t Am, + const n_bpoly_t A, + n_poly_t alphapow, + nmod_t mod); + +void n_bpoly_mod_interp_lift_2sm_poly( + slong * deg1, + n_bpoly_t T, + const n_poly_t A, + const n_poly_t B, + mp_limb_t alpha, + nmod_t mod); + +int n_bpoly_mod_interp_crt_2sm_poly( + slong * deg1, + n_bpoly_t F, + n_bpoly_t T, + n_poly_t A, + n_poly_t B, + const n_poly_t modulus, + n_poly_t alphapow, + nmod_t mod); + +int n_bpoly_mod_gcd_brown_smprime( + n_bpoly_t G, + n_bpoly_t Abar, + n_bpoly_t Bbar, + n_bpoly_t A, + n_bpoly_t B, + nmod_t ctx, + n_poly_bpoly_stack_t Sp); +int n_polyu1n_mod_gcd_brown_smprime( + n_polyun_t G, + n_polyun_t Abar, + n_polyun_t Bbar, + n_polyun_t A, + n_polyun_t B, + nmod_t ctx, + n_poly_polyun_stack_t St); /*****************************************************************************/ int n_fq_bpoly_equal(const n_bpoly_t A, const n_bpoly_t B, const fq_nmod_ctx_t ctx); -void n_fq_bpoly_get_coeff_fq_nmod(fq_nmod_t c, const n_bpoly_t A, slong e0, slong e1, const fq_nmod_ctx_t ctx); -void n_fq_bpoly_get_coeff_n_fq(mp_limb_t * c, const n_bpoly_t A, slong e0, slong e1, const fq_nmod_ctx_t ctx); - -void n_fq_bpoly_set_coeff_n_fq(n_fq_bpoly_t A, slong e0, slong e1, const mp_limb_t * c, const fq_nmod_ctx_t ctx); - -void n_fq_bpoly_set_n_fq_poly_gen0(n_bpoly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx); -void n_fq_bpoly_set_n_fq_poly_gen1(n_bpoly_t A, const n_poly_t B, const fq_nmod_ctx_t ctx); -void n_fq_bpoly_set_fq_nmod_poly_gen0(n_bpoly_t A, const fq_nmod_poly_t B, const fq_nmod_ctx_t ctx); +void n_fq_bpoly_get_coeff_fq_nmod( + fq_nmod_t c, + const n_bpoly_t A, + slong e0, + slong e1, + const fq_nmod_ctx_t ctx); +void n_fq_bpoly_get_coeff_n_fq( + mp_limb_t * c, + const n_bpoly_t A, + slong e0, + slong e1, + const fq_nmod_ctx_t ctx); + +void n_fq_bpoly_set_coeff_n_fq( + n_fq_bpoly_t A, + slong e0, + slong e1, + const mp_limb_t * c, + const fq_nmod_ctx_t ctx); + +void n_fq_bpoly_set_n_fq_poly_gen0( + n_bpoly_t A, + const n_poly_t B, + const fq_nmod_ctx_t ctx); +void n_fq_bpoly_set_n_fq_poly_gen1( + n_bpoly_t A, + const n_poly_t B, + const fq_nmod_ctx_t ctx); +void n_fq_bpoly_set_fq_nmod_poly_gen0( + n_bpoly_t A, + const fq_nmod_poly_t B, + const fq_nmod_ctx_t ctx); void n_fq_bpoly_derivative_gen0(n_bpoly_t A, const n_bpoly_t B, const fq_nmod_ctx_t ctx); -void n_fq_bpoly_scalar_mul_n_fq(n_fq_bpoly_t A, const mp_limb_t * c, const fq_nmod_ctx_t ctx); - -void n_fq_bpoly_taylor_shift_gen0_fq_nmod(n_bpoly_t A, const fq_nmod_t alpha, const fq_nmod_ctx_t ctx); -void n_fq_bpoly_taylor_shift_gen1_fq_nmod(n_bpoly_t A, const n_bpoly_t B, const fq_nmod_t c_, const fq_nmod_ctx_t ctx); -void n_fq_bpoly_taylor_shift_gen0_n_fq(n_fq_bpoly_t A, const mp_limb_t * alpha, const fq_nmod_ctx_t ctx); - -int n_fq_bpoly_gcd_brown_smprime(n_fq_bpoly_t G, n_fq_bpoly_t Abar, n_fq_bpoly_t Bbar, n_fq_bpoly_t A, n_fq_bpoly_t B, const fq_nmod_ctx_t ctx, n_poly_bpoly_stack_t Sp); - -void n_fq_bpoly_print_pretty(const n_fq_bpoly_t A, const char * xvar, const char * yvar, const fq_nmod_ctx_t ctx); +void n_fq_bpoly_scalar_mul_n_fq( + n_fq_bpoly_t A, + const mp_limb_t * c, + const fq_nmod_ctx_t ctx); + +void n_fq_bpoly_taylor_shift_gen0_fq_nmod( + n_bpoly_t A, + const fq_nmod_t alpha, + const fq_nmod_ctx_t ctx); +void n_fq_bpoly_taylor_shift_gen1_fq_nmod( + n_bpoly_t A, + const n_bpoly_t B, + const fq_nmod_t c_, + const fq_nmod_ctx_t ctx); +void n_fq_bpoly_taylor_shift_gen0_n_fq( + n_fq_bpoly_t A, + const mp_limb_t * alpha, + const fq_nmod_ctx_t ctx); + +int n_fq_bpoly_gcd_brown_smprime( + n_fq_bpoly_t G, + n_fq_bpoly_t Abar, + n_fq_bpoly_t Bbar, + n_fq_bpoly_t A, + n_fq_bpoly_t B, + const fq_nmod_ctx_t ctx, + n_poly_bpoly_stack_t Sp); + +void n_fq_bpoly_print_pretty( + const n_fq_bpoly_t A, + const char * xvar, + const char * yvar, + const fq_nmod_ctx_t ctx); void n_fq_bpoly_one(n_fq_bpoly_t A, const fq_nmod_ctx_t ctx); @@ -950,24 +1363,81 @@ void n_polyu_swap(n_polyu_t A, n_polyu_t B) *A = T; } -void n_polyu3_print_pretty(const n_polyu_t A, const char * gen0, const char * gen1, const char * var2); +void n_polyu3_print_pretty( + const n_polyu_t A, + const char * gen0, + const char * gen1, + const char * var2); void n_polyu3_degrees(slong * deg0, slong * deg1, slong * deg2, const n_polyu_t A); /*****************************************************************************/ -void nmod_pow_cache_start(mp_limb_t b, n_poly_t pos_direct, n_poly_t pos_bin, n_poly_t neg_direct); - -mp_limb_t nmod_pow_cache_mulpow_ui(mp_limb_t a, ulong e, n_poly_t pos_direct, n_poly_t pos_bin, n_poly_t neg_direct, nmod_t ctx); -mp_limb_t nmod_pow_cache_mulpow_neg_ui(mp_limb_t a, ulong e, n_poly_t pos_direct, n_poly_t pos_bin, n_poly_t neg_direct, nmod_t ctx); -mp_limb_t nmod_pow_cache_mulpow_fmpz(mp_limb_t a, const fmpz_t e, n_poly_t pos_direct, n_poly_t pos_bin, n_poly_t neg_direct, nmod_t ctx); - -void n_fq_pow_cache_start_fq_nmod(const fq_nmod_t b, n_poly_t pos_direct, n_poly_t pos_bin, n_poly_t neg_direct, const fq_nmod_ctx_t ctx); -void n_fq_pow_cache_start_n_fq(const mp_limb_t * b, n_poly_t pos_direct, n_poly_t pos_bin, n_poly_t neg_direct, const fq_nmod_ctx_t ctx); - -void n_fq_pow_cache_mulpow_ui(mp_limb_t * r, const mp_limb_t * a, ulong e, n_poly_t pos_direct, n_poly_t pos_bin, n_poly_t neg_direct, const fq_nmod_ctx_t ctx); -void n_fq_pow_cache_mulpow_neg_ui(mp_limb_t * r, const mp_limb_t * a, ulong e, n_poly_t pos_direct, n_poly_t pos_bin, n_poly_t neg_direct, const fq_nmod_ctx_t ctx); -void n_fq_pow_cache_mulpow_fmpz(mp_limb_t * r, const mp_limb_t * a, const fmpz_t e, n_poly_t pos_direct, n_poly_t pos_bin, n_poly_t neg_direct, const fq_nmod_ctx_t ctx); +void nmod_pow_cache_start( + mp_limb_t b, + n_poly_t pos_direct, + n_poly_t pos_bin, + n_poly_t neg_direct); + +mp_limb_t nmod_pow_cache_mulpow_ui( + mp_limb_t a, + ulong e, + n_poly_t pos_direct, + n_poly_t pos_bin, + n_poly_t neg_direct, + nmod_t ctx); +mp_limb_t nmod_pow_cache_mulpow_neg_ui( + mp_limb_t a, + ulong e, + n_poly_t pos_direct, + n_poly_t pos_bin, + n_poly_t neg_direct, + nmod_t ctx); +mp_limb_t nmod_pow_cache_mulpow_fmpz( + mp_limb_t a, + const fmpz_t e, + n_poly_t pos_direct, + n_poly_t pos_bin, + n_poly_t neg_direct, + nmod_t ctx); + +void n_fq_pow_cache_start_fq_nmod( + const fq_nmod_t b, + n_poly_t pos_direct, + n_poly_t pos_bin, + n_poly_t neg_direct, + const fq_nmod_ctx_t ctx); +void n_fq_pow_cache_start_n_fq( + const mp_limb_t * b, + n_poly_t pos_direct, + n_poly_t pos_bin, + n_poly_t neg_direct, + const fq_nmod_ctx_t ctx); + +void n_fq_pow_cache_mulpow_ui( + mp_limb_t * r, + const mp_limb_t * a, + ulong e, + n_poly_t pos_direct, + n_poly_t pos_bin, + n_poly_t neg_direct, + const fq_nmod_ctx_t ctx); +void n_fq_pow_cache_mulpow_neg_ui( + mp_limb_t * r, + const mp_limb_t * a, + ulong e, + n_poly_t pos_direct, + n_poly_t pos_bin, + n_poly_t neg_direct, + const fq_nmod_ctx_t ctx); +void n_fq_pow_cache_mulpow_fmpz( + mp_limb_t * r, + const mp_limb_t * a, + const fmpz_t e, + n_poly_t pos_direct, + n_poly_t pos_bin, + n_poly_t neg_direct, + const fq_nmod_ctx_t ctx); /*****************************************************************************/ @@ -976,28 +1446,76 @@ void nmod_eval_interp_clear(nmod_eval_interp_t E); int nmod_eval_interp_set_degree_modulus(nmod_eval_interp_t E, slong deg, nmod_t ctx); -N_POLY_INLINE slong nmod_eval_interp_eval_length(nmod_eval_interp_t E) { return 1 + E->radix*E->d; } +N_POLY_INLINE +slong nmod_eval_interp_eval_length(nmod_eval_interp_t E) +{ + return 1 + E->radix*E->d; +} -void nmod_eval_interp_to_coeffs_poly(n_poly_t a, const n_poly_t v, nmod_eval_interp_t E, nmod_t ctx); -void nmod_eval_interp_from_coeffs_poly(n_poly_t v, const n_poly_t a, nmod_eval_interp_t E, nmod_t ctx); +void nmod_eval_interp_to_coeffs_poly( + n_poly_t a, + const n_poly_t v, + nmod_eval_interp_t E, + nmod_t ctx); +void nmod_eval_interp_from_coeffs_poly( + n_poly_t v, + const n_poly_t a, + nmod_eval_interp_t E, + nmod_t ctx); -void nmod_eval_interp_to_coeffs_n_fq_poly(n_fq_poly_t a, const n_fq_poly_t v, nmod_eval_interp_t E, const fq_nmod_ctx_t ctx); -void nmod_eval_interp_from_coeffs_n_fq_poly(n_fq_poly_t v, const n_fq_poly_t a, nmod_eval_interp_t E, const fq_nmod_ctx_t ctx); +void nmod_eval_interp_to_coeffs_n_fq_poly( + n_fq_poly_t a, + const n_fq_poly_t v, + nmod_eval_interp_t E, + const fq_nmod_ctx_t ctx); +void nmod_eval_interp_from_coeffs_n_fq_poly( + n_fq_poly_t v, + const n_fq_poly_t a, + nmod_eval_interp_t E, + const fq_nmod_ctx_t ctx); N_POLY_INLINE void nmod_evals_zero(n_poly_t a) { a->length = 0; } N_POLY_INLINE void n_fq_evals_zero(n_fq_poly_t a) { a->length = 0; } void nmod_evals_add_inplace(n_poly_t a, n_poly_t b, slong len, nmod_t ctx); -void n_fq_evals_add_inplace(n_fq_poly_t a, n_fq_poly_t b, slong len, const fq_nmod_ctx_t ctx); +void n_fq_evals_add_inplace( + n_fq_poly_t a, + n_fq_poly_t b, + slong len, + const fq_nmod_ctx_t ctx); void nmod_evals_mul(n_poly_t a, n_poly_t b, n_poly_t c, slong len, nmod_t ctx); -void n_fq_evals_mul(n_fq_poly_t a, n_fq_poly_t b, n_fq_poly_t c, slong len, const fq_nmod_ctx_t ctx); +void n_fq_evals_mul( + n_fq_poly_t a, + n_fq_poly_t b, + n_fq_poly_t c, + slong len, + const fq_nmod_ctx_t ctx); void nmod_evals_addmul(n_poly_t a, n_poly_t b, n_poly_t c, slong len, nmod_t ctx); -void n_fq_evals_addmul(n_fq_poly_t a, n_fq_poly_t b, n_fq_poly_t c, slong len, const fq_nmod_ctx_t ctx); - -void nmod_evals_fmma(n_poly_t a, n_poly_t b, n_poly_t c, n_poly_t d, n_poly_t e, slong len, nmod_t ctx); -void n_fq_evals_fmma(n_fq_poly_t a, n_fq_poly_t b, n_fq_poly_t c, n_fq_poly_t f, n_fq_poly_t e, slong len, const fq_nmod_ctx_t ctx); +void n_fq_evals_addmul( + n_fq_poly_t a, + n_fq_poly_t b, + n_fq_poly_t c, + slong len, + const fq_nmod_ctx_t ctx); + +void nmod_evals_fmma( + n_poly_t a, + n_poly_t b, + n_poly_t c, + n_poly_t d, + n_poly_t e, + slong len, + nmod_t ctx); +void n_fq_evals_fmma( + n_fq_poly_t a, + n_fq_poly_t b, + n_fq_poly_t c, + n_fq_poly_t f, + n_fq_poly_t e, + slong len, + const fq_nmod_ctx_t ctx); /*****************************************************************************/ @@ -1016,7 +1534,11 @@ void n_polyun_clear(n_polyun_t A); int n_polyun_mod_is_canonical(const n_polyun_t A, nmod_t mod); int n_polyun_is_canonical(const n_polyun_t A); -N_POLY_INLINE void n_polyun_fit_length(n_polyun_t A, slong len) { if (len > A->alloc) n_polyun_realloc(A, len); } +N_POLY_INLINE +void n_polyun_fit_length(n_polyun_t A, slong len) +{ + if (len > A->alloc) n_polyun_realloc(A, len); +} N_POLY_INLINE void n_polyun_swap(n_polyun_t A, n_polyun_t B) @@ -1027,8 +1549,17 @@ void n_polyun_swap(n_polyun_t A, n_polyun_t B) } void n_polyu1n_print_pretty(const n_polyun_t A, const char * var0, const char * varlast); -void n_polyu2n_print_pretty(const n_polyun_t A, const char * gen0, const char * gen1, const char * varlast); -void n_polyu3n_print_pretty(const n_polyun_t A, const char * gen0, const char * gen1, const char * var2, const char * varlast); +void n_polyu2n_print_pretty( + const n_polyun_t A, + const char * gen0, + const char * gen1, + const char * varlast); +void n_polyu3n_print_pretty( + const n_polyun_t A, + const char * gen0, + const char * gen1, + const char * var2, + const char * varlast); int n_polyun_equal(const n_polyun_t A, const n_polyun_t B); @@ -1054,18 +1585,69 @@ ulong n_polyu1n_bidegree(n_polyun_t A) /*****************************************************************************/ -void n_fq_poly_product_roots_n_fq(n_poly_t M, const mp_limb_t * H, slong length, const fq_nmod_ctx_t ctx, n_poly_stack_t St); +void n_fq_poly_product_roots_n_fq( + n_poly_t M, + const mp_limb_t * H, + slong length, + const fq_nmod_ctx_t ctx, + n_poly_stack_t St); slong n_polyun_product_roots(n_polyun_t M, const n_polyun_t H, nmod_t ctx); -slong n_fq_polyun_product_roots(n_fq_polyun_t M, const n_fq_polyun_t H, const fq_nmod_ctx_t ctx, n_poly_stack_t St); - -mp_limb_t _nmod_zip_eval_step(mp_limb_t * cur, const mp_limb_t * inc, const mp_limb_t * coeffs, slong length, nmod_t ctx); - -void _n_fq_zip_eval_step(mp_limb_t * res, mp_limb_t * cur, const mp_limb_t * inc, const mp_limb_t * coeffs, slong length, const fq_nmod_ctx_t ctx); -void _n_fqp_zip_eval_step(mp_limb_t * res, mp_limb_t * cur, const mp_limb_t * inc, const mp_limb_t * coeffs, slong length, slong d, nmod_t mod); - -int _nmod_zip_vand_solve(mp_limb_t * coeffs, const mp_limb_t * monomials, slong mlength, const mp_limb_t * evals, slong elength, const mp_limb_t * master, mp_limb_t * scratch, nmod_t ctx); -int _n_fq_zip_vand_solve(mp_limb_t * coeffs, const mp_limb_t * monomials, slong mlength, const mp_limb_t * evals, slong elength, const mp_limb_t * master, mp_limb_t * scratch, const fq_nmod_ctx_t ctx); -int _n_fqp_zip_vand_solve(mp_limb_t * coeffs, const mp_limb_t * monomials, slong mlength, const mp_limb_t * evals, slong elength, const mp_limb_t * master, mp_limb_t * scratch, const fq_nmod_ctx_t ctx); +slong n_fq_polyun_product_roots( + n_fq_polyun_t M, + const n_fq_polyun_t H, + const fq_nmod_ctx_t ctx, + n_poly_stack_t St); + +mp_limb_t _nmod_zip_eval_step( + mp_limb_t * cur, + const mp_limb_t * inc, + const mp_limb_t * coeffs, + slong length, + nmod_t ctx); + +void _n_fq_zip_eval_step( + mp_limb_t * res, + mp_limb_t * cur, + const mp_limb_t * inc, + const mp_limb_t * coeffs, + slong length, + const fq_nmod_ctx_t ctx); +void _n_fqp_zip_eval_step( + mp_limb_t * res, + mp_limb_t * cur, + const mp_limb_t * inc, + const mp_limb_t * coeffs, + slong length, + slong d, + nmod_t mod); + +int _nmod_zip_vand_solve( + mp_limb_t * coeffs, + const mp_limb_t * monomials, + slong mlength, + const mp_limb_t * evals, + slong elength, + const mp_limb_t * master, + mp_limb_t * scratch, + nmod_t ctx); +int _n_fq_zip_vand_solve( + mp_limb_t * coeffs, + const mp_limb_t * monomials, + slong mlength, + const mp_limb_t * evals, + slong elength, + const mp_limb_t * master, + mp_limb_t * scratch, + const fq_nmod_ctx_t ctx); +int _n_fqp_zip_vand_solve( + mp_limb_t * coeffs, + const mp_limb_t * monomials, + slong mlength, + const mp_limb_t * evals, + slong elength, + const mp_limb_t * master, + mp_limb_t * scratch, + const fq_nmod_ctx_t ctx); /*****************************************************************************/ @@ -1111,7 +1693,11 @@ n_poly_struct * n_poly_stack_take_top(n_poly_stack_t S) return poly_top[0]; } -N_POLY_INLINE void n_poly_stack_give_back(n_poly_stack_t S, slong k) { FLINT_ASSERT(S->top >= k); S->top -= k; } +N_POLY_INLINE +void n_poly_stack_give_back(n_poly_stack_t S, slong k) +{ + FLINT_ASSERT(S->top >= k); S->top -= k; +} N_POLY_INLINE slong n_poly_stack_size(const n_poly_stack_t S) { return S->top; } /*****************************************************************************/ @@ -1141,7 +1727,11 @@ n_bpoly_struct * n_bpoly_stack_take_top(n_bpoly_stack_t S) return bpoly_top[0]; } -N_POLY_INLINE void n_bpoly_stack_give_back(n_bpoly_stack_t S, slong k) { FLINT_ASSERT(S->top >= k); S->top -= k; } +N_POLY_INLINE +void n_bpoly_stack_give_back(n_bpoly_stack_t S, slong k) +{ + FLINT_ASSERT(S->top >= k); S->top -= k; +} N_POLY_INLINE slong n_bpoly_stack_size(const n_bpoly_stack_t S) { return S->top; } /*****************************************************************************/ @@ -1171,7 +1761,11 @@ n_polyun_struct * n_polyun_stack_take_top(n_polyun_stack_t S) return polyun_top[0]; } -N_POLY_INLINE void n_polyun_stack_give_back(n_polyun_stack_t S, slong k) { FLINT_ASSERT(S->top >= k); S->top -= k; } +N_POLY_INLINE +void n_polyun_stack_give_back(n_polyun_stack_t S, slong k) +{ + FLINT_ASSERT(S->top >= k); S->top -= k; +} N_POLY_INLINE slong n_polyun_stack_size(const n_polyun_stack_t S) { return S->top; } #ifndef FQ_NMOD_H diff --git a/src/nf_elem.h b/src/nf_elem.h index 84d9f5497f..acc4cfd05b 100644 --- a/src/nf_elem.h +++ b/src/nf_elem.h @@ -75,7 +75,11 @@ void nf_elem_swap(nf_elem_t a, nf_elem_t b, const nf_t nf); void nf_elem_randtest(nf_elem_t a, flint_rand_t state, mp_bitcnt_t bits, const nf_t nf); -void nf_elem_randtest_not_zero(nf_elem_t a, flint_rand_t state, mp_bitcnt_t bits, const nf_t nf); +void nf_elem_randtest_not_zero( + nf_elem_t a, + flint_rand_t state, + mp_bitcnt_t bits, + const nf_t nf); NF_ELEM_INLINE void nf_elem_canonicalise(nf_elem_t a, const nf_t nf) @@ -171,18 +175,45 @@ void nf_elem_set_fmpq_poly(nf_elem_t a, const fmpq_poly_t pol, const nf_t nf); /* Conversion ****************************************************************/ -void nf_elem_set_fmpz_mat_row(nf_elem_t b, const fmpz_mat_t M, const slong i, fmpz_t den, const nf_t nf); -void nf_elem_get_fmpz_mat_row(fmpz_mat_t M, const slong i, fmpz_t den, const nf_elem_t b, const nf_t nf); +void nf_elem_set_fmpz_mat_row( + nf_elem_t b, + const fmpz_mat_t M, + const slong i, + fmpz_t den, + const nf_t nf); +void nf_elem_get_fmpz_mat_row( + fmpz_mat_t M, + const slong i, + fmpz_t den, + const nf_elem_t b, + const nf_t nf); void nf_elem_get_fmpq_poly(fmpq_poly_t pol, const nf_elem_t a, const nf_t nf); -void nf_elem_get_nmod_poly_den(nmod_poly_t pol, const nf_elem_t a, const nf_t nf, int den); +void nf_elem_get_nmod_poly_den( + nmod_poly_t pol, + const nf_elem_t a, + const nf_t nf, + int den); void _nf_elem_get_nmod_poly(nmod_poly_t pol, const nf_elem_t a, const nf_t nf); void nf_elem_get_nmod_poly(nmod_poly_t pol, const nf_elem_t a, const nf_t nf); -void nf_elem_get_fmpz_mod_poly_den(fmpz_mod_poly_t pol, const nf_elem_t a, const nf_t nf, int den, const fmpz_mod_ctx_t ctx); -void _nf_elem_get_fmpz_mod_poly(fmpz_mod_poly_t pol, const nf_elem_t a, const nf_t nf, const fmpz_mod_ctx_t ctx); -void nf_elem_get_fmpz_mod_poly(fmpz_mod_poly_t pol, const nf_elem_t a, const nf_t nf, const fmpz_mod_ctx_t ctx); +void nf_elem_get_fmpz_mod_poly_den( + fmpz_mod_poly_t pol, + const nf_elem_t a, + const nf_t nf, + int den, + const fmpz_mod_ctx_t ctx); +void _nf_elem_get_fmpz_mod_poly( + fmpz_mod_poly_t pol, + const nf_elem_t a, + const nf_t nf, + const fmpz_mod_ctx_t ctx); +void nf_elem_get_fmpz_mod_poly( + fmpz_mod_poly_t pol, + const nf_elem_t a, + const nf_t nf, + const fmpz_mod_ctx_t ctx); /* Basic manipulation ********************************************************/ @@ -241,20 +272,56 @@ void nf_elem_fmpq_sub(nf_elem_t a, const fmpq_t c, const nf_elem_t b, const nf_t void nf_elem_neg(nf_elem_t a, const nf_elem_t b, const nf_t nf); void nf_elem_scalar_mul_si(nf_elem_t a, const nf_elem_t b, slong c, const nf_t nf); -void nf_elem_scalar_mul_fmpz(nf_elem_t a, const nf_elem_t b, const fmpz_t c, const nf_t nf); -void nf_elem_scalar_mul_fmpq(nf_elem_t a, const nf_elem_t b, const fmpq_t c, const nf_t nf); +void nf_elem_scalar_mul_fmpz( + nf_elem_t a, + const nf_elem_t b, + const fmpz_t c, + const nf_t nf); +void nf_elem_scalar_mul_fmpq( + nf_elem_t a, + const nf_elem_t b, + const fmpq_t c, + const nf_t nf); void nf_elem_scalar_div_si(nf_elem_t a, const nf_elem_t b, slong c, const nf_t nf); -void nf_elem_scalar_div_fmpz(nf_elem_t a, const nf_elem_t b, const fmpz_t c, const nf_t nf); -void nf_elem_scalar_div_fmpq(nf_elem_t a, const nf_elem_t b, const fmpq_t c, const nf_t nf); - -void _nf_elem_add_lf(nf_elem_t a, const nf_elem_t b, const nf_elem_t c, const nf_t nf, int can); -void _nf_elem_sub_lf(nf_elem_t a, const nf_elem_t b, const nf_elem_t c, const nf_t nf, int can); - -void _nf_elem_add_qf(nf_elem_t a, const nf_elem_t b, const nf_elem_t c, const nf_t nf, int can); +void nf_elem_scalar_div_fmpz( + nf_elem_t a, + const nf_elem_t b, + const fmpz_t c, + const nf_t nf); +void nf_elem_scalar_div_fmpq( + nf_elem_t a, + const nf_elem_t b, + const fmpq_t c, + const nf_t nf); + +void _nf_elem_add_lf( + nf_elem_t a, + const nf_elem_t b, + const nf_elem_t c, + const nf_t nf, + int can); +void _nf_elem_sub_lf( + nf_elem_t a, + const nf_elem_t b, + const nf_elem_t c, + const nf_t nf, + int can); + +void _nf_elem_add_qf( + nf_elem_t a, + const nf_elem_t b, + const nf_elem_t c, + const nf_t nf, + int can); void nf_elem_add_qf(nf_elem_t a, const nf_elem_t b, const nf_elem_t c, const nf_t nf); -void _nf_elem_sub_qf(nf_elem_t a, const nf_elem_t b, const nf_elem_t c, const nf_t nf, int can); +void _nf_elem_sub_qf( + nf_elem_t a, + const nf_elem_t b, + const nf_elem_t c, + const nf_t nf, + int can); void nf_elem_sub_qf(nf_elem_t a, const nf_elem_t b, const nf_elem_t c, const nf_t nf); void _nf_elem_add(nf_elem_t a, const nf_elem_t b, const nf_elem_t c, const nf_t nf); @@ -268,8 +335,18 @@ void nf_elem_mul_gen(nf_elem_t a, const nf_elem_t b, const nf_t nf); void _nf_elem_mul(nf_elem_t a, const nf_elem_t b, const nf_elem_t c, const nf_t nf); void nf_elem_mul(nf_elem_t a, const nf_elem_t b, const nf_elem_t c, const nf_t nf); -void _nf_elem_mul_red(nf_elem_t a, const nf_elem_t b, const nf_elem_t c, const nf_t nf, int red); -void nf_elem_mul_red(nf_elem_t a, const nf_elem_t b, const nf_elem_t c, const nf_t nf, int red); +void _nf_elem_mul_red( + nf_elem_t a, + const nf_elem_t b, + const nf_elem_t c, + const nf_t nf, + int red); +void nf_elem_mul_red( + nf_elem_t a, + const nf_elem_t b, + const nf_elem_t c, + const nf_t nf, + int red); void _nf_elem_inv(nf_elem_t a, const nf_elem_t b, const nf_t nf); void nf_elem_inv(nf_elem_t a, const nf_elem_t b, const nf_t nf); @@ -283,25 +360,67 @@ void nf_elem_pow(nf_elem_t res, const nf_elem_t a, ulong e, const nf_t nf); void _nf_elem_norm(fmpz_t rnum, fmpz_t rden, const nf_elem_t a, const nf_t nf); void nf_elem_norm(fmpq_t res, const nf_elem_t a, const nf_t nf); -void _nf_elem_norm_div(fmpz_t rnum, fmpz_t rden, const nf_elem_t a, const nf_t nf, const fmpz_t divisor, slong nbits); -void nf_elem_norm_div(fmpq_t res, const nf_elem_t a, const nf_t nf, const fmpz_t divisor, slong nbits); +void _nf_elem_norm_div( + fmpz_t rnum, + fmpz_t rden, + const nf_elem_t a, + const nf_t nf, + const fmpz_t divisor, + slong nbits); +void nf_elem_norm_div( + fmpq_t res, + const nf_elem_t a, + const nf_t nf, + const fmpz_t divisor, + slong nbits); void _nf_elem_trace(fmpz_t rnum, fmpz_t rden, const nf_elem_t a, const nf_t nf); void nf_elem_trace(fmpq_t res, const nf_elem_t a, const nf_t nf); void nf_elem_rep_mat(fmpq_mat_t res, const nf_elem_t a, const nf_t nf); -void nf_elem_rep_mat_fmpz_mat_den(fmpz_mat_t res, fmpz_t den, const nf_elem_t a, const nf_t nf); +void nf_elem_rep_mat_fmpz_mat_den( + fmpz_mat_t res, + fmpz_t den, + const nf_elem_t a, + const nf_t nf); /* Modular reduction *********************************************************/ -void _nf_elem_mod_fmpz(nf_elem_t res, const nf_elem_t a, const fmpz_t mod, const nf_t nf, int sign); -void nf_elem_mod_fmpz_den(nf_elem_t res, const nf_elem_t a, const fmpz_t mod, const nf_t nf, int den); -void nf_elem_smod_fmpz_den(nf_elem_t res, const nf_elem_t a, const fmpz_t mod, const nf_t nf, int den); +void _nf_elem_mod_fmpz( + nf_elem_t res, + const nf_elem_t a, + const fmpz_t mod, + const nf_t nf, + int sign); +void nf_elem_mod_fmpz_den( + nf_elem_t res, + const nf_elem_t a, + const fmpz_t mod, + const nf_t nf, + int den); +void nf_elem_smod_fmpz_den( + nf_elem_t res, + const nf_elem_t a, + const fmpz_t mod, + const nf_t nf, + int den); void nf_elem_mod_fmpz(nf_elem_t res, const nf_elem_t a, const fmpz_t mod, const nf_t nf); -void nf_elem_smod_fmpz(nf_elem_t res, const nf_elem_t a, const fmpz_t mod, const nf_t nf); -void nf_elem_coprime_den(nf_elem_t res, const nf_elem_t a, const fmpz_t mod, const nf_t nf); -void nf_elem_coprime_den_signed(nf_elem_t res, const nf_elem_t a, const fmpz_t mod, const nf_t nf); +void nf_elem_smod_fmpz( + nf_elem_t res, + const nf_elem_t a, + const fmpz_t mod, + const nf_t nf); +void nf_elem_coprime_den( + nf_elem_t res, + const nf_elem_t a, + const fmpz_t mod, + const nf_t nf); +void nf_elem_coprime_den_signed( + nf_elem_t res, + const nf_elem_t a, + const fmpz_t mod, + const nf_t nf); #ifdef __cplusplus } diff --git a/src/nmod.h b/src/nmod.h index 3725860962..9f237db995 100644 --- a/src/nmod.h +++ b/src/nmod.h @@ -258,7 +258,11 @@ double nmod_discrete_log_pohlig_hellman_precompute_prime(nmod_discrete_log_pohli ulong nmod_discrete_log_pohlig_hellman_run(const nmod_discrete_log_pohlig_hellman_t L, mp_limb_t y); -NMOD_INLINE mp_limb_t nmod_discrete_log_pohlig_hellman_primitive_root(const nmod_discrete_log_pohlig_hellman_t L) { return L->alpha; } +NMOD_INLINE +mp_limb_t nmod_discrete_log_pohlig_hellman_primitive_root(const nmod_discrete_log_pohlig_hellman_t L) +{ + return L->alpha; +} #ifdef __cplusplus } diff --git a/src/nmod_mat.h b/src/nmod_mat.h index 864e614d34..121ecdc10e 100644 --- a/src/nmod_mat.h +++ b/src/nmod_mat.h @@ -81,11 +81,23 @@ nmod_mat_swap_entrywise(nmod_mat_t mat1, nmod_mat_t mat2) /* Windows and concatenation */ -void nmod_mat_window_init(nmod_mat_t window, const nmod_mat_t mat, slong r1, slong c1, slong r2, slong c2); +void nmod_mat_window_init( + nmod_mat_t window, + const nmod_mat_t mat, + slong r1, + slong c1, + slong r2, + slong c2); void nmod_mat_window_clear(nmod_mat_t window); -void nmod_mat_concat_horizontal(nmod_mat_t res, const nmod_mat_t mat1, const nmod_mat_t mat2); -void nmod_mat_concat_vertical(nmod_mat_t res, const nmod_mat_t mat1, const nmod_mat_t mat2); +void nmod_mat_concat_horizontal( + nmod_mat_t res, + const nmod_mat_t mat1, + const nmod_mat_t mat2); +void nmod_mat_concat_vertical( + nmod_mat_t res, + const nmod_mat_t mat1, + const nmod_mat_t mat2); /* Random matrix generation */ void nmod_mat_randtest(nmod_mat_t mat, flint_rand_t state); @@ -135,7 +147,11 @@ void nmod_mat_neg(nmod_mat_t B, const nmod_mat_t A); /* Matrix-scalar arithmetic */ void nmod_mat_scalar_mul(nmod_mat_t B, const nmod_mat_t A, mp_limb_t c); -void nmod_mat_scalar_addmul_ui(nmod_mat_t dest, const nmod_mat_t X, const nmod_mat_t Y, const mp_limb_t b); +void nmod_mat_scalar_addmul_ui( + nmod_mat_t dest, + const nmod_mat_t X, + const nmod_mat_t Y, + const mp_limb_t b); void nmod_mat_scalar_mul_fmpz(nmod_mat_t res, const nmod_mat_t M, const fmpz_t c); /* Matrix multiplication */ @@ -149,18 +165,50 @@ _nmod_mat_mul_classical_threaded_pool_op(nmod_mat_t D, const nmod_mat_t C, const nmod_mat_t A, const nmod_mat_t B, int op, thread_pool_handle * threads, slong num_threads); -void nmod_mat_mul_classical_threaded(nmod_mat_t C, const nmod_mat_t A, const nmod_mat_t B); +void nmod_mat_mul_classical_threaded( + nmod_mat_t C, + const nmod_mat_t A, + const nmod_mat_t B); void nmod_mat_mul_strassen(nmod_mat_t C, const nmod_mat_t A, const nmod_mat_t B); -void _nmod_mat_mul_classical_op(nmod_mat_t D, const nmod_mat_t C, const nmod_mat_t A, const nmod_mat_t B, int op); - -void nmod_mat_addmul(nmod_mat_t D, const nmod_mat_t C, const nmod_mat_t A, const nmod_mat_t B); -void nmod_mat_submul(nmod_mat_t D, const nmod_mat_t C, const nmod_mat_t A, const nmod_mat_t B); - -void nmod_mat_mul_nmod_vec(mp_limb_t * c, const nmod_mat_t A, const mp_limb_t * b, slong blen); -void nmod_mat_mul_nmod_vec_ptr(mp_limb_t * const * c, const nmod_mat_t A, const mp_limb_t * const * b, slong blen); - -void nmod_mat_nmod_vec_mul(mp_limb_t * c, const mp_limb_t * a, slong alen, const nmod_mat_t B); -void nmod_mat_nmod_vec_mul_ptr(mp_limb_t * const * c, const mp_limb_t * const * a, slong alen, const nmod_mat_t B); +void _nmod_mat_mul_classical_op( + nmod_mat_t D, + const nmod_mat_t C, + const nmod_mat_t A, + const nmod_mat_t B, + int op); + +void nmod_mat_addmul( + nmod_mat_t D, + const nmod_mat_t C, + const nmod_mat_t A, + const nmod_mat_t B); +void nmod_mat_submul( + nmod_mat_t D, + const nmod_mat_t C, + const nmod_mat_t A, + const nmod_mat_t B); + +void nmod_mat_mul_nmod_vec( + mp_limb_t * c, + const nmod_mat_t A, + const mp_limb_t * b, + slong blen); +void nmod_mat_mul_nmod_vec_ptr( + mp_limb_t * const * c, + const nmod_mat_t A, + const mp_limb_t * const * b, + slong blen); + +void nmod_mat_nmod_vec_mul( + mp_limb_t * c, + const mp_limb_t * a, + slong alen, + const nmod_mat_t B); +void nmod_mat_nmod_vec_mul_ptr( + mp_limb_t * const * c, + const mp_limb_t * const * a, + slong alen, + const nmod_mat_t B); /* Exponent */ @@ -249,12 +297,28 @@ void nmod_mat_permute_rows(nmod_mat_t mat, const slong * perm_act, slong * perm_ /* Triangular solving */ void nmod_mat_solve_tril(nmod_mat_t X, const nmod_mat_t L, const nmod_mat_t B, int unit); -void nmod_mat_solve_tril_recursive(nmod_mat_t X, const nmod_mat_t L, const nmod_mat_t B, int unit); -void nmod_mat_solve_tril_classical(nmod_mat_t X, const nmod_mat_t L, const nmod_mat_t B, int unit); +void nmod_mat_solve_tril_recursive( + nmod_mat_t X, + const nmod_mat_t L, + const nmod_mat_t B, + int unit); +void nmod_mat_solve_tril_classical( + nmod_mat_t X, + const nmod_mat_t L, + const nmod_mat_t B, + int unit); void nmod_mat_solve_triu(nmod_mat_t X, const nmod_mat_t U, const nmod_mat_t B, int unit); -void nmod_mat_solve_triu_recursive(nmod_mat_t X, const nmod_mat_t U, const nmod_mat_t B, int unit); -void nmod_mat_solve_triu_classical(nmod_mat_t X, const nmod_mat_t U, const nmod_mat_t B, int unit); +void nmod_mat_solve_triu_recursive( + nmod_mat_t X, + const nmod_mat_t U, + const nmod_mat_t B, + int unit); +void nmod_mat_solve_triu_classical( + nmod_mat_t X, + const nmod_mat_t U, + const nmod_mat_t B, + int unit); /* LU decomposition */ diff --git a/src/nmod_mpoly.h b/src/nmod_mpoly.h index 97e10b7ba1..0802b8da8b 100644 --- a/src/nmod_mpoly.h +++ b/src/nmod_mpoly.h @@ -31,12 +31,24 @@ extern "C" { #endif -NMOD_MPOLY_INLINE mp_limb_t * nmod_mpoly_term_coeff_ref(nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(i < A->length); return A->coeffs + i; } +NMOD_MPOLY_INLINE +mp_limb_t * nmod_mpoly_term_coeff_ref(nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < A->length); return A->coeffs + i; +} /* Internal type definitions *************************************************/ -NMOD_MPOLY_INLINE n_poly_struct * evil_cast_nmod_poly_to_n_poly(nmod_poly_struct * a) { return (n_poly_struct *) a; } -NMOD_MPOLY_INLINE const n_poly_struct * evil_const_cast_nmod_poly_to_n_poly(const nmod_poly_struct * a) { return (const n_poly_struct *) a; } +NMOD_MPOLY_INLINE +n_poly_struct * evil_cast_nmod_poly_to_n_poly(nmod_poly_struct * a) +{ + return (n_poly_struct *) a; +} +NMOD_MPOLY_INLINE +const n_poly_struct * evil_const_cast_nmod_poly_to_n_poly(const nmod_poly_struct * a) +{ + return (const n_poly_struct *) a; +} /* nmod_mpoly_univar_t @@ -104,7 +116,10 @@ typedef struct typedef nmod_poly_stack_struct nmod_poly_stack_t[1]; -void nmod_poly_stack_init(nmod_poly_stack_t S, flint_bitcnt_t bits, const nmod_mpoly_ctx_t ctx); +void nmod_poly_stack_init( + nmod_poly_stack_t S, + flint_bitcnt_t bits, + const nmod_mpoly_ctx_t ctx); void nmod_poly_stack_clear(nmod_poly_stack_t S); void nmod_poly_stack_set_ctx(nmod_poly_stack_t S, const nmod_mpoly_ctx_t ctx); @@ -173,26 +188,78 @@ nmod_mpolyn_struct * nmod_poly_stack_take_top_mpolyn(nmod_poly_stack_t S) return mpolyn_top[0]; } -NMOD_MPOLY_INLINE void nmod_poly_stack_give_back_poly(nmod_poly_stack_t S, slong k) { FLINT_ASSERT(S->poly_top >= k); S->poly_top -= k; } -NMOD_MPOLY_INLINE void nmod_poly_stack_give_back_mpolyun(nmod_poly_stack_t S, slong k) { FLINT_ASSERT(S->mpolyun_top >= k); S->mpolyun_top -= k; } -NMOD_MPOLY_INLINE void nmod_poly_stack_give_back_mpolyn(nmod_poly_stack_t S, slong k) { FLINT_ASSERT(S->mpolyn_top >= k); S->mpolyn_top -= k; } +NMOD_MPOLY_INLINE +void nmod_poly_stack_give_back_poly(nmod_poly_stack_t S, slong k) +{ + FLINT_ASSERT(S->poly_top >= k); S->poly_top -= k; +} +NMOD_MPOLY_INLINE +void nmod_poly_stack_give_back_mpolyun(nmod_poly_stack_t S, slong k) +{ + FLINT_ASSERT(S->mpolyun_top >= k); S->mpolyun_top -= k; +} +NMOD_MPOLY_INLINE +void nmod_poly_stack_give_back_mpolyn(nmod_poly_stack_t S, slong k) +{ + FLINT_ASSERT(S->mpolyn_top >= k); S->mpolyn_top -= k; +} -NMOD_MPOLY_INLINE slong nmod_poly_stack_size_poly(const nmod_poly_stack_t S) { return S->poly_top; } -NMOD_MPOLY_INLINE slong nmod_poly_stack_size_mpolyun(const nmod_poly_stack_t S) { return S->mpolyun_top; } -NMOD_MPOLY_INLINE slong nmod_poly_stack_size_mpolyn(const nmod_poly_stack_t S) { return S->mpolyn_top; } +NMOD_MPOLY_INLINE +slong nmod_poly_stack_size_poly(const nmod_poly_stack_t S) +{ + return S->poly_top; +} +NMOD_MPOLY_INLINE +slong nmod_poly_stack_size_mpolyun(const nmod_poly_stack_t S) +{ + return S->mpolyun_top; +} +NMOD_MPOLY_INLINE +slong nmod_poly_stack_size_mpolyn(const nmod_poly_stack_t S) +{ + return S->mpolyn_top; +} /* Context object ************************************************************/ -void nmod_mpoly_ctx_init(nmod_mpoly_ctx_t ctx, slong nvars, const ordering_t ord, mp_limb_t modulus); -void nmod_mpoly_ctx_init_rand(nmod_mpoly_ctx_t ctx, flint_rand_t state, slong max_nvars, mp_limb_t modulus); +void nmod_mpoly_ctx_init( + nmod_mpoly_ctx_t ctx, + slong nvars, + const ordering_t ord, + mp_limb_t modulus); +void nmod_mpoly_ctx_init_rand( + nmod_mpoly_ctx_t ctx, + flint_rand_t state, + slong max_nvars, + mp_limb_t modulus); void nmod_mpoly_ctx_clear(nmod_mpoly_ctx_t ctx); -NMOD_MPOLY_INLINE slong nmod_mpoly_ctx_nvars(const nmod_mpoly_ctx_t ctx) { return ctx->minfo->nvars; } -NMOD_MPOLY_INLINE ordering_t nmod_mpoly_ctx_ord(const nmod_mpoly_ctx_t ctx) { return ctx->minfo->ord; } -NMOD_MPOLY_INLINE mp_limb_t nmod_mpoly_ctx_modulus(const nmod_mpoly_ctx_t ctx) { return ctx->mod.n; } +NMOD_MPOLY_INLINE +slong nmod_mpoly_ctx_nvars(const nmod_mpoly_ctx_t ctx) +{ + return ctx->minfo->nvars; +} +NMOD_MPOLY_INLINE +ordering_t nmod_mpoly_ctx_ord(const nmod_mpoly_ctx_t ctx) +{ + return ctx->minfo->ord; +} +NMOD_MPOLY_INLINE +mp_limb_t nmod_mpoly_ctx_modulus(const nmod_mpoly_ctx_t ctx) +{ + return ctx->mod.n; +} -NMOD_MPOLY_INLINE void nmod_mpoly_ctx_set_modulus(nmod_mpoly_ctx_t ctx, mp_limb_t p) { nmod_init(&ctx->mod, p); } -NMOD_MPOLY_INLINE void nmod_mpoly_ctx_change_modulus(nmod_mpoly_ctx_t ctx, mp_limb_t modulus) { nmod_init(&ctx->mod, modulus); } +NMOD_MPOLY_INLINE +void nmod_mpoly_ctx_set_modulus(nmod_mpoly_ctx_t ctx, mp_limb_t p) +{ + nmod_init(&ctx->mod, p); +} +NMOD_MPOLY_INLINE +void nmod_mpoly_ctx_change_modulus(nmod_mpoly_ctx_t ctx, mp_limb_t modulus) +{ + nmod_init(&ctx->mod, modulus); +} /* Memory management ********************************************************/ @@ -208,7 +275,11 @@ void nmod_mpoly_init(nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) } void nmod_mpoly_init2(nmod_mpoly_t A, slong alloc, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_init3(nmod_mpoly_t A, slong alloc, flint_bitcnt_t bits, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_init3( + nmod_mpoly_t A, + slong alloc, + flint_bitcnt_t bits, + const nmod_mpoly_ctx_t ctx); void nmod_mpoly_realloc(nmod_mpoly_t A, slong alloc, const nmod_mpoly_ctx_t ctx); NMOD_MPOLY_INLINE @@ -239,8 +310,16 @@ void _nmod_mpoly_fit_length(mp_limb_t ** coeffs, slong * coeffs_alloc, ulong ** void nmod_mpoly_fit_length(nmod_mpoly_t A, slong length, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_fit_length_fit_bits(nmod_mpoly_t A, slong len, flint_bitcnt_t bits, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_fit_length_reset_bits(nmod_mpoly_t A, slong len, flint_bitcnt_t bits, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_fit_length_fit_bits( + nmod_mpoly_t A, + slong len, + flint_bitcnt_t bits, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_fit_length_reset_bits( + nmod_mpoly_t A, + slong len, + flint_bitcnt_t bits, + const nmod_mpoly_ctx_t ctx); NMOD_MPOLY_INLINE void _nmod_mpoly_set_length(nmod_mpoly_t A, slong newlen, const nmod_mpoly_ctx_t ctx) @@ -261,15 +340,29 @@ void nmod_mpoly_truncate(nmod_mpoly_t A, slong newlen, const nmod_mpoly_ctx_t ct /* Input/output **************************************************************/ -int nmod_mpoly_set_str_pretty(nmod_mpoly_t A, const char * str, const char ** x, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_set_str_pretty( + nmod_mpoly_t A, + const char * str, + const char ** x, + const nmod_mpoly_ctx_t ctx); -char * nmod_mpoly_get_str_pretty(const nmod_mpoly_t A, const char ** x, const nmod_mpoly_ctx_t ctx); +char * nmod_mpoly_get_str_pretty( + const nmod_mpoly_t A, + const char ** x, + const nmod_mpoly_ctx_t ctx); #ifdef FLINT_HAVE_FILE -int nmod_mpoly_fprint_pretty(FILE * file, const nmod_mpoly_t A, const char ** x, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_fprint_pretty( + FILE * file, + const nmod_mpoly_t A, + const char ** x, + const nmod_mpoly_ctx_t ctx); #endif -int nmod_mpoly_print_pretty(const nmod_mpoly_t A, const char ** x, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_print_pretty( + const nmod_mpoly_t A, + const char ** x, + const nmod_mpoly_ctx_t ctx); /* Basic manipulation *******************************************************/ @@ -279,9 +372,16 @@ int nmod_mpoly_is_gen(const nmod_mpoly_t A, slong var, const nmod_mpoly_ctx_t ct void nmod_mpoly_set(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_equal(const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_equal( + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); -NMOD_MPOLY_INLINE void nmod_mpoly_swap(nmod_mpoly_t A, nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx) { FLINT_SWAP(nmod_mpoly_struct, *A, *B); } +NMOD_MPOLY_INLINE +void nmod_mpoly_swap(nmod_mpoly_t A, nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx) +{ + FLINT_SWAP(nmod_mpoly_struct, *A, *B); +} /* Constants *****************************************************************/ @@ -292,28 +392,76 @@ ulong nmod_mpoly_get_ui(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); void nmod_mpoly_set_ui(nmod_mpoly_t A, ulong c, const nmod_mpoly_ctx_t ctx); void nmod_mpoly_set_fmpz(nmod_mpoly_t A, const fmpz_t c, const nmod_mpoly_ctx_t ctx); -NMOD_MPOLY_INLINE void nmod_mpoly_zero(nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { _nmod_mpoly_set_length(A, 0, ctx); } -NMOD_MPOLY_INLINE void nmod_mpoly_one(nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { nmod_mpoly_set_ui(A, UWORD(1), ctx); } +NMOD_MPOLY_INLINE +void nmod_mpoly_zero(nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + _nmod_mpoly_set_length(A, 0, ctx); +} +NMOD_MPOLY_INLINE +void nmod_mpoly_one(nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + nmod_mpoly_set_ui(A, UWORD(1), ctx); +} int nmod_mpoly_equal_ui(const nmod_mpoly_t A, ulong c, const nmod_mpoly_ctx_t ctx); -NMOD_MPOLY_INLINE int nmod_mpoly_is_zero(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { return A->length == 0; } -NMOD_MPOLY_INLINE int nmod_mpoly_is_one(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { return nmod_mpoly_equal_ui(A, 1, ctx); } +NMOD_MPOLY_INLINE +int nmod_mpoly_is_zero(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + return A->length == 0; +} +NMOD_MPOLY_INLINE +int nmod_mpoly_is_one(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + return nmod_mpoly_equal_ui(A, 1, ctx); +} /* Degrees *******************************************************************/ -NMOD_MPOLY_INLINE int nmod_mpoly_degrees_fit_si(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_degrees_fit_si(A->exps, A->length, A->bits, ctx->minfo); } +NMOD_MPOLY_INLINE +int nmod_mpoly_degrees_fit_si(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_degrees_fit_si(A->exps, A->length, A->bits, ctx->minfo); +} -NMOD_MPOLY_INLINE void nmod_mpoly_degrees_si(slong * degs, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { mpoly_degrees_si(degs, A->exps, A->length, A->bits, ctx->minfo); } -NMOD_MPOLY_INLINE void nmod_mpoly_degrees_fmpz(fmpz ** degs, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { mpoly_degrees_pfmpz(degs, A->exps, A->length, A->bits, ctx->minfo); } +NMOD_MPOLY_INLINE +void nmod_mpoly_degrees_si(slong * degs, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + mpoly_degrees_si(degs, A->exps, A->length, A->bits, ctx->minfo); +} +NMOD_MPOLY_INLINE +void nmod_mpoly_degrees_fmpz(fmpz ** degs, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + mpoly_degrees_pfmpz(degs, A->exps, A->length, A->bits, ctx->minfo); +} -NMOD_MPOLY_INLINE slong nmod_mpoly_degree_si(const nmod_mpoly_t A, slong var, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); return mpoly_degree_si(A->exps, A->length, A->bits, var, ctx->minfo); } -NMOD_MPOLY_INLINE void nmod_mpoly_degree_fmpz(fmpz_t deg, const nmod_mpoly_t A, slong var, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); mpoly_degree_fmpz(deg, A->exps, A->length, A->bits, var, ctx->minfo); } +NMOD_MPOLY_INLINE +slong nmod_mpoly_degree_si(const nmod_mpoly_t A, slong var, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); return mpoly_degree_si(A->exps, A->length, A->bits, var, ctx->minfo); +} +NMOD_MPOLY_INLINE +void nmod_mpoly_degree_fmpz(fmpz_t deg, const nmod_mpoly_t A, slong var, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(0 <= var && var < ctx->minfo->nvars); mpoly_degree_fmpz(deg, A->exps, A->length, A->bits, var, ctx->minfo); +} -NMOD_MPOLY_INLINE int nmod_mpoly_total_degree_fits_si(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { return mpoly_total_degree_fits_si(A->exps, A->length, A->bits, ctx->minfo); } +NMOD_MPOLY_INLINE +int nmod_mpoly_total_degree_fits_si(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + return mpoly_total_degree_fits_si(A->exps, A->length, A->bits, ctx->minfo); +} -NMOD_MPOLY_INLINE slong nmod_mpoly_total_degree_si(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { return mpoly_total_degree_si(A->exps, A->length, A->bits, ctx->minfo); } -NMOD_MPOLY_INLINE void nmod_mpoly_total_degree_fmpz(fmpz_t td, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { mpoly_total_degree_fmpz(td, A->exps, A->length, A->bits, ctx->minfo); } +NMOD_MPOLY_INLINE +slong nmod_mpoly_total_degree_si(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + return mpoly_total_degree_si(A->exps, A->length, A->bits, ctx->minfo); +} +NMOD_MPOLY_INLINE +void nmod_mpoly_total_degree_fmpz(fmpz_t td, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + mpoly_total_degree_fmpz(td, A->exps, A->length, A->bits, ctx->minfo); +} NMOD_MPOLY_INLINE void nmod_mpoly_used_vars(int * used, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) @@ -328,208 +476,696 @@ void nmod_mpoly_used_vars(int * used, const nmod_mpoly_t A, const nmod_mpoly_ctx /* Coefficients **************************************************************/ -ulong nmod_mpoly_get_coeff_ui_ui(const nmod_mpoly_t A, const ulong * exp, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_set_coeff_ui_ui(nmod_mpoly_t A, ulong c, const ulong * exp, const nmod_mpoly_ctx_t ctx); - -ulong nmod_mpoly_get_coeff_ui_fmpz(const nmod_mpoly_t A, fmpz * const * exp, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_set_coeff_ui_fmpz(nmod_mpoly_t A, ulong c, const fmpz * exp, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_set_coeff_ui_fmpz(nmod_mpoly_t A, ulong c, fmpz * const * exp, const nmod_mpoly_ctx_t ctx); - -ulong nmod_mpoly_get_coeff_ui_monomial(const nmod_mpoly_t A, const nmod_mpoly_t M, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_set_coeff_ui_monomial(nmod_mpoly_t A, ulong c, const nmod_mpoly_t M, const nmod_mpoly_ctx_t ctx); +ulong nmod_mpoly_get_coeff_ui_ui( + const nmod_mpoly_t A, + const ulong * exp, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_set_coeff_ui_ui( + nmod_mpoly_t A, + ulong c, + const ulong * exp, + const nmod_mpoly_ctx_t ctx); + +ulong nmod_mpoly_get_coeff_ui_fmpz( + const nmod_mpoly_t A, + fmpz * const * exp, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_set_coeff_ui_fmpz( + nmod_mpoly_t A, + ulong c, + const fmpz * exp, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_set_coeff_ui_fmpz( + nmod_mpoly_t A, + ulong c, + fmpz * const * exp, + const nmod_mpoly_ctx_t ctx); + +ulong nmod_mpoly_get_coeff_ui_monomial( + const nmod_mpoly_t A, + const nmod_mpoly_t M, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_set_coeff_ui_monomial( + nmod_mpoly_t A, + ulong c, + const nmod_mpoly_t M, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_get_coeff_vars_ui( + nmod_mpoly_t C, + const nmod_mpoly_t A, + const slong * vars, + const ulong * exps, + slong length, + const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_get_coeff_vars_ui(nmod_mpoly_t C, const nmod_mpoly_t A, const slong * vars, const ulong * exps, slong length, const nmod_mpoly_ctx_t ctx); - -NMOD_MPOLY_INLINE mp_limb_t nmod_mpoly_leadcoeff(nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(A->length > 0); return A->coeffs[0]; } +NMOD_MPOLY_INLINE +mp_limb_t nmod_mpoly_leadcoeff(nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(A->length > 0); return A->coeffs[0]; +} /* conversion ****************************************************************/ int nmod_mpoly_is_nmod_poly(const nmod_mpoly_t A, slong var, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_get_n_poly(n_poly_t A, const nmod_mpoly_t B, slong var, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_set_n_poly_mod(nmod_mpoly_t A, const n_poly_t B, slong var, const nmod_mpoly_ctx_t ctx); - -int nmod_mpoly_get_nmod_poly(nmod_poly_t A, const nmod_mpoly_t B, slong var, const nmod_mpoly_ctx_t ctx); -void _nmod_mpoly_set_nmod_poly(nmod_mpoly_t A, flint_bitcnt_t Abits, const mp_limb_t * Bcoeffs, slong Blen, slong var, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_set_nmod_poly(nmod_mpoly_t A, const nmod_poly_t B, slong var, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_get_n_poly( + n_poly_t A, + const nmod_mpoly_t B, + slong var, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_set_n_poly_mod( + nmod_mpoly_t A, + const n_poly_t B, + slong var, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_get_nmod_poly( + nmod_poly_t A, + const nmod_mpoly_t B, + slong var, + const nmod_mpoly_ctx_t ctx); +void _nmod_mpoly_set_nmod_poly( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const mp_limb_t * Bcoeffs, + slong Blen, + slong var, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_set_nmod_poly( + nmod_mpoly_t A, + const nmod_poly_t B, + slong var, + const nmod_mpoly_ctx_t ctx); /* comparison ****************************************************************/ -int nmod_mpoly_cmp(const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_cmp( + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); /* container operations ******************************************************/ int nmod_mpoly_is_canonical(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); void nmod_mpoly_assert_canonical(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); -NMOD_MPOLY_INLINE slong nmod_mpoly_length(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { return A->length; } +NMOD_MPOLY_INLINE +slong nmod_mpoly_length(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + return A->length; +} void nmod_mpoly_resize(nmod_mpoly_t A, slong new_length, const nmod_mpoly_ctx_t ctx); -ulong nmod_mpoly_get_term_coeff_ui(const nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_set_term_coeff_ui(nmod_mpoly_t A, slong i, ulong c, const nmod_mpoly_ctx_t ctx); - -NMOD_MPOLY_INLINE int nmod_mpoly_term_exp_fits_si(const nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_si(A->exps, A->bits, i, ctx->minfo); } -NMOD_MPOLY_INLINE int nmod_mpoly_term_exp_fits_ui(const nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx) { return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_ui(A->exps, A->bits, i, ctx->minfo); } +ulong nmod_mpoly_get_term_coeff_ui( + const nmod_mpoly_t A, + slong i, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_set_term_coeff_ui( + nmod_mpoly_t A, + slong i, + ulong c, + const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_get_term_exp_si(slong * exp, const nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_get_term_exp_ui(ulong * exp, const nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_get_term_exp_fmpz(fmpz ** exp, const nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx); - -slong nmod_mpoly_get_term_var_exp_si(const nmod_mpoly_t A, slong i, slong var, const nmod_mpoly_ctx_t ctx); -ulong nmod_mpoly_get_term_var_exp_ui(const nmod_mpoly_t A, slong i, slong var, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_set_term_exp_ui(nmod_mpoly_t A, slong i, const ulong * exp, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_set_term_exp_fmpz(nmod_mpoly_t A, slong i, fmpz * const * exp, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_get_term(nmod_mpoly_t M, const nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_get_term_monomial(nmod_mpoly_t M, const nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx); +NMOD_MPOLY_INLINE +int nmod_mpoly_term_exp_fits_si(const nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_si(A->exps, A->bits, i, ctx->minfo); +} +NMOD_MPOLY_INLINE +int nmod_mpoly_term_exp_fits_ui(const nmod_mpoly_t A, slong i, const nmod_mpoly_ctx_t ctx) +{ + return A->bits <= FLINT_BITS ? 1 : mpoly_term_exp_fits_ui(A->exps, A->bits, i, ctx->minfo); +} -void nmod_mpoly_push_term_ui_ui(nmod_mpoly_t A, ulong c, const ulong * exp, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_push_term_ui_fmpz(nmod_mpoly_t A, ulong c, fmpz * const * exp, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_push_term_ui_ffmpz(nmod_mpoly_t A, ulong c, const fmpz * exp, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_get_term_exp_si( + slong * exp, + const nmod_mpoly_t A, + slong i, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_get_term_exp_ui( + ulong * exp, + const nmod_mpoly_t A, + slong i, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_get_term_exp_fmpz( + fmpz ** exp, + const nmod_mpoly_t A, + slong i, + const nmod_mpoly_ctx_t ctx); + +slong nmod_mpoly_get_term_var_exp_si( + const nmod_mpoly_t A, + slong i, + slong var, + const nmod_mpoly_ctx_t ctx); +ulong nmod_mpoly_get_term_var_exp_ui( + const nmod_mpoly_t A, + slong i, + slong var, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_set_term_exp_ui( + nmod_mpoly_t A, + slong i, + const ulong * exp, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_set_term_exp_fmpz( + nmod_mpoly_t A, + slong i, + fmpz * const * exp, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_get_term( + nmod_mpoly_t M, + const nmod_mpoly_t A, + slong i, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_get_term_monomial( + nmod_mpoly_t M, + const nmod_mpoly_t A, + slong i, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_push_term_ui_ui( + nmod_mpoly_t A, + ulong c, + const ulong * exp, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_push_term_ui_fmpz( + nmod_mpoly_t A, + ulong c, + fmpz * const * exp, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_push_term_ui_ffmpz( + nmod_mpoly_t A, + ulong c, + const fmpz * exp, + const nmod_mpoly_ctx_t ctx); void nmod_mpoly_sort_terms(nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); void nmod_mpoly_combine_like_terms(nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_reverse(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_radix_sort1(nmod_mpoly_t A, slong left, slong right, flint_bitcnt_t pos, ulong cmpmask, ulong totalmask); -void _nmod_mpoly_radix_sort(nmod_mpoly_t A, slong left, slong right, flint_bitcnt_t pos, slong N, ulong * cmpmask); - -void _nmod_mpoly_push_exp_ui(nmod_mpoly_t A, const ulong * exp, const nmod_mpoly_ctx_t ctx); -void _nmod_mpoly_push_exp_ffmpz(nmod_mpoly_t A, const fmpz * exp, const nmod_mpoly_ctx_t ctx); -void _nmod_mpoly_push_exp_pfmpz(nmod_mpoly_t A, fmpz * const * exp, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_reverse( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_radix_sort1( + nmod_mpoly_t A, + slong left, + slong right, + flint_bitcnt_t pos, + ulong cmpmask, + ulong totalmask); +void _nmod_mpoly_radix_sort( + nmod_mpoly_t A, + slong left, + slong right, + flint_bitcnt_t pos, + slong N, + ulong * cmpmask); + +void _nmod_mpoly_push_exp_ui( + nmod_mpoly_t A, + const ulong * exp, + const nmod_mpoly_ctx_t ctx); +void _nmod_mpoly_push_exp_ffmpz( + nmod_mpoly_t A, + const fmpz * exp, + const nmod_mpoly_ctx_t ctx); +void _nmod_mpoly_push_exp_pfmpz( + nmod_mpoly_t A, + fmpz * const * exp, + const nmod_mpoly_ctx_t ctx); /* Random generation *********************************************************/ -void nmod_mpoly_randtest_bound(nmod_mpoly_t A, flint_rand_t state, slong length, ulong exp_bound, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_randtest_bounds(nmod_mpoly_t A, flint_rand_t state, slong length, ulong * exp_bounds, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_randtest_bits(nmod_mpoly_t A, flint_rand_t state, slong length, flint_bitcnt_t exp_bits, const nmod_mpoly_ctx_t ctx); - -ulong nmod_mpoly_get_term_ui_ui(const nmod_mpoly_t poly, const ulong * exp, const nmod_mpoly_ctx_t ctx); -ulong _nmod_mpoly_get_term_ui_fmpz(const nmod_mpoly_t poly, const fmpz * exp, const nmod_mpoly_ctx_t ctx); -ulong nmod_mpoly_get_term_ui_fmpz(const nmod_mpoly_t poly, fmpz * const * exp, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_max_degrees(ulong * max_degs, const ulong * exps, slong len, slong bits, slong n, int deg, int rev, slong N); -void nmod_mpoly_max_degrees(ulong * max_degs, const nmod_mpoly_t poly, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_randtest_bound( + nmod_mpoly_t A, + flint_rand_t state, + slong length, + ulong exp_bound, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_randtest_bounds( + nmod_mpoly_t A, + flint_rand_t state, + slong length, + ulong * exp_bounds, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_randtest_bits( + nmod_mpoly_t A, + flint_rand_t state, + slong length, + flint_bitcnt_t exp_bits, + const nmod_mpoly_ctx_t ctx); + +ulong nmod_mpoly_get_term_ui_ui( + const nmod_mpoly_t poly, + const ulong * exp, + const nmod_mpoly_ctx_t ctx); +ulong _nmod_mpoly_get_term_ui_fmpz( + const nmod_mpoly_t poly, + const fmpz * exp, + const nmod_mpoly_ctx_t ctx); +ulong nmod_mpoly_get_term_ui_fmpz( + const nmod_mpoly_t poly, + fmpz * const * exp, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_max_degrees( + ulong * max_degs, + const ulong * exps, + slong len, + slong bits, + slong n, + int deg, + int rev, + slong N); +void nmod_mpoly_max_degrees( + ulong * max_degs, + const nmod_mpoly_t poly, + const nmod_mpoly_ctx_t ctx); void nmod_mpoly_set_nmod(nmod_mpoly_t poly, const nmod_t c, const nmod_mpoly_ctx_t ctx); -ulong nmod_mpoly_get_coeff_ui(nmod_t x, const nmod_mpoly_t poly, slong n, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_set_coeff_ui(nmod_mpoly_t poly, slong n, ulong x, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_get_monomial(ulong * exps, const nmod_mpoly_t poly, slong n, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_set_monomial(nmod_mpoly_t poly, slong n, const ulong * exps, const nmod_mpoly_ctx_t ctx); +ulong nmod_mpoly_get_coeff_ui( + nmod_t x, + const nmod_mpoly_t poly, + slong n, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_set_coeff_ui( + nmod_mpoly_t poly, + slong n, + ulong x, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_get_monomial( + ulong * exps, + const nmod_mpoly_t poly, + slong n, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_set_monomial( + nmod_mpoly_t poly, + slong n, + const ulong * exps, + const nmod_mpoly_ctx_t ctx); /* Addition/Subtraction ******************************************************/ -void nmod_mpoly_add_ui(nmod_mpoly_t A, const nmod_mpoly_t B, ulong c, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_sub_ui(nmod_mpoly_t A, const nmod_mpoly_t B, ulong c, const nmod_mpoly_ctx_t ctx); - -slong _nmod_mpoly_add(mp_limb_t * coeff1, ulong * exp1, const mp_limb_t * coeff2, const ulong * exp2, slong len2, const mp_limb_t * coeff3, const ulong * exp3, slong len3, slong N, const ulong * cmpmask, nmod_t fctx); -slong _nmod_mpoly_sub(ulong * coeff1, ulong * exp1, const ulong * coeff2, const ulong * exp2, slong len2, const ulong * coeff3, const ulong * exp3, slong len3, slong N, const ulong * cmpmask, nmod_t fctx); - -void nmod_mpoly_add(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_t C, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_sub(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_t C, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_add_ui( + nmod_mpoly_t A, + const nmod_mpoly_t B, + ulong c, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_sub_ui( + nmod_mpoly_t A, + const nmod_mpoly_t B, + ulong c, + const nmod_mpoly_ctx_t ctx); + +slong _nmod_mpoly_add( + mp_limb_t * coeff1, + ulong * exp1, + const mp_limb_t * coeff2, + const ulong * exp2, + slong len2, + const mp_limb_t * coeff3, + const ulong * exp3, + slong len3, + slong N, + const ulong * cmpmask, + nmod_t fctx); +slong _nmod_mpoly_sub( + ulong * coeff1, + ulong * exp1, + const ulong * coeff2, + const ulong * exp2, + slong len2, + const ulong * coeff3, + const ulong * exp3, + slong len3, + slong N, + const ulong * cmpmask, + nmod_t fctx); + +void nmod_mpoly_add( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_t C, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_sub( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_t C, + const nmod_mpoly_ctx_t ctx); void nmod_mpoly_neg(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); /* Scalar operations *********************************************************/ -void nmod_mpoly_make_monic(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_scalar_mul_ui(nmod_mpoly_t A, const nmod_mpoly_t B, ulong c, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_scalar_mul_nmod_invertible(nmod_mpoly_t A, const nmod_mpoly_t B, mp_limb_t c, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_scalar_addmul_ui(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_t C, ulong d, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_make_monic( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_scalar_mul_ui( + nmod_mpoly_t A, + const nmod_mpoly_t B, + ulong c, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_scalar_mul_nmod_invertible( + nmod_mpoly_t A, + const nmod_mpoly_t B, + mp_limb_t c, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_scalar_addmul_ui( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_t C, + ulong d, + const nmod_mpoly_ctx_t ctx); /* Differention **************************************************************/ -void nmod_mpoly_derivative(nmod_mpoly_t A, const nmod_mpoly_t B, slong var, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_derivative( + nmod_mpoly_t A, + const nmod_mpoly_t B, + slong var, + const nmod_mpoly_ctx_t ctx); /* Evaluation ****************************************************************/ int _ff_poly_pow_ui_is_not_feasible(slong length, ulong e); int _ff_poly_pow_fmpz_is_not_feasible(slong length, const fmpz_t e); -mp_limb_t _nmod_mpoly_eval_all_ui(const mp_limb_t * Acoeffs, const ulong * Aexps, slong Alen, flint_bitcnt_t Abits, const mp_limb_t * alphas, const mpoly_ctx_t mctx, nmod_t mod); -ulong nmod_mpoly_evaluate_all_ui(const nmod_mpoly_t A, const ulong * vals, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_evaluate_one_ui(nmod_mpoly_t A, const nmod_mpoly_t B, slong var, ulong val, const nmod_mpoly_ctx_t ctx); - -int nmod_mpoly_compose_nmod_poly(nmod_poly_t A, const nmod_mpoly_t B, nmod_poly_struct * const * C, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_compose_mat(nmod_mpoly_t A, const nmod_mpoly_t B, const fmpz_mat_t M, const nmod_mpoly_ctx_t ctxB, const nmod_mpoly_ctx_t ctxAC); - -void nmod_mpoly_compose_nmod_mpoly_gen(nmod_mpoly_t A, const nmod_mpoly_t B, const slong * c, const nmod_mpoly_ctx_t ctxB, const nmod_mpoly_ctx_t ctxAC); - -int nmod_mpoly_compose_nmod_mpoly_geobucket(nmod_mpoly_t A, const nmod_mpoly_t B, nmod_mpoly_struct * const * C, const nmod_mpoly_ctx_t ctxB, const nmod_mpoly_ctx_t ctxAC); -int nmod_mpoly_compose_nmod_mpoly_horner(nmod_mpoly_t A, const nmod_mpoly_t B, nmod_mpoly_struct * const * C, const nmod_mpoly_ctx_t ctxB, const nmod_mpoly_ctx_t ctxAC); -int nmod_mpoly_compose_nmod_mpoly(nmod_mpoly_t A, const nmod_mpoly_t B, nmod_mpoly_struct * const * C, const nmod_mpoly_ctx_t ctxB, const nmod_mpoly_ctx_t ctxAC); +mp_limb_t _nmod_mpoly_eval_all_ui( + const mp_limb_t * Acoeffs, + const ulong * Aexps, + slong Alen, + flint_bitcnt_t Abits, + const mp_limb_t * alphas, + const mpoly_ctx_t mctx, + nmod_t mod); +ulong nmod_mpoly_evaluate_all_ui( + const nmod_mpoly_t A, + const ulong * vals, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_evaluate_one_ui( + nmod_mpoly_t A, + const nmod_mpoly_t B, + slong var, + ulong val, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_compose_nmod_poly( + nmod_poly_t A, + const nmod_mpoly_t B, + nmod_poly_struct * const * C, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_compose_mat( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const fmpz_mat_t M, + const nmod_mpoly_ctx_t ctxB, + const nmod_mpoly_ctx_t ctxAC); + +void nmod_mpoly_compose_nmod_mpoly_gen( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const slong * c, + const nmod_mpoly_ctx_t ctxB, + const nmod_mpoly_ctx_t ctxAC); + +int nmod_mpoly_compose_nmod_mpoly_geobucket( + nmod_mpoly_t A, + const nmod_mpoly_t B, + nmod_mpoly_struct * const * C, + const nmod_mpoly_ctx_t ctxB, + const nmod_mpoly_ctx_t ctxAC); +int nmod_mpoly_compose_nmod_mpoly_horner( + nmod_mpoly_t A, + const nmod_mpoly_t B, + nmod_mpoly_struct * const * C, + const nmod_mpoly_ctx_t ctxB, + const nmod_mpoly_ctx_t ctxAC); +int nmod_mpoly_compose_nmod_mpoly( + nmod_mpoly_t A, + const nmod_mpoly_t B, + nmod_mpoly_struct * const * C, + const nmod_mpoly_ctx_t ctxB, + const nmod_mpoly_ctx_t ctxAC); /* Multiplication ************************************************************/ -void nmod_mpoly_mul_johnson(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_t C, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_mul_heap_threaded(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_t C, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_mul(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_t C, const nmod_mpoly_ctx_t ctx); - -int nmod_mpoly_mul_array_threaded(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_t C, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_mul_array(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_t C, const nmod_mpoly_ctx_t ctx); - -int _nmod_mpoly_mul_dense(nmod_mpoly_t P, const nmod_mpoly_t A, fmpz * maxAfields, const nmod_mpoly_t B, fmpz * maxBfields, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_mul_dense(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_t C, const nmod_mpoly_ctx_t ctx); - -slong _nmod_mpoly_mul_johnson(nmod_mpoly_t A, const mp_limb_t * coeff2, const ulong * exp2, slong len2, const mp_limb_t * coeff3, const ulong * exp3, slong len3, flint_bitcnt_t bits, slong N, const ulong * cmpmask, nmod_t fctx); -void _nmod_mpoly_mul_johnson_maxfields(nmod_mpoly_t A, const nmod_mpoly_t B, fmpz * maxBfields, const nmod_mpoly_t C, fmpz * maxCfields, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_mul_heap_threaded_pool_maxfields(nmod_mpoly_t A, const nmod_mpoly_t B, fmpz * maxBfields, const nmod_mpoly_t C, fmpz * maxCfields, const nmod_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles); - -int _nmod_mpoly_mul_array_threaded_pool_DEG(nmod_mpoly_t A, const nmod_mpoly_t B, fmpz * maxBfields, const nmod_mpoly_t C, fmpz * maxCfields, const nmod_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles); -int _nmod_mpoly_mul_array_threaded_pool_LEX(nmod_mpoly_t A, const nmod_mpoly_t B, fmpz * maxBfields, const nmod_mpoly_t C, fmpz * maxCfields, const nmod_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles); -int _nmod_mpoly_mul_array_DEG(nmod_mpoly_t A, const nmod_mpoly_t B, fmpz * maxBfields, const nmod_mpoly_t C, fmpz * maxCfields, const nmod_mpoly_ctx_t ctx); -int _nmod_mpoly_mul_array_LEX(nmod_mpoly_t A, const nmod_mpoly_t B, fmpz * maxBfields, const nmod_mpoly_t C, fmpz * maxCfields, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_mul_johnson( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_t C, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_mul_heap_threaded( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_t C, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_mul( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_t C, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_mul_array_threaded( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_t C, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_mul_array( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_t C, + const nmod_mpoly_ctx_t ctx); + +int _nmod_mpoly_mul_dense( + nmod_mpoly_t P, + const nmod_mpoly_t A, + fmpz * maxAfields, + const nmod_mpoly_t B, + fmpz * maxBfields, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_mul_dense( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_t C, + const nmod_mpoly_ctx_t ctx); + +slong _nmod_mpoly_mul_johnson( + nmod_mpoly_t A, + const mp_limb_t * coeff2, + const ulong * exp2, + slong len2, + const mp_limb_t * coeff3, + const ulong * exp3, + slong len3, + flint_bitcnt_t bits, + slong N, + const ulong * cmpmask, + nmod_t fctx); +void _nmod_mpoly_mul_johnson_maxfields( + nmod_mpoly_t A, + const nmod_mpoly_t B, + fmpz * maxBfields, + const nmod_mpoly_t C, + fmpz * maxCfields, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_mul_heap_threaded_pool_maxfields( + nmod_mpoly_t A, + const nmod_mpoly_t B, + fmpz * maxBfields, + const nmod_mpoly_t C, + fmpz * maxCfields, + const nmod_mpoly_ctx_t ctx, + const thread_pool_handle * handles, + slong num_handles); + +int _nmod_mpoly_mul_array_threaded_pool_DEG( + nmod_mpoly_t A, + const nmod_mpoly_t B, + fmpz * maxBfields, + const nmod_mpoly_t C, + fmpz * maxCfields, + const nmod_mpoly_ctx_t ctx, + const thread_pool_handle * handles, + slong num_handles); +int _nmod_mpoly_mul_array_threaded_pool_LEX( + nmod_mpoly_t A, + const nmod_mpoly_t B, + fmpz * maxBfields, + const nmod_mpoly_t C, + fmpz * maxCfields, + const nmod_mpoly_ctx_t ctx, + const thread_pool_handle * handles, + slong num_handles); +int _nmod_mpoly_mul_array_DEG( + nmod_mpoly_t A, + const nmod_mpoly_t B, + fmpz * maxBfields, + const nmod_mpoly_t C, + fmpz * maxCfields, + const nmod_mpoly_ctx_t ctx); +int _nmod_mpoly_mul_array_LEX( + nmod_mpoly_t A, + const nmod_mpoly_t B, + fmpz * maxBfields, + const nmod_mpoly_t C, + fmpz * maxCfields, + const nmod_mpoly_ctx_t ctx); /* Powering ******************************************************************/ -void _nmod_mpoly_pow_rmul(nmod_mpoly_t A, const mp_limb_t * Bcoeffs, const ulong * Bexps, slong Blen, ulong k, slong N, const ulong * cmpmask, nmod_t mod, nmod_mpoly_t T); -void nmod_mpoly_pow_rmul(nmod_mpoly_t A, const nmod_mpoly_t B, ulong k, const nmod_mpoly_ctx_t ctx); - -int nmod_mpoly_pow_ui(nmod_mpoly_t A, const nmod_mpoly_t B, ulong k, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_pow_fmpz(nmod_mpoly_t A, const nmod_mpoly_t B, const fmpz_t k, const nmod_mpoly_ctx_t ctx); +void _nmod_mpoly_pow_rmul( + nmod_mpoly_t A, + const mp_limb_t * Bcoeffs, + const ulong * Bexps, + slong Blen, + ulong k, + slong N, + const ulong * cmpmask, + nmod_t mod, + nmod_mpoly_t T); +void nmod_mpoly_pow_rmul( + nmod_mpoly_t A, + const nmod_mpoly_t B, + ulong k, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_pow_ui( + nmod_mpoly_t A, + const nmod_mpoly_t B, + ulong k, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_pow_fmpz( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const fmpz_t k, + const nmod_mpoly_ctx_t ctx); /* Division ******************************************************************/ -int _nmod_mpoly_divides_threaded_pool(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles); -int _nmod_mpoly_divides_heap_threaded_pool(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles); -int nmod_mpoly_divides_heap_threaded(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); - -int _nmod_mpoly_divides_monagan_pearce(nmod_mpoly_t Q, const mp_limb_t * coeff2, const ulong * exp2, slong len2, const mp_limb_t * coeff3, const ulong * exp3, slong len3, flint_bitcnt_t bits, slong N, const ulong * cmpmask, nmod_t fctx); -int nmod_mpoly_divides_monagan_pearce(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); - -int nmod_mpoly_divides_dense(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); - -int nmod_mpoly_divides(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); +int _nmod_mpoly_divides_threaded_pool( + nmod_mpoly_t Q, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx, + const thread_pool_handle * handles, + slong num_handles); +int _nmod_mpoly_divides_heap_threaded_pool( + nmod_mpoly_t Q, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx, + const thread_pool_handle * handles, + slong num_handles); +int nmod_mpoly_divides_heap_threaded( + nmod_mpoly_t Q, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); + +int _nmod_mpoly_divides_monagan_pearce( + nmod_mpoly_t Q, + const mp_limb_t * coeff2, + const ulong * exp2, + slong len2, + const mp_limb_t * coeff3, + const ulong * exp3, + slong len3, + flint_bitcnt_t bits, + slong N, + const ulong * cmpmask, + nmod_t fctx); +int nmod_mpoly_divides_monagan_pearce( + nmod_mpoly_t Q, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_divides_dense( + nmod_mpoly_t Q, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_divides( + nmod_mpoly_t Q, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_div_monagan_pearce( + nmod_mpoly_t Q, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_div( + nmod_mpoly_t Q, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_divrem_monagan_pearce( + nmod_mpoly_t q, + nmod_mpoly_t r, + const nmod_mpoly_t poly2, + const nmod_mpoly_t poly3, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_divrem( + nmod_mpoly_t Q, + nmod_mpoly_t R, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_divrem_ideal_monagan_pearce( + nmod_mpoly_struct ** Q, + nmod_mpoly_t R, + const nmod_mpoly_t A, + nmod_mpoly_struct * const * B, + slong len, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_divrem_ideal( + nmod_mpoly_struct ** Q, + nmod_mpoly_t R, + const nmod_mpoly_t A, + nmod_mpoly_struct * const * B, + slong len, + const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_div_monagan_pearce(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_div(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_divrem_monagan_pearce(nmod_mpoly_t q, nmod_mpoly_t r, const nmod_mpoly_t poly2, const nmod_mpoly_t poly3, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_divrem(nmod_mpoly_t Q, nmod_mpoly_t R, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_divrem_ideal_monagan_pearce(nmod_mpoly_struct ** Q, nmod_mpoly_t R, const nmod_mpoly_t A, nmod_mpoly_struct * const * B, slong len, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_divrem_ideal(nmod_mpoly_struct ** Q, nmod_mpoly_t R, const nmod_mpoly_t A, nmod_mpoly_struct * const * B, slong len, const nmod_mpoly_ctx_t ctx); - -NMOD_MPOLY_INLINE void nmod_mpoly_divexact(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx) { if (nmod_mpoly_divides(Q, A, B, ctx)) return; flint_throw(FLINT_ERROR, "nmod_mpoly_divexact: nonexact division"); } +NMOD_MPOLY_INLINE +void nmod_mpoly_divexact(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx) +{ + if (nmod_mpoly_divides(Q, A, B, ctx)) return; flint_throw(FLINT_ERROR, "nmod_mpoly_divexact: nonexact division"); +} /* Square root ***************************************************************/ -int nmod_mpoly_sqrt_heap(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); -NMOD_MPOLY_INLINE int nmod_mpoly_sqrt(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) { return nmod_mpoly_sqrt_heap(Q, A, ctx); } +int nmod_mpoly_sqrt_heap( + nmod_mpoly_t Q, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx); +NMOD_MPOLY_INLINE +int nmod_mpoly_sqrt(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) +{ + return nmod_mpoly_sqrt_heap(Q, A, ctx); +} NMOD_MPOLY_INLINE int nmod_mpoly_is_square(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) @@ -542,27 +1178,93 @@ int nmod_mpoly_is_square(const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx) return res; } -int nmod_mpoly_quadratic_root(nmod_mpoly_t Q, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_quadratic_root( + nmod_mpoly_t Q, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); /* GCD ***********************************************************************/ -void nmod_mpoly_term_content(nmod_mpoly_t M, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); - -int nmod_mpoly_content_vars(nmod_mpoly_t g, const nmod_mpoly_t A, slong * vars, slong vars_length, const nmod_mpoly_ctx_t ctx); - -int _nmod_mpoly_gcd_algo_small(nmod_mpoly_t G, nmod_mpoly_t Abar /* can be NULL */, nmod_mpoly_t Bbar /* can be NULL */, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx, unsigned int algo); -int _nmod_mpoly_gcd_algo(nmod_mpoly_t G, nmod_mpoly_t Abar, nmod_mpoly_t Bbar, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx, unsigned int algo); -int nmod_mpoly_gcd_cofactors(nmod_mpoly_t G, nmod_mpoly_t Abar, nmod_mpoly_t Bbar, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_gcd_brown(nmod_mpoly_t G, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_gcd_hensel(nmod_mpoly_t G, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_gcd_zippel(nmod_mpoly_t G, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_gcd_zippel2(nmod_mpoly_t G, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_gcd(nmod_mpoly_t G, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_deflation(fmpz * shift, fmpz * stride, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_deflate(nmod_mpoly_t A, const nmod_mpoly_t B, const fmpz * shift, const fmpz * stride, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_inflate(nmod_mpoly_t A, const nmod_mpoly_t B, const fmpz * shift, const fmpz * stride, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_term_content( + nmod_mpoly_t M, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_content_vars( + nmod_mpoly_t g, + const nmod_mpoly_t A, + slong * vars, + slong vars_length, + const nmod_mpoly_ctx_t ctx); + +int _nmod_mpoly_gcd_algo_small( + nmod_mpoly_t G, + nmod_mpoly_t Abar /* can be NULL */, + nmod_mpoly_t Bbar /* can be NULL */, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx, + unsigned int algo); +int _nmod_mpoly_gcd_algo( + nmod_mpoly_t G, + nmod_mpoly_t Abar, + nmod_mpoly_t Bbar, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx, + unsigned int algo); +int nmod_mpoly_gcd_cofactors( + nmod_mpoly_t G, + nmod_mpoly_t Abar, + nmod_mpoly_t Bbar, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_gcd_brown( + nmod_mpoly_t G, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_gcd_hensel( + nmod_mpoly_t G, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_gcd_zippel( + nmod_mpoly_t G, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_gcd_zippel2( + nmod_mpoly_t G, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_gcd( + nmod_mpoly_t G, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_deflation( + fmpz * shift, + fmpz * stride, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_deflate( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const fmpz * shift, + const fmpz * stride, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_inflate( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const fmpz * shift, + const fmpz * stride, + const nmod_mpoly_ctx_t ctx); /****************************************************************************** @@ -572,16 +1274,44 @@ void nmod_mpoly_inflate(nmod_mpoly_t A, const nmod_mpoly_t B, const fmpz * shift void mpoly_void_ring_init_nmod_mpoly_ctx(mpoly_void_ring_t R, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyl_lead_coeff(nmod_mpoly_t c, const nmod_mpoly_t A, slong num_vars, const nmod_mpoly_ctx_t ctx); - -int nmod_mpolyl_content(nmod_mpoly_t g, const nmod_mpoly_t A, slong num_vars, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_to_nmod_poly_deflate(nmod_poly_t A, const nmod_mpoly_t B, slong var, const ulong * Bshift, const ulong * Bstride, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_from_nmod_poly_inflate(nmod_mpoly_t A, flint_bitcnt_t Abits, const nmod_poly_t B, slong var, const ulong * Ashift, const ulong * Astride, const nmod_mpoly_ctx_t ctx); - -int nmod_mpoly_repack_bits_inplace(nmod_mpoly_t A, flint_bitcnt_t Abits, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_repack_bits(nmod_mpoly_t A, const nmod_mpoly_t B, flint_bitcnt_t Abits, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyl_lead_coeff( + nmod_mpoly_t c, + const nmod_mpoly_t A, + slong num_vars, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpolyl_content( + nmod_mpoly_t g, + const nmod_mpoly_t A, + slong num_vars, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_to_nmod_poly_deflate( + nmod_poly_t A, + const nmod_mpoly_t B, + slong var, + const ulong * Bshift, + const ulong * Bstride, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_from_nmod_poly_inflate( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const nmod_poly_t B, + slong var, + const ulong * Ashift, + const ulong * Astride, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_repack_bits_inplace( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_repack_bits( + nmod_mpoly_t A, + const nmod_mpoly_t B, + flint_bitcnt_t Abits, + const nmod_mpoly_ctx_t ctx); typedef struct { @@ -617,20 +1347,47 @@ typedef nmod_mpoly_stripe_struct nmod_mpoly_stripe_t[1]; void nmod_mpoly_univar_init(nmod_mpoly_univar_t A, const nmod_mpoly_ctx_t ctx); void nmod_mpoly_univar_clear(nmod_mpoly_univar_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_univar_fit_length(nmod_mpoly_univar_t A, slong length, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_univar_fit_length( + nmod_mpoly_univar_t A, + slong length, + const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_univar_print_pretty(const nmod_mpoly_univar_t A, const char ** x, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_univar_print_pretty( + const nmod_mpoly_univar_t A, + const char ** x, + const nmod_mpoly_ctx_t ctx); void nmod_mpoly_univar_assert_canonical(nmod_mpoly_univar_t A, const nmod_mpoly_ctx_t ctx); -NMOD_MPOLY_INLINE void nmod_mpoly_univar_zero(nmod_mpoly_univar_t A, const nmod_mpoly_ctx_t ctx) { A->length = 0; } - -void nmod_mpoly_univar_set_coeff_ui(nmod_mpoly_univar_t A, ulong e, const nmod_mpoly_t c, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_to_univar(nmod_mpoly_univar_t A, const nmod_mpoly_t B, slong var, const nmod_mpoly_ctx_t ctx); +NMOD_MPOLY_INLINE +void nmod_mpoly_univar_zero(nmod_mpoly_univar_t A, const nmod_mpoly_ctx_t ctx) +{ + A->length = 0; +} -void _nmod_mpoly_from_univar(nmod_mpoly_t A, flint_bitcnt_t Abits, const nmod_mpoly_univar_t B, slong var, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_from_univar(nmod_mpoly_t A, const nmod_mpoly_univar_t B, slong var, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_univar_set_coeff_ui( + nmod_mpoly_univar_t A, + ulong e, + const nmod_mpoly_t c, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_to_univar( + nmod_mpoly_univar_t A, + const nmod_mpoly_t B, + slong var, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_from_univar( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const nmod_mpoly_univar_t B, + slong var, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_from_univar( + nmod_mpoly_t A, + const nmod_mpoly_univar_t B, + slong var, + const nmod_mpoly_ctx_t ctx); NMOD_MPOLY_INLINE void nmod_mpoly_univar_swap(nmod_mpoly_univar_t A, nmod_mpoly_univar_t B, const nmod_mpoly_ctx_t ctx) @@ -640,43 +1397,180 @@ void nmod_mpoly_univar_swap(nmod_mpoly_univar_t A, nmod_mpoly_univar_t B, const *B = t; } -NMOD_MPOLY_INLINE int nmod_mpoly_univar_degree_fits_si(const nmod_mpoly_univar_t A, const nmod_mpoly_ctx_t ctx) { return A->length == 0 || fmpz_fits_si(A->exps + 0); } - -NMOD_MPOLY_INLINE slong nmod_mpoly_univar_length(const nmod_mpoly_univar_t A, const nmod_mpoly_ctx_t ctx) { return A->length; } - -NMOD_MPOLY_INLINE slong nmod_mpoly_univar_get_term_exp_si(nmod_mpoly_univar_t A, slong i, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT((ulong) i < (ulong) A->length); return fmpz_get_si(A->exps + i); } +NMOD_MPOLY_INLINE +int nmod_mpoly_univar_degree_fits_si(const nmod_mpoly_univar_t A, const nmod_mpoly_ctx_t ctx) +{ + return A->length == 0 || fmpz_fits_si(A->exps + 0); +} -NMOD_MPOLY_INLINE void nmod_mpoly_univar_get_term_coeff(nmod_mpoly_t c, const nmod_mpoly_univar_t A, slong i, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT((ulong) i < (ulong) A->length); nmod_mpoly_set(c, A->coeffs + i, ctx); } -NMOD_MPOLY_INLINE void nmod_mpoly_univar_swap_term_coeff(nmod_mpoly_t c, nmod_mpoly_univar_t A, slong i, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT((ulong) i < (ulong) A->length); nmod_mpoly_swap(c, A->coeffs + i, ctx); } +NMOD_MPOLY_INLINE +slong nmod_mpoly_univar_length(const nmod_mpoly_univar_t A, const nmod_mpoly_ctx_t ctx) +{ + return A->length; +} -int nmod_mpoly_univar_pseudo_gcd(nmod_mpoly_univar_t Gx, const nmod_mpoly_univar_t Ax, const nmod_mpoly_univar_t Bx, const nmod_mpoly_ctx_t ctx); +NMOD_MPOLY_INLINE +slong nmod_mpoly_univar_get_term_exp_si(nmod_mpoly_univar_t A, slong i, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT((ulong) i < (ulong) A->length); return fmpz_get_si(A->exps + i); +} -int nmod_mpoly_univar_discriminant(nmod_mpoly_t D, const nmod_mpoly_univar_t Fx, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_discriminant(nmod_mpoly_t R, const nmod_mpoly_t A, slong var, const nmod_mpoly_ctx_t ctx); +NMOD_MPOLY_INLINE +void nmod_mpoly_univar_get_term_coeff(nmod_mpoly_t c, const nmod_mpoly_univar_t A, slong i, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT((ulong) i < (ulong) A->length); nmod_mpoly_set(c, A->coeffs + i, ctx); +} +NMOD_MPOLY_INLINE +void nmod_mpoly_univar_swap_term_coeff(nmod_mpoly_t c, nmod_mpoly_univar_t A, slong i, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT((ulong) i < (ulong) A->length); nmod_mpoly_swap(c, A->coeffs + i, ctx); +} -int nmod_mpoly_univar_resultant(nmod_mpoly_t R, const nmod_mpoly_univar_t Ax, const nmod_mpoly_univar_t Bx, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_resultant(nmod_mpoly_t R, const nmod_mpoly_t A, const nmod_mpoly_t B, slong var, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_univar_pseudo_gcd( + nmod_mpoly_univar_t Gx, + const nmod_mpoly_univar_t Ax, + const nmod_mpoly_univar_t Bx, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_univar_discriminant( + nmod_mpoly_t D, + const nmod_mpoly_univar_t Fx, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_discriminant( + nmod_mpoly_t R, + const nmod_mpoly_t A, + slong var, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_univar_resultant( + nmod_mpoly_t R, + const nmod_mpoly_univar_t Ax, + const nmod_mpoly_univar_t Bx, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_resultant( + nmod_mpoly_t R, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + slong var, + const nmod_mpoly_ctx_t ctx); /* Helpers for array methods *************************************************/ -void _nmod_mpoly_mul_array_chunked_LEX(nmod_mpoly_t P, const nmod_mpoly_t A, const nmod_mpoly_t B, const ulong * mults, const nmod_mpoly_ctx_t ctx); -void _nmod_mpoly_mul_array_chunked_DEG(nmod_mpoly_t P, const nmod_mpoly_t A, const nmod_mpoly_t B, ulong degb, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_addmul_array1_ulong1(ulong * poly1, const ulong * poly2, const ulong * exp2, slong len2, const ulong * poly3, const ulong * exp3, slong len3); -void _nmod_mpoly_addmul_array1_ulong2(ulong * poly1, const ulong * poly2, const ulong * exp2, slong len2, const ulong * poly3, const ulong * exp3, slong len3); -void _nmod_mpoly_addmul_array1_ulong3(ulong * poly1, const ulong * poly2, const ulong * exp2, slong len2, const ulong * poly3, const ulong * exp3, slong len3); - -slong nmod_mpoly_append_array_sm1_LEX(nmod_mpoly_t P, slong Plen, ulong * coeff_array, const ulong * mults, slong num, slong array_size, slong top, const nmod_mpoly_ctx_t ctx); -slong nmod_mpoly_append_array_sm2_LEX(nmod_mpoly_t P, slong Plen, ulong * coeff_array, const ulong * mults, slong num, slong array_size, slong top, const nmod_mpoly_ctx_t ctx); -slong nmod_mpoly_append_array_sm3_LEX(nmod_mpoly_t P, slong Plen, ulong * coeff_array, const ulong * mults, slong num, slong array_size, slong top, const nmod_mpoly_ctx_t ctx); - -slong nmod_mpoly_append_array_sm1_DEGLEX(nmod_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb, const nmod_mpoly_ctx_t ctx); -slong nmod_mpoly_append_array_sm2_DEGLEX(nmod_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb, const nmod_mpoly_ctx_t ctx); -slong nmod_mpoly_append_array_sm3_DEGLEX(nmod_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb, const nmod_mpoly_ctx_t ctx); - -slong nmod_mpoly_append_array_sm1_DEGREVLEX(nmod_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb, const nmod_mpoly_ctx_t ctx); -slong nmod_mpoly_append_array_sm2_DEGREVLEX(nmod_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb, const nmod_mpoly_ctx_t ctx); -slong nmod_mpoly_append_array_sm3_DEGREVLEX(nmod_mpoly_t P, slong Plen, ulong * coeff_array, slong top, slong nvars, slong degb, const nmod_mpoly_ctx_t ctx); +void _nmod_mpoly_mul_array_chunked_LEX( + nmod_mpoly_t P, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const ulong * mults, + const nmod_mpoly_ctx_t ctx); +void _nmod_mpoly_mul_array_chunked_DEG( + nmod_mpoly_t P, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + ulong degb, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_addmul_array1_ulong1( + ulong * poly1, + const ulong * poly2, + const ulong * exp2, + slong len2, + const ulong * poly3, + const ulong * exp3, + slong len3); +void _nmod_mpoly_addmul_array1_ulong2( + ulong * poly1, + const ulong * poly2, + const ulong * exp2, + slong len2, + const ulong * poly3, + const ulong * exp3, + slong len3); +void _nmod_mpoly_addmul_array1_ulong3( + ulong * poly1, + const ulong * poly2, + const ulong * exp2, + slong len2, + const ulong * poly3, + const ulong * exp3, + slong len3); + +slong nmod_mpoly_append_array_sm1_LEX( + nmod_mpoly_t P, + slong Plen, + ulong * coeff_array, + const ulong * mults, + slong num, + slong array_size, + slong top, + const nmod_mpoly_ctx_t ctx); +slong nmod_mpoly_append_array_sm2_LEX( + nmod_mpoly_t P, + slong Plen, + ulong * coeff_array, + const ulong * mults, + slong num, + slong array_size, + slong top, + const nmod_mpoly_ctx_t ctx); +slong nmod_mpoly_append_array_sm3_LEX( + nmod_mpoly_t P, + slong Plen, + ulong * coeff_array, + const ulong * mults, + slong num, + slong array_size, + slong top, + const nmod_mpoly_ctx_t ctx); + +slong nmod_mpoly_append_array_sm1_DEGLEX( + nmod_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb, + const nmod_mpoly_ctx_t ctx); +slong nmod_mpoly_append_array_sm2_DEGLEX( + nmod_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb, + const nmod_mpoly_ctx_t ctx); +slong nmod_mpoly_append_array_sm3_DEGLEX( + nmod_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb, + const nmod_mpoly_ctx_t ctx); + +slong nmod_mpoly_append_array_sm1_DEGREVLEX( + nmod_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb, + const nmod_mpoly_ctx_t ctx); +slong nmod_mpoly_append_array_sm2_DEGREVLEX( + nmod_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb, + const nmod_mpoly_ctx_t ctx); +slong nmod_mpoly_append_array_sm3_DEGREVLEX( + nmod_mpoly_t P, + slong Plen, + ulong * coeff_array, + slong top, + slong nvars, + slong degb, + const nmod_mpoly_ctx_t ctx); /* mpolyd ********************************************************************/ @@ -690,13 +1584,28 @@ NMOD_MPOLY_INLINE void nmod_mpolyd_swap(nmod_mpolyd_t poly1, nmod_mpolyd_t poly2 *poly2 = t; } -int nmod_mpolyd_set_degbounds_perm(nmod_mpolyd_t A, const nmod_mpolyd_ctx_t dctx, slong * bounds); +int nmod_mpolyd_set_degbounds_perm( + nmod_mpolyd_t A, + const nmod_mpolyd_ctx_t dctx, + slong * bounds); int nmod_mpolyd_set_degbounds(nmod_mpolyd_t A, slong * bounds); -void nmod_mpoly_convert_to_nmod_mpolyd_degbound(nmod_mpolyd_t A, const nmod_mpolyd_ctx_t dctx, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_convert_to_nmod_mpolyd(nmod_mpolyd_t A, const nmod_mpolyd_ctx_t dctx, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_convert_from_nmod_mpolyd(nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, const nmod_mpolyd_t B, const nmod_mpolyd_ctx_t dctx); +void nmod_mpoly_convert_to_nmod_mpolyd_degbound( + nmod_mpolyd_t A, + const nmod_mpolyd_ctx_t dctx, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_convert_to_nmod_mpolyd( + nmod_mpolyd_t A, + const nmod_mpolyd_ctx_t dctx, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_convert_from_nmod_mpolyd( + nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx, + const nmod_mpolyd_t B, + const nmod_mpolyd_ctx_t dctx); void nmod_mpolyd_init(nmod_mpolyd_t poly, slong nvars); void nmod_mpolyd_clear(nmod_mpolyd_t poly); @@ -725,46 +1634,117 @@ void nmod_mpolyu_one(nmod_mpolyu_t A, const nmod_mpoly_ctx_t uctx); int nmod_mpolyu_is_one(nmod_mpolyu_t A, const nmod_mpoly_ctx_t uctx); -void nmod_mpolyu_print_pretty(const nmod_mpolyu_t poly, const char ** x, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyu_print_pretty( + const nmod_mpolyu_t poly, + const char ** x, + const nmod_mpoly_ctx_t ctx); void nmod_mpolyu_fit_length(nmod_mpolyu_t A, slong length, const nmod_mpoly_ctx_t uctx); -void nmod_mpolyu_degrees_si(slong * degs, const nmod_mpolyu_t A, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyu_degrees_si( + slong * degs, + const nmod_mpolyu_t A, + const nmod_mpoly_ctx_t ctx); -void nmod_mpolyu_repack_bits_inplace(nmod_mpolyu_t A, flint_bitcnt_t bits, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyu_repack_bits_inplace( + nmod_mpolyu_t A, + flint_bitcnt_t bits, + const nmod_mpoly_ctx_t ctx); -nmod_mpoly_struct * _nmod_mpolyu_get_coeff(nmod_mpolyu_t A, ulong pow, const nmod_mpoly_ctx_t uctx); +nmod_mpoly_struct * _nmod_mpolyu_get_coeff( + nmod_mpolyu_t A, + ulong pow, + const nmod_mpoly_ctx_t uctx); void nmod_mpolyu_shift_right(nmod_mpolyu_t A, ulong s); void nmod_mpolyu_shift_left(nmod_mpolyu_t A, ulong s); -int nmod_mpolyu_content_mpoly(nmod_mpoly_t g, const nmod_mpolyu_t A, const nmod_mpoly_ctx_t ctx); +int nmod_mpolyu_content_mpoly( + nmod_mpoly_t g, + const nmod_mpolyu_t A, + const nmod_mpoly_ctx_t ctx); -void nmod_mpolyu_scalar_mul_nmod(nmod_mpolyu_t A, mp_limb_t c, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyu_scalar_mul_nmod( + nmod_mpolyu_t A, + mp_limb_t c, + const nmod_mpoly_ctx_t ctx); -void nmod_mpolyu_set(nmod_mpolyu_t A, const nmod_mpolyu_t B, const nmod_mpoly_ctx_t uctx); +void nmod_mpolyu_set( + nmod_mpolyu_t A, + const nmod_mpolyu_t B, + const nmod_mpoly_ctx_t uctx); void nmod_mpolyu_cvtto_poly(nmod_poly_t a, nmod_mpolyu_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyu_cvtfrom_poly_notmain(nmod_mpolyu_t A, nmod_poly_t a, slong var, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyu_cvtfrom_poly(nmod_mpolyu_t A, nmod_poly_t a, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_to_mpolyu_perm_deflate_threaded_pool(nmod_mpolyu_t A, const nmod_mpoly_ctx_t uctx, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx, const slong * perm, const ulong * shift, const ulong * stride, const thread_pool_handle * handles, slong num_handles); - -void nmod_mpoly_from_mpolyu_perm_inflate(nmod_mpoly_t A, flint_bitcnt_t Abits, const nmod_mpoly_ctx_t ctx, const nmod_mpolyu_t B, const nmod_mpoly_ctx_t uctx, const slong * perm, const ulong * shift, const ulong * stride); - -int nmod_mpolyuu_divides(nmod_mpolyu_t Q, const nmod_mpolyu_t A, const nmod_mpolyu_t B, slong nmainvars, const nmod_mpoly_ctx_t ctx); - -void nmod_mpolyu_divexact_mpoly_inplace(nmod_mpolyu_t A, nmod_mpoly_t c, const nmod_mpoly_ctx_t ctx); - -void nmod_mpolyu_mul_mpoly_inplace(nmod_mpolyu_t A, nmod_mpoly_t c, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyu_mul_mpoly(nmod_mpolyu_t A, nmod_mpolyu_t B, nmod_mpoly_t c, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyu_cvtfrom_poly_notmain( + nmod_mpolyu_t A, + nmod_poly_t a, + slong var, + const nmod_mpoly_ctx_t ctx); +void nmod_mpolyu_cvtfrom_poly( + nmod_mpolyu_t A, + nmod_poly_t a, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_to_mpolyu_perm_deflate_threaded_pool( + nmod_mpolyu_t A, + const nmod_mpoly_ctx_t uctx, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx, + const slong * perm, + const ulong * shift, + const ulong * stride, + const thread_pool_handle * handles, + slong num_handles); + +void nmod_mpoly_from_mpolyu_perm_inflate( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const nmod_mpoly_ctx_t ctx, + const nmod_mpolyu_t B, + const nmod_mpoly_ctx_t uctx, + const slong * perm, + const ulong * shift, + const ulong * stride); + +int nmod_mpolyuu_divides( + nmod_mpolyu_t Q, + const nmod_mpolyu_t A, + const nmod_mpolyu_t B, + slong nmainvars, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpolyu_divexact_mpoly_inplace( + nmod_mpolyu_t A, + nmod_mpoly_t c, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpolyu_mul_mpoly_inplace( + nmod_mpolyu_t A, + nmod_mpoly_t c, + const nmod_mpoly_ctx_t ctx); +void nmod_mpolyu_mul_mpoly( + nmod_mpolyu_t A, + nmod_mpolyu_t B, + nmod_mpoly_t c, + const nmod_mpoly_ctx_t ctx); void nmod_mpolyu_setform(nmod_mpolyu_t A, nmod_mpolyu_t B, const nmod_mpoly_ctx_t ctx); -int nmod_mpolyu_gcdm_zippel(nmod_mpolyu_t G, nmod_mpolyu_t Abar, nmod_mpolyu_t Bbar, nmod_mpolyu_t A, nmod_mpolyu_t B, nmod_mpoly_ctx_t ctx, flint_rand_t randstate); +int nmod_mpolyu_gcdm_zippel( + nmod_mpolyu_t G, + nmod_mpolyu_t Abar, + nmod_mpolyu_t Bbar, + nmod_mpolyu_t A, + nmod_mpolyu_t B, + nmod_mpoly_ctx_t ctx, + flint_rand_t randstate); -NMOD_MPOLY_INLINE mp_limb_t nmod_mpolyu_leadcoeff(nmod_mpolyu_t A, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(A->length > 0); return nmod_mpoly_leadcoeff(A->coeffs + 0, ctx); } +NMOD_MPOLY_INLINE +mp_limb_t nmod_mpolyu_leadcoeff(nmod_mpolyu_t A, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(A->length > 0); return nmod_mpoly_leadcoeff(A->coeffs + 0, ctx); +} /* mpolyn ********************************************************************/ @@ -777,7 +1757,10 @@ void nmod_mpolyn_zero(nmod_mpolyn_t A, const nmod_mpoly_ctx_t ctx); int nmod_mpolyn_is_zero(nmod_mpolyn_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyn_print_pretty(const nmod_mpolyn_t A, const char ** x_in, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyn_print_pretty( + const nmod_mpolyn_t A, + const char ** x_in, + const nmod_mpoly_ctx_t ctx); void nmod_mpolyn_fit_length(nmod_mpolyn_t A, slong length, const nmod_mpoly_ctx_t ctx); void nmod_mpolyn_set_length(nmod_mpolyn_t A, slong newlen, const nmod_mpoly_ctx_t ctx); @@ -786,14 +1769,29 @@ void nmod_mpolyn_fit_bits(nmod_mpolyn_t A, slong bits, const nmod_mpoly_ctx_t ct int nmod_mpolyn_is_canonical(const nmod_mpolyn_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyn_set_mpoly(nmod_mpolyn_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyn_set_mpoly( + nmod_mpolyn_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); void nmod_mpolyn_set(nmod_mpolyn_t A, const nmod_mpolyn_t B, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_cvtfrom_mpolyn(nmod_mpoly_t A, const nmod_mpolyn_t B, slong var, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_cvtfrom_mpolyn( + nmod_mpoly_t A, + const nmod_mpolyn_t B, + slong var, + const nmod_mpoly_ctx_t ctx); -void nmod_mpolyn_mul_poly(nmod_mpolyn_t A, const nmod_mpolyn_t B, const n_poly_t c, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyn_mul_poly( + nmod_mpolyn_t A, + const nmod_mpolyn_t B, + const n_poly_t c, + const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_cvtto_mpolyn(nmod_mpolyn_t A, const nmod_mpoly_t B, slong var, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_cvtto_mpolyn( + nmod_mpolyn_t A, + const nmod_mpoly_t B, + slong var, + const nmod_mpoly_ctx_t ctx); NMOD_MPOLY_INLINE mp_limb_t nmod_mpolyn_leadcoeff(nmod_mpolyn_t A, const nmod_mpoly_ctx_t ctx) @@ -816,14 +1814,20 @@ n_poly_struct * nmod_mpolyn_leadcoeff_poly(nmod_mpolyn_t A, const nmod_mpoly_ctx /* mpolyun *******************************************************************/ -void nmod_mpolyun_init(nmod_mpolyun_t A, flint_bitcnt_t bits, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyun_init( + nmod_mpolyun_t A, + flint_bitcnt_t bits, + const nmod_mpoly_ctx_t ctx); void nmod_mpolyun_clear(nmod_mpolyun_t A, const nmod_mpoly_ctx_t ctx); void nmod_mpolyun_swap(nmod_mpolyun_t A, nmod_mpolyun_t B); void nmod_mpolyun_zero(nmod_mpolyun_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyun_print_pretty(const nmod_mpolyun_t poly, const char ** x, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyun_print_pretty( + const nmod_mpolyun_t poly, + const char ** x, + const nmod_mpoly_ctx_t ctx); void nmod_mpolyun_fit_length(nmod_mpolyun_t A, slong length, const nmod_mpoly_ctx_t ctx); @@ -835,7 +1839,10 @@ void nmod_mpolyun_shift_left(nmod_mpolyun_t A, ulong s); slong nmod_mpolyn_lastdeg(nmod_mpolyn_t A, const nmod_mpoly_ctx_t ctx); slong nmod_mpolyun_lastdeg(nmod_mpolyun_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyun_set(nmod_mpolyun_t A, const nmod_mpolyun_t B, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyun_set( + nmod_mpolyun_t A, + const nmod_mpolyun_t B, + const nmod_mpoly_ctx_t ctx); void nmod_mpolyn_one(nmod_mpolyn_t A, const nmod_mpoly_ctx_t ctx); void nmod_mpolyun_one(nmod_mpolyun_t A, const nmod_mpoly_ctx_t ctx); @@ -848,94 +1855,395 @@ void nmod_mpolyun_set_mod(nmod_mpolyun_t A, const nmod_t mod); int nmod_mpolyn_is_nonzero_nmod(const nmod_mpolyn_t A, const nmod_mpoly_ctx_t ctx); int nmod_mpolyun_is_nonzero_nmod(const nmod_mpolyun_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyn_scalar_mul_nmod(nmod_mpolyn_t A, mp_limb_t c, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyun_scalar_mul_nmod(nmod_mpolyun_t A, mp_limb_t c, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyn_scalar_mul_nmod( + nmod_mpolyn_t A, + mp_limb_t c, + const nmod_mpoly_ctx_t ctx); +void nmod_mpolyun_scalar_mul_nmod( + nmod_mpolyun_t A, + mp_limb_t c, + const nmod_mpoly_ctx_t ctx); void nmod_mpolyn_mul_last(nmod_mpolyn_t A, n_poly_t b, const nmod_mpoly_ctx_t ctx); void nmod_mpolyun_mul_last(nmod_mpolyun_t A, n_poly_t b, const nmod_mpoly_ctx_t ctx); -int nmod_mpolyn_equal(const nmod_mpolyn_t A, const nmod_mpolyn_t B, const nmod_mpoly_ctx_t ctx); -int nmod_mpolyun_equal(const nmod_mpolyun_t A, const nmod_mpolyun_t B, const nmod_mpoly_ctx_t ctx); - -void nmod_mpolyu_cvtto_mpolyun(nmod_mpolyun_t A, const nmod_mpolyu_t B, slong k, const nmod_mpoly_ctx_t ctx); - -void nmod_mpolyu_cvtfrom_mpolyun(nmod_mpolyu_t A, const nmod_mpolyun_t B, slong var, const nmod_mpoly_ctx_t ctx); - -void nmod_mpolyun_mul_poly(nmod_mpolyun_t A, const nmod_mpolyun_t B, const n_poly_t c, const nmod_mpoly_ctx_t ctx); +int nmod_mpolyn_equal( + const nmod_mpolyn_t A, + const nmod_mpolyn_t B, + const nmod_mpoly_ctx_t ctx); +int nmod_mpolyun_equal( + const nmod_mpolyun_t A, + const nmod_mpolyun_t B, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpolyu_cvtto_mpolyun( + nmod_mpolyun_t A, + const nmod_mpolyu_t B, + slong k, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpolyu_cvtfrom_mpolyun( + nmod_mpolyu_t A, + const nmod_mpolyun_t B, + slong var, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpolyun_mul_poly( + nmod_mpolyun_t A, + const nmod_mpolyun_t B, + const n_poly_t c, + const nmod_mpoly_ctx_t ctx); void nmod_mpolyn_content_last(n_poly_t a, nmod_mpolyn_t B, const nmod_mpoly_ctx_t ctx); void nmod_mpolyun_content_last(n_poly_t a, nmod_mpolyun_t B, const nmod_mpoly_ctx_t ctx); void nmod_mpolyn_divexact_last(nmod_mpolyn_t A, n_poly_t b, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyun_divexact_last(nmod_mpolyun_t A, n_poly_t b, const nmod_mpoly_ctx_t ctx); - -int nmod_mpolyn_divides_threaded_pool(nmod_mpolyn_t Q, const nmod_mpolyn_t A, const nmod_mpolyn_t B, const nmod_mpoly_ctx_t ctx, const thread_pool_handle * handles, slong num_handles); -int nmod_mpolyn_divides(nmod_mpolyn_t Q, const nmod_mpolyn_t A, const nmod_mpolyn_t B, const nmod_mpoly_ctx_t ctx); -int nmod_mpolyun_divides(nmod_mpolyun_t Q, const nmod_mpolyun_t A, const nmod_mpolyun_t B, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_to_mpolyn_perm_deflate_threaded_pool(nmod_mpolyn_t A, const nmod_mpoly_ctx_t nctx, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx, const slong * perm, const ulong * shift, const ulong * stride, const thread_pool_handle * handles, slong num_handles); -void nmod_mpoly_to_mpolyun_perm_deflate_threaded_pool(nmod_mpolyun_t A, const nmod_mpoly_ctx_t uctx, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx, const slong * perm, const ulong * shift, const ulong * stride, const thread_pool_handle * handles, slong num_handles); +void nmod_mpolyun_divexact_last( + nmod_mpolyun_t A, + n_poly_t b, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpolyn_divides_threaded_pool( + nmod_mpolyn_t Q, + const nmod_mpolyn_t A, + const nmod_mpolyn_t B, + const nmod_mpoly_ctx_t ctx, + const thread_pool_handle * handles, + slong num_handles); +int nmod_mpolyn_divides( + nmod_mpolyn_t Q, + const nmod_mpolyn_t A, + const nmod_mpolyn_t B, + const nmod_mpoly_ctx_t ctx); +int nmod_mpolyun_divides( + nmod_mpolyun_t Q, + const nmod_mpolyun_t A, + const nmod_mpolyun_t B, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_to_mpolyn_perm_deflate_threaded_pool( + nmod_mpolyn_t A, + const nmod_mpoly_ctx_t nctx, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx, + const slong * perm, + const ulong * shift, + const ulong * stride, + const thread_pool_handle * handles, + slong num_handles); +void nmod_mpoly_to_mpolyun_perm_deflate_threaded_pool( + nmod_mpolyun_t A, + const nmod_mpoly_ctx_t uctx, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx, + const slong * perm, + const ulong * shift, + const ulong * stride, + const thread_pool_handle * handles, + slong num_handles); + +void nmod_mpoly_from_mpolyn_perm_inflate( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const nmod_mpoly_ctx_t ctx, + const nmod_mpolyn_t B, + const nmod_mpoly_ctx_t nctx, + const slong * perm, + const ulong * shift, + const ulong * stride); +void nmod_mpoly_from_mpolyun_perm_inflate( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const nmod_mpoly_ctx_t ctx, + const nmod_mpolyun_t B, + const nmod_mpoly_ctx_t uctx, + const slong * perm, + const ulong * shift, + const ulong * stride); -void nmod_mpoly_from_mpolyn_perm_inflate(nmod_mpoly_t A, flint_bitcnt_t Abits, const nmod_mpoly_ctx_t ctx, const nmod_mpolyn_t B, const nmod_mpoly_ctx_t nctx, const slong * perm, const ulong * shift, const ulong * stride); -void nmod_mpoly_from_mpolyun_perm_inflate(nmod_mpoly_t A, flint_bitcnt_t Abits, const nmod_mpoly_ctx_t ctx, const nmod_mpolyun_t B, const nmod_mpoly_ctx_t uctx, const slong * perm, const ulong * shift, const ulong * stride); - -NMOD_MPOLY_INLINE mp_limb_t nmod_mpolyun_leadcoeff(nmod_mpolyun_t A, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(A->length > 0); return nmod_mpolyn_leadcoeff(A->coeffs + 0, ctx); } -NMOD_MPOLY_INLINE n_poly_struct * nmod_mpolyun_leadcoeff_poly(nmod_mpolyun_t A, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(A->length > 0); return nmod_mpolyn_leadcoeff_poly(A->coeffs + 0, ctx); } +NMOD_MPOLY_INLINE +mp_limb_t nmod_mpolyun_leadcoeff(nmod_mpolyun_t A, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(A->length > 0); return nmod_mpolyn_leadcoeff(A->coeffs + 0, ctx); +} +NMOD_MPOLY_INLINE +n_poly_struct * nmod_mpolyun_leadcoeff_poly(nmod_mpolyun_t A, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(A->length > 0); return nmod_mpolyn_leadcoeff_poly(A->coeffs + 0, ctx); +} /* GCD ***********************************************************************/ int mpoly_gcd_get_use_first(slong rGdeg, slong Adeg, slong Bdeg, slong gammadeg); -int nmod_mpoly_gcd_get_use_new(slong rGdeg, slong Adeg, slong Bdeg, slong gammadeg, slong degxAB, slong degyAB, slong numABgamma, const n_polyun_t G, const n_polyun_t Abar, const n_polyun_t Bbar); - -void nmod_mpolyu_setform_mpolyun(nmod_mpolyu_t A, nmod_mpolyun_t B, const nmod_mpoly_ctx_t ctx); - -int nmod_mpolyn_gcd_brown_smprime_bivar(nmod_mpolyn_t G, nmod_mpolyn_t Abar, nmod_mpolyn_t Bbar, nmod_mpolyn_t A, nmod_mpolyn_t B, const nmod_mpoly_ctx_t ctx, nmod_poly_stack_t Sp); -int nmod_mpolyn_gcd_brown_smprime_threaded_pool(nmod_mpolyn_t G, nmod_mpolyn_t Abar, nmod_mpolyn_t Bbar, nmod_mpolyn_t A, nmod_mpolyn_t B, slong var, const nmod_mpoly_ctx_t ctx, const mpoly_gcd_info_t I, const thread_pool_handle * handles, slong num_workers); -int nmod_mpolyn_gcd_brown_smprime(nmod_mpolyn_t G, nmod_mpolyn_t Abar, nmod_mpolyn_t Bbar, nmod_mpolyn_t A, nmod_mpolyn_t B, slong var, const nmod_mpoly_ctx_t ctx, const mpoly_gcd_info_t I, nmod_poly_stack_t Sp); - -int nmod_mpolyn_gcd_brown_lgprime(nmod_mpolyn_t G, nmod_mpolyn_t Abar, nmod_mpolyn_t Bbar, nmod_mpolyn_t A, nmod_mpolyn_t B, slong var, const nmod_mpoly_ctx_t ctx); - -nmod_gcds_ret_t nmod_mpolyu_gcds_zippel(nmod_mpolyu_t G, nmod_mpolyu_t A, nmod_mpolyu_t B, nmod_mpolyu_t f, slong var, const nmod_mpoly_ctx_t ctx, flint_rand_t randstate, slong * degbound); - -int nmod_mpolyu_gcdp_zippel(nmod_mpolyu_t G, nmod_mpolyu_t Abar, nmod_mpolyu_t Bbar, nmod_mpolyu_t A, nmod_mpolyu_t B, slong var, const nmod_mpoly_ctx_t ctx, flint_rand_t randstate); - -void nmod_mpoly_to_mpolyl_perm_deflate(nmod_mpoly_t A, const nmod_mpoly_ctx_t lctx, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx, const slong * perm, const ulong * shift, const ulong * stride); - -void nmod_mpoly_from_mpolyl_perm_inflate(nmod_mpoly_t A, flint_bitcnt_t Abits, const nmod_mpoly_ctx_t ctx, const nmod_mpoly_t B, const nmod_mpoly_ctx_t lctx, const slong * perm, const ulong * shift, const ulong * stride); - -int nmod_mpolyl_gcd_hensel_smprime(nmod_mpoly_t G, slong Gdeg, nmod_mpoly_t Abar, nmod_mpoly_t Bbar, const nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); -int nmod_mpolyl_gcd_zippel_smprime(nmod_mpoly_t rG, const slong * rGdegs /* guess at rG degrees, can be NULL */, nmod_mpoly_t rAbar, nmod_mpoly_t rBbar, const nmod_mpoly_t A, const slong * Adegs, const nmod_mpoly_t B, const slong * Bdegs, const nmod_mpoly_t gamma, const slong * gammadegs, const nmod_mpoly_ctx_t ctx); -int nmod_mpolyl_gcd_hensel_medprime(nmod_mpoly_t G, slong Gdeg, nmod_mpoly_t Abar, nmod_mpoly_t Bbar, const nmod_mpoly_t smA, const nmod_mpoly_t smB, const nmod_mpoly_ctx_t smctx); -int nmod_mpolyl_gcd_zippel_lgprime(nmod_mpoly_t rG, const slong * rGdegs /* guess at rG degrees, can be NULL */, nmod_mpoly_t rAbar, nmod_mpoly_t rBbar, const nmod_mpoly_t A, const slong * Adegs, const nmod_mpoly_t B, const slong * Bdegs, const nmod_mpoly_t gamma, const slong * gammadegs, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_monomial_evals_cache(n_poly_t E, const ulong * Aexps, flint_bitcnt_t Abits, slong Alen, const mp_limb_t * betas, slong start, slong stop, const mpoly_ctx_t mctx, nmod_t mod); -void _nmod_mpoly_monomial_evals2_cache(n_polyun_t E, const ulong * Aexps, flint_bitcnt_t Abits, slong Alen, const mp_limb_t * betas, slong m, const mpoly_ctx_t ctx, nmod_t mod); +int nmod_mpoly_gcd_get_use_new( + slong rGdeg, + slong Adeg, + slong Bdeg, + slong gammadeg, + slong degxAB, + slong degyAB, + slong numABgamma, + const n_polyun_t G, + const n_polyun_t Abar, + const n_polyun_t Bbar); + +void nmod_mpolyu_setform_mpolyun( + nmod_mpolyu_t A, + nmod_mpolyun_t B, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpolyn_gcd_brown_smprime_bivar( + nmod_mpolyn_t G, + nmod_mpolyn_t Abar, + nmod_mpolyn_t Bbar, + nmod_mpolyn_t A, + nmod_mpolyn_t B, + const nmod_mpoly_ctx_t ctx, + nmod_poly_stack_t Sp); +int nmod_mpolyn_gcd_brown_smprime_threaded_pool( + nmod_mpolyn_t G, + nmod_mpolyn_t Abar, + nmod_mpolyn_t Bbar, + nmod_mpolyn_t A, + nmod_mpolyn_t B, + slong var, + const nmod_mpoly_ctx_t ctx, + const mpoly_gcd_info_t I, + const thread_pool_handle * handles, + slong num_workers); +int nmod_mpolyn_gcd_brown_smprime( + nmod_mpolyn_t G, + nmod_mpolyn_t Abar, + nmod_mpolyn_t Bbar, + nmod_mpolyn_t A, + nmod_mpolyn_t B, + slong var, + const nmod_mpoly_ctx_t ctx, + const mpoly_gcd_info_t I, + nmod_poly_stack_t Sp); + +int nmod_mpolyn_gcd_brown_lgprime( + nmod_mpolyn_t G, + nmod_mpolyn_t Abar, + nmod_mpolyn_t Bbar, + nmod_mpolyn_t A, + nmod_mpolyn_t B, + slong var, + const nmod_mpoly_ctx_t ctx); + +nmod_gcds_ret_t nmod_mpolyu_gcds_zippel( + nmod_mpolyu_t G, + nmod_mpolyu_t A, + nmod_mpolyu_t B, + nmod_mpolyu_t f, + slong var, + const nmod_mpoly_ctx_t ctx, + flint_rand_t randstate, + slong * degbound); + +int nmod_mpolyu_gcdp_zippel( + nmod_mpolyu_t G, + nmod_mpolyu_t Abar, + nmod_mpolyu_t Bbar, + nmod_mpolyu_t A, + nmod_mpolyu_t B, + slong var, + const nmod_mpoly_ctx_t ctx, + flint_rand_t randstate); + +void nmod_mpoly_to_mpolyl_perm_deflate( + nmod_mpoly_t A, + const nmod_mpoly_ctx_t lctx, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx, + const slong * perm, + const ulong * shift, + const ulong * stride); + +void nmod_mpoly_from_mpolyl_perm_inflate( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const nmod_mpoly_ctx_t ctx, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t lctx, + const slong * perm, + const ulong * shift, + const ulong * stride); + +int nmod_mpolyl_gcd_hensel_smprime( + nmod_mpoly_t G, + slong Gdeg, + nmod_mpoly_t Abar, + nmod_mpoly_t Bbar, + const nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); +int nmod_mpolyl_gcd_zippel_smprime( + nmod_mpoly_t rG, + const slong * rGdegs /* guess at rG degrees, + can be NULL */, + nmod_mpoly_t rAbar, + nmod_mpoly_t rBbar, + const nmod_mpoly_t A, + const slong * Adegs, + const nmod_mpoly_t B, + const slong * Bdegs, + const nmod_mpoly_t gamma, + const slong * gammadegs, + const nmod_mpoly_ctx_t ctx); +int nmod_mpolyl_gcd_hensel_medprime( + nmod_mpoly_t G, + slong Gdeg, + nmod_mpoly_t Abar, + nmod_mpoly_t Bbar, + const nmod_mpoly_t smA, + const nmod_mpoly_t smB, + const nmod_mpoly_ctx_t smctx); +int nmod_mpolyl_gcd_zippel_lgprime( + nmod_mpoly_t rG, + const slong * rGdegs /* guess at rG degrees, + can be NULL */, + nmod_mpoly_t rAbar, + nmod_mpoly_t rBbar, + const nmod_mpoly_t A, + const slong * Adegs, + const nmod_mpoly_t B, + const slong * Bdegs, + const nmod_mpoly_t gamma, + const slong * gammadegs, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_monomial_evals_cache( + n_poly_t E, + const ulong * Aexps, + flint_bitcnt_t Abits, + slong Alen, + const mp_limb_t * betas, + slong start, + slong stop, + const mpoly_ctx_t mctx, + nmod_t mod); +void _nmod_mpoly_monomial_evals2_cache( + n_polyun_t E, + const ulong * Aexps, + flint_bitcnt_t Abits, + slong Alen, + const mp_limb_t * betas, + slong m, + const mpoly_ctx_t ctx, + nmod_t mod); /* interp ********************************************************************/ -void _nmod_poly_eval2_pow(mp_limb_t * vp, mp_limb_t * vm, n_poly_t P, n_poly_t alphapow, nmod_t fctx); - -void nmod_mpolyn_interp_reduce_2sm_poly(n_poly_t E, n_poly_t F, const nmod_mpolyn_t A, n_poly_t alphapow, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyn_interp_reduce_2sm_mpolyn(nmod_mpolyn_t E, nmod_mpolyn_t F, nmod_mpolyn_t A, slong var, n_poly_t alphapow, const nmod_mpoly_ctx_t ctx); - -void nmod_mpolyun_interp_reduce_sm_mpolyu(nmod_mpolyu_t B, nmod_mpolyun_t A, mp_limb_t alpha, const nmod_mpoly_ctx_t ctx); - -void nmod_mpolyn_interp_lift_2sm_poly(slong * lastdeg_, nmod_mpolyn_t F, const n_poly_t A, const n_poly_t B, mp_limb_t alpha, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyn_interp_lift_2sm_mpolyn(slong * lastdeg, nmod_mpolyn_t T, nmod_mpolyn_t A, nmod_mpolyn_t B, slong var, mp_limb_t alpha, const nmod_mpoly_ctx_t ctx); - -void nmod_mpolyn_interp_lift_sm_bpoly(nmod_mpolyn_t F, n_bpoly_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyn_interp_lift_sm_mpoly(nmod_mpolyn_t A, const nmod_mpoly_t B, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyun_interp_lift_sm_mpolyu(nmod_mpolyun_t A, const nmod_mpolyu_t B, const nmod_mpoly_ctx_t ctx); - -int nmod_mpolyn_interp_crt_2sm_poly(slong * lastdeg_, nmod_mpolyn_t F, nmod_mpolyn_t T, const n_poly_t A, const n_poly_t B, const n_poly_t modulus, n_poly_t alphapow, const nmod_mpoly_ctx_t ctx); -int nmod_mpolyn_interp_crt_2sm_mpolyn(slong * lastdeg, nmod_mpolyn_t F, nmod_mpolyn_t T, nmod_mpolyn_t A, nmod_mpolyn_t B, slong var, n_poly_t modulus, n_poly_t alphapow, const nmod_mpoly_ctx_t ctx); - -int nmod_mpolyn_interp_crt_sm_bpoly(slong * lastdeg, nmod_mpolyn_t F, nmod_mpolyn_t T, n_bpoly_t A, n_poly_t modulus, n_poly_t alphapow, const nmod_mpoly_ctx_t ctx); -int nmod_mpolyn_interp_crt_sm_mpoly(slong * lastdeg, nmod_mpolyn_t F, nmod_mpolyn_t T, nmod_mpoly_t A, n_poly_t modulus, mp_limb_t alpha, const nmod_mpoly_ctx_t ctx); -int nmod_mpolyun_interp_crt_sm_mpolyu(slong * lastdeg, nmod_mpolyun_t F, nmod_mpolyun_t T, nmod_mpolyu_t A, n_poly_t modulus, mp_limb_t alpha, const nmod_mpoly_ctx_t ctx); - -int nmod_mpolyn_interp_mcrt_sm_mpoly(slong * lastdeg_, nmod_mpolyn_t F, const nmod_mpoly_t A, const n_poly_t modulus, n_poly_t alphapow, const nmod_mpoly_ctx_t ctx); +void _nmod_poly_eval2_pow( + mp_limb_t * vp, + mp_limb_t * vm, + n_poly_t P, + n_poly_t alphapow, + nmod_t fctx); + +void nmod_mpolyn_interp_reduce_2sm_poly( + n_poly_t E, + n_poly_t F, + const nmod_mpolyn_t A, + n_poly_t alphapow, + const nmod_mpoly_ctx_t ctx); +void nmod_mpolyn_interp_reduce_2sm_mpolyn( + nmod_mpolyn_t E, + nmod_mpolyn_t F, + nmod_mpolyn_t A, + slong var, + n_poly_t alphapow, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpolyun_interp_reduce_sm_mpolyu( + nmod_mpolyu_t B, + nmod_mpolyun_t A, + mp_limb_t alpha, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpolyn_interp_lift_2sm_poly( + slong * lastdeg_, + nmod_mpolyn_t F, + const n_poly_t A, + const n_poly_t B, + mp_limb_t alpha, + const nmod_mpoly_ctx_t ctx); +void nmod_mpolyn_interp_lift_2sm_mpolyn( + slong * lastdeg, + nmod_mpolyn_t T, + nmod_mpolyn_t A, + nmod_mpolyn_t B, + slong var, + mp_limb_t alpha, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpolyn_interp_lift_sm_bpoly( + nmod_mpolyn_t F, + n_bpoly_t A, + const nmod_mpoly_ctx_t ctx); +void nmod_mpolyn_interp_lift_sm_mpoly( + nmod_mpolyn_t A, + const nmod_mpoly_t B, + const nmod_mpoly_ctx_t ctx); +void nmod_mpolyun_interp_lift_sm_mpolyu( + nmod_mpolyun_t A, + const nmod_mpolyu_t B, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpolyn_interp_crt_2sm_poly( + slong * lastdeg_, + nmod_mpolyn_t F, + nmod_mpolyn_t T, + const n_poly_t A, + const n_poly_t B, + const n_poly_t modulus, + n_poly_t alphapow, + const nmod_mpoly_ctx_t ctx); +int nmod_mpolyn_interp_crt_2sm_mpolyn( + slong * lastdeg, + nmod_mpolyn_t F, + nmod_mpolyn_t T, + nmod_mpolyn_t A, + nmod_mpolyn_t B, + slong var, + n_poly_t modulus, + n_poly_t alphapow, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpolyn_interp_crt_sm_bpoly( + slong * lastdeg, + nmod_mpolyn_t F, + nmod_mpolyn_t T, + n_bpoly_t A, + n_poly_t modulus, + n_poly_t alphapow, + const nmod_mpoly_ctx_t ctx); +int nmod_mpolyn_interp_crt_sm_mpoly( + slong * lastdeg, + nmod_mpolyn_t F, + nmod_mpolyn_t T, + nmod_mpoly_t A, + n_poly_t modulus, + mp_limb_t alpha, + const nmod_mpoly_ctx_t ctx); +int nmod_mpolyun_interp_crt_sm_mpolyu( + slong * lastdeg, + nmod_mpolyun_t F, + nmod_mpolyun_t T, + nmod_mpolyu_t A, + n_poly_t modulus, + mp_limb_t alpha, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpolyn_interp_mcrt_sm_mpoly( + slong * lastdeg_, + nmod_mpolyn_t F, + const nmod_mpoly_t A, + const n_poly_t modulus, + n_poly_t alphapow, + const nmod_mpoly_ctx_t ctx); /* geobuckets ****************************************************************/ @@ -951,14 +2259,29 @@ typedef nmod_mpoly_geobucket_struct nmod_mpoly_geobucket_t[1]; void nmod_mpoly_geobucket_init(nmod_mpoly_geobucket_t B, const nmod_mpoly_ctx_t ctx); void nmod_mpoly_geobucket_clear(nmod_mpoly_geobucket_t B, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_geobucket_empty(nmod_mpoly_t p, nmod_mpoly_geobucket_t B, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_geobucket_fit_length(nmod_mpoly_geobucket_t B, slong i, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_geobucket_set(nmod_mpoly_geobucket_t B, nmod_mpoly_t p, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_geobucket_add(nmod_mpoly_geobucket_t B, nmod_mpoly_t p, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_geobucket_sub(nmod_mpoly_geobucket_t B, nmod_mpoly_t p, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_geobucket_empty( + nmod_mpoly_t p, + nmod_mpoly_geobucket_t B, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_geobucket_fit_length( + nmod_mpoly_geobucket_t B, + slong i, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_geobucket_set( + nmod_mpoly_geobucket_t B, + nmod_mpoly_t p, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_geobucket_add( + nmod_mpoly_geobucket_t B, + nmod_mpoly_t p, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_geobucket_sub( + nmod_mpoly_geobucket_t B, + nmod_mpoly_t p, + const nmod_mpoly_ctx_t ctx); /****************************************************************************** @@ -966,7 +2289,10 @@ void nmod_mpoly_geobucket_sub(nmod_mpoly_geobucket_t B, nmod_mpoly_t p, const nm ******************************************************************************/ -void nmod_mpoly_remainder_strongtest(const nmod_mpoly_t r, const nmod_mpoly_t g, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_remainder_strongtest( + const nmod_mpoly_t r, + const nmod_mpoly_t g, + const nmod_mpoly_ctx_t ctx); #ifdef __cplusplus } diff --git a/src/nmod_mpoly_factor.h b/src/nmod_mpoly_factor.h index edf0938992..0bc100e836 100644 --- a/src/nmod_mpoly_factor.h +++ b/src/nmod_mpoly_factor.h @@ -25,10 +25,26 @@ extern "C" { #endif -void nmod_mpoly_get_bpoly(n_bpoly_t A, const nmod_mpoly_t B, slong var0, slong var1, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_set_bpoly(nmod_mpoly_t A, flint_bitcnt_t Abits, const n_bpoly_t B, slong var0, slong var1, const nmod_mpoly_ctx_t ctx); - -int n_bpoly_mod_factor_smprime(n_poly_t c, n_tpoly_t F, n_bpoly_t B, int allow_shift, nmod_t ctx); +void nmod_mpoly_get_bpoly( + n_bpoly_t A, + const nmod_mpoly_t B, + slong var0, + slong var1, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_set_bpoly( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const n_bpoly_t B, + slong var0, + slong var1, + const nmod_mpoly_ctx_t ctx); + +int n_bpoly_mod_factor_smprime( + n_poly_t c, + n_tpoly_t F, + n_bpoly_t B, + int allow_shift, + nmod_t ctx); void n_bpoly_mod_factor_lgprime(n_poly_t c, n_tpoly_t F, n_bpoly_t B, nmod_t ctx); /*****************************************************************************/ @@ -39,43 +55,109 @@ void nmod_mat_init_nullspace_tr(nmod_mat_t X, nmod_mat_t tmp); /*****************************************************************************/ -NMOD_MPOLY_FACTOR_INLINE void nmod_mpoly_factor_init(nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx) { f->constant = 1; f->poly = NULL; f->exp = NULL; f->num = 0; f->alloc = 0; } -void nmod_mpoly_factor_init2(nmod_mpoly_factor_t f, slong alloc, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_factor_realloc(nmod_mpoly_factor_t f, slong alloc, const nmod_mpoly_ctx_t ctx); +NMOD_MPOLY_FACTOR_INLINE +void nmod_mpoly_factor_init(nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx) +{ + f->constant = 1; f->poly = NULL; f->exp = NULL; f->num = 0; f->alloc = 0; +} +void nmod_mpoly_factor_init2( + nmod_mpoly_factor_t f, + slong alloc, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_factor_realloc( + nmod_mpoly_factor_t f, + slong alloc, + const nmod_mpoly_ctx_t ctx); void nmod_mpoly_factor_clear(nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_factor_fit_length(nmod_mpoly_factor_t f, slong len, const nmod_mpoly_ctx_t ctx); - -NMOD_MPOLY_FACTOR_INLINE slong nmod_mpoly_factor_length(const nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx) { return f->num; } - -NMOD_MPOLY_FACTOR_INLINE ulong nmod_mpoly_factor_get_constant_ui(const nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx) { return f->constant; } - -NMOD_MPOLY_FACTOR_INLINE void nmod_mpoly_factor_get_base(nmod_mpoly_t p, const nmod_mpoly_factor_t f, slong i, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); nmod_mpoly_set(p, f->poly + i, ctx); } - -NMOD_MPOLY_FACTOR_INLINE void nmod_mpoly_factor_swap_base(nmod_mpoly_t p, nmod_mpoly_factor_t f, slong i, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); nmod_mpoly_swap(p, f->poly + i, ctx); } +void nmod_mpoly_factor_fit_length( + nmod_mpoly_factor_t f, + slong len, + const nmod_mpoly_ctx_t ctx); -NMOD_MPOLY_FACTOR_INLINE slong nmod_mpoly_factor_get_exp_si(nmod_mpoly_factor_t f, slong i, const nmod_mpoly_ctx_t ctx) { FLINT_ASSERT(i < (ulong) f->num); return fmpz_get_si(f->exp + i); } - -void nmod_mpoly_factor_append_ui(nmod_mpoly_factor_t f, const nmod_mpoly_t A, ulong e, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_factor_append_fmpz(nmod_mpoly_factor_t f, const nmod_mpoly_t A, const fmpz_t e, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_factor_set(nmod_mpoly_factor_t f, const nmod_mpoly_factor_t g, const nmod_mpoly_ctx_t ctx); +NMOD_MPOLY_FACTOR_INLINE +slong nmod_mpoly_factor_length(const nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx) +{ + return f->num; +} -void nmod_mpoly_factor_print_pretty(const nmod_mpoly_factor_t f, const char ** vars, const nmod_mpoly_ctx_t ctx); +NMOD_MPOLY_FACTOR_INLINE +ulong nmod_mpoly_factor_get_constant_ui(const nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx) +{ + return f->constant; +} -int nmod_mpoly_factor_content(nmod_mpoly_factor_t f, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); +NMOD_MPOLY_FACTOR_INLINE +void nmod_mpoly_factor_get_base(nmod_mpoly_t p, const nmod_mpoly_factor_t f, slong i, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); nmod_mpoly_set(p, f->poly + i, ctx); +} -int nmod_mpoly_factor_squarefree(nmod_mpoly_factor_t f, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); +NMOD_MPOLY_FACTOR_INLINE +void nmod_mpoly_factor_swap_base(nmod_mpoly_t p, nmod_mpoly_factor_t f, slong i, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); nmod_mpoly_swap(p, f->poly + i, ctx); +} -int nmod_mpoly_factor_separable(nmod_mpoly_factor_t f, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, int sep); +NMOD_MPOLY_FACTOR_INLINE +slong nmod_mpoly_factor_get_exp_si(nmod_mpoly_factor_t f, slong i, const nmod_mpoly_ctx_t ctx) +{ + FLINT_ASSERT(i < (ulong) f->num); return fmpz_get_si(f->exp + i); +} -int nmod_mpoly_factor(nmod_mpoly_factor_t f, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_factor_append_ui( + nmod_mpoly_factor_t f, + const nmod_mpoly_t A, + ulong e, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_factor_append_fmpz( + nmod_mpoly_factor_t f, + const nmod_mpoly_t A, + const fmpz_t e, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_factor_set( + nmod_mpoly_factor_t f, + const nmod_mpoly_factor_t g, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_factor_print_pretty( + const nmod_mpoly_factor_t f, + const char ** vars, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_factor_content( + nmod_mpoly_factor_t f, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_factor_squarefree( + nmod_mpoly_factor_t f, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_factor_separable( + nmod_mpoly_factor_t f, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx, + int sep); + +int nmod_mpoly_factor( + nmod_mpoly_factor_t f, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx); void nmod_mpoly_factor_sort(nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_factor_cmp(const nmod_mpoly_factor_t A, const nmod_mpoly_factor_t B, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_factor_cmp( + const nmod_mpoly_factor_t A, + const nmod_mpoly_factor_t B, + const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_factor_expand(nmod_mpoly_t A, const nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_factor_expand( + nmod_mpoly_t A, + const nmod_mpoly_factor_t f, + const nmod_mpoly_ctx_t ctx); NMOD_MPOLY_FACTOR_INLINE int nmod_mpoly_factor_matches(const nmod_mpoly_t a, const nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx) @@ -91,31 +173,76 @@ int nmod_mpoly_factor_matches(const nmod_mpoly_t a, const nmod_mpoly_factor_t f, int nmod_mpoly_factor_fix_units(nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx); -NMOD_MPOLY_FACTOR_INLINE void nmod_mpoly_factor_swap(nmod_mpoly_factor_t f, nmod_mpoly_factor_t g, const nmod_mpoly_ctx_t ctx) { FLINT_SWAP(nmod_mpoly_factor_struct, *f, *g); } +NMOD_MPOLY_FACTOR_INLINE +void nmod_mpoly_factor_swap(nmod_mpoly_factor_t f, nmod_mpoly_factor_t g, const nmod_mpoly_ctx_t ctx) +{ + FLINT_SWAP(nmod_mpoly_factor_struct, *f, *g); +} -NMOD_MPOLY_FACTOR_INLINE void nmod_mpoly_factor_one(nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx) { f->constant = 1; f->num = 0; } +NMOD_MPOLY_FACTOR_INLINE +void nmod_mpoly_factor_one(nmod_mpoly_factor_t f, const nmod_mpoly_ctx_t ctx) +{ + f->constant = 1; f->num = 0; +} -void _nmod_mpoly_get_lead0(nmod_mpoly_t c, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); -void _nmod_mpoly_set_lead0(nmod_mpoly_t A, const nmod_mpoly_t B, const nmod_mpoly_t c, const nmod_mpoly_ctx_t ctx); +void _nmod_mpoly_get_lead0( + nmod_mpoly_t c, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx); +void _nmod_mpoly_set_lead0( + nmod_mpoly_t A, + const nmod_mpoly_t B, + const nmod_mpoly_t c, + const nmod_mpoly_ctx_t ctx); /* n_poly_vec ****************************************************************/ slong _n_poly_vec_max_degree(const n_poly_struct * A, slong Alen); -void _n_poly_vec_mul_nmod_intertible(n_poly_struct * A, slong Alen, mp_limb_t c, nmod_t ctx); - -void _n_poly_vec_mod_mul_poly(n_poly_struct * A, slong Alen, const n_poly_t g, const nmod_t ctx); - -void _n_poly_vec_mod_divexact_poly(n_poly_struct * A, slong Alen, const n_poly_t g, nmod_t ctx); - -void _n_poly_vec_mod_content(n_poly_t g, const n_poly_struct * A, slong Alen, nmod_t ctx); - -void _n_poly_vec_mod_remove_content(n_poly_t g, n_poly_struct * A, slong Alen, nmod_t ctx); +void _n_poly_vec_mul_nmod_intertible( + n_poly_struct * A, + slong Alen, + mp_limb_t c, + nmod_t ctx); + +void _n_poly_vec_mod_mul_poly( + n_poly_struct * A, + slong Alen, + const n_poly_t g, + const nmod_t ctx); + +void _n_poly_vec_mod_divexact_poly( + n_poly_struct * A, + slong Alen, + const n_poly_t g, + nmod_t ctx); + +void _n_poly_vec_mod_content( + n_poly_t g, + const n_poly_struct * A, + slong Alen, + nmod_t ctx); + +void _n_poly_vec_mod_remove_content( + n_poly_t g, + n_poly_struct * A, + slong Alen, + nmod_t ctx); /* polyun ********************************************************************/ -void nmod_mpoly_get_polyu1n(n_polyun_t A, const nmod_mpoly_t B, slong varx, slong vary, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_set_polyu1n(nmod_mpoly_t B, const n_polyun_t A, slong varx, slong vary, const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_get_polyu1n( + n_polyun_t A, + const nmod_mpoly_t B, + slong varx, + slong vary, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_set_polyu1n( + nmod_mpoly_t B, + const n_polyun_t A, + slong varx, + slong vary, + const nmod_mpoly_ctx_t ctx); /*****************************************************************************/ @@ -128,54 +255,166 @@ typedef struct typedef nmod_mpolyv_struct nmod_mpolyv_t[1]; -NMOD_MPOLY_FACTOR_INLINE void nmod_mpolyv_init(nmod_mpolyv_t A, const nmod_mpoly_ctx_t ctx) { A->coeffs = NULL; A->alloc = 0; A->length = 0; } +NMOD_MPOLY_FACTOR_INLINE +void nmod_mpolyv_init(nmod_mpolyv_t A, const nmod_mpoly_ctx_t ctx) +{ + A->coeffs = NULL; A->alloc = 0; A->length = 0; +} void nmod_mpolyv_clear(nmod_mpolyv_t A, const nmod_mpoly_ctx_t ctx); -NMOD_MPOLY_FACTOR_INLINE void nmod_mpolyv_swap(nmod_mpolyv_t A, nmod_mpolyv_t B, const nmod_mpoly_ctx_t ctx) { FLINT_SWAP(nmod_mpolyv_struct, *A, *B); } +NMOD_MPOLY_FACTOR_INLINE +void nmod_mpolyv_swap(nmod_mpolyv_t A, nmod_mpolyv_t B, const nmod_mpoly_ctx_t ctx) +{ + FLINT_SWAP(nmod_mpolyv_struct, *A, *B); +} -void nmod_mpolyv_print_pretty(const nmod_mpolyv_t poly, const char ** x, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyv_print_pretty( + const nmod_mpolyv_t poly, + const char ** x, + const nmod_mpoly_ctx_t ctx); void nmod_mpolyv_fit_length(nmod_mpolyv_t A, slong length, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyv_set_coeff(nmod_mpolyv_t A, slong i, nmod_mpoly_t c, const nmod_mpoly_ctx_t ctx); - -void nmod_mpoly_to_mpolyv(nmod_mpolyv_t A, const nmod_mpoly_t B, const nmod_mpoly_t xalpha, const nmod_mpoly_ctx_t ctx); -void nmod_mpoly_from_mpolyv(nmod_mpoly_t A, flint_bitcnt_t Abits, const nmod_mpolyv_t B, const nmod_mpoly_t xalpha, const nmod_mpoly_ctx_t ctx); - -int _nmod_mpoly_vec_content_mpoly(nmod_mpoly_t g, const nmod_mpoly_struct * A, slong Alen, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_vec_divexact_mpoly(nmod_mpoly_struct * A, slong Alen, const nmod_mpoly_t c, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_vec_mul_mpoly(nmod_mpoly_struct * A, slong Alen, const nmod_mpoly_t c, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyv_set_coeff( + nmod_mpolyv_t A, + slong i, + nmod_mpoly_t c, + const nmod_mpoly_ctx_t ctx); + +void nmod_mpoly_to_mpolyv( + nmod_mpolyv_t A, + const nmod_mpoly_t B, + const nmod_mpoly_t xalpha, + const nmod_mpoly_ctx_t ctx); +void nmod_mpoly_from_mpolyv( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const nmod_mpolyv_t B, + const nmod_mpoly_t xalpha, + const nmod_mpoly_ctx_t ctx); + +int _nmod_mpoly_vec_content_mpoly( + nmod_mpoly_t g, + const nmod_mpoly_struct * A, + slong Alen, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_vec_divexact_mpoly( + nmod_mpoly_struct * A, + slong Alen, + const nmod_mpoly_t c, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_vec_mul_mpoly( + nmod_mpoly_struct * A, + slong Alen, + const nmod_mpoly_t c, + const nmod_mpoly_ctx_t ctx); /*****************************************************************************/ -int _nmod_mpoly_factor_separable(nmod_mpoly_factor_t f, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, int sep); - -int nmod_mpoly_factor_lcc_wang(nmod_mpoly_struct * lc_divs, const nmod_mpoly_factor_t lcAfac, const n_poly_t Auc, const n_bpoly_struct * Auf, slong r, const n_poly_struct * alpha, const nmod_mpoly_ctx_t ctx); - -int nmod_mpoly_factor_irred_smprime_zassenhaus(nmod_mpolyv_t fac, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, flint_rand_t state); -int nmod_mpoly_factor_irred_medprime_zassenhaus(nmod_mpolyv_t fac, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, flint_rand_t state); -int nmod_mpoly_factor_irred_lgprime_zassenhaus(nmod_mpolyv_t fac, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, flint_rand_t state); - -int nmod_mpoly_factor_irred_smprime_wang(nmod_mpolyv_t fac, const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac, const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state); -int nmod_mpoly_factor_irred_medprime_wang(nmod_mpolyv_t Af, const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac, const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state); -int nmod_mpoly_factor_irred_lgprime_wang(nmod_mpolyv_t Af, const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac, const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state); - -int nmod_mpoly_factor_irred_smprime_zippel(nmod_mpolyv_t fac, const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac, const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state); -int nmod_mpoly_factor_irred_medprime_zippel(nmod_mpolyv_t Af, const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac, const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state); -int nmod_mpoly_factor_irred_lgprime_zippel(nmod_mpolyv_t Af, const nmod_mpoly_t A, const nmod_mpoly_factor_t lcAfac, const nmod_mpoly_t lcA, const nmod_mpoly_ctx_t ctx, flint_rand_t state); +int _nmod_mpoly_factor_separable( + nmod_mpoly_factor_t f, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx, + int sep); + +int nmod_mpoly_factor_lcc_wang( + nmod_mpoly_struct * lc_divs, + const nmod_mpoly_factor_t lcAfac, + const n_poly_t Auc, + const n_bpoly_struct * Auf, + slong r, + const n_poly_struct * alpha, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_factor_irred_smprime_zassenhaus( + nmod_mpolyv_t fac, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state); +int nmod_mpoly_factor_irred_medprime_zassenhaus( + nmod_mpolyv_t fac, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state); +int nmod_mpoly_factor_irred_lgprime_zassenhaus( + nmod_mpolyv_t fac, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state); + +int nmod_mpoly_factor_irred_smprime_wang( + nmod_mpolyv_t fac, + const nmod_mpoly_t A, + const nmod_mpoly_factor_t lcAfac, + const nmod_mpoly_t lcA, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state); +int nmod_mpoly_factor_irred_medprime_wang( + nmod_mpolyv_t Af, + const nmod_mpoly_t A, + const nmod_mpoly_factor_t lcAfac, + const nmod_mpoly_t lcA, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state); +int nmod_mpoly_factor_irred_lgprime_wang( + nmod_mpolyv_t Af, + const nmod_mpoly_t A, + const nmod_mpoly_factor_t lcAfac, + const nmod_mpoly_t lcA, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state); + +int nmod_mpoly_factor_irred_smprime_zippel( + nmod_mpolyv_t fac, + const nmod_mpoly_t A, + const nmod_mpoly_factor_t lcAfac, + const nmod_mpoly_t lcA, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state); +int nmod_mpoly_factor_irred_medprime_zippel( + nmod_mpolyv_t Af, + const nmod_mpoly_t A, + const nmod_mpoly_factor_t lcAfac, + const nmod_mpoly_t lcA, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state); +int nmod_mpoly_factor_irred_lgprime_zippel( + nmod_mpolyv_t Af, + const nmod_mpoly_t A, + const nmod_mpoly_factor_t lcAfac, + const nmod_mpoly_t lcA, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state); /*****************************************************************************/ -void nmod_mpoly_compression_do(nmod_mpoly_t L, const nmod_mpoly_ctx_t Lctx, mp_limb_t * Acoeffs, slong Alen, mpoly_compression_t M); -void nmod_mpoly_compression_undo(nmod_mpoly_t A, flint_bitcnt_t Abits, const nmod_mpoly_ctx_t Actx, nmod_mpoly_t L, const nmod_mpoly_ctx_t Lctx, mpoly_compression_t M); +void nmod_mpoly_compression_do( + nmod_mpoly_t L, + const nmod_mpoly_ctx_t Lctx, + mp_limb_t * Acoeffs, + slong Alen, + mpoly_compression_t M); +void nmod_mpoly_compression_undo( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const nmod_mpoly_ctx_t Actx, + nmod_mpoly_t L, + const nmod_mpoly_ctx_t Lctx, + mpoly_compression_t M); /*****************************************************************************/ int nmod_mpolyu_is_canonical(const nmod_mpolyu_t A, const nmod_mpoly_ctx_t ctx); -void nmod_mpolyu3_print_pretty(const nmod_mpolyu_t A, const char * var0, const char * var1, const char * var2, const char ** vars, const nmod_mpoly_ctx_t ctx); +void nmod_mpolyu3_print_pretty( + const nmod_mpolyu_t A, + const char * var0, + const char * var1, + const char * var2, + const char ** vars, + const nmod_mpoly_ctx_t ctx); /*****************************************************************************/ @@ -205,54 +444,214 @@ typedef struct typedef nmod_mpoly_pfrac_struct nmod_mpoly_pfrac_t[1]; -int nmod_mpoly_pfrac_init(nmod_mpoly_pfrac_t I, flint_bitcnt_t bits, slong l, slong r, const nmod_mpoly_struct * betas, const mp_limb_t * alpha, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_pfrac_init( + nmod_mpoly_pfrac_t I, + flint_bitcnt_t bits, + slong l, + slong r, + const nmod_mpoly_struct * betas, + const mp_limb_t * alpha, + const nmod_mpoly_ctx_t ctx); void nmod_mpoly_pfrac_clear(nmod_mpoly_pfrac_t I, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_pfrac(slong r, nmod_mpoly_t t, const slong * deg, nmod_mpoly_pfrac_t I, const nmod_mpoly_ctx_t ctx); - -int nmod_mpoly_hlift(slong m, nmod_mpoly_struct * f, slong r, const mp_limb_t * alpha, const nmod_mpoly_t A, const slong * degs, const nmod_mpoly_ctx_t ctx); - -int n_bpoly_mod_pfrac(slong r, n_bpoly_struct * C, slong * C_deg1_bound, n_bpoly_t A, n_bpoly_struct * B, nmod_t mod); - -int n_bpoly_mod_hlift2(n_bpoly_t A, n_bpoly_t B0, n_bpoly_t B1, mp_limb_t alpha, slong degree_inner, nmod_t mod, n_poly_bpoly_stack_t St); -int n_bpoly_mod_hlift2_cubic(n_bpoly_t A, n_bpoly_t B0, n_bpoly_t B1, mp_limb_t alpha, slong degree_inner, nmod_t ctx, nmod_eval_interp_t E, n_poly_bpoly_stack_t St); - -int n_bpoly_mod_hlift(slong r, n_bpoly_t A, n_bpoly_struct * B, mp_limb_t alpha, slong degree_inner, nmod_t mod, n_poly_bpoly_stack_t St); -int n_bpoly_mod_hlift_cubic(slong r, n_bpoly_t A, n_bpoly_struct * B, mp_limb_t alpha, slong degree_inner, nmod_t mod, nmod_eval_interp_t E, n_poly_bpoly_stack_t St); - -int n_polyu3_mod_hlift(slong r, n_polyun_struct * BB, n_polyu_t A, n_polyu_struct * B, mp_limb_t beta, slong degree_inner, nmod_t ctx); - -int nmod_mpoly_hlift_zippel(slong m, nmod_mpoly_struct * B, slong r, const mp_limb_t * alpha, const nmod_mpoly_t A, const slong * degs, const nmod_mpoly_ctx_t ctx, flint_rand_t state); - -int nmod_mpoly_factor_algo(nmod_mpoly_factor_t f, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx, unsigned int algo); -int nmod_mpoly_factor_zassenhaus(nmod_mpoly_factor_t f, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_factor_wang(nmod_mpoly_factor_t f, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); -int nmod_mpoly_factor_zippel(nmod_mpoly_factor_t f, const nmod_mpoly_t A, const nmod_mpoly_ctx_t ctx); - -int _nmod_mpoly_evaluate_rest_n_poly(n_poly_struct * E, slong * starts, slong * ends, slong * stops, ulong * es, const mp_limb_t * Acoeffs, const ulong * Aexps, slong Alen, slong var, const n_poly_struct * alphas, const slong * offsets, const slong * shifts, slong N, ulong mask, slong nvars, nmod_t ctx); - -void _nmod_mpoly_eval_rest_to_n_bpoly(n_bpoly_t E, const nmod_mpoly_t A, const n_poly_struct * alphabetas, const nmod_mpoly_ctx_t ctx); - -void _nmod_mpoly_set_n_bpoly_var1_zero(nmod_mpoly_t A, flint_bitcnt_t Abits, const n_bpoly_t B, slong var, const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_pfrac( + slong r, + nmod_mpoly_t t, + const slong * deg, + nmod_mpoly_pfrac_t I, + const nmod_mpoly_ctx_t ctx); + +int nmod_mpoly_hlift( + slong m, + nmod_mpoly_struct * f, + slong r, + const mp_limb_t * alpha, + const nmod_mpoly_t A, + const slong * degs, + const nmod_mpoly_ctx_t ctx); + +int n_bpoly_mod_pfrac( + slong r, + n_bpoly_struct * C, + slong * C_deg1_bound, + n_bpoly_t A, + n_bpoly_struct * B, + nmod_t mod); + +int n_bpoly_mod_hlift2( + n_bpoly_t A, + n_bpoly_t B0, + n_bpoly_t B1, + mp_limb_t alpha, + slong degree_inner, + nmod_t mod, + n_poly_bpoly_stack_t St); +int n_bpoly_mod_hlift2_cubic( + n_bpoly_t A, + n_bpoly_t B0, + n_bpoly_t B1, + mp_limb_t alpha, + slong degree_inner, + nmod_t ctx, + nmod_eval_interp_t E, + n_poly_bpoly_stack_t St); + +int n_bpoly_mod_hlift( + slong r, + n_bpoly_t A, + n_bpoly_struct * B, + mp_limb_t alpha, + slong degree_inner, + nmod_t mod, + n_poly_bpoly_stack_t St); +int n_bpoly_mod_hlift_cubic( + slong r, + n_bpoly_t A, + n_bpoly_struct * B, + mp_limb_t alpha, + slong degree_inner, + nmod_t mod, + nmod_eval_interp_t E, + n_poly_bpoly_stack_t St); + +int n_polyu3_mod_hlift( + slong r, + n_polyun_struct * BB, + n_polyu_t A, + n_polyu_struct * B, + mp_limb_t beta, + slong degree_inner, + nmod_t ctx); + +int nmod_mpoly_hlift_zippel( + slong m, + nmod_mpoly_struct * B, + slong r, + const mp_limb_t * alpha, + const nmod_mpoly_t A, + const slong * degs, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state); + +int nmod_mpoly_factor_algo( + nmod_mpoly_factor_t f, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx, + unsigned int algo); +int nmod_mpoly_factor_zassenhaus( + nmod_mpoly_factor_t f, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_factor_wang( + nmod_mpoly_factor_t f, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx); +int nmod_mpoly_factor_zippel( + nmod_mpoly_factor_t f, + const nmod_mpoly_t A, + const nmod_mpoly_ctx_t ctx); + +int _nmod_mpoly_evaluate_rest_n_poly( + n_poly_struct * E, slong * starts, + slong * ends, + slong * stops, + ulong * es, + const mp_limb_t * Acoeffs, + const ulong * Aexps, + slong Alen, + slong var, + const n_poly_struct * alphas, + const slong * offsets, + const slong * shifts, + slong N, + ulong mask, + slong nvars, + nmod_t ctx); + +void _nmod_mpoly_eval_rest_to_n_bpoly( + n_bpoly_t E, + const nmod_mpoly_t A, + const n_poly_struct * alphabetas, + const nmod_mpoly_ctx_t ctx); + +void _nmod_mpoly_set_n_bpoly_var1_zero( + nmod_mpoly_t A, + flint_bitcnt_t Abits, + const n_bpoly_t B, + slong var, + const nmod_mpoly_ctx_t ctx); /* gcd ***********************************************************************/ -int nmod_mpolyl_gcdp_zippel_smprime(nmod_mpoly_t G, nmod_mpoly_t Abar, nmod_mpoly_t Bbar, nmod_mpoly_t A, nmod_mpoly_t B, slong var, const nmod_mpoly_ctx_t ctx, flint_rand_t state); - -int nmod_mpolyl_gcds_zippel(nmod_mpoly_t G, const ulong * Gmarks, slong Gmarkslen, nmod_mpoly_t A, nmod_mpoly_t B, slong *perm, slong l, slong var, const nmod_mpoly_ctx_t ctx, flint_rand_t state, slong * Gdegbound, n_poly_t Amarks, n_poly_t Bmarks); +int nmod_mpolyl_gcdp_zippel_smprime( + nmod_mpoly_t G, + nmod_mpoly_t Abar, + nmod_mpoly_t Bbar, + nmod_mpoly_t A, + nmod_mpoly_t B, + slong var, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state); + +int nmod_mpolyl_gcds_zippel( + nmod_mpoly_t G, + const ulong * Gmarks, + slong Gmarkslen, + nmod_mpoly_t A, + nmod_mpoly_t B, + slong *perm, + slong l, + slong var, + const nmod_mpoly_ctx_t ctx, + flint_rand_t state, + slong * Gdegbound, + n_poly_t Amarks, + n_poly_t Bmarks); /* zip helpers ***************************************************************/ -void mpoly_monomial_evals_nmod(n_poly_t EH, const ulong * Aexps, slong Alen, flint_bitcnt_t Abits, n_poly_struct * alpha_caches, slong start, slong stop, const mpoly_ctx_t mctx, const nmod_t fpctx); - -void mpoly1_monomial_evals_nmod(n_polyun_t EH, const ulong * Aexps, flint_bitcnt_t Abits, const ulong * Amarks, slong Amarkslen, n_poly_struct * alpha_caches, slong m, const mpoly_ctx_t mctx, const nmod_t fpctx); -void mpoly2_monomial_evals_nmod(n_polyun_t EH, const ulong * Aexps, flint_bitcnt_t Abits, ulong * Amarks, slong Amarkslen, n_poly_struct * alpha_caches, slong m, const mpoly_ctx_t mctx, const nmod_t fpctx); +void mpoly_monomial_evals_nmod( + n_poly_t EH, + const ulong * Aexps, + slong Alen, + flint_bitcnt_t Abits, + n_poly_struct * alpha_caches, + slong start, + slong stop, + const mpoly_ctx_t mctx, + const nmod_t fpctx); + +void mpoly1_monomial_evals_nmod( + n_polyun_t EH, + const ulong * Aexps, + flint_bitcnt_t Abits, + const ulong * Amarks, + slong Amarkslen, + n_poly_struct * alpha_caches, + slong m, + const mpoly_ctx_t mctx, + const nmod_t fpctx); +void mpoly2_monomial_evals_nmod( + n_polyun_t EH, + const ulong * Aexps, + flint_bitcnt_t Abits, + ulong * Amarks, + slong Amarkslen, + n_poly_struct * alpha_caches, + slong m, + const mpoly_ctx_t mctx, + const nmod_t fpctx); void n_polyun_zip_start(n_polyun_t Z, n_polyun_t H, slong req_images); int n_polyu2n_add_zip_must_match(n_polyun_t Z, const n_bpoly_t A, slong cur_length); -int n_polyun_zip_solve(nmod_mpoly_t A, n_polyun_t Z, n_polyun_t H, n_polyun_t M, const nmod_mpoly_ctx_t ctx); +int n_polyun_zip_solve( + nmod_mpoly_t A, + n_polyun_t Z, + n_polyun_t H, + n_polyun_t M, + const nmod_mpoly_ctx_t ctx); #ifdef __cplusplus } diff --git a/src/nmod_poly.h b/src/nmod_poly.h index 6db6f365e3..eb8a05ae70 100644 --- a/src/nmod_poly.h +++ b/src/nmod_poly.h @@ -107,9 +107,17 @@ void nmod_poly_init_mod(nmod_poly_t poly, const nmod_t mod) poly->mod = mod; } -NMOD_POLY_INLINE void nmod_poly_set_mod(nmod_poly_t poly, const nmod_t mod) { poly->mod = mod; } +NMOD_POLY_INLINE +void nmod_poly_set_mod(nmod_poly_t poly, const nmod_t mod) +{ + poly->mod = mod; +} -NMOD_POLY_INLINE void _nmod_poly_set_length(nmod_poly_t poly, slong len) { poly->length = len; } +NMOD_POLY_INLINE +void _nmod_poly_set_length(nmod_poly_t poly, slong len) +{ + poly->length = len; +} NMOD_POLY_INLINE void _nmod_poly_normalise(nmod_poly_t poly) @@ -120,9 +128,21 @@ void _nmod_poly_normalise(nmod_poly_t poly) /* Polynomial parameters ****************************************************/ -NMOD_POLY_INLINE slong nmod_poly_length(const nmod_poly_t poly) { return poly->length; } -NMOD_POLY_INLINE slong nmod_poly_degree(const nmod_poly_t poly) { return poly->length - 1; } -NMOD_POLY_INLINE mp_limb_t nmod_poly_modulus(const nmod_poly_t poly) { return poly->mod.n; } +NMOD_POLY_INLINE +slong nmod_poly_length(const nmod_poly_t poly) +{ + return poly->length; +} +NMOD_POLY_INLINE +slong nmod_poly_degree(const nmod_poly_t poly) +{ + return poly->length - 1; +} +NMOD_POLY_INLINE +mp_limb_t nmod_poly_modulus(const nmod_poly_t poly) +{ + return poly->mod.n; +} flint_bitcnt_t nmod_poly_max_bits(const nmod_poly_t poly); @@ -148,7 +168,11 @@ void nmod_poly_set(nmod_poly_t a, const nmod_poly_t b) } } -NMOD_POLY_INLINE void nmod_poly_swap(nmod_poly_t poly1, nmod_poly_t poly2) { FLINT_SWAP(nmod_poly_struct, *poly1, *poly2); } +NMOD_POLY_INLINE +void nmod_poly_swap(nmod_poly_t poly1, nmod_poly_t poly2) +{ + FLINT_SWAP(nmod_poly_struct, *poly1, *poly2); +} NMOD_POLY_INLINE void nmod_poly_zero(nmod_poly_t res) { res->length = 0; } @@ -162,7 +186,11 @@ void nmod_poly_one(nmod_poly_t res) void nmod_poly_set_trunc(nmod_poly_t res, const nmod_poly_t poly, slong len); -NMOD_POLY_INLINE void nmod_poly_truncate(nmod_poly_t poly, slong len) { nmod_poly_set_trunc(poly, poly, len); } +NMOD_POLY_INLINE +void nmod_poly_truncate(nmod_poly_t poly, slong len) +{ + nmod_poly_set_trunc(poly, poly, len); +} void _nmod_poly_reverse(mp_ptr output, mp_srcptr input, slong len, slong m); void nmod_poly_reverse(nmod_poly_t output, const nmod_poly_t input, slong m); @@ -175,37 +203,79 @@ int nmod_poly_equal_ui(const nmod_poly_t poly, ulong cst); int nmod_poly_equal_trunc(const nmod_poly_t poly1, const nmod_poly_t poly2, slong n); -NMOD_POLY_INLINE int nmod_poly_is_zero(const nmod_poly_t poly) { return (poly->length == 0); } -NMOD_POLY_INLINE int nmod_poly_is_one(const nmod_poly_t poly) { return (poly->mod.n == 0) || (poly->length == 1 && poly->coeffs[0] == 1); } +NMOD_POLY_INLINE +int nmod_poly_is_zero(const nmod_poly_t poly) +{ + return (poly->length == 0); +} +NMOD_POLY_INLINE +int nmod_poly_is_one(const nmod_poly_t poly) +{ + return (poly->mod.n == 0) || (poly->length == 1 && poly->coeffs[0] == 1); +} /* bogus for non-prime modulus */ -NMOD_POLY_INLINE int nmod_poly_is_unit(const nmod_poly_t poly) { return (poly->length == 1) && poly->coeffs[0] != 0; } -NMOD_POLY_INLINE int nmod_poly_is_gen(const nmod_poly_t poly) { return (poly->mod.n == 0) || (poly->length == 2 && poly->coeffs[0] == 0 && poly->coeffs[1] == 1); } -NMOD_POLY_INLINE int nmod_poly_is_monic(const nmod_poly_t poly) { return (poly->length && poly->coeffs[(poly->length - 1)] == 1); } +NMOD_POLY_INLINE +int nmod_poly_is_unit(const nmod_poly_t poly) +{ + return (poly->length == 1) && poly->coeffs[0] != 0; +} +NMOD_POLY_INLINE +int nmod_poly_is_gen(const nmod_poly_t poly) +{ + return (poly->mod.n == 0) || (poly->length == 2 && poly->coeffs[0] == 0 && poly->coeffs[1] == 1); +} +NMOD_POLY_INLINE +int nmod_poly_is_monic(const nmod_poly_t poly) +{ + return (poly->length && poly->coeffs[(poly->length - 1)] == 1); +} /* Randomisation ************************************************************/ void nmod_poly_randtest(nmod_poly_t poly, flint_rand_t state, slong len); -NMOD_POLY_INLINE void nmod_poly_randtest_not_zero(nmod_poly_t poly, flint_rand_t state, slong len) { do { nmod_poly_randtest(poly, state, len); } while (nmod_poly_is_zero(poly)); } +NMOD_POLY_INLINE +void nmod_poly_randtest_not_zero(nmod_poly_t poly, flint_rand_t state, slong len) { do +{ + nmod_poly_randtest(poly, state, len); } while (nmod_poly_is_zero(poly)); +} void nmod_poly_randtest_irreducible(nmod_poly_t poly, flint_rand_t state, slong len); void nmod_poly_randtest_monic(nmod_poly_t poly, flint_rand_t state, slong len); -void nmod_poly_randtest_monic_irreducible(nmod_poly_t poly, flint_rand_t state, slong len); +void nmod_poly_randtest_monic_irreducible( + nmod_poly_t poly, + flint_rand_t state, + slong len); void nmod_poly_randtest_monic_primitive(nmod_poly_t poly, flint_rand_t state, slong len); void nmod_poly_randtest_trinomial(nmod_poly_t poly, flint_rand_t state, slong len); -int nmod_poly_randtest_trinomial_irreducible(nmod_poly_t poly, flint_rand_t state, slong len, slong max_attempts); +int nmod_poly_randtest_trinomial_irreducible( + nmod_poly_t poly, + flint_rand_t state, + slong len, + slong max_attempts); void nmod_poly_randtest_pentomial(nmod_poly_t poly, flint_rand_t state, slong len); -int nmod_poly_randtest_pentomial_irreducible(nmod_poly_t poly, flint_rand_t state, slong len, slong max_attempts); +int nmod_poly_randtest_pentomial_irreducible( + nmod_poly_t poly, + flint_rand_t state, + slong len, + slong max_attempts); -void nmod_poly_randtest_sparse_irreducible(nmod_poly_t poly, flint_rand_t state, slong len); +void nmod_poly_randtest_sparse_irreducible( + nmod_poly_t poly, + flint_rand_t state, + slong len); /* Getting and setting coefficients *****************************************/ -NMOD_POLY_INLINE ulong nmod_poly_get_coeff_ui(const nmod_poly_t poly, slong j) { return (j >= poly->length) ? 0 : poly->coeffs[j]; } +NMOD_POLY_INLINE +ulong nmod_poly_get_coeff_ui(const nmod_poly_t poly, slong j) +{ + return (j >= poly->length) ? 0 : poly->coeffs[j]; +} void nmod_poly_set_coeff_ui(nmod_poly_t poly, slong j, ulong c); @@ -237,15 +307,35 @@ void nmod_poly_shift_right(nmod_poly_t res, const nmod_poly_t poly, slong k); /* Addition and subtraction *************************************************/ -void _nmod_poly_add(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, nmod_t mod); +void _nmod_poly_add( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + nmod_t mod); void nmod_poly_add(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2); void nmod_poly_add_ui(nmod_poly_t res, const nmod_poly_t poly, ulong c); -void nmod_poly_add_series(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, slong n); - -void _nmod_poly_sub(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, nmod_t mod); +void nmod_poly_add_series( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + slong n); + +void _nmod_poly_sub( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + nmod_t mod); void nmod_poly_sub(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2); void nmod_poly_sub_ui(nmod_poly_t res, const nmod_poly_t poly, ulong c); -void nmod_poly_sub_series(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, slong n); +void nmod_poly_sub_series( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + slong n); void nmod_poly_neg(nmod_poly_t res, const nmod_poly_t poly1); @@ -260,66 +350,260 @@ void nmod_poly_make_monic(nmod_poly_t output, const nmod_poly_t input); /* Bit packing and unpacking aand reduction **********************************/ -void _nmod_poly_KS2_pack1(mp_ptr res, mp_srcptr op, slong n, slong s, ulong b, ulong k, slong r); -void _nmod_poly_KS2_pack(mp_ptr res, mp_srcptr op, slong n, slong s, ulong b, ulong k, slong r); +void _nmod_poly_KS2_pack1( + mp_ptr res, + mp_srcptr op, + slong n, + slong s, + ulong b, + ulong k, + slong r); +void _nmod_poly_KS2_pack( + mp_ptr res, + mp_srcptr op, + slong n, + slong s, + ulong b, + ulong k, + slong r); void _nmod_poly_KS2_unpack1(mp_ptr res, mp_srcptr op, slong n, ulong b, ulong k); void _nmod_poly_KS2_unpack2(mp_ptr res, mp_srcptr op, slong n, ulong b, ulong k); void _nmod_poly_KS2_unpack3(mp_ptr res, mp_srcptr op, slong n, ulong b, ulong k); void _nmod_poly_KS2_unpack(mp_ptr res, mp_srcptr op, slong n, ulong b, ulong k); -void _nmod_poly_KS2_reduce(mp_ptr res, slong s, mp_srcptr op, slong n, ulong w, nmod_t mod); - -void _nmod_poly_KS2_recover_reduce1(mp_ptr res, slong s, mp_srcptr op1, mp_srcptr op2, slong n, ulong b, nmod_t mod); -void _nmod_poly_KS2_recover_reduce2(mp_ptr res, slong s, mp_srcptr op1, mp_srcptr op2, slong n, ulong b, nmod_t mod); -void _nmod_poly_KS2_recover_reduce2b(mp_ptr res, slong s, mp_srcptr op1, mp_srcptr op2, slong n, ulong b, nmod_t mod); -void _nmod_poly_KS2_recover_reduce3(mp_ptr res, slong s, mp_srcptr op1, mp_srcptr op2, slong n, ulong b, nmod_t mod); -void _nmod_poly_KS2_recover_reduce(mp_ptr res, slong s, mp_srcptr op1, mp_srcptr op2, slong n, ulong b, nmod_t mod); +void _nmod_poly_KS2_reduce( + mp_ptr res, + slong s, + mp_srcptr op, + slong n, + ulong w, + nmod_t mod); + +void _nmod_poly_KS2_recover_reduce1( + mp_ptr res, + slong s, + mp_srcptr op1, + mp_srcptr op2, + slong n, + ulong b, + nmod_t mod); +void _nmod_poly_KS2_recover_reduce2( + mp_ptr res, + slong s, + mp_srcptr op1, + mp_srcptr op2, + slong n, + ulong b, + nmod_t mod); +void _nmod_poly_KS2_recover_reduce2b( + mp_ptr res, + slong s, + mp_srcptr op1, + mp_srcptr op2, + slong n, + ulong b, + nmod_t mod); +void _nmod_poly_KS2_recover_reduce3( + mp_ptr res, + slong s, + mp_srcptr op1, + mp_srcptr op2, + slong n, + ulong b, + nmod_t mod); +void _nmod_poly_KS2_recover_reduce( + mp_ptr res, + slong s, + mp_srcptr op1, + mp_srcptr op2, + slong n, + ulong b, + nmod_t mod); void _nmod_poly_bit_pack(mp_ptr res, mp_srcptr poly, slong len, flint_bitcnt_t bits); void nmod_poly_bit_pack(fmpz_t f, const nmod_poly_t poly, flint_bitcnt_t bit_size); -void _nmod_poly_bit_unpack(mp_ptr res, slong len, mp_srcptr mpn, flint_bitcnt_t bits, nmod_t mod); +void _nmod_poly_bit_unpack( + mp_ptr res, + slong len, + mp_srcptr mpn, + flint_bitcnt_t bits, + nmod_t mod); void nmod_poly_bit_unpack(nmod_poly_t poly, const fmpz_t f, flint_bitcnt_t bit_size); /* Multiplication ***********************************************************/ -void _nmod_poly_mul_classical(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, nmod_t mod); -void nmod_poly_mul_classical(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2); - -void _nmod_poly_mullow_classical(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, slong trunc, nmod_t mod); -void nmod_poly_mullow_classical(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, slong trunc); - -void _nmod_poly_mulhigh_classical(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, slong start, nmod_t mod); -void nmod_poly_mulhigh_classical(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, slong start); - -void _nmod_poly_mul_KS(mp_ptr out, mp_srcptr in1, slong len1, mp_srcptr in2, slong len2, flint_bitcnt_t bits, nmod_t mod); -void nmod_poly_mul_KS(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, flint_bitcnt_t bits); - -void _nmod_poly_mul_KS2(mp_ptr res, mp_srcptr op1, slong n1, mp_srcptr op2, slong n2, nmod_t mod); -void nmod_poly_mul_KS2(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2); - -void _nmod_poly_mul_KS4(mp_ptr res, mp_srcptr op1, slong n1, mp_srcptr op2, slong n2, nmod_t mod); -void nmod_poly_mul_KS4(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2); - -void _nmod_poly_mullow_KS(mp_ptr out, mp_srcptr in1, slong len1, mp_srcptr in2, slong len2, flint_bitcnt_t bits, slong n, nmod_t mod); -void nmod_poly_mullow_KS(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, flint_bitcnt_t bits, slong n); - -void _nmod_poly_mul(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, nmod_t mod); +void _nmod_poly_mul_classical( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + nmod_t mod); +void nmod_poly_mul_classical( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2); + +void _nmod_poly_mullow_classical( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + slong trunc, + nmod_t mod); +void nmod_poly_mullow_classical( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + slong trunc); + +void _nmod_poly_mulhigh_classical( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + slong start, + nmod_t mod); +void nmod_poly_mulhigh_classical( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + slong start); + +void _nmod_poly_mul_KS( + mp_ptr out, + mp_srcptr in1, + slong len1, + mp_srcptr in2, + slong len2, + flint_bitcnt_t bits, + nmod_t mod); +void nmod_poly_mul_KS( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + flint_bitcnt_t bits); + +void _nmod_poly_mul_KS2( + mp_ptr res, + mp_srcptr op1, + slong n1, + mp_srcptr op2, + slong n2, + nmod_t mod); +void nmod_poly_mul_KS2( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2); + +void _nmod_poly_mul_KS4( + mp_ptr res, + mp_srcptr op1, + slong n1, + mp_srcptr op2, + slong n2, + nmod_t mod); +void nmod_poly_mul_KS4( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2); + +void _nmod_poly_mullow_KS( + mp_ptr out, + mp_srcptr in1, + slong len1, + mp_srcptr in2, + slong len2, + flint_bitcnt_t bits, + slong n, + nmod_t mod); +void nmod_poly_mullow_KS( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + flint_bitcnt_t bits, + slong n); + +void _nmod_poly_mul( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + nmod_t mod); void nmod_poly_mul(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2); -void _nmod_poly_mullow(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, slong trunc, nmod_t mod); -void nmod_poly_mullow(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, slong trunc); - -void _nmod_poly_mulhigh(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, slong n, nmod_t mod); -void nmod_poly_mulhigh(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, slong n); - -void _nmod_poly_mulmod(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, mp_srcptr f, slong lenf, nmod_t mod); -void nmod_poly_mulmod(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, const nmod_poly_t f); - -void _nmod_poly_mulmod_preinv(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, mp_srcptr f, slong lenf, mp_srcptr finv, slong lenfinv, nmod_t mod); -void nmod_poly_mulmod_preinv(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, const nmod_poly_t f, const nmod_poly_t finv); - -int _nmod_poly_invmod(mp_limb_t *A, const mp_limb_t *B, slong lenB, const mp_limb_t *P, slong lenP, const nmod_t mod); +void _nmod_poly_mullow( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + slong trunc, + nmod_t mod); +void nmod_poly_mullow( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + slong trunc); + +void _nmod_poly_mulhigh( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + slong n, + nmod_t mod); +void nmod_poly_mulhigh( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + slong n); + +void _nmod_poly_mulmod( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + mp_srcptr f, + slong lenf, + nmod_t mod); +void nmod_poly_mulmod( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + const nmod_poly_t f); + +void _nmod_poly_mulmod_preinv( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + mp_srcptr f, + slong lenf, + mp_srcptr finv, + slong lenfinv, + nmod_t mod); +void nmod_poly_mulmod_preinv( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + const nmod_poly_t f, + const nmod_poly_t finv); + +int _nmod_poly_invmod( + mp_limb_t *A, + const mp_limb_t *B, + slong lenB, + const mp_limb_t *P, + slong lenP, + const nmod_t mod); int nmod_poly_invmod(nmod_poly_t A, const nmod_poly_t B, const nmod_poly_t P); /* Powering *****************************************************************/ @@ -330,85 +614,272 @@ void nmod_poly_pow_binexp(nmod_poly_t res, const nmod_poly_t poly, ulong e); void _nmod_poly_pow(mp_ptr res, mp_srcptr poly, slong len, ulong e, nmod_t mod); void nmod_poly_pow(nmod_poly_t res, const nmod_poly_t poly, ulong e); -void _nmod_poly_pow_trunc_binexp(mp_ptr res, mp_srcptr poly, ulong e, slong trunc, nmod_t mod); -void nmod_poly_pow_trunc_binexp(nmod_poly_t res, const nmod_poly_t poly, ulong e, slong trunc); +void _nmod_poly_pow_trunc_binexp( + mp_ptr res, + mp_srcptr poly, + ulong e, + slong trunc, + nmod_t mod); +void nmod_poly_pow_trunc_binexp( + nmod_poly_t res, + const nmod_poly_t poly, + ulong e, + slong trunc); void _nmod_poly_pow_trunc(mp_ptr res, mp_srcptr poly, ulong e, slong trunc, nmod_t mod); void nmod_poly_pow_trunc(nmod_poly_t res, const nmod_poly_t poly, ulong e, slong trunc); -void _nmod_poly_powmod_ui_binexp(mp_ptr res, mp_srcptr poly, ulong e, mp_srcptr f, slong lenf, nmod_t mod); -void nmod_poly_powmod_ui_binexp(nmod_poly_t res, const nmod_poly_t poly, ulong e, const nmod_poly_t f); - -void _nmod_poly_powmod_fmpz_binexp(mp_ptr res, mp_srcptr poly, fmpz_t e, mp_srcptr f, slong lenf, nmod_t mod); -void nmod_poly_powmod_fmpz_binexp(nmod_poly_t res, const nmod_poly_t poly, fmpz_t e, const nmod_poly_t f); +void _nmod_poly_powmod_ui_binexp( + mp_ptr res, + mp_srcptr poly, + ulong e, + mp_srcptr f, + slong lenf, + nmod_t mod); +void nmod_poly_powmod_ui_binexp( + nmod_poly_t res, + const nmod_poly_t poly, + ulong e, + const nmod_poly_t f); + +void _nmod_poly_powmod_fmpz_binexp( + mp_ptr res, + mp_srcptr poly, + fmpz_t e, + mp_srcptr f, + slong lenf, + nmod_t mod); +void nmod_poly_powmod_fmpz_binexp( + nmod_poly_t res, + const nmod_poly_t poly, + fmpz_t e, + const nmod_poly_t f); void _nmod_poly_powmod_ui_binexp_preinv (mp_ptr res, mp_srcptr poly, ulong e, mp_srcptr f, slong lenf, mp_srcptr finv, slong lenfinv, nmod_t mod); -void nmod_poly_powmod_ui_binexp_preinv(nmod_poly_t res, const nmod_poly_t poly, ulong e, const nmod_poly_t f, const nmod_poly_t finv); +void nmod_poly_powmod_ui_binexp_preinv( + nmod_poly_t res, + const nmod_poly_t poly, + ulong e, + const nmod_poly_t f, + const nmod_poly_t finv); void _nmod_poly_powmod_fmpz_binexp_preinv (mp_ptr res, mp_srcptr poly, fmpz_t e, mp_srcptr f, slong lenf, mp_srcptr finv, slong lenfinv, nmod_t mod); -void nmod_poly_powmod_fmpz_binexp_preinv(nmod_poly_t res, const nmod_poly_t poly, fmpz_t e, const nmod_poly_t f, const nmod_poly_t finv); +void nmod_poly_powmod_fmpz_binexp_preinv( + nmod_poly_t res, + const nmod_poly_t poly, + fmpz_t e, + const nmod_poly_t f, + const nmod_poly_t finv); void _nmod_poly_powmod_x_ui_preinv (mp_ptr res, ulong e, mp_srcptr f, slong lenf, mp_srcptr finv, slong lenfinv, nmod_t mod); -void nmod_poly_powmod_x_ui_preinv(nmod_poly_t res, ulong e, const nmod_poly_t f, const nmod_poly_t finv); +void nmod_poly_powmod_x_ui_preinv( + nmod_poly_t res, + ulong e, + const nmod_poly_t f, + const nmod_poly_t finv); void _nmod_poly_powmod_x_fmpz_preinv (mp_ptr res, fmpz_t e, mp_srcptr f, slong lenf, mp_srcptr finv, slong lenfinv, nmod_t mod); -void nmod_poly_powmod_x_fmpz_preinv(nmod_poly_t res, fmpz_t e, const nmod_poly_t f, const nmod_poly_t finv); - -void _nmod_poly_powers_mod_preinv_naive(mp_ptr * res, mp_srcptr f, slong flen, slong n, mp_srcptr g, slong glen, mp_srcptr ginv, slong ginvlen, const nmod_t mod); - -void nmod_poly_powers_mod_naive(nmod_poly_struct * res, const nmod_poly_t f, slong n, const nmod_poly_t g); - -void _nmod_poly_powers_mod_preinv_threaded_pool(mp_ptr * res, mp_srcptr f, slong flen, slong n, mp_srcptr g, slong glen, mp_srcptr ginv, slong ginvlen, const nmod_t mod, thread_pool_handle * threads, slong num_threads); -void _nmod_poly_powers_mod_preinv_threaded(mp_ptr * res, mp_srcptr f, slong flen, slong n, mp_srcptr g, slong glen, mp_srcptr ginv, slong ginvlen, const nmod_t mod); - -void nmod_poly_powers_mod_bsgs(nmod_poly_struct * res, const nmod_poly_t f, slong n, const nmod_poly_t g); +void nmod_poly_powmod_x_fmpz_preinv( + nmod_poly_t res, + fmpz_t e, + const nmod_poly_t f, + const nmod_poly_t finv); + +void _nmod_poly_powers_mod_preinv_naive( + mp_ptr * res, + mp_srcptr f, + slong flen, + slong n, + mp_srcptr g, + slong glen, + mp_srcptr ginv, + slong ginvlen, + const nmod_t mod); + +void nmod_poly_powers_mod_naive( + nmod_poly_struct * res, + const nmod_poly_t f, + slong n, + const nmod_poly_t g); + +void _nmod_poly_powers_mod_preinv_threaded_pool( + mp_ptr * res, + mp_srcptr f, + slong flen, + slong n, + mp_srcptr g, + slong glen, + mp_srcptr ginv, + slong ginvlen, + const nmod_t mod, + thread_pool_handle * threads, + slong num_threads); +void _nmod_poly_powers_mod_preinv_threaded( + mp_ptr * res, + mp_srcptr f, + slong flen, + slong n, + mp_srcptr g, + slong glen, + mp_srcptr ginv, + slong ginvlen, + const nmod_t mod); + +void nmod_poly_powers_mod_bsgs( + nmod_poly_struct * res, + const nmod_poly_t f, + slong n, + const nmod_poly_t g); /* Division *****************************************************************/ -void _nmod_poly_divrem_basecase_preinv1(mp_ptr Q, mp_ptr R, mp_srcptr A, slong A_len, mp_srcptr B, slong B_len, mp_limb_t invB, nmod_t mod); - -void _nmod_poly_divrem_basecase(mp_ptr Q, mp_ptr R, mp_srcptr A, slong A_len, mp_srcptr B, slong B_len, nmod_t mod); -void nmod_poly_divrem_basecase(nmod_poly_t Q, nmod_poly_t R, const nmod_poly_t A, const nmod_poly_t B); - -void _nmod_poly_divrem(mp_ptr Q, mp_ptr R, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); -void nmod_poly_divrem(nmod_poly_t Q, nmod_poly_t R, const nmod_poly_t A, const nmod_poly_t B); - -void _nmod_poly_div(mp_ptr Q, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); +void _nmod_poly_divrem_basecase_preinv1( + mp_ptr Q, + mp_ptr R, + mp_srcptr A, + slong A_len, + mp_srcptr B, + slong B_len, + mp_limb_t invB, + nmod_t mod); + +void _nmod_poly_divrem_basecase( + mp_ptr Q, + mp_ptr R, + mp_srcptr A, + slong A_len, + mp_srcptr B, + slong B_len, + nmod_t mod); +void nmod_poly_divrem_basecase( + nmod_poly_t Q, + nmod_poly_t R, + const nmod_poly_t A, + const nmod_poly_t B); + +void _nmod_poly_divrem( + mp_ptr Q, + mp_ptr R, + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); +void nmod_poly_divrem( + nmod_poly_t Q, + nmod_poly_t R, + const nmod_poly_t A, + const nmod_poly_t B); + +void _nmod_poly_div( + mp_ptr Q, + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); void nmod_poly_div(nmod_poly_t Q, const nmod_poly_t A, const nmod_poly_t B); -void _nmod_poly_rem(mp_ptr R, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); +void _nmod_poly_rem( + mp_ptr R, + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); void nmod_poly_rem(nmod_poly_t R, const nmod_poly_t A, const nmod_poly_t B); -void _nmod_poly_inv_series_basecase(mp_ptr Qinv, mp_srcptr Q, slong Qlen, slong n, nmod_t mod); +void _nmod_poly_inv_series_basecase( + mp_ptr Qinv, + mp_srcptr Q, + slong Qlen, + slong n, + nmod_t mod); void nmod_poly_inv_series_basecase(nmod_poly_t Qinv, const nmod_poly_t Q, slong n); -void _nmod_poly_inv_series_newton(mp_ptr Qinv, mp_srcptr Q, slong Qlen, slong n, nmod_t mod); +void _nmod_poly_inv_series_newton( + mp_ptr Qinv, + mp_srcptr Q, + slong Qlen, + slong n, + nmod_t mod); void nmod_poly_inv_series_newton(nmod_poly_t Qinv, const nmod_poly_t Q, slong n); void _nmod_poly_inv_series(mp_ptr Qinv, mp_srcptr Q, slong Qlen, slong n, nmod_t mod); void nmod_poly_inv_series(nmod_poly_t Qinv, const nmod_poly_t Q, slong n); -void _nmod_poly_div_series_basecase(mp_ptr Q, mp_srcptr A, slong Alen, mp_srcptr B, slong Blen, slong n, nmod_t mod); -void nmod_poly_div_series_basecase(nmod_poly_t Q, const nmod_poly_t A, const nmod_poly_t B, slong n); - -void _nmod_poly_div_series(mp_ptr Q, mp_srcptr A, slong Alen, mp_srcptr B, slong Blen, slong n, nmod_t mod); -void nmod_poly_div_series(nmod_poly_t Q, const nmod_poly_t A, const nmod_poly_t B, slong n); - -void _nmod_poly_div_newton_n_preinv(mp_ptr Q, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, mp_srcptr Binv, slong lenBinv, nmod_t mod); -void nmod_poly_div_newton_n_preinv(nmod_poly_t Q, const nmod_poly_t A, const nmod_poly_t B, const nmod_poly_t Binv); +void _nmod_poly_div_series_basecase( + mp_ptr Q, + mp_srcptr A, + slong Alen, + mp_srcptr B, + slong Blen, + slong n, + nmod_t mod); +void nmod_poly_div_series_basecase( + nmod_poly_t Q, + const nmod_poly_t A, + const nmod_poly_t B, + slong n); + +void _nmod_poly_div_series( + mp_ptr Q, + mp_srcptr A, + slong Alen, + mp_srcptr B, + slong Blen, + slong n, + nmod_t mod); +void nmod_poly_div_series( + nmod_poly_t Q, + const nmod_poly_t A, + const nmod_poly_t B, + slong n); + +void _nmod_poly_div_newton_n_preinv( + mp_ptr Q, + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + mp_srcptr Binv, + slong lenBinv, + nmod_t mod); +void nmod_poly_div_newton_n_preinv( + nmod_poly_t Q, + const nmod_poly_t A, + const nmod_poly_t B, + const nmod_poly_t Binv); void _nmod_poly_divrem_newton_n_preinv (mp_ptr Q, mp_ptr R, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, mp_srcptr Binv, slong lenBinv, nmod_t mod); -void nmod_poly_divrem_newton_n_preinv(nmod_poly_t Q, nmod_poly_t R, const nmod_poly_t A, const nmod_poly_t B, const nmod_poly_t Binv); +void nmod_poly_divrem_newton_n_preinv( + nmod_poly_t Q, + nmod_poly_t R, + const nmod_poly_t A, + const nmod_poly_t B, + const nmod_poly_t Binv); mp_limb_t _nmod_poly_div_root(mp_ptr Q, mp_srcptr A, slong len, mp_limb_t c, nmod_t mod); mp_limb_t nmod_poly_div_root(nmod_poly_t Q, const nmod_poly_t A, mp_limb_t c); /* Divisibility testing *****************************************************/ -int _nmod_poly_divides_classical(mp_ptr Q, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); +int _nmod_poly_divides_classical( + mp_ptr Q, + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); int nmod_poly_divides_classical(nmod_poly_t Q, const nmod_poly_t A, const nmod_poly_t B); -int _nmod_poly_divides(mp_ptr Q, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); +int _nmod_poly_divides( + mp_ptr Q, + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); int nmod_poly_divides(nmod_poly_t Q, const nmod_poly_t A, const nmod_poly_t B); /* Derivative ***************************************************************/ @@ -421,27 +892,73 @@ void nmod_poly_integral(nmod_poly_t x_int, const nmod_poly_t x); /* Evaluation ***************************************************************/ -void _nmod_poly_evaluate_fmpz(fmpz_t rop, mp_srcptr poly, const slong len, const fmpz_t c); +void _nmod_poly_evaluate_fmpz( + fmpz_t rop, + mp_srcptr poly, + const slong len, + const fmpz_t c); void nmod_poly_evaluate_fmpz(fmpz_t rop, const nmod_poly_t poly, const fmpz_t c); mp_limb_t _nmod_poly_evaluate_nmod(mp_srcptr poly, slong len, mp_limb_t c, nmod_t mod); mp_limb_t nmod_poly_evaluate_nmod(const nmod_poly_t poly, mp_limb_t c); -void _nmod_poly_evaluate_nmod_vec(mp_ptr ys, mp_srcptr coeffs, slong len, mp_srcptr xs, slong n, nmod_t mod); -void nmod_poly_evaluate_nmod_vec(mp_ptr ys, const nmod_poly_t poly, mp_srcptr xs, slong n); - -void _nmod_poly_evaluate_nmod_vec_iter(mp_ptr ys, mp_srcptr coeffs, slong len, mp_srcptr xs, slong n, nmod_t mod); -void nmod_poly_evaluate_nmod_vec_iter(mp_ptr ys, const nmod_poly_t poly, mp_srcptr xs, slong n); - -void _nmod_poly_evaluate_nmod_vec_fast_precomp(mp_ptr vs, mp_srcptr poly, slong plen, const mp_ptr * tree, slong len, nmod_t mod); - -void _nmod_poly_evaluate_nmod_vec_fast(mp_ptr ys, mp_srcptr coeffs, slong len, mp_srcptr xs, slong n, nmod_t mod); -void nmod_poly_evaluate_nmod_vec_fast(mp_ptr ys, const nmod_poly_t poly, mp_srcptr xs, slong n); +void _nmod_poly_evaluate_nmod_vec( + mp_ptr ys, + mp_srcptr coeffs, + slong len, + mp_srcptr xs, + slong n, + nmod_t mod); +void nmod_poly_evaluate_nmod_vec( + mp_ptr ys, + const nmod_poly_t poly, + mp_srcptr xs, + slong n); + +void _nmod_poly_evaluate_nmod_vec_iter( + mp_ptr ys, + mp_srcptr coeffs, + slong len, + mp_srcptr xs, + slong n, + nmod_t mod); +void nmod_poly_evaluate_nmod_vec_iter( + mp_ptr ys, + const nmod_poly_t poly, + mp_srcptr xs, + slong n); + +void _nmod_poly_evaluate_nmod_vec_fast_precomp( + mp_ptr vs, + mp_srcptr poly, + slong plen, + const mp_ptr * tree, + slong len, + nmod_t mod); + +void _nmod_poly_evaluate_nmod_vec_fast( + mp_ptr ys, + mp_srcptr coeffs, + slong len, + mp_srcptr xs, + slong n, + nmod_t mod); +void nmod_poly_evaluate_nmod_vec_fast( + mp_ptr ys, + const nmod_poly_t poly, + mp_srcptr xs, + slong n); void nmod_mat_one_addmul(nmod_mat_t dest, const nmod_mat_t mat, mp_limb_t c); -void nmod_poly_evaluate_mat_horner(nmod_mat_t dest, const nmod_poly_t poly, const nmod_mat_t c); -void nmod_poly_evaluate_mat_paterson_stockmeyer(nmod_mat_t dest, const nmod_poly_t poly, const nmod_mat_t c); +void nmod_poly_evaluate_mat_horner( + nmod_mat_t dest, + const nmod_poly_t poly, + const nmod_mat_t c); +void nmod_poly_evaluate_mat_paterson_stockmeyer( + nmod_mat_t dest, + const nmod_poly_t poly, + const nmod_mat_t c); NMOD_POLY_INLINE void nmod_poly_evaluate_mat(nmod_mat_t dest, const nmod_poly_t poly, const nmod_mat_t c) @@ -464,29 +981,93 @@ void _nmod_poly_tree_build(mp_ptr * tree, mp_srcptr roots, slong len, nmod_t mod /* Interpolation ************************************************************/ -void _nmod_poly_interpolate_nmod_vec_newton(mp_ptr poly, mp_srcptr xs, mp_srcptr ys, slong n, nmod_t mod); -void nmod_poly_interpolate_nmod_vec_newton(nmod_poly_t poly, mp_srcptr xs, mp_srcptr ys, slong n); - -void _nmod_poly_interpolate_nmod_vec_barycentric(mp_ptr poly, mp_srcptr xs, mp_srcptr ys, slong n, nmod_t mod); -void nmod_poly_interpolate_nmod_vec_barycentric(nmod_poly_t poly, mp_srcptr xs, mp_srcptr ys, slong n); - -void _nmod_poly_interpolate_nmod_vec(mp_ptr poly, mp_srcptr xs, mp_srcptr ys, slong n, nmod_t mod); -void nmod_poly_interpolate_nmod_vec(nmod_poly_t poly, mp_srcptr xs, mp_srcptr ys, slong n); - -void nmod_poly_interpolate_nmod_vec_fast(nmod_poly_t poly, mp_srcptr xs, mp_srcptr ys, slong n); -void _nmod_poly_interpolate_nmod_vec_fast(mp_ptr poly, mp_srcptr xs, mp_srcptr ys, slong len, nmod_t mod); - -void _nmod_poly_interpolate_nmod_vec_fast_precomp(mp_ptr poly, mp_srcptr ys, const mp_ptr * tree, mp_srcptr weights, slong len, nmod_t mod); - -void _nmod_poly_interpolation_weights(mp_ptr w, const mp_ptr * tree, slong len, nmod_t mod); +void _nmod_poly_interpolate_nmod_vec_newton( + mp_ptr poly, + mp_srcptr xs, + mp_srcptr ys, + slong n, + nmod_t mod); +void nmod_poly_interpolate_nmod_vec_newton( + nmod_poly_t poly, + mp_srcptr xs, + mp_srcptr ys, + slong n); + +void _nmod_poly_interpolate_nmod_vec_barycentric( + mp_ptr poly, + mp_srcptr xs, + mp_srcptr ys, + slong n, + nmod_t mod); +void nmod_poly_interpolate_nmod_vec_barycentric( + nmod_poly_t poly, + mp_srcptr xs, + mp_srcptr ys, + slong n); + +void _nmod_poly_interpolate_nmod_vec( + mp_ptr poly, + mp_srcptr xs, + mp_srcptr ys, + slong n, + nmod_t mod); +void nmod_poly_interpolate_nmod_vec( + nmod_poly_t poly, + mp_srcptr xs, + mp_srcptr ys, + slong n); + +void nmod_poly_interpolate_nmod_vec_fast( + nmod_poly_t poly, + mp_srcptr xs, + mp_srcptr ys, + slong n); +void _nmod_poly_interpolate_nmod_vec_fast( + mp_ptr poly, + mp_srcptr xs, + mp_srcptr ys, + slong len, + nmod_t mod); + +void _nmod_poly_interpolate_nmod_vec_fast_precomp( + mp_ptr poly, + mp_srcptr ys, + const mp_ptr * tree, + mp_srcptr weights, + slong len, + nmod_t mod); + +void _nmod_poly_interpolation_weights( + mp_ptr w, + const mp_ptr * tree, + slong len, + nmod_t mod); /* Composition **************************************************************/ -void _nmod_poly_compose_horner(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, nmod_t mod); -void nmod_poly_compose_horner(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2); - -void _nmod_poly_compose(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, nmod_t mod); -void nmod_poly_compose(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2); +void _nmod_poly_compose_horner( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + nmod_t mod); +void nmod_poly_compose_horner( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2); + +void _nmod_poly_compose( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + nmod_t mod); +void nmod_poly_compose( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2); /* obsolete implementation */ #define _nmod_poly_compose_divconquer _nmod_poly_compose @@ -497,7 +1078,11 @@ void nmod_poly_compose(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly void _nmod_poly_taylor_shift_horner(mp_ptr poly, mp_limb_t c, slong len, nmod_t mod); void nmod_poly_taylor_shift_horner(nmod_poly_t g, const nmod_poly_t f, mp_limb_t c); -void _nmod_poly_taylor_shift_convolution(mp_ptr poly, mp_limb_t c, slong len, nmod_t mod); +void _nmod_poly_taylor_shift_convolution( + mp_ptr poly, + mp_limb_t c, + slong len, + nmod_t mod); void nmod_poly_taylor_shift_convolution(nmod_poly_t g, const nmod_poly_t f, mp_limb_t c); void _nmod_poly_taylor_shift(mp_ptr poly, mp_limb_t c, slong len, nmod_t mod); @@ -505,40 +1090,173 @@ void nmod_poly_taylor_shift(nmod_poly_t g, const nmod_poly_t f, mp_limb_t c); /* Modular composition ******************************************************/ -void _nmod_poly_compose_mod_brent_kung(mp_ptr res, mp_srcptr f, slong lenf, mp_srcptr g, mp_srcptr h, slong lenh, nmod_t mod); -void nmod_poly_compose_mod_brent_kung(nmod_poly_t res, const nmod_poly_t f, const nmod_poly_t g, const nmod_poly_t h); - -void _nmod_poly_reduce_matrix_mod_poly(nmod_mat_t A, const nmod_mat_t B, const nmod_poly_t f); +void _nmod_poly_compose_mod_brent_kung( + mp_ptr res, + mp_srcptr f, + slong lenf, + mp_srcptr g, + mp_srcptr h, + slong lenh, + nmod_t mod); +void nmod_poly_compose_mod_brent_kung( + nmod_poly_t res, + const nmod_poly_t f, + const nmod_poly_t g, + const nmod_poly_t h); + +void _nmod_poly_reduce_matrix_mod_poly( + nmod_mat_t A, + const nmod_mat_t B, + const nmod_poly_t f); void _nmod_poly_precompute_matrix_worker(void * arg_ptr); -void _nmod_poly_precompute_matrix(nmod_mat_t A, mp_srcptr poly1, mp_srcptr poly2, slong len2, mp_srcptr poly2inv, slong len2inv, nmod_t mod); -void nmod_poly_precompute_matrix(nmod_mat_t A, const nmod_poly_t poly1, const nmod_poly_t poly2, const nmod_poly_t poly2inv); +void _nmod_poly_precompute_matrix( + nmod_mat_t A, + mp_srcptr poly1, + mp_srcptr poly2, + slong len2, + mp_srcptr poly2inv, + slong len2inv, + nmod_t mod); +void nmod_poly_precompute_matrix( + nmod_mat_t A, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + const nmod_poly_t poly2inv); void _nmod_poly_compose_mod_brent_kung_precomp_preinv_worker(void * arg_ptr); -void _nmod_poly_compose_mod_brent_kung_precomp_preinv(mp_ptr res, mp_srcptr poly1, slong len1, const nmod_mat_t A, mp_srcptr poly3, slong len3, mp_srcptr poly3inv, slong len3inv, nmod_t mod); -void nmod_poly_compose_mod_brent_kung_precomp_preinv(nmod_poly_t res, const nmod_poly_t poly1, const nmod_mat_t A, const nmod_poly_t poly3, const nmod_poly_t poly3inv); - -void _nmod_poly_compose_mod_brent_kung_preinv(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, mp_srcptr poly3, slong len3, mp_srcptr poly3inv, slong len3inv, nmod_t mod); -void nmod_poly_compose_mod_brent_kung_preinv(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, const nmod_poly_t poly3, const nmod_poly_t poly3inv); +void _nmod_poly_compose_mod_brent_kung_precomp_preinv( + mp_ptr res, + mp_srcptr poly1, + slong len1, + const nmod_mat_t A, + mp_srcptr poly3, + slong len3, + mp_srcptr poly3inv, + slong len3inv, + nmod_t mod); +void nmod_poly_compose_mod_brent_kung_precomp_preinv( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_mat_t A, + const nmod_poly_t poly3, + const nmod_poly_t poly3inv); + +void _nmod_poly_compose_mod_brent_kung_preinv( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + mp_srcptr poly3, + slong len3, + mp_srcptr poly3inv, + slong len3inv, + nmod_t mod); +void nmod_poly_compose_mod_brent_kung_preinv( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + const nmod_poly_t poly3, + const nmod_poly_t poly3inv); void _nmod_poly_compose_mod_brent_kung_vec_preinv_worker(void * arg_ptr); -void _nmod_poly_compose_mod_brent_kung_vec_preinv(nmod_poly_struct * res, const nmod_poly_struct * polys, slong len1, slong l, mp_srcptr g, slong glen, mp_srcptr poly, slong len, mp_srcptr polyinv,slong leninv, nmod_t mod); -void nmod_poly_compose_mod_brent_kung_vec_preinv(nmod_poly_struct * res, const nmod_poly_struct * polys, slong len1, slong n, const nmod_poly_t g, const nmod_poly_t poly, const nmod_poly_t polyinv); - -void _nmod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool(nmod_poly_struct * res, const nmod_poly_struct * polys, slong lenpolys, slong l, mp_srcptr g, slong glen, mp_srcptr poly, slong len, mp_srcptr polyinv, slong leninv, nmod_t mod, thread_pool_handle * threads, slong num_threads); -void nmod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool(nmod_poly_struct * res, const nmod_poly_struct * polys, slong len1, slong n, const nmod_poly_t g, const nmod_poly_t poly, const nmod_poly_t polyinv, thread_pool_handle * threads, slong num_threads); -void nmod_poly_compose_mod_brent_kung_vec_preinv_threaded(nmod_poly_struct * res, const nmod_poly_struct * polys, slong len1, slong n, const nmod_poly_t g, const nmod_poly_t poly, const nmod_poly_t polyinv); - -void _nmod_poly_compose_mod_horner(mp_ptr res, mp_srcptr f, slong lenf, mp_srcptr g, mp_srcptr h, slong lenh, nmod_t mod); -void nmod_poly_compose_mod_horner(nmod_poly_t res, const nmod_poly_t f, const nmod_poly_t g, const nmod_poly_t h); - -void _nmod_poly_compose_mod(mp_ptr res, mp_srcptr f, slong lenf, mp_srcptr g, mp_srcptr h, slong lenh, nmod_t mod); -void nmod_poly_compose_mod(nmod_poly_t res, const nmod_poly_t f, const nmod_poly_t g, const nmod_poly_t h); +void _nmod_poly_compose_mod_brent_kung_vec_preinv( + nmod_poly_struct * res, + const nmod_poly_struct * polys, + slong len1, + slong l, + mp_srcptr g, + slong glen, + mp_srcptr poly, + slong len, + mp_srcptr polyinv, + slong leninv, + nmod_t mod); +void nmod_poly_compose_mod_brent_kung_vec_preinv( + nmod_poly_struct * res, + const nmod_poly_struct * polys, + slong len1, + slong n, + const nmod_poly_t g, + const nmod_poly_t poly, + const nmod_poly_t polyinv); + +void _nmod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool( + nmod_poly_struct * res, + const nmod_poly_struct * polys, + slong lenpolys, + slong l, + mp_srcptr g, + slong glen, + mp_srcptr poly, + slong len, + mp_srcptr polyinv, + slong leninv, + nmod_t mod, + thread_pool_handle * threads, + slong num_threads); +void nmod_poly_compose_mod_brent_kung_vec_preinv_threaded_pool( + nmod_poly_struct * res, + const nmod_poly_struct * polys, + slong len1, + slong n, + const nmod_poly_t g, + const nmod_poly_t poly, + const nmod_poly_t polyinv, + thread_pool_handle * threads, + slong num_threads); +void nmod_poly_compose_mod_brent_kung_vec_preinv_threaded( + nmod_poly_struct * res, + const nmod_poly_struct * polys, + slong len1, + slong n, + const nmod_poly_t g, + const nmod_poly_t poly, + const nmod_poly_t polyinv); + +void _nmod_poly_compose_mod_horner( + mp_ptr res, + mp_srcptr f, + slong lenf, + mp_srcptr g, + mp_srcptr h, + slong lenh, + nmod_t mod); +void nmod_poly_compose_mod_horner( + nmod_poly_t res, + const nmod_poly_t f, + const nmod_poly_t g, + const nmod_poly_t h); + +void _nmod_poly_compose_mod( + mp_ptr res, + mp_srcptr f, + slong lenf, + mp_srcptr g, + mp_srcptr h, + slong lenh, + nmod_t mod); +void nmod_poly_compose_mod( + nmod_poly_t res, + const nmod_poly_t f, + const nmod_poly_t g, + const nmod_poly_t h); /* Power series composition and reversion ************************************/ -void _nmod_poly_compose_series(mp_ptr res, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, slong n, nmod_t mod); -void nmod_poly_compose_series(nmod_poly_t res, const nmod_poly_t poly1, const nmod_poly_t poly2, slong n); +void _nmod_poly_compose_series( + mp_ptr res, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + slong n, + nmod_t mod); +void nmod_poly_compose_series( + nmod_poly_t res, + const nmod_poly_t poly1, + const nmod_poly_t poly2, + slong n); void _nmod_poly_revert_series(mp_ptr Qinv, mp_srcptr Q, slong Qlen, slong n, nmod_t mod); void nmod_poly_revert_series(nmod_poly_t Qinv, const nmod_poly_t Q, slong n); @@ -553,44 +1271,172 @@ NMOD_POLY_INLINE slong _nmod_poly_hamming_weight(mp_srcptr a, slong len) return sum; } -NMOD_POLY_INLINE slong nmod_poly_hamming_weight(const nmod_poly_t A) { return _nmod_poly_hamming_weight(A->coeffs, A->length); } +NMOD_POLY_INLINE +slong nmod_poly_hamming_weight(const nmod_poly_t A) +{ + return _nmod_poly_hamming_weight(A->coeffs, A->length); +} /* Greatest common divisor **************************************************/ -slong _nmod_poly_gcd_euclidean(mp_ptr G, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); +slong _nmod_poly_gcd_euclidean( + mp_ptr G, + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); void nmod_poly_gcd_euclidean(nmod_poly_t G, const nmod_poly_t A, const nmod_poly_t B); -slong _nmod_poly_hgcd_recursive(mp_ptr * M, slong * lenM, mp_ptr A, slong * lenA, mp_ptr B, slong * lenB, mp_srcptr a, slong lena, mp_srcptr b, slong lenb, mp_ptr P, nmod_t mod, int flag, nmod_poly_res_t res); -slong nmod_poly_hgcd_ref(nmod_poly_t m11, nmod_poly_t m12, nmod_poly_t m21, nmod_poly_t m22, nmod_poly_t A, nmod_poly_t B, const nmod_poly_t a, const nmod_poly_t b); -slong _nmod_poly_hgcd(mp_ptr * M, slong * lenM, mp_ptr A, slong * lenA, mp_ptr B, slong * lenB, mp_srcptr a, slong lena, mp_srcptr b, slong lenb, nmod_t mod); -slong nmod_poly_hgcd(nmod_poly_t m11, nmod_poly_t m12, nmod_poly_t m21, nmod_poly_t m22, nmod_poly_t A, nmod_poly_t B, const nmod_poly_t a, const nmod_poly_t b); - -slong _nmod_poly_gcd_hgcd(mp_ptr G, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); +slong _nmod_poly_hgcd_recursive( + mp_ptr * M, + slong * lenM, + mp_ptr A, + slong * lenA, + mp_ptr B, + slong * lenB, + mp_srcptr a, + slong lena, + mp_srcptr b, + slong lenb, + mp_ptr P, + nmod_t mod, + int flag, + nmod_poly_res_t res); +slong nmod_poly_hgcd_ref( + nmod_poly_t m11, + nmod_poly_t m12, + nmod_poly_t m21, + nmod_poly_t m22, + nmod_poly_t A, + nmod_poly_t B, + const nmod_poly_t a, + const nmod_poly_t b); +slong _nmod_poly_hgcd( + mp_ptr * M, + slong * lenM, + mp_ptr A, + slong * lenA, + mp_ptr B, + slong * lenB, + mp_srcptr a, + slong lena, + mp_srcptr b, + slong lenb, + nmod_t mod); +slong nmod_poly_hgcd( + nmod_poly_t m11, + nmod_poly_t m12, + nmod_poly_t m21, + nmod_poly_t m22, + nmod_poly_t A, + nmod_poly_t B, + const nmod_poly_t a, + const nmod_poly_t b); + +slong _nmod_poly_gcd_hgcd( + mp_ptr G, + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); void nmod_poly_gcd_hgcd(nmod_poly_t G, const nmod_poly_t A, const nmod_poly_t B); -slong _nmod_poly_gcd(mp_ptr G, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); +slong _nmod_poly_gcd( + mp_ptr G, + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); void nmod_poly_gcd(nmod_poly_t G, const nmod_poly_t A, const nmod_poly_t B); -slong _nmod_poly_xgcd_euclidean(mp_ptr res, mp_ptr s, mp_ptr t, mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, nmod_t mod); -void nmod_poly_xgcd_euclidean(nmod_poly_t G, nmod_poly_t S, nmod_poly_t T, const nmod_poly_t A, const nmod_poly_t B); - -slong _nmod_poly_xgcd_hgcd(mp_ptr G, mp_ptr S, mp_ptr T, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); -void nmod_poly_xgcd_hgcd(nmod_poly_t G, nmod_poly_t S, nmod_poly_t T, const nmod_poly_t A, const nmod_poly_t B); - -slong _nmod_poly_xgcd(mp_ptr G, mp_ptr S, mp_ptr T, mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); -void nmod_poly_xgcd(nmod_poly_t G, nmod_poly_t S, nmod_poly_t T, const nmod_poly_t A, const nmod_poly_t B); - -mp_limb_t _nmod_poly_resultant_euclidean(mp_srcptr poly1, slong len1, mp_srcptr poly2, slong len2, nmod_t mod); +slong _nmod_poly_xgcd_euclidean( + mp_ptr res, + mp_ptr s, + mp_ptr t, + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + nmod_t mod); +void nmod_poly_xgcd_euclidean( + nmod_poly_t G, + nmod_poly_t S, + nmod_poly_t T, + const nmod_poly_t A, + const nmod_poly_t B); + +slong _nmod_poly_xgcd_hgcd( + mp_ptr G, + mp_ptr S, + mp_ptr T, + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); +void nmod_poly_xgcd_hgcd( + nmod_poly_t G, + nmod_poly_t S, + nmod_poly_t T, + const nmod_poly_t A, + const nmod_poly_t B); + +slong _nmod_poly_xgcd( + mp_ptr G, + mp_ptr S, + mp_ptr T, + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); +void nmod_poly_xgcd( + nmod_poly_t G, + nmod_poly_t S, + nmod_poly_t T, + const nmod_poly_t A, + const nmod_poly_t B); + +mp_limb_t _nmod_poly_resultant_euclidean( + mp_srcptr poly1, + slong len1, + mp_srcptr poly2, + slong len2, + nmod_t mod); mp_limb_t nmod_poly_resultant_euclidean(const nmod_poly_t f, const nmod_poly_t g); -mp_limb_t _nmod_poly_resultant_hgcd(mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); +mp_limb_t _nmod_poly_resultant_hgcd( + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); mp_limb_t nmod_poly_resultant_hgcd(const nmod_poly_t A, const nmod_poly_t B); -mp_limb_t _nmod_poly_resultant(mp_srcptr A, slong lenA, mp_srcptr B, slong lenB, nmod_t mod); +mp_limb_t _nmod_poly_resultant( + mp_srcptr A, + slong lenA, + mp_srcptr B, + slong lenB, + nmod_t mod); mp_limb_t nmod_poly_resultant(const nmod_poly_t A, const nmod_poly_t B); -slong _nmod_poly_gcdinv(mp_limb_t * G, mp_limb_t * S, const mp_limb_t * A, slong lenA, const mp_limb_t * B, slong lenB, const nmod_t mod); -void nmod_poly_gcdinv(nmod_poly_t G, nmod_poly_t S, const nmod_poly_t A, const nmod_poly_t B); +slong _nmod_poly_gcdinv( + mp_limb_t * G, + mp_limb_t * S, + const mp_limb_t * A, + slong lenA, + const mp_limb_t * B, + slong lenB, + const nmod_t mod); +void nmod_poly_gcdinv( + nmod_poly_t G, + nmod_poly_t S, + const nmod_poly_t A, + const nmod_poly_t B); /* Discriminant **************************************************************/ @@ -610,19 +1456,37 @@ int nmod_poly_sqrt(nmod_poly_t b, const nmod_poly_t a); /* Power sums ****************************************************************/ -void _nmod_poly_power_sums_naive(mp_ptr res, mp_srcptr poly, slong len, slong n, nmod_t mod); +void _nmod_poly_power_sums_naive( + mp_ptr res, + mp_srcptr poly, + slong len, + slong n, + nmod_t mod); void nmod_poly_power_sums_naive(nmod_poly_t res, const nmod_poly_t poly, slong n); -void _nmod_poly_power_sums_schoenhage(mp_ptr res, mp_srcptr poly, slong len, slong n, nmod_t mod); +void _nmod_poly_power_sums_schoenhage( + mp_ptr res, + mp_srcptr poly, + slong len, + slong n, + nmod_t mod); void nmod_poly_power_sums_schoenhage(nmod_poly_t res, const nmod_poly_t poly, slong n); void _nmod_poly_power_sums(mp_ptr res, mp_srcptr poly, slong len, slong n, nmod_t mod); void nmod_poly_power_sums(nmod_poly_t res, const nmod_poly_t poly, slong n); -void _nmod_poly_power_sums_to_poly_naive(mp_ptr res, mp_srcptr poly, slong len, nmod_t mod); +void _nmod_poly_power_sums_to_poly_naive( + mp_ptr res, + mp_srcptr poly, + slong len, + nmod_t mod); void nmod_poly_power_sums_to_poly_naive(nmod_poly_t res, const nmod_poly_t Q); -void _nmod_poly_power_sums_to_poly_schoenhage(mp_ptr res, mp_srcptr poly, slong len, nmod_t mod); +void _nmod_poly_power_sums_to_poly_schoenhage( + mp_ptr res, + mp_srcptr poly, + slong len, + nmod_t mod); void nmod_poly_power_sums_to_poly_schoenhage(nmod_poly_t res, const nmod_poly_t Q); void _nmod_poly_power_sums_to_poly(mp_ptr res, mp_srcptr poly, slong len, nmod_t mod); @@ -663,7 +1527,13 @@ void nmod_poly_tanh_series(nmod_poly_t g, const nmod_poly_t h, slong n); void _nmod_poly_log_series(mp_ptr res, mp_srcptr f, slong flen, slong n, nmod_t mod); void nmod_poly_log_series(nmod_poly_t res, const nmod_poly_t f, slong n); -void _nmod_poly_exp_expinv_series(mp_ptr f, mp_ptr g, mp_srcptr h, slong hlen, slong n, nmod_t mod); +void _nmod_poly_exp_expinv_series( + mp_ptr f, + mp_ptr g, + mp_srcptr h, + slong hlen, + slong n, + nmod_t mod); void _nmod_poly_exp_series(mp_ptr f, mp_srcptr h, slong hlen, slong n, nmod_t mod); void nmod_poly_exp_series(nmod_poly_t f, const nmod_poly_t h, slong n); @@ -672,7 +1542,13 @@ void nmod_poly_exp_series(nmod_poly_t f, const nmod_poly_t h, slong n); void _nmod_poly_product_roots_nmod_vec(mp_ptr poly, mp_srcptr xs, slong n, nmod_t mod); void nmod_poly_product_roots_nmod_vec(nmod_poly_t poly, mp_srcptr xs, slong n); -void _nmod_poly_split_rabin(nmod_poly_t a, nmod_poly_t b, const nmod_poly_t f, nmod_poly_t t, nmod_poly_t t2, flint_rand_t randstate); +void _nmod_poly_split_rabin( + nmod_poly_t a, + nmod_poly_t b, + const nmod_poly_t f, + nmod_poly_t t, + nmod_poly_t t2, + flint_rand_t randstate); int nmod_poly_find_distinct_nonzero_roots(mp_limb_t * roots, const nmod_poly_t P); @@ -703,20 +1579,46 @@ typedef nmod_poly_multi_crt_struct nmod_poly_multi_crt_t[1]; void nmod_poly_multi_crt_init(nmod_poly_multi_crt_t CRT); -int nmod_poly_multi_crt_precompute(nmod_poly_multi_crt_t CRT, const nmod_poly_struct * moduli, slong len); -int nmod_poly_multi_crt_precompute_p(nmod_poly_multi_crt_t CRT, const nmod_poly_struct * const * moduli, slong len); - -void nmod_poly_multi_crt_precomp(nmod_poly_t output, const nmod_poly_multi_crt_t CRT, const nmod_poly_struct * values); -void nmod_poly_multi_crt_precomp_p(nmod_poly_t output, const nmod_poly_multi_crt_t CRT, const nmod_poly_struct * const * values); - -int nmod_poly_multi_crt(nmod_poly_t output, const nmod_poly_struct * moduli, const nmod_poly_struct * values, slong len); +int nmod_poly_multi_crt_precompute( + nmod_poly_multi_crt_t CRT, + const nmod_poly_struct * moduli, + slong len); +int nmod_poly_multi_crt_precompute_p( + nmod_poly_multi_crt_t CRT, + const nmod_poly_struct * const * moduli, + slong len); + +void nmod_poly_multi_crt_precomp( + nmod_poly_t output, + const nmod_poly_multi_crt_t CRT, + const nmod_poly_struct * values); +void nmod_poly_multi_crt_precomp_p( + nmod_poly_t output, + const nmod_poly_multi_crt_t CRT, + const nmod_poly_struct * const * values); + +int nmod_poly_multi_crt( + nmod_poly_t output, + const nmod_poly_struct * moduli, + const nmod_poly_struct * values, + slong len); void nmod_poly_multi_crt_clear(nmod_poly_multi_crt_t CRT); -NMOD_POLY_INLINE slong _nmod_poly_multi_crt_local_size(const nmod_poly_multi_crt_t CRT) { return CRT->localsize; } +NMOD_POLY_INLINE +slong _nmod_poly_multi_crt_local_size(const nmod_poly_multi_crt_t CRT) +{ + return CRT->localsize; +} -void _nmod_poly_multi_crt_run(nmod_poly_struct * outputs, const nmod_poly_multi_crt_t CRT, const nmod_poly_struct * inputs); -void _nmod_poly_multi_crt_run_p(nmod_poly_struct * outputs, const nmod_poly_multi_crt_t CRT, const nmod_poly_struct * const * inputs); +void _nmod_poly_multi_crt_run( + nmod_poly_struct * outputs, + const nmod_poly_multi_crt_t CRT, + const nmod_poly_struct * inputs); +void _nmod_poly_multi_crt_run_p( + nmod_poly_struct * outputs, + const nmod_poly_multi_crt_t CRT, + const nmod_poly_struct * const * inputs); /* Inflation and deflation ***************************************************/ @@ -758,19 +1660,38 @@ void nmod_berlekamp_massey_set_prime(nmod_berlekamp_massey_t B, mp_limb_t p); void nmod_berlekamp_massey_print(const nmod_berlekamp_massey_t B); -void nmod_berlekamp_massey_add_points(nmod_berlekamp_massey_t B, const mp_limb_t * a, slong count); +void nmod_berlekamp_massey_add_points( + nmod_berlekamp_massey_t B, + const mp_limb_t * a, + slong count); void nmod_berlekamp_massey_add_point(nmod_berlekamp_massey_t B, mp_limb_t a); void nmod_berlekamp_massey_add_zeros(nmod_berlekamp_massey_t B, slong count); int nmod_berlekamp_massey_reduce(nmod_berlekamp_massey_t B); -NMOD_POLY_INLINE const mp_limb_t * nmod_berlekamp_massey_points(const nmod_berlekamp_massey_t B) { return B->points->coeffs; } +NMOD_POLY_INLINE +const mp_limb_t * nmod_berlekamp_massey_points(const nmod_berlekamp_massey_t B) +{ + return B->points->coeffs; +} -NMOD_POLY_INLINE slong nmod_berlekamp_massey_point_count(const nmod_berlekamp_massey_t B) { return B->points->length; } +NMOD_POLY_INLINE +slong nmod_berlekamp_massey_point_count(const nmod_berlekamp_massey_t B) +{ + return B->points->length; +} -NMOD_POLY_INLINE const nmod_poly_struct * nmod_berlekamp_massey_V_poly(const nmod_berlekamp_massey_t B) { return B->V1; } -NMOD_POLY_INLINE const nmod_poly_struct * nmod_berlekamp_massey_R_poly(const nmod_berlekamp_massey_t B) { return B->R1; } +NMOD_POLY_INLINE +const nmod_poly_struct * nmod_berlekamp_massey_V_poly(const nmod_berlekamp_massey_t B) +{ + return B->V1; +} +NMOD_POLY_INLINE +const nmod_poly_struct * nmod_berlekamp_massey_R_poly(const nmod_berlekamp_massey_t B) +{ + return B->R1; +} #ifdef __cplusplus } diff --git a/src/nmod_poly_factor.h b/src/nmod_poly_factor.h index 894bd9d8aa..02d2b9d808 100644 --- a/src/nmod_poly_factor.h +++ b/src/nmod_poly_factor.h @@ -70,14 +70,27 @@ void nmod_poly_factor_concat(nmod_poly_factor_t res, const nmod_poly_factor_t fa void nmod_poly_factor_pow(nmod_poly_factor_t fac, slong exp); -void nmod_poly_factor_equal_deg(nmod_poly_factor_t factors, const nmod_poly_t pol, slong d); -int nmod_poly_factor_equal_deg_prob(nmod_poly_t factor, flint_rand_t state, const nmod_poly_t pol, slong d); - -void nmod_poly_factor_distinct_deg(nmod_poly_factor_t res, const nmod_poly_t poly, slong * const *degs); +void nmod_poly_factor_equal_deg( + nmod_poly_factor_t factors, + const nmod_poly_t pol, + slong d); +int nmod_poly_factor_equal_deg_prob( + nmod_poly_t factor, + flint_rand_t state, + const nmod_poly_t pol, + slong d); + +void nmod_poly_factor_distinct_deg( + nmod_poly_factor_t res, + const nmod_poly_t poly, + slong * const *degs); ulong nmod_poly_remove(nmod_poly_t f, const nmod_poly_t p); -void nmod_poly_factor_distinct_deg_threaded(nmod_poly_factor_t res, const nmod_poly_t poly, slong * const *degs); +void nmod_poly_factor_distinct_deg_threaded( + nmod_poly_factor_t res, + const nmod_poly_t poly, + slong * const *degs); int nmod_poly_is_irreducible(const nmod_poly_t f); int nmod_poly_is_irreducible_rabin(const nmod_poly_t f); @@ -101,7 +114,11 @@ void _nmod_poly_interval_poly_worker(void* arg_ptr); /* Roots *********************************************************************/ void nmod_poly_roots(nmod_poly_factor_t r, const nmod_poly_t f, int with_multiplicity); -int nmod_poly_roots_factored(nmod_poly_factor_t r, const nmod_poly_t f, int with_multiplicity, const n_factor_t * n); +int nmod_poly_roots_factored( + nmod_poly_factor_t r, + const nmod_poly_t f, + int with_multiplicity, + const n_factor_t * n); #ifdef __cplusplus } diff --git a/src/nmod_poly_mat.h b/src/nmod_poly_mat.h index f70f9d4edb..3db18018fb 100644 --- a/src/nmod_poly_mat.h +++ b/src/nmod_poly_mat.h @@ -24,9 +24,21 @@ extern "C" { #endif -NMOD_POLY_MAT_INLINE nmod_poly_struct * nmod_poly_mat_entry(const nmod_poly_mat_t mat, slong i, slong j) { return mat->rows[i] + j; } -NMOD_POLY_MAT_INLINE slong nmod_poly_mat_nrows(const nmod_poly_mat_t mat) { return mat->r; } -NMOD_POLY_MAT_INLINE slong nmod_poly_mat_ncols(const nmod_poly_mat_t mat) { return mat->c; } +NMOD_POLY_MAT_INLINE +nmod_poly_struct * nmod_poly_mat_entry(const nmod_poly_mat_t mat, slong i, slong j) +{ + return mat->rows[i] + j; +} +NMOD_POLY_MAT_INLINE +slong nmod_poly_mat_nrows(const nmod_poly_mat_t mat) +{ + return mat->r; +} +NMOD_POLY_MAT_INLINE +slong nmod_poly_mat_ncols(const nmod_poly_mat_t mat) +{ + return mat->c; +} /* Memory management *********************************************************/ @@ -44,17 +56,31 @@ void nmod_poly_mat_set_nmod_mat(nmod_poly_mat_t pmat, const nmod_mat_t cmat); void nmod_poly_mat_set_trunc(nmod_poly_mat_t res, const nmod_poly_mat_t pmat, long len); -NMOD_POLY_MAT_INLINE void nmod_poly_mat_truncate(nmod_poly_mat_t pmat, long len) { nmod_poly_mat_set_trunc(pmat, pmat, len); } +NMOD_POLY_MAT_INLINE +void nmod_poly_mat_truncate(nmod_poly_mat_t pmat, long len) +{ + nmod_poly_mat_set_trunc(pmat, pmat, len); +} void nmod_poly_mat_shift_left(nmod_poly_mat_t res, const nmod_poly_mat_t pmat, slong k); void nmod_poly_mat_shift_right(nmod_poly_mat_t res, const nmod_poly_mat_t pmat, slong k); /* Basic properties **********************************************************/ -NMOD_POLY_MAT_INLINE mp_limb_t nmod_poly_mat_modulus(const nmod_poly_mat_t mat) { return mat->modulus; } +NMOD_POLY_MAT_INLINE +mp_limb_t nmod_poly_mat_modulus(const nmod_poly_mat_t mat) +{ + return mat->modulus; +} -void nmod_poly_mat_get_coeff_mat(nmod_mat_t coeff, const nmod_poly_mat_t pmat, slong deg); -void nmod_poly_mat_set_coeff_mat(nmod_poly_mat_t pmat, const nmod_mat_t coeff, slong deg); +void nmod_poly_mat_get_coeff_mat( + nmod_mat_t coeff, + const nmod_poly_mat_t pmat, + slong deg); +void nmod_poly_mat_set_coeff_mat( + nmod_poly_mat_t pmat, + const nmod_mat_t coeff, + slong deg); /* Comparison ****************************************************************/ @@ -64,8 +90,16 @@ int nmod_poly_mat_equal_nmod_mat(const nmod_poly_mat_t pmat, const nmod_mat_t cm int nmod_poly_mat_is_zero(const nmod_poly_mat_t mat); int nmod_poly_mat_is_one(const nmod_poly_mat_t mat); -NMOD_POLY_MAT_INLINE int nmod_poly_mat_is_empty(const nmod_poly_mat_t mat) { return mat->r == 0 || mat->c == 0; } -NMOD_POLY_MAT_INLINE int nmod_poly_mat_is_square(const nmod_poly_mat_t mat) { return mat->r == mat->c; } +NMOD_POLY_MAT_INLINE +int nmod_poly_mat_is_empty(const nmod_poly_mat_t mat) +{ + return mat->r == 0 || mat->c == 0; +} +NMOD_POLY_MAT_INLINE +int nmod_poly_mat_is_square(const nmod_poly_mat_t mat) +{ + return mat->r == mat->c; +} /* Standard matrices *********************************************************/ @@ -75,15 +109,31 @@ void nmod_poly_mat_one(nmod_poly_mat_t mat); /* Random matrices ***********************************************************/ void nmod_poly_mat_randtest(nmod_poly_mat_t mat, flint_rand_t state, slong len); -void nmod_poly_mat_randtest_sparse(nmod_poly_mat_t A, flint_rand_t state, slong len, float density); +void nmod_poly_mat_randtest_sparse( + nmod_poly_mat_t A, + flint_rand_t state, + slong len, + float density); /* Windows and concatenation *************************************************/ -void nmod_poly_mat_window_init(nmod_poly_mat_t window, const nmod_poly_mat_t mat, slong r1, slong c1, slong r2, slong c2); +void nmod_poly_mat_window_init( + nmod_poly_mat_t window, + const nmod_poly_mat_t mat, + slong r1, + slong c1, + slong r2, + slong c2); void nmod_poly_mat_window_clear(nmod_poly_mat_t window); -void nmod_poly_mat_concat_horizontal(nmod_poly_mat_t res, const nmod_poly_mat_t mat1, const nmod_poly_mat_t mat2); -void nmod_poly_mat_concat_vertical(nmod_poly_mat_t res, const nmod_poly_mat_t mat1, const nmod_poly_mat_t mat2); +void nmod_poly_mat_concat_horizontal( + nmod_poly_mat_t res, + const nmod_poly_mat_t mat1, + const nmod_poly_mat_t mat2); +void nmod_poly_mat_concat_vertical( + nmod_poly_mat_t res, + const nmod_poly_mat_t mat1, + const nmod_poly_mat_t mat2); /* Input and output **********************************************************/ @@ -93,23 +143,51 @@ void nmod_poly_mat_print(const nmod_poly_mat_t mat, const char * x); slong nmod_poly_mat_max_length(const nmod_poly_mat_t A); -NMOD_POLY_MAT_INLINE slong nmod_poly_mat_degree(const nmod_poly_mat_t pmat) { return nmod_poly_mat_max_length(pmat) - 1; } +NMOD_POLY_MAT_INLINE +slong nmod_poly_mat_degree(const nmod_poly_mat_t pmat) +{ + return nmod_poly_mat_max_length(pmat) - 1; +} /* Scalar arithmetic *********************************************************/ -void nmod_poly_mat_scalar_mul_nmod(nmod_poly_mat_t B, const nmod_poly_mat_t A, mp_limb_t c); -void nmod_poly_mat_scalar_mul_nmod_poly(nmod_poly_mat_t B, const nmod_poly_mat_t A, const nmod_poly_t c); +void nmod_poly_mat_scalar_mul_nmod( + nmod_poly_mat_t B, + const nmod_poly_mat_t A, + mp_limb_t c); +void nmod_poly_mat_scalar_mul_nmod_poly( + nmod_poly_mat_t B, + const nmod_poly_mat_t A, + const nmod_poly_t c); /* Matrix arithmetic *********************************************************/ -void nmod_poly_mat_add(nmod_poly_mat_t C, const nmod_poly_mat_t A, const nmod_poly_mat_t B); -void nmod_poly_mat_sub(nmod_poly_mat_t C, const nmod_poly_mat_t A, const nmod_poly_mat_t B); +void nmod_poly_mat_add( + nmod_poly_mat_t C, + const nmod_poly_mat_t A, + const nmod_poly_mat_t B); +void nmod_poly_mat_sub( + nmod_poly_mat_t C, + const nmod_poly_mat_t A, + const nmod_poly_mat_t B); void nmod_poly_mat_neg(nmod_poly_mat_t B, const nmod_poly_mat_t A); -void nmod_poly_mat_mul_classical(nmod_poly_mat_t C, const nmod_poly_mat_t A, const nmod_poly_mat_t B); -void nmod_poly_mat_mul_interpolate(nmod_poly_mat_t C, const nmod_poly_mat_t A, const nmod_poly_mat_t B); -void nmod_poly_mat_mul_KS(nmod_poly_mat_t C, const nmod_poly_mat_t A, const nmod_poly_mat_t B); -void nmod_poly_mat_mul(nmod_poly_mat_t C, const nmod_poly_mat_t A, const nmod_poly_mat_t B); +void nmod_poly_mat_mul_classical( + nmod_poly_mat_t C, + const nmod_poly_mat_t A, + const nmod_poly_mat_t B); +void nmod_poly_mat_mul_interpolate( + nmod_poly_mat_t C, + const nmod_poly_mat_t A, + const nmod_poly_mat_t B); +void nmod_poly_mat_mul_KS( + nmod_poly_mat_t C, + const nmod_poly_mat_t A, + const nmod_poly_mat_t B); +void nmod_poly_mat_mul( + nmod_poly_mat_t C, + const nmod_poly_mat_t A, + const nmod_poly_mat_t B); void nmod_poly_mat_sqr_classical(nmod_poly_mat_t B, const nmod_poly_mat_t A); void nmod_poly_mat_sqr_KS(nmod_poly_mat_t B, const nmod_poly_mat_t A); @@ -124,10 +202,23 @@ void nmod_poly_mat_evaluate_nmod(nmod_mat_t B, const nmod_poly_mat_t A, mp_limb_ /* Row reduction *************************************************************/ -slong nmod_poly_mat_find_pivot_any(const nmod_poly_mat_t mat, slong start_row, slong end_row, slong c); -slong nmod_poly_mat_find_pivot_partial(const nmod_poly_mat_t mat, slong start_row, slong end_row, slong c); - -slong nmod_poly_mat_fflu(nmod_poly_mat_t B, nmod_poly_t den, slong * perm, const nmod_poly_mat_t A, int rank_check); +slong nmod_poly_mat_find_pivot_any( + const nmod_poly_mat_t mat, + slong start_row, + slong end_row, + slong c); +slong nmod_poly_mat_find_pivot_partial( + const nmod_poly_mat_t mat, + slong start_row, + slong end_row, + slong c); + +slong nmod_poly_mat_fflu( + nmod_poly_mat_t B, + nmod_poly_t den, + slong * perm, + const nmod_poly_mat_t A, + int rank_check); slong nmod_poly_mat_rref(nmod_poly_mat_t B, nmod_poly_t den, const nmod_poly_mat_t A); @@ -155,11 +246,23 @@ slong nmod_poly_mat_nullspace(nmod_poly_mat_t res, const nmod_poly_mat_t mat); /* Solving *******************************************************************/ -void nmod_poly_mat_solve_fflu_precomp(nmod_poly_mat_t X, const slong * perm, const nmod_poly_mat_t FFLU, const nmod_poly_mat_t B); - -int nmod_poly_mat_solve_fflu(nmod_poly_mat_t X, nmod_poly_t den, const nmod_poly_mat_t A, const nmod_poly_mat_t B); - -int nmod_poly_mat_solve(nmod_poly_mat_t X, nmod_poly_t den, const nmod_poly_mat_t A, const nmod_poly_mat_t B); +void nmod_poly_mat_solve_fflu_precomp( + nmod_poly_mat_t X, + const slong * perm, + const nmod_poly_mat_t FFLU, + const nmod_poly_mat_t B); + +int nmod_poly_mat_solve_fflu( + nmod_poly_mat_t X, + nmod_poly_t den, + const nmod_poly_mat_t A, + const nmod_poly_mat_t B); + +int nmod_poly_mat_solve( + nmod_poly_mat_t X, + nmod_poly_t den, + const nmod_poly_mat_t A, + const nmod_poly_mat_t B); #ifdef __cplusplus } diff --git a/src/nmod_vec.h b/src/nmod_vec.h index f771e0637d..6bb76df330 100644 --- a/src/nmod_vec.h +++ b/src/nmod_vec.h @@ -99,10 +99,25 @@ void _nmod_vec_add(mp_ptr res, mp_srcptr vec1, mp_srcptr vec2, slong len, nmod_t void _nmod_vec_sub(mp_ptr res, mp_srcptr vec1, mp_srcptr vec2, slong len, nmod_t mod); void _nmod_vec_neg(mp_ptr res, mp_srcptr vec, slong len, nmod_t mod); -void _nmod_vec_scalar_mul_nmod(mp_ptr res, mp_srcptr vec, slong len, mp_limb_t c, nmod_t mod); -void _nmod_vec_scalar_mul_nmod_shoup(mp_ptr res, mp_srcptr vec, slong len, mp_limb_t c, nmod_t mod); - -void _nmod_vec_scalar_addmul_nmod(mp_ptr res, mp_srcptr vec, slong len, mp_limb_t c, nmod_t mod); +void _nmod_vec_scalar_mul_nmod( + mp_ptr res, + mp_srcptr vec, + slong len, + mp_limb_t c, + nmod_t mod); +void _nmod_vec_scalar_mul_nmod_shoup( + mp_ptr res, + mp_srcptr vec, + slong len, + mp_limb_t c, + nmod_t mod); + +void _nmod_vec_scalar_addmul_nmod( + mp_ptr res, + mp_srcptr vec, + slong len, + mp_limb_t c, + nmod_t mod); int _nmod_vec_dot_bound_limbs(slong len, nmod_t mod); @@ -170,9 +185,25 @@ int _nmod_vec_dot_bound_limbs(slong len, nmod_t mod); res = s0; \ } while (0); -mp_limb_t _nmod_vec_dot(mp_srcptr vec1, mp_srcptr vec2, slong len, nmod_t mod, int nlimbs); -mp_limb_t _nmod_vec_dot_rev(mp_srcptr vec1, mp_srcptr vec2, slong len, nmod_t mod, int nlimbs); -mp_limb_t _nmod_vec_dot_ptr(mp_srcptr vec1, const mp_ptr * vec2, slong offset, slong len, nmod_t mod, int nlimbs); +mp_limb_t _nmod_vec_dot( + mp_srcptr vec1, + mp_srcptr vec2, + slong len, + nmod_t mod, + int nlimbs); +mp_limb_t _nmod_vec_dot_rev( + mp_srcptr vec1, + mp_srcptr vec2, + slong len, + nmod_t mod, + int nlimbs); +mp_limb_t _nmod_vec_dot_ptr( + mp_srcptr vec1, + const mp_ptr * vec2, + slong offset, + slong len, + nmod_t mod, + int nlimbs); /* some IO functions */ #ifdef FLINT_HAVE_FILE diff --git a/src/padic.h b/src/padic.h index 0318084c37..9ac9543be5 100644 --- a/src/padic.h +++ b/src/padic.h @@ -44,7 +44,12 @@ typedef padic_inv_struct padic_inv_t[1]; /* Context *******************************************************************/ -void padic_ctx_init(padic_ctx_t ctx, const fmpz_t p, slong min, slong max, enum padic_print_mode mode); +void padic_ctx_init( + padic_ctx_t ctx, + const fmpz_t p, + slong min, + slong max, + enum padic_print_mode mode); void padic_ctx_clear(padic_ctx_t ctx); PADIC_INLINE @@ -176,10 +181,22 @@ void padic_one(padic_t rop) /* Comparison ****************************************************************/ -PADIC_INLINE int padic_is_zero(const padic_t op) { return fmpz_is_zero(padic_unit(op)); } -PADIC_INLINE int padic_is_one(const padic_t op) { return fmpz_is_one(padic_unit(op)) && padic_val(op) == 0; } +PADIC_INLINE +int padic_is_zero(const padic_t op) +{ + return fmpz_is_zero(padic_unit(op)); +} +PADIC_INLINE +int padic_is_one(const padic_t op) +{ + return fmpz_is_one(padic_unit(op)) && padic_val(op) == 0; +} -PADIC_INLINE int padic_equal(const padic_t op1, const padic_t op2) { return padic_val(op1) == padic_val(op2) && fmpz_equal(padic_unit(op1), padic_unit(op2)); } +PADIC_INLINE +int padic_equal(const padic_t op1, const padic_t op2) +{ + return padic_val(op1) == padic_val(op2) && fmpz_equal(padic_unit(op1), padic_unit(op2)); +} /* Arithmetic operations *****************************************************/ @@ -213,7 +230,12 @@ void padic_pow_si(padic_t rop, const padic_t op, slong e, const padic_ctx_t ctx) slong _padic_exp_bound(slong v, slong N, const fmpz_t p); void _padic_exp(fmpz_t rop, const fmpz_t u, slong v, const fmpz_t p, slong N); -void _padic_exp_rectangular(fmpz_t rop, const fmpz_t u, slong v, const fmpz_t p, slong N); +void _padic_exp_rectangular( + fmpz_t rop, + const fmpz_t u, + slong v, + const fmpz_t p, + slong N); void _padic_exp_balanced(fmpz_t rop, const fmpz_t u, slong v, const fmpz_t p, slong N); int padic_exp(padic_t rop, const padic_t op, const padic_ctx_t ctx); @@ -247,7 +269,11 @@ void padic_val_fac(fmpz_t rop, const fmpz_t op, const fmpz_t p); /* Input and output **********************************************************/ -char * _padic_get_str(char * str, const padic_t op, const fmpz_t p, enum padic_print_mode mode); +char * _padic_get_str( + char * str, + const padic_t op, + const fmpz_t p, + enum padic_print_mode mode); char * padic_get_str(char * str, const padic_t op, const padic_ctx_t ctx); #ifdef FLINT_HAVE_FILE diff --git a/src/padic_mat.h b/src/padic_mat.h index fd457b8a3a..debcd49996 100644 --- a/src/padic_mat.h +++ b/src/padic_mat.h @@ -27,10 +27,26 @@ extern "C" { /* Macros *******************************************************************/ -PADIC_MAT_INLINE fmpz_mat_struct * padic_mat(const padic_mat_t A) { return (fmpz_mat_struct *)(&(A->mat)); } -PADIC_MAT_INLINE fmpz * padic_mat_entry(const padic_mat_t A, slong i, slong j) { return A->mat.rows[i] + j; } -PADIC_MAT_INLINE slong padic_mat_get_val(const padic_mat_t A) { return padic_mat_val(A); } -PADIC_MAT_INLINE slong padic_mat_get_prec(const padic_mat_t A) { return padic_mat_prec(A); } +PADIC_MAT_INLINE +fmpz_mat_struct * padic_mat(const padic_mat_t A) +{ + return (fmpz_mat_struct *)(&(A->mat)); +} +PADIC_MAT_INLINE +fmpz * padic_mat_entry(const padic_mat_t A, slong i, slong j) +{ + return A->mat.rows[i] + j; +} +PADIC_MAT_INLINE +slong padic_mat_get_val(const padic_mat_t A) +{ + return padic_mat_val(A); +} +PADIC_MAT_INLINE +slong padic_mat_get_prec(const padic_mat_t A) +{ + return padic_mat_prec(A); +} PADIC_MAT_INLINE slong padic_mat_nrows(const padic_mat_t A) { return (A->mat).r; } PADIC_MAT_INLINE slong padic_mat_ncols(const padic_mat_t A) { return (A->mat).c; } @@ -46,8 +62,16 @@ void _padic_mat_canonicalise(padic_mat_t A, const padic_ctx_t ctx); void _padic_mat_reduce(padic_mat_t A, const padic_ctx_t ctx); void padic_mat_reduce(padic_mat_t A, const padic_ctx_t ctx); -PADIC_MAT_INLINE int padic_mat_is_empty(const padic_mat_t A) { return padic_mat(A)->r == 0 || padic_mat(A)->c == 0; } -PADIC_MAT_INLINE int padic_mat_is_square(const padic_mat_t A) { return padic_mat(A)->c == padic_mat(A)->r; } +PADIC_MAT_INLINE +int padic_mat_is_empty(const padic_mat_t A) +{ + return padic_mat(A)->r == 0 || padic_mat(A)->c == 0; +} +PADIC_MAT_INLINE +int padic_mat_is_square(const padic_mat_t A) +{ + return padic_mat(A)->c == padic_mat(A)->r; +} int padic_mat_is_canonical(const padic_mat_t A, const padic_ctx_t ctx); @@ -70,8 +94,18 @@ void padic_mat_get_fmpq_mat(fmpq_mat_t B, const padic_mat_t A, const padic_ctx_t /* Entries *******************************************************************/ -void padic_mat_get_entry_padic(padic_t rop, const padic_mat_t op, slong i, slong j, const padic_ctx_t ctx); -void padic_mat_set_entry_padic(padic_mat_t rop, slong i, slong j, const padic_t op, const padic_ctx_t ctx); +void padic_mat_get_entry_padic( + padic_t rop, + const padic_mat_t op, + slong i, + slong j, + const padic_ctx_t ctx); +void padic_mat_set_entry_padic( + padic_mat_t rop, + slong i, + slong j, + const padic_t op, + const padic_ctx_t ctx); /* Comparison ****************************************************************/ @@ -99,28 +133,68 @@ void padic_mat_transpose(padic_mat_t B, const padic_mat_t A); /* Addition and subtraction **************************************************/ -void _padic_mat_add(padic_mat_t C, const padic_mat_t A, const padic_mat_t B, const padic_ctx_t ctx); -void padic_mat_add(padic_mat_t C, const padic_mat_t A, const padic_mat_t B, const padic_ctx_t ctx); - -void _padic_mat_sub(padic_mat_t C, const padic_mat_t A, const padic_mat_t B, const padic_ctx_t ctx); -void padic_mat_sub(padic_mat_t C, const padic_mat_t A, const padic_mat_t B, const padic_ctx_t ctx); +void _padic_mat_add( + padic_mat_t C, + const padic_mat_t A, + const padic_mat_t B, + const padic_ctx_t ctx); +void padic_mat_add( + padic_mat_t C, + const padic_mat_t A, + const padic_mat_t B, + const padic_ctx_t ctx); + +void _padic_mat_sub( + padic_mat_t C, + const padic_mat_t A, + const padic_mat_t B, + const padic_ctx_t ctx); +void padic_mat_sub( + padic_mat_t C, + const padic_mat_t A, + const padic_mat_t B, + const padic_ctx_t ctx); void _padic_mat_neg(padic_mat_t B, const padic_mat_t A); void padic_mat_neg(padic_mat_t B, const padic_mat_t A, const padic_ctx_t ctx); /* Scalar operations *********************************************************/ -void _padic_mat_scalar_mul_padic(padic_mat_t B, const padic_mat_t A, const padic_t c, const padic_ctx_t ctx); -void padic_mat_scalar_mul_padic(padic_mat_t B, const padic_mat_t A, const padic_t c, const padic_ctx_t ctx); - -void _padic_mat_scalar_mul_fmpz(padic_mat_t B, const padic_mat_t A, const fmpz_t c, const padic_ctx_t ctx); -void padic_mat_scalar_mul_fmpz(padic_mat_t B, const padic_mat_t A, const fmpz_t c, const padic_ctx_t ctx); - -void padic_mat_scalar_div_fmpz(padic_mat_t B, const padic_mat_t A, const fmpz_t c, const padic_ctx_t ctx); +void _padic_mat_scalar_mul_padic( + padic_mat_t B, + const padic_mat_t A, + const padic_t c, + const padic_ctx_t ctx); +void padic_mat_scalar_mul_padic( + padic_mat_t B, + const padic_mat_t A, + const padic_t c, + const padic_ctx_t ctx); + +void _padic_mat_scalar_mul_fmpz( + padic_mat_t B, + const padic_mat_t A, + const fmpz_t c, + const padic_ctx_t ctx); +void padic_mat_scalar_mul_fmpz( + padic_mat_t B, + const padic_mat_t A, + const fmpz_t c, + const padic_ctx_t ctx); + +void padic_mat_scalar_div_fmpz( + padic_mat_t B, + const padic_mat_t A, + const fmpz_t c, + const padic_ctx_t ctx); /* Multiplication ************************************************************/ -void padic_mat_mul(padic_mat_t C, const padic_mat_t A, const padic_mat_t B, const padic_ctx_t ctx); +void padic_mat_mul( + padic_mat_t C, + const padic_mat_t A, + const padic_mat_t B, + const padic_ctx_t ctx); #ifdef __cplusplus } diff --git a/src/padic_poly.h b/src/padic_poly.h index afb57ed958..2f473ef30a 100644 --- a/src/padic_poly.h +++ b/src/padic_poly.h @@ -51,121 +51,341 @@ void padic_poly_truncate(padic_poly_t poly, slong n, const fmpz_t p); /* Polynomial parameters ***************************************************/ -PADIC_POLY_INLINE slong padic_poly_degree(const padic_poly_t poly) { return poly->length - 1; } -PADIC_POLY_INLINE slong padic_poly_length(const padic_poly_t poly) { return poly->length; } -PADIC_POLY_INLINE slong padic_poly_val(const padic_poly_t poly) { return poly->val; } +PADIC_POLY_INLINE +slong padic_poly_degree(const padic_poly_t poly) +{ + return poly->length - 1; +} +PADIC_POLY_INLINE +slong padic_poly_length(const padic_poly_t poly) +{ + return poly->length; +} +PADIC_POLY_INLINE +slong padic_poly_val(const padic_poly_t poly) +{ + return poly->val; +} /* Randomisation ***********************************************************/ -void padic_poly_randtest(padic_poly_t f, flint_rand_t state, slong len, const padic_ctx_t ctx); -void padic_poly_randtest_not_zero(padic_poly_t f, flint_rand_t state, slong len, const padic_ctx_t ctx); -void padic_poly_randtest_val(padic_poly_t f, flint_rand_t state, slong val, slong len, const padic_ctx_t ctx); +void padic_poly_randtest( + padic_poly_t f, + flint_rand_t state, + slong len, + const padic_ctx_t ctx); +void padic_poly_randtest_not_zero( + padic_poly_t f, + flint_rand_t state, + slong len, + const padic_ctx_t ctx); +void padic_poly_randtest_val( + padic_poly_t f, + flint_rand_t state, + slong val, + slong len, + const padic_ctx_t ctx); /* Assignment and basic manipulation ***************************************/ void padic_poly_set_si(padic_poly_t poly, slong x, const padic_ctx_t ctx); void padic_poly_set_ui(padic_poly_t poly, ulong x, const padic_ctx_t ctx); void padic_poly_set_fmpz(padic_poly_t poly, const fmpz_t x, const padic_ctx_t ctx); -void padic_poly_set_fmpz_poly(padic_poly_t rop, const fmpz_poly_t op, const padic_ctx_t ctx); +void padic_poly_set_fmpz_poly( + padic_poly_t rop, + const fmpz_poly_t op, + const padic_ctx_t ctx); void padic_poly_set_fmpq(padic_poly_t poly, const fmpq_t x, const padic_ctx_t ctx); -void padic_poly_set_fmpq_poly(padic_poly_t rop, const fmpq_poly_t op, const padic_ctx_t ctx); +void padic_poly_set_fmpq_poly( + padic_poly_t rop, + const fmpq_poly_t op, + const padic_ctx_t ctx); void padic_poly_set_padic(padic_poly_t poly, const padic_t x, const padic_ctx_t ctx); void padic_poly_set(padic_poly_t f, const padic_poly_t g, const padic_ctx_t ctx); -int padic_poly_get_fmpz_poly(fmpz_poly_t rop, const padic_poly_t op, const padic_ctx_t ctx); -void padic_poly_get_fmpq_poly(fmpq_poly_t rop, const padic_poly_t op, const padic_ctx_t ctx); - -PADIC_POLY_INLINE void padic_poly_zero(padic_poly_t poly) { _padic_poly_set_length(poly, 0); poly->val = 0; } +int padic_poly_get_fmpz_poly( + fmpz_poly_t rop, + const padic_poly_t op, + const padic_ctx_t ctx); +void padic_poly_get_fmpq_poly( + fmpq_poly_t rop, + const padic_poly_t op, + const padic_ctx_t ctx); + +PADIC_POLY_INLINE +void padic_poly_zero(padic_poly_t poly) +{ + _padic_poly_set_length(poly, 0); poly->val = 0; +} void padic_poly_one(padic_poly_t poly); void padic_poly_swap(padic_poly_t poly1, padic_poly_t poly2); /* Getting and setting coefficients ****************************************/ -void padic_poly_get_coeff_padic(padic_t c, const padic_poly_t poly, slong n, const padic_ctx_t ctx); -void padic_poly_set_coeff_padic(padic_poly_t f, slong n, const padic_t c, const padic_ctx_t ctx); +void padic_poly_get_coeff_padic( + padic_t c, + const padic_poly_t poly, + slong n, + const padic_ctx_t ctx); +void padic_poly_set_coeff_padic( + padic_poly_t f, + slong n, + const padic_t c, + const padic_ctx_t ctx); /* Comparison **************************************************************/ int padic_poly_equal(const padic_poly_t f, const padic_poly_t g); -PADIC_POLY_INLINE int padic_poly_is_zero(const padic_poly_t poly) { return poly->length == 0; } -PADIC_POLY_INLINE int padic_poly_is_one(const padic_poly_t poly) { return (poly->length == 1) && /* fmpz_is_one(poly->coeffs) */ *(poly->coeffs) == 1 && (poly->val == 0); } +PADIC_POLY_INLINE +int padic_poly_is_zero(const padic_poly_t poly) +{ + return poly->length == 0; +} +PADIC_POLY_INLINE +int padic_poly_is_one(const padic_poly_t poly) +{ + return (poly->length == 1) && /* fmpz_is_one(poly->coeffs) */ *(poly->coeffs) == 1 && (poly->val == 0); +} /* Addition and subtraction ************************************************/ -void _padic_poly_add(fmpz * rop, slong * rval, slong N, const fmpz * op1, slong val1, slong len1, slong N1, const fmpz * op2, slong val2, slong len2, slong N2, const padic_ctx_t ctx); -void padic_poly_add(padic_poly_t f, const padic_poly_t g, const padic_poly_t h, const padic_ctx_t ctx); - -void _padic_poly_sub(fmpz * rop, slong * rval, slong N, const fmpz * op1, slong val1, slong len1, slong N1, const fmpz * op2, slong val2, slong len2, slong N2, const padic_ctx_t ctx); -void padic_poly_sub(padic_poly_t f, const padic_poly_t g, const padic_poly_t h, const padic_ctx_t ctx); +void _padic_poly_add( + fmpz * rop, + slong * rval, + slong N, + const fmpz * op1, + slong val1, + slong len1, + slong N1, + const fmpz * op2, + slong val2, + slong len2, + slong N2, + const padic_ctx_t ctx); +void padic_poly_add( + padic_poly_t f, + const padic_poly_t g, + const padic_poly_t h, + const padic_ctx_t ctx); + +void _padic_poly_sub( + fmpz * rop, + slong * rval, + slong N, + const fmpz * op1, + slong val1, + slong len1, + slong N1, + const fmpz * op2, + slong val2, + slong len2, + slong N2, + const padic_ctx_t ctx); +void padic_poly_sub( + padic_poly_t f, + const padic_poly_t g, + const padic_poly_t h, + const padic_ctx_t ctx); void padic_poly_neg(padic_poly_t f, const padic_poly_t g, const padic_ctx_t ctx); /* Scalar multiplication and division **************************************/ -void _padic_poly_scalar_mul_padic(fmpz * rop, slong * rval, slong N, const fmpz * op, slong val, slong len, const padic_t c, const padic_ctx_t ctx); -void padic_poly_scalar_mul_padic(padic_poly_t rop, const padic_poly_t op, const padic_t c, const padic_ctx_t ctx); +void _padic_poly_scalar_mul_padic( + fmpz * rop, + slong * rval, + slong N, + const fmpz * op, + slong val, + slong len, + const padic_t c, + const padic_ctx_t ctx); +void padic_poly_scalar_mul_padic( + padic_poly_t rop, + const padic_poly_t op, + const padic_t c, + const padic_ctx_t ctx); /* Multiplication **********************************************************/ -void _padic_poly_mul(fmpz * rop, slong * rval, slong N, const fmpz * op1, slong val1, slong len1, const fmpz * op2, slong val2, slong len2, const padic_ctx_t ctx); -void padic_poly_mul(padic_poly_t f, const padic_poly_t g, const padic_poly_t h, const padic_ctx_t ctx); +void _padic_poly_mul( + fmpz * rop, + slong * rval, + slong N, + const fmpz * op1, + slong val1, + slong len1, + const fmpz * op2, + slong val2, + slong len2, + const padic_ctx_t ctx); +void padic_poly_mul( + padic_poly_t f, + const padic_poly_t g, + const padic_poly_t h, + const padic_ctx_t ctx); /* Powering ****************************************************************/ -void _padic_poly_pow(fmpz * rop, slong * rval, slong N, const fmpz * op, slong val, slong len, ulong e, const padic_ctx_t ctx); -void padic_poly_pow(padic_poly_t rop, const padic_poly_t op, ulong e, const padic_ctx_t ctx); +void _padic_poly_pow( + fmpz * rop, + slong * rval, + slong N, + const fmpz * op, + slong val, + slong len, + ulong e, + const padic_ctx_t ctx); +void padic_poly_pow( + padic_poly_t rop, + const padic_poly_t op, + ulong e, + const padic_ctx_t ctx); /* Series inversion ********************************************************/ -void padic_poly_inv_series(padic_poly_t Qinv, const padic_poly_t Q, slong n, const padic_ctx_t ctx); +void padic_poly_inv_series( + padic_poly_t Qinv, + const padic_poly_t Q, + slong n, + const padic_ctx_t ctx); /* Derivative **************************************************************/ -void _padic_poly_derivative(fmpz * rop, slong * rval, slong N, const fmpz * op, slong val, slong len, const padic_ctx_t ctx); -void padic_poly_derivative(padic_poly_t rop, const padic_poly_t op, const padic_ctx_t ctx); +void _padic_poly_derivative( + fmpz * rop, + slong * rval, + slong N, + const fmpz * op, + slong val, + slong len, + const padic_ctx_t ctx); +void padic_poly_derivative( + padic_poly_t rop, + const padic_poly_t op, + const padic_ctx_t ctx); /* Shifting ****************************************************************/ -void padic_poly_shift_left(padic_poly_t rop, const padic_poly_t op, slong n, const padic_ctx_t ctx); -void padic_poly_shift_right(padic_poly_t rop, const padic_poly_t op, slong n, const padic_ctx_t ctx); +void padic_poly_shift_left( + padic_poly_t rop, + const padic_poly_t op, + slong n, + const padic_ctx_t ctx); +void padic_poly_shift_right( + padic_poly_t rop, + const padic_poly_t op, + slong n, + const padic_ctx_t ctx); /* Evaluation **************************************************************/ -void _padic_poly_evaluate_padic(fmpz_t u, slong * v, slong N, const fmpz * poly, slong val, slong len, const fmpz_t a, slong b, const padic_ctx_t ctx); -void padic_poly_evaluate_padic(padic_t y, const padic_poly_t poly, const padic_t x, const padic_ctx_t ctx); +void _padic_poly_evaluate_padic( + fmpz_t u, + slong * v, + slong N, + const fmpz * poly, + slong val, + slong len, + const fmpz_t a, + slong b, + const padic_ctx_t ctx); +void padic_poly_evaluate_padic( + padic_t y, + const padic_poly_t poly, + const padic_t x, + const padic_ctx_t ctx); /* Composition *************************************************************/ -void _padic_poly_compose(fmpz * rop, slong * rval, slong N, const fmpz * op1, slong val1, slong len1, const fmpz * op2, slong val2, slong len2, const padic_ctx_t ctx); -void padic_poly_compose(padic_poly_t rop, const padic_poly_t op1, const padic_poly_t op2, const padic_ctx_t ctx); - -void _padic_poly_compose_pow(fmpz * rop, slong * rval, slong N, const fmpz * op, slong val, slong len, slong k, const padic_ctx_t ctx); -void padic_poly_compose_pow(padic_poly_t rop, const padic_poly_t op, slong k, const padic_ctx_t ctx); +void _padic_poly_compose( + fmpz * rop, + slong * rval, + slong N, + const fmpz * op1, + slong val1, + slong len1, + const fmpz * op2, + slong val2, + slong len2, + const padic_ctx_t ctx); +void padic_poly_compose( + padic_poly_t rop, + const padic_poly_t op1, + const padic_poly_t op2, + const padic_ctx_t ctx); + +void _padic_poly_compose_pow( + fmpz * rop, + slong * rval, + slong N, + const fmpz * op, + slong val, + slong len, + slong k, + const padic_ctx_t ctx); +void padic_poly_compose_pow( + padic_poly_t rop, + const padic_poly_t op, + slong k, + const padic_ctx_t ctx); /* Input and output ********************************************************/ int padic_poly_debug(const padic_poly_t poly); #ifdef FLINT_HAVE_FILE -int _padic_poly_fprint(FILE * file, const fmpz * poly, slong val, slong len, const padic_ctx_t ctx); +int _padic_poly_fprint( + FILE * file, + const fmpz * poly, + slong val, + slong len, + const padic_ctx_t ctx); int padic_poly_fprint(FILE * file, const padic_poly_t poly, const padic_ctx_t ctx); -int _padic_poly_fprint_pretty(FILE * file, const fmpz * poly, slong val, slong len, const char * var, const padic_ctx_t ctx); -int padic_poly_fprint_pretty(FILE * file, const padic_poly_t poly, const char * var, const padic_ctx_t ctx); +int _padic_poly_fprint_pretty( + FILE * file, + const fmpz * poly, + slong val, + slong len, + const char * var, + const padic_ctx_t ctx); +int padic_poly_fprint_pretty( + FILE * file, + const padic_poly_t poly, + const char * var, + const padic_ctx_t ctx); #endif int _padic_poly_print(const fmpz * poly, slong val, slong len, const padic_ctx_t ctx); int padic_poly_print(const padic_poly_t poly, const padic_ctx_t ctx); -int _padic_poly_print_pretty(const fmpz * poly, slong val, slong len, const char * var, const padic_ctx_t ctx); -int padic_poly_print_pretty(const padic_poly_t poly, const char * var, const padic_ctx_t ctx); +int _padic_poly_print_pretty( + const fmpz * poly, + slong val, + slong len, + const char * var, + const padic_ctx_t ctx); +int padic_poly_print_pretty( + const padic_poly_t poly, + const char * var, + const padic_ctx_t ctx); /* Testing *****************************************************************/ -int _padic_poly_is_canonical(const fmpz * op, slong val, slong len, const padic_ctx_t ctx); +int _padic_poly_is_canonical( + const fmpz * op, + slong val, + slong len, + const padic_ctx_t ctx); int padic_poly_is_canonical(const padic_poly_t op, const padic_ctx_t ctx); -int _padic_poly_is_reduced(const fmpz * op, slong val, slong len, slong N, const padic_ctx_t ctx); +int _padic_poly_is_reduced( + const fmpz * op, + slong val, + slong len, + slong N, + const padic_ctx_t ctx); int padic_poly_is_reduced(const padic_poly_t op, const padic_ctx_t ctx); #ifdef __cplusplus diff --git a/src/qadic.h b/src/qadic.h index e3530f8de1..8650753679 100644 --- a/src/qadic.h +++ b/src/qadic.h @@ -46,31 +46,71 @@ qadic_ctx_struct; typedef qadic_ctx_struct qadic_ctx_t[1]; -void qadic_ctx_init(qadic_ctx_t ctx, const fmpz_t p, slong d, slong min, slong max, const char * var, enum padic_print_mode mode); -void qadic_ctx_init_conway(qadic_ctx_t ctx, const fmpz_t p, slong d, slong min, slong max, const char * var, enum padic_print_mode mode); +void qadic_ctx_init( + qadic_ctx_t ctx, + const fmpz_t p, + slong d, + slong min, + slong max, + const char * var, + enum padic_print_mode mode); +void qadic_ctx_init_conway( + qadic_ctx_t ctx, + const fmpz_t p, + slong d, + slong min, + slong max, + const char * var, + enum padic_print_mode mode); void qadic_ctx_clear(qadic_ctx_t ctx); -QADIC_INLINE slong qadic_ctx_degree(const qadic_ctx_t ctx) { return ctx->j[ctx->len - 1]; } +QADIC_INLINE +slong qadic_ctx_degree(const qadic_ctx_t ctx) +{ + return ctx->j[ctx->len - 1]; +} void qadic_ctx_print(const qadic_ctx_t ctx); /* Memory management *********************************************************/ QADIC_INLINE void qadic_init(qadic_t x) { padic_poly_init(x); } -QADIC_INLINE void qadic_init2(qadic_t rop, slong prec) { padic_poly_init2(rop, 0, prec); } +QADIC_INLINE +void qadic_init2(qadic_t rop, slong prec) +{ + padic_poly_init2(rop, 0, prec); +} QADIC_INLINE void qadic_clear(qadic_t x) { padic_poly_clear(x); } /* TODO: Consider renaming these functions, prefix for the "qadic" module. */ void _fmpz_poly_reduce(fmpz * R, slong lenR, const fmpz * a, const slong * j, slong len); -void _fmpz_mod_poly_reduce(fmpz * R, slong lenR, const fmpz * a, const slong * j, slong len, const fmpz_t p); +void _fmpz_mod_poly_reduce( + fmpz * R, + slong lenR, + const fmpz * a, + const slong * j, + slong len, + const fmpz_t p); void qadic_reduce(qadic_t x, const qadic_ctx_t ctx); /* Randomisation *************************************************************/ -QADIC_INLINE void qadic_randtest(qadic_t x, flint_rand_t state, const qadic_ctx_t ctx) { padic_poly_randtest(x, state, qadic_ctx_degree(ctx), &ctx->pctx); } -QADIC_INLINE void qadic_randtest_not_zero(qadic_t x, flint_rand_t state, const qadic_ctx_t ctx) { padic_poly_randtest_not_zero(x, state, qadic_ctx_degree(ctx), &ctx->pctx); } -QADIC_INLINE void qadic_randtest_val(qadic_t x, flint_rand_t state, slong val, const qadic_ctx_t ctx) { padic_poly_randtest_val(x, state, val, qadic_ctx_degree(ctx), &ctx->pctx); } +QADIC_INLINE +void qadic_randtest(qadic_t x, flint_rand_t state, const qadic_ctx_t ctx) +{ + padic_poly_randtest(x, state, qadic_ctx_degree(ctx), &ctx->pctx); +} +QADIC_INLINE +void qadic_randtest_not_zero(qadic_t x, flint_rand_t state, const qadic_ctx_t ctx) +{ + padic_poly_randtest_not_zero(x, state, qadic_ctx_degree(ctx), &ctx->pctx); +} +QADIC_INLINE +void qadic_randtest_val(qadic_t x, flint_rand_t state, slong val, const qadic_ctx_t ctx) +{ + padic_poly_randtest_val(x, state, val, qadic_ctx_degree(ctx), &ctx->pctx); +} QADIC_INLINE void qadic_randtest_int(qadic_t x, flint_rand_t state, const qadic_ctx_t ctx) @@ -94,9 +134,17 @@ QADIC_INLINE void qadic_one(qadic_t op) { padic_poly_one(op); } void qadic_gen(qadic_t x, const qadic_ctx_t ctx); -QADIC_INLINE void qadic_set_ui(qadic_t rop, ulong op, const qadic_ctx_t ctx) { padic_poly_set_ui(rop, op, &ctx->pctx); } +QADIC_INLINE +void qadic_set_ui(qadic_t rop, ulong op, const qadic_ctx_t ctx) +{ + padic_poly_set_ui(rop, op, &ctx->pctx); +} void qadic_set_fmpz_poly(qadic_t rop, const fmpz_poly_t op, const qadic_ctx_t ctx); -QADIC_INLINE void qadic_set(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx) { padic_poly_set(rop, op, &(ctx->pctx)); } +QADIC_INLINE +void qadic_set(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx) +{ + padic_poly_set(rop, op, &(ctx->pctx)); +} int qadic_get_padic(padic_t rop, const qadic_t op, const qadic_ctx_t ctx); @@ -105,59 +153,206 @@ int qadic_get_padic(padic_t rop, const qadic_t op, const qadic_ctx_t ctx); QADIC_INLINE int qadic_is_zero(const qadic_t op) { return padic_poly_is_zero(op); } QADIC_INLINE int qadic_is_one(const qadic_t op) { return padic_poly_is_one(op); } -QADIC_INLINE int qadic_equal(const qadic_t op1, const qadic_t op2) { return padic_poly_equal(op1, op2); } +QADIC_INLINE +int qadic_equal(const qadic_t op1, const qadic_t op2) +{ + return padic_poly_equal(op1, op2); +} /* Basic arithmetic **********************************************************/ -QADIC_INLINE void qadic_add(qadic_t x, const qadic_t y, const qadic_t z, const qadic_ctx_t ctx) { padic_poly_add(x, y, z, &ctx->pctx); } -QADIC_INLINE void qadic_sub(qadic_t x, const qadic_t y, const qadic_t z, const qadic_ctx_t ctx) { padic_poly_sub(x, y, z, &ctx->pctx); } -QADIC_INLINE void qadic_neg(qadic_t x, const qadic_t y, const qadic_ctx_t ctx) { padic_poly_neg(x, y, &ctx->pctx); } +QADIC_INLINE +void qadic_add(qadic_t x, const qadic_t y, const qadic_t z, const qadic_ctx_t ctx) +{ + padic_poly_add(x, y, z, &ctx->pctx); +} +QADIC_INLINE +void qadic_sub(qadic_t x, const qadic_t y, const qadic_t z, const qadic_ctx_t ctx) +{ + padic_poly_sub(x, y, z, &ctx->pctx); +} +QADIC_INLINE +void qadic_neg(qadic_t x, const qadic_t y, const qadic_ctx_t ctx) +{ + padic_poly_neg(x, y, &ctx->pctx); +} void qadic_mul(qadic_t x, const qadic_t y, const qadic_t z, const qadic_ctx_t ctx); -void _qadic_inv(fmpz * rop, const fmpz * op, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N); +void _qadic_inv( + fmpz * rop, + const fmpz * op, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N); void qadic_inv(qadic_t x, const qadic_t y, const qadic_ctx_t ctx); -void _qadic_pow(fmpz * rop, const fmpz * op, slong len, const fmpz_t e, const fmpz * a, const slong * j, slong lena, const fmpz_t p); +void _qadic_pow( + fmpz * rop, + const fmpz * op, + slong len, + const fmpz_t e, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p); void qadic_pow(qadic_t x, const qadic_t y, const fmpz_t e, const qadic_ctx_t ctx); /* Special functions *********************************************************/ -void _qadic_exp_rectangular(fmpz * rop, const fmpz * op, slong v, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N, const fmpz_t pN); +void _qadic_exp_rectangular( + fmpz * rop, + const fmpz * op, + slong v, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N, + const fmpz_t pN); int qadic_exp_rectangular(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx); -void _qadic_exp_balanced(fmpz * rop, const fmpz * op, slong v, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N, const fmpz_t pN); +void _qadic_exp_balanced( + fmpz * rop, + const fmpz * op, + slong v, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N, + const fmpz_t pN); int qadic_exp_balanced(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx); -void _qadic_exp(fmpz * rop, const fmpz * op, slong v, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N, const fmpz_t pN); +void _qadic_exp( + fmpz * rop, + const fmpz * op, + slong v, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N, + const fmpz_t pN); int qadic_exp(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx); -void _qadic_log_rectangular(fmpz * z, const fmpz * y, slong v, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N, const fmpz_t pN); +void _qadic_log_rectangular( + fmpz * z, + const fmpz * y, + slong v, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N, + const fmpz_t pN); int qadic_log_rectangular(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx); -void _qadic_log_balanced(fmpz * z, const fmpz * y, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N, const fmpz_t pN); +void _qadic_log_balanced( + fmpz * z, + const fmpz * y, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N, + const fmpz_t pN); int qadic_log_balanced(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx); -void _qadic_log(fmpz * z, const fmpz * y, slong v, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N, const fmpz_t pN); +void _qadic_log( + fmpz * z, + const fmpz * y, + slong v, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N, + const fmpz_t pN); int qadic_log(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx); -void _qadic_frobenius_a(fmpz * rop, slong exp, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N); -void _qadic_frobenius(fmpz * rop, const fmpz * op, slong len, slong e, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N); +void _qadic_frobenius_a( + fmpz * rop, + slong exp, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N); +void _qadic_frobenius( + fmpz * rop, + const fmpz * op, + slong len, + slong e, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N); void qadic_frobenius(qadic_t rop, const qadic_t op, slong e, const qadic_ctx_t ctx); -void _qadic_teichmuller(fmpz * rop, const fmpz * op, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N); +void _qadic_teichmuller( + fmpz * rop, + const fmpz * op, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N); void qadic_teichmuller(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx); -void _qadic_trace(fmpz_t rop, const fmpz * op, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t pN); +void _qadic_trace( + fmpz_t rop, + const fmpz * op, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t pN); void qadic_trace(padic_t rop, const qadic_t op, const qadic_ctx_t ctx); -void _qadic_norm_resultant(fmpz_t rop, const fmpz * op, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N); +void _qadic_norm_resultant( + fmpz_t rop, + const fmpz * op, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N); void qadic_norm_resultant(padic_t rop, const qadic_t op, const qadic_ctx_t ctx); -void _qadic_norm_analytic(fmpz_t rop, const fmpz * y, slong v, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N); +void _qadic_norm_analytic( + fmpz_t rop, + const fmpz * y, + slong v, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N); void qadic_norm_analytic(padic_t rop, const qadic_t op, const qadic_ctx_t ctx); -void _qadic_norm(fmpz_t rop, const fmpz * op, slong len, const fmpz * a, const slong * j, slong lena, const fmpz_t p, slong N); +void _qadic_norm( + fmpz_t rop, + const fmpz * op, + slong len, + const fmpz * a, + const slong * j, + slong lena, + const fmpz_t p, + slong N); void qadic_norm(padic_t rop, const qadic_t op, const qadic_ctx_t ctx); int qadic_sqrt(qadic_t rop, const qadic_t op, const qadic_ctx_t ctx); diff --git a/src/qfb.h b/src/qfb.h index a5f9b475d7..74865a2aec 100644 --- a/src/qfb.h +++ b/src/qfb.h @@ -45,12 +45,28 @@ typedef struct slong iter; } qfb_hash_t; -QFB_INLINE void qfb_init(qfb_t q) { fmpz_init(q->a); fmpz_init(q->b); fmpz_init(q->c); } -QFB_INLINE void qfb_clear(qfb_t q) { fmpz_clear(q->a); fmpz_clear(q->b); fmpz_clear(q->c); } +QFB_INLINE +void qfb_init(qfb_t q) +{ + fmpz_init(q->a); fmpz_init(q->b); fmpz_init(q->c); +} +QFB_INLINE +void qfb_clear(qfb_t q) +{ + fmpz_clear(q->a); fmpz_clear(q->b); fmpz_clear(q->c); +} -QFB_INLINE int qfb_equal(qfb_t f, qfb_t g) { return (fmpz_equal(f->a, g->a) && fmpz_equal(f->b, g->b) && fmpz_equal(f->c, g->c)); } +QFB_INLINE +int qfb_equal(qfb_t f, qfb_t g) +{ + return (fmpz_equal(f->a, g->a) && fmpz_equal(f->b, g->b) && fmpz_equal(f->c, g->c)); +} -QFB_INLINE void qfb_set(qfb_t f, qfb_t g) { fmpz_set(f->a, g->a); fmpz_set(f->b, g->b); fmpz_set(f->c, g->c); } +QFB_INLINE +void qfb_set(qfb_t f, qfb_t g) +{ + fmpz_set(f->a, g->a); fmpz_set(f->b, g->b); fmpz_set(f->c, g->c); +} QFB_INLINE void qfb_discriminant(fmpz_t D, qfb_t f) diff --git a/src/qsieve.h b/src/qsieve.h index 3f2843c953..3f7094bbaf 100644 --- a/src/qsieve.h +++ b/src/qsieve.h @@ -327,7 +327,11 @@ void qsieve_poly_copy(qs_poly_t poly, qs_t qs_inf); void qsieve_do_sieving(qs_t qs_inf, unsigned char * sieve, qs_poly_t poly); void qsieve_do_sieving2(qs_t qs_inf, unsigned char * sieve, qs_poly_t poly); -slong qsieve_evaluate_candidate(qs_t qs_inf, ulong i, unsigned char * sieve, qs_poly_t poly); +slong qsieve_evaluate_candidate( + qs_t qs_inf, + ulong i, + unsigned char * sieve, + qs_poly_t poly); slong qsieve_evaluate_sieve(qs_t qs_inf, unsigned char * sieve, qs_poly_t poly); @@ -398,9 +402,21 @@ uint64_t get_null_entry(uint64_t * nullrows, slong i, slong l); void reduce_matrix(qs_t qs_inf, slong *nrows, slong *ncols, la_col_t *cols); -uint64_t * block_lanczos(flint_rand_t state, slong nrows, slong dense_rows, slong ncols, la_col_t *B); - -void qsieve_square_root(fmpz_t X, fmpz_t Y, qs_t qs_inf, uint64_t * nullrows, slong ncols, slong l, fmpz_t N); +uint64_t * block_lanczos( + flint_rand_t state, + slong nrows, + slong dense_rows, + slong ncols, + la_col_t *B); + +void qsieve_square_root( + fmpz_t X, + fmpz_t Y, + qs_t qs_inf, + uint64_t * nullrows, + slong ncols, + slong l, + fmpz_t N); #ifdef __cplusplus } diff --git a/src/thread_pool.h b/src/thread_pool.h index f6d3092d3c..5b46710497 100644 --- a/src/thread_pool.h +++ b/src/thread_pool.h @@ -72,15 +72,34 @@ slong thread_pool_get_size(thread_pool_t T); int thread_pool_set_size(thread_pool_t T, slong new_size); slong thread_pool_request(thread_pool_t T, thread_pool_handle * out, slong requested); -void thread_pool_wake(thread_pool_t T, thread_pool_handle i, int max_workers, void (*f)(void*), void * a); +void thread_pool_wake( + thread_pool_t T, + thread_pool_handle i, + int max_workers, + void (*f)(void*), + void * a); void thread_pool_wait(thread_pool_t T, thread_pool_handle i); void thread_pool_give_back(thread_pool_t T, thread_pool_handle i); /* misc internal helpers *****************************************************/ -void _thread_pool_distribute_work_2(slong start, slong stop, slong * Astart, slong * Astop, slong Alen, slong * Bstart, slong * Bstop, slong Blen); - -ulong _thread_pool_find_work_2(ulong a, ulong alpha, ulong b, ulong beta, ulong yn, ulong yd); +void _thread_pool_distribute_work_2( + slong start, + slong stop, + slong * Astart, + slong * Astop, + slong Alen, + slong * Bstart, + slong * Bstop, + slong Blen); + +ulong _thread_pool_find_work_2( + ulong a, + ulong alpha, + ulong b, + ulong beta, + ulong yn, + ulong yd); #ifdef __cplusplus } diff --git a/src/thread_support.h b/src/thread_support.h index 25ae6c7df1..1315fb0e4e 100644 --- a/src/thread_support.h +++ b/src/thread_support.h @@ -42,7 +42,19 @@ typedef void (* bsplit_basecase_func_t)(void *, slong, slong, void *); typedef void (* bsplit_init_func_t)(void *, void *); typedef void (* bsplit_clear_func_t)(void *, void *); -void flint_parallel_binary_splitting(void * res, bsplit_basecase_func_t basecase, bsplit_merge_func_t merge, size_t sizeof_res, bsplit_init_func_t init, bsplit_clear_func_t clear, void * args, slong a, slong b, slong basecase_cutoff, int thread_limit, int flags); +void flint_parallel_binary_splitting( + void * res, + bsplit_basecase_func_t basecase, + bsplit_merge_func_t merge, + size_t sizeof_res, + bsplit_init_func_t init, + bsplit_clear_func_t clear, + void * args, + slong a, + slong b, + slong basecase_cutoff, + int thread_limit, + int flags); #ifdef __cplusplus } diff --git a/src/ulong_extras.h b/src/ulong_extras.h index 614e884fc6..a1fbe08481 100644 --- a/src/ulong_extras.h +++ b/src/ulong_extras.h @@ -130,7 +130,11 @@ ULONG_EXTRAS_INLINE int n_sub_checked(ulong * a, ulong b, ulong c) /* Modular arithmetic ********************************************************/ -ULONG_EXTRAS_INLINE double n_precompute_inverse(ulong n) { return (double) 1 / (double) n; } +ULONG_EXTRAS_INLINE +double n_precompute_inverse(ulong n) +{ + return (double) 1 / (double) n; +} ulong n_preinvert_limb(ulong n); ulong n_preinvert_limb_prenorm(ulong n); @@ -351,14 +355,23 @@ ulong n_nextprime(ulong n, int proved); #define FLINT_FACTOR_ONE_LINE_MAX (UWORD(1)<<39) #define FLINT_FACTOR_ONE_LINE_ITERS 40000 -ULONG_EXTRAS_INLINE void n_factor_init(n_factor_t * factors) { factors->num = UWORD(0); } +ULONG_EXTRAS_INLINE +void n_factor_init(n_factor_t * factors) +{ + factors->num = UWORD(0); +} void n_factor(n_factor_t * factors, ulong n, int proved); void n_factor_insert(n_factor_t * factors, ulong p, ulong exp); ulong n_factor_trial_range(n_factor_t * factors, ulong n, ulong start, ulong num_primes); -ulong n_factor_trial_partial(n_factor_t * factors, ulong n, ulong * prod, ulong num_primes, ulong limit); +ulong n_factor_trial_partial( + n_factor_t * factors, + ulong n, + ulong * prod, + ulong num_primes, + ulong limit); ulong n_factor_trial(n_factor_t * factors, ulong n, ulong num_primes); ulong n_factor_partial(n_factor_t * factors, ulong n, ulong limit, int proved); @@ -372,8 +385,20 @@ ulong n_factor_pp1(ulong n, ulong B1, ulong c); ulong n_factor_pp1_wrapper(ulong n); void n_factor_pp1_table_insert(slong bits, slong B1, slong count); -int n_factor_pollard_brent_single(ulong *factor, ulong n, ulong ninv, ulong ai, ulong xi, ulong normbits, ulong max_iters); -int n_factor_pollard_brent(ulong *factor, flint_rand_t state, ulong n_in, ulong max_tries, ulong max_iters); +int n_factor_pollard_brent_single( + ulong *factor, + ulong n, + ulong ninv, + ulong ai, + ulong xi, + ulong normbits, + ulong max_iters); +int n_factor_pollard_brent( + ulong *factor, + flint_rand_t state, + ulong n_in, + ulong max_tries, + ulong max_iters); int n_remove(ulong * n, ulong p); int n_remove2_precomp(ulong * n, ulong p, double ppre); @@ -396,14 +421,55 @@ n_ecm_s; typedef n_ecm_s n_ecm_t[1]; -void n_factor_ecm_double(ulong *x, ulong *z, ulong x0, ulong z0, ulong n, n_ecm_t n_ecm_inf); -void n_factor_ecm_add(ulong *x, ulong *z, ulong x1, ulong z1, ulong x2, ulong z2, ulong x0, ulong z0, ulong n, n_ecm_t n_ecm_inf); -void n_factor_ecm_mul_montgomery_ladder(ulong *x, ulong *z, ulong x0, ulong z0, ulong k, ulong n, n_ecm_t n_ecm_inf); +void n_factor_ecm_double( + ulong *x, + ulong *z, + ulong x0, + ulong z0, + ulong n, + n_ecm_t n_ecm_inf); +void n_factor_ecm_add( + ulong *x, + ulong *z, + ulong x1, + ulong z1, + ulong x2, + ulong z2, + ulong x0, + ulong z0, + ulong n, + n_ecm_t n_ecm_inf); +void n_factor_ecm_mul_montgomery_ladder( + ulong *x, + ulong *z, + ulong x0, + ulong z0, + ulong k, + ulong n, + n_ecm_t n_ecm_inf); int n_factor_ecm_select_curve(ulong *f, ulong sig, ulong n, n_ecm_t n_ecm_inf); -int n_factor_ecm(ulong *f, ulong curves, ulong B1, ulong B2, flint_rand_t state, ulong n); -int n_factor_ecm_stage_I(ulong *f, const ulong *prime_array, ulong num, ulong B1, ulong n, n_ecm_t n_ecm_inf); -int n_factor_ecm_stage_II(ulong *f, ulong B1, ulong B2, ulong P, ulong n, n_ecm_t n_ecm_inf); +int n_factor_ecm( + ulong *f, + ulong curves, + ulong B1, + ulong B2, + flint_rand_t state, + ulong n); +int n_factor_ecm_stage_I( + ulong *f, + const ulong *prime_array, + ulong num, + ulong B1, + ulong n, + n_ecm_t n_ecm_inf); +int n_factor_ecm_stage_II( + ulong *f, + ulong B1, + ulong B2, + ulong P, + ulong n, + n_ecm_t n_ecm_inf); #ifdef __cplusplus }