fmpz_poly_factor.h – factorisation of polynomials over the integers¶
Types, macros and constants¶
- 
type fmpz_poly_factor_struct¶
- 
type fmpz_poly_factor_t¶
Memory management¶
- 
void fmpz_poly_factor_init(fmpz_poly_factor_t fac)¶
- Initialises a new factor structure. 
- 
void fmpz_poly_factor_init2(fmpz_poly_factor_t fac, slong alloc)¶
- Initialises a new factor structure, providing space for at least - allocfactors.
- 
void fmpz_poly_factor_realloc(fmpz_poly_factor_t fac, slong alloc)¶
- Reallocates the factor structure to provide space for precisely - allocfactors.
- 
void fmpz_poly_factor_fit_length(fmpz_poly_factor_t fac, slong len)¶
- Ensures that the factor structure has space for at least - lenfactors. This functions takes care of the case of repeated calls by always at least doubling the number of factors the structure can hold.
- 
void fmpz_poly_factor_clear(fmpz_poly_factor_t fac)¶
- Releases all memory occupied by the factor structure. 
Manipulating factors¶
- 
void fmpz_poly_factor_set(fmpz_poly_factor_t res, const fmpz_poly_factor_t fac)¶
- Sets - resto the same factorisation as- fac.
- 
void fmpz_poly_factor_insert(fmpz_poly_factor_t fac, const fmpz_poly_t p, slong e)¶
- Adds the primitive polynomial \(p^e\) to the factorisation - fac.- Assumes that \(\deg(p) \geq 2\) and \(e \neq 0\). 
- 
void fmpz_poly_factor_concat(fmpz_poly_factor_t res, const fmpz_poly_factor_t fac)¶
- Concatenates two factorisations. - This is equivalent to calling - fmpz_poly_factor_insert()repeatedly with the individual factors of- fac.- Does not support aliasing between - resand- fac.
Input and output¶
- 
void fmpz_poly_factor_print(const fmpz_poly_factor_t fac)¶
- Prints the entries of - facto standard output.
Factoring algorithms¶
- 
void fmpz_poly_factor_squarefree(fmpz_poly_factor_t fac, const fmpz_poly_t F)¶
- Takes as input a polynomial \(F\) and a freshly initialized factor structure - fac. Updates- facto contain a factorization of \(F\) into (not necessarily irreducible) factors that themselves have no repeated factors. None of the returned factors will have the same exponent. That is we return \(g_i\) and unique \(e_i\) such that\[F = c \prod_{i} g_i^{e_i}\]- where \(c\) is the signed content of \(F\) and \(\gcd(g_i, g_i') = 1\). 
- 
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)¶
- Takes as input a factor structure - lifted_faccontaining a squarefree factorization of the polynomial \(F \bmod p\). The algorithm does a brute force search for irreducible factors of \(F\) over the integers, and each factor is raised to the power- exp.- The impact of the algorithm is to augment a factorization of - F^expto the factor structure- final_fac.
- 
void _fmpz_poly_factor_zassenhaus(fmpz_poly_factor_t final_fac, slong exp, const fmpz_poly_t f, slong cutoff, int use_van_hoeij)¶
- This is the internal wrapper of Zassenhaus. - It will attempt to find a small prime such that \(f\) modulo \(p\) has a minimal number of factors. If it cannot find a prime giving less than - cutofffactors it aborts. Then it decides a \(p\)-adic precision to lift the factors to, Hensel lifts, and finally calls Zassenhaus recombination.- Assumes that \(\operatorname{len}(f) \geq 2\). - Assumes that \(f\) is primitive. - Assumes that the constant coefficient of \(f\) is non-zero. Note that this can be easily achieved by taking out factors of the form \(x^k\) before calling this routine. - If the final flag is set, the function will use the van Hoeij factorisation algorithm with gradual feeding and mod \(2^k\) data truncation to find factors when the number of local factors is large. 
- 
void fmpz_poly_factor_zassenhaus(fmpz_poly_factor_t final_fac, const fmpz_poly_t F)¶
- A wrapper of the Zassenhaus factoring algorithm, which takes as input any polynomial \(F\), and stores a factorization in - final_fac.- The complexity will be exponential in the number of local factors we find for the components of a squarefree factorization of \(F\). 
- 
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)¶
- Inserts the factorisation of the quadratic (resp. cubic) polynomial f into fac with multiplicity exp. This function requires that the content of f has been removed, and does not update the content of fac. The factorization is calculated over \(\mathbb{R}\) or \(\mathbb{Q}_2\) and then tested over \(\mathbb{Z}\). 
- 
void fmpz_poly_factor(fmpz_poly_factor_t final_fac, const fmpz_poly_t F)¶
- A wrapper of the Zassenhaus and van Hoeij factoring algorithms, which takes as input any polynomial \(F\), and stores a factorization in - final_fac.