We describe the functions for multivariate polynomial factorization and associated computations.
Given a multivariate polynomial f over the ring R, this function returns the factorization of f as a factorization sequence Q, that is, a sequence of pairs, each consisting of an irreducible factor qi a positive integer ki (its multiplicity). Each irreducible factor is normalized (see the function Normalize), so the expansion of the factorization sequence is the unique canonical associate of f. The function also returns the unit u of R giving the normalization, so f=u.∏i qiki.The coefficient ring R must be one of the following: a finite field Fq, the ring of integers Z, the field of rationals Q, an algebraic number field Q(α), or a polynomial ring, function field (rational or algebraic) or finite-dimensional affine algebra (which is a field) over any of the above.
For bivariate polynomials, a polynomial-time algorithm in the same spirit as van Hoeij's Knapsack factoring algorithm [vH02] is used.
For polynomials over the integers or rationals, an algorithm similar to that presented in [Wan78] and [GCL92, section 6.8], based on evaluation and sparse ideal-adic multivariate Hensel lifting, is used.
For polynomials over any finite field, a similar algorithm is used, with a few special modifications for non-zero characteristic (see, for example, [BM97]).
For polynomials over algebraic number fields and affine algebras, a multivariate version of the norm-based algorithm of Trager [Tra76] is used, which performs a suitable substitution and multivariate resultant computation, and then factors the resulting integral multivariate polynomial.
Each of these algorithms reduces to univariate factorization over the base ring; for details of how this factorization is done in each case, see the function Factorization in the univariate polynomial rings chapter.
For polynomials over another polynomial ring or function field, the polynomials are first "flattened" to be inside a multivariate polynomial ring over the base coefficient ring, then the appropriate algorithm is used for that base coefficient ring.
Return the squarefree factorization of the multivariate polynomial f as a sequence of tuples of length 2, each consisting of a (not necessarily irreducible) factor and an integer indicating the multiplicity. The factors do not contain the square of any polynomial of degree greater than 0. The allowable coefficient rings are the same as those allowable for the function Factorization.
Return the squarefree part of the multivariate polynomial f, which is the largest (normalized) divisor g of f which is squarefree.
Given a multivariate polynomial f over a ring R, this function returns whether f is irreducible over R. The allowable coefficient rings are the same as those allowable for the function Factorization.
(Procedure.) Change the verbose printing level for all polynomial factorization algorithms to be v. Currently the legal levels are 0, 1, 2 or 3.
> P<x, y, z> := PolynomialRing(IntegerRing(), 3); > f := &*[x^i+y^j+z^k: i,j,k in [1..2]]; > #Terms(f); 461 > TotalDegree(f); 15 > time Factorization(f); [ <x + y + z, 1>, <x + y + z^2, 1>, <x + y^2 + z, 1>, <x + y^2 + z^2, 1>, <x^2 + y + z, 1>, <x^2 + y + z^2, 1>, <x^2 + y^2 + z, 1>, <x^2 + y^2 + z^2, 1> ] Time: 0.290
> // Create polynomial ring over R of rank n > PRing := function(R, n) > P := PolynomialRing(R, n); > AssignNames(~P, ["x" cat IntegerToString(i): i in [1..n]]); > return P; > end function; > > // Create Vandermonde matrix of rank n > Vandermonde := function(n) > P := PRing(IntegerRing(), n); > return MatrixRing(P, n) ! [P.i^(j - 1): i, j in [1 .. n]]; > end function; > > V := Vandermonde(6); > V; [ 1 x1 x1^2 x1^3 x1^4 x1^5] [ 1 x2 x2^2 x2^3 x2^4 x2^5] [ 1 x3 x3^2 x3^3 x3^4 x3^5] [ 1 x4 x4^2 x4^3 x4^4 x4^5] [ 1 x5 x5^2 x5^3 x5^4 x5^5] [ 1 x6 x6^2 x6^3 x6^4 x6^5] > D := Determinant(V); > #Terms(D); 720 > TotalDegree(D); 15 > time Factorization(D); [ <x5 - x6, 1>, <x4 - x6, 1>, <x4 - x5, 1>, <x3 - x6, 1>, <x3 - x5, 1>, <x3 - x4, 1>, <x2 - x6, 1>, <x2 - x5, 1>, <x2 - x4, 1>, <x2 - x3, 1>, <x1 - x6, 1>, <x1 - x5, 1>, <x1 - x4, 1>, <x1 - x3, 1>, <x1 - x2, 1> ] Time: 0.030
> P<a, b, c> := PolynomialRing(RationalField(), 3); > A2 := 1/16 * (4*a^2*b^2 - (a^2 + b^2 - c^2)^2); > A2; -1/16*a^4 + 1/8*a^2*b^2 + 1/8*a^2*c^2 - 1/16*b^4 + 1/8*b^2*c^2 - 1/16*c^4 > F, u := Factorization(A2); > F; [ <a - b - c, 1>, <a - b + c, 1>, <a + b - c, 1>, <a + b + c, 1> ] > u; -1/16
> Frob := function(G) > n := #G; > I := {@ g: g in G @}; > P := PolynomialRing(GF(2), n); > AssignNames(~P, [CodeToString(96 + i): i in [1 .. n]]); > M := MatrixRing(P, n); > return M ! &cat[ > [P.Index(I, I[i] * I[j]): j in [1 .. n]]: i in [1 .. n] > ]; > end function; > A := Frob(Sym(3)); > A; [a b c d e f] [b c a f d e] [c a b e f d] [d e f a b c] [e f d c a b] [f d e b c a] > Determinant(A); a^6 + a^4*d^2 + a^4*e^2 + a^4*f^2 + a^2*b^2*c^2 + a^2*b^2*d^2 + a^2*b^2*e^2 + a^2*b^2*f^2 + a^2*c^2*d^2 + a^2*c^2*e^2 + a^2*c^2*f^2 + a^2*d^4 + a^2*d^2*e^2 + a^2*d^2*f^2 + a^2*e^4 + a^2*e^2*f^2 + a^2*f^4 + b^6 + b^4*d^2 + b^4*e^2 + b^4*f^2 + b^2*c^2*d^2 + b^2*c^2*e^2 + b^2*c^2*f^2 + b^2*d^4 + b^2*d^2*e^2 + b^2*d^2*f^2 + b^2*e^4 + b^2*e^2*f^2 + b^2*f^4 + c^6 + c^4*d^2 + c^4*e^2 + c^4*f^2 + c^2*d^4 + c^2*d^2*e^2 + c^2*d^2*f^2 + c^2*e^4 + c^2*e^2*f^2 + c^2*f^4 + d^6 + d^2*e^2*f^2 + e^6 + f^6 > time Factorization(Determinant(A)); [ <a + b + c + d + e + f, 2>, <a^2 + a*b + a*c + b^2 + b*c + c^2 + d^2 + d*e + d*f + e^2 + e*f + f^2, 2> ] Time: 0.049