File indexing completed on 2026-11-07 10:15:16
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014 #ifndef FMPZ_POLY_FACTOR_H
0015 #define FMPZ_POLY_FACTOR_H
0016
0017 #ifdef FMPZ_POLY_FACTOR_INLINES_C
0018 #define FMPZ_POLY_FACTOR_INLINE
0019 #else
0020 #define FMPZ_POLY_FACTOR_INLINE static inline
0021 #endif
0022
0023 #include "nmod_types.h"
0024 #include "fmpz_types.h"
0025
0026 #ifdef __cplusplus
0027 extern "C" {
0028 #endif
0029
0030 void fmpz_poly_factor_init(fmpz_poly_factor_t fac);
0031
0032 void fmpz_poly_factor_init2(fmpz_poly_factor_t fac, slong alloc);
0033
0034 void fmpz_poly_factor_realloc(fmpz_poly_factor_t fac, slong alloc);
0035
0036 void fmpz_poly_factor_fit_length(fmpz_poly_factor_t fac, slong len);
0037
0038 void fmpz_poly_factor_clear(fmpz_poly_factor_t fac);
0039
0040 void fmpz_poly_factor_set(fmpz_poly_factor_t res,
0041 const fmpz_poly_factor_t fac);
0042
0043 void fmpz_poly_factor_insert(fmpz_poly_factor_t fac,
0044 const fmpz_poly_t p, slong exp);
0045
0046 void fmpz_poly_factor_concat(fmpz_poly_factor_t res,
0047 const fmpz_poly_factor_t fac);
0048
0049 void fmpz_poly_factor_print(const fmpz_poly_factor_t fac);
0050
0051 void fmpz_poly_factor_zassenhaus_recombination(
0052 fmpz_poly_factor_t final_fac, const fmpz_poly_factor_t lifted_fac,
0053 const fmpz_poly_t F, const fmpz_t P, slong exp);
0054
0055 void fmpz_poly_factor_squarefree(fmpz_poly_factor_t fac,
0056 const fmpz_poly_t F);
0057
0058 void fmpz_poly_factor_mignotte(fmpz_t B, const fmpz_poly_t f);
0059
0060 void _fmpz_poly_factor_zassenhaus(fmpz_poly_factor_t final_fac,
0061 slong exp, const fmpz_poly_t f, slong cutoff, int use_van_hoeij);
0062
0063 void fmpz_poly_factor_zassenhaus(fmpz_poly_factor_t fac,
0064 const fmpz_poly_t G);
0065
0066 void _fmpz_poly_factor_quadratic(fmpz_poly_factor_t fac,
0067 const fmpz_poly_t f, slong exp);
0068
0069 void _fmpz_poly_factor_cubic(fmpz_poly_factor_t fac,
0070 const fmpz_poly_t f, slong exp);
0071
0072 slong _fmpz_poly_factor_CLD_mat(fmpz_mat_t res, const fmpz_poly_t f,
0073 fmpz_poly_factor_t lifted_fac, fmpz_t P, ulong k);
0074
0075 int fmpz_poly_factor_van_hoeij_check_if_solved(fmpz_mat_t M,
0076 fmpz_poly_factor_t final_fac, fmpz_poly_factor_t lifted_fac,
0077 const fmpz_poly_t f, fmpz_t P, slong exp, fmpz_t lc);
0078
0079 void fmpz_poly_factor_van_hoeij(fmpz_poly_factor_t final_fac,
0080 const nmod_poly_factor_t fac, const fmpz_poly_t f, slong exp, ulong p);
0081
0082 void fmpz_poly_factor(fmpz_poly_factor_t fac, const fmpz_poly_t G);
0083
0084
0085
0086 void fmpz_poly_factor_get_fmpz_poly(fmpz_poly_t z, const fmpz_poly_factor_t F, slong i);
0087 void fmpz_poly_factor_get_fmpz(fmpz_t z, const fmpz_poly_factor_t F);
0088
0089
0090
0091 void zassenhaus_subset_first(slong * s, slong r, slong m);
0092
0093 int zassenhaus_subset_next(slong * s, slong r);
0094
0095 slong zassenhaus_subset_next_disjoint(slong * s, slong r);
0096
0097 typedef struct {
0098 slong deg;
0099 unsigned char * pos_degs;
0100 slong new_length;
0101 slong new_total;
0102 slong * new_degs;
0103 slong alloc;
0104 } zassenhaus_prune_struct;
0105
0106 typedef zassenhaus_prune_struct zassenhaus_prune_t[1];
0107
0108 FMPZ_POLY_FACTOR_INLINE
0109 void zassenhaus_prune_init(zassenhaus_prune_t Z)
0110 {
0111 Z->deg = 0;
0112 Z->pos_degs = NULL;
0113 Z->new_length = 0;
0114 Z->new_total = 0;
0115 Z->new_degs = NULL;
0116 Z->alloc = 0;
0117 }
0118
0119 void zassenhaus_prune_clear(zassenhaus_prune_t Z);
0120
0121 void zassenhaus_prune_set_degree(zassenhaus_prune_t Z, slong d);
0122
0123 FMPZ_POLY_FACTOR_INLINE
0124 void zassenhaus_prune_start_add_factors(zassenhaus_prune_t Z)
0125 {
0126 Z->new_length = 0;
0127 Z->new_total = 0;
0128 }
0129
0130 void zassenhaus_prune_add_factor(zassenhaus_prune_t Z,
0131 slong deg, slong exp);
0132
0133 void zassenhaus_prune_end_add_factors(zassenhaus_prune_t Z);
0134
0135 int zassenhaus_prune_must_be_irreducible(const zassenhaus_prune_t Z);
0136
0137 FMPZ_POLY_FACTOR_INLINE
0138 int zassenhaus_prune_degree_is_possible(const zassenhaus_prune_t Z, slong d)
0139 {
0140 if (d <= 0)
0141 return d == 0;
0142
0143 if (d >= Z->deg)
0144 return d == Z->deg;
0145
0146 return Z->pos_degs[d];
0147 }
0148
0149 void fmpz_poly_factor_zassenhaus_recombination_with_prune(
0150 fmpz_poly_factor_t final_fac, const fmpz_poly_factor_t lifted_fac,
0151 const fmpz_poly_t F, const fmpz_t P, slong exp,
0152 const zassenhaus_prune_t Z);
0153
0154 #ifdef __cplusplus
0155 }
0156 #endif
0157
0158 #endif