|
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.
We create a polynomial f in the polynomial ring in three indeterminates over
the ring of integers by multiplying together various trinomials. The resulting
product f has 461 terms and total degree 15.
We then factorize f to recover the trinomials.
> 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
We construct a Vandermonde matrix of rank 6, find its determinant, and
factorize that determinant.
> // 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
We construct a polynomial A2 in three indeterminates a, b, and c
over the rational field such that A2 is the square of the area of the
triangle with side lengths a, b, c. Using elementary trigonometry
one can derive the expression (4 * a 2 * b 2 - (a 2 + b 2 - c 2) 2)/16 for A2.
Factorizing A2 gives a nice formulation of the square of the area which is
similar to that given by Heron's formula.
> 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
We factorize a multivariate polynomial over a finite field.
> 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
[Next][Prev] [Right] [Left] [Up] [Index] [Root]
|