Re: a fault in the Factor[] function for polynomials?
- To: mathgroup at smc.vnet.net
- Subject: [mg70424] Re: [mg70395] a fault in the Factor[] function for polynomials?
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Mon, 16 Oct 2006 02:34:22 -0400 (EDT)
- References: <200610150419.AAA12686@smc.vnet.net>
On 15 Oct 2006, at 13:19, Roger Bagula wrote:
> Expand[(x^4 + 2*Sqrt[3]x^2 - 1)(x^4 - 2*Sqrt[3]x^2 - 1)]
> 1 - 14x^4 + x^8
> Factor[%]
> (1 - 4x^2 + x^4)(1 + 4x^2 + x^4)
Factorization is defined only with respect to an algebraic extension.
If you specify no extension Factor attempts only to factor your
polynomial over the rationals. Here is how you specify the algebraic
extension you wish to use:
poly=Expand[(x^4 + 2*Sqrt[3]*x^2 - 1)*(x^4 - 2*Sqrt[3]*x^2 - 1)];
Factor[poly, Extension -> {Sqrt[3]}]
(-x^2 + Sqrt[3] - 2)*(-x^2 + Sqrt[3] + 2)*(x^2 + Sqrt[3] - 2)*
(x^2 + Sqrt[3] + 2)
or
Factor[poly, Extension -> {Sqrt[3], Sqrt[2]}]
(-(1/16))*(-2*x + Sqrt[6] - Sqrt[2])*
(-2*x + Sqrt[6] + Sqrt[2])*(2*x + Sqrt[6] - Sqrt[2])*
(2*x + Sqrt[6] + Sqrt[2])*(-x^2 + Sqrt[3] - 2)*
(x^2 + Sqrt[3] + 2)
or you can get a simple factorization into linear factors over the
complex numbers:
Factor[poly, Extension -> {Sqrt[3], Sqrt[2], I}]
(1/256)*(-2*x + Sqrt[6] - Sqrt[2])*(-2*x + Sqrt[6] + Sqrt[2])*
(-2*I*x + Sqrt[6] - Sqrt[2])*(-2*I*x + Sqrt[6] + Sqrt[2])*
(2*I*x + Sqrt[6] - Sqrt[2])*(2*I*x + Sqrt[6] + Sqrt[2])*
(2*x + Sqrt[6] - Sqrt[2])*(2*x + Sqrt[6] + Sqrt[2])
If you do not wish to enter the Extension manually you might want to
use the following functions that will automatically factor your
polynomial over the complex number or the real numbers.
FactorOverComplexes[poly_, x_] := If[PolynomialQ[poly, x],
Factor[poly, Extension -> (x /. Solve[poly == 0, x])], poly]
FactorOverReals[poly_, x_] := If[PolynomialQ[poly, x],
Factor[poly, Extension -> (x /. {ToRules[Reduce[poly == 0, x,
Reals]]})], poly]
However, although these factorizations are quite correct, they will
in general look much more complicated than the ones you can get by
specifying the extension manually (provided you choose the right
generators). Just compare these two lists:
l1 = List @@ Factor[poly, Extension -> {Sqrt[3], Sqrt[2], I}]
l2 = List @@ FactorOverComplexes[poly, x]
They both have the same number of factors:
In[35]:=
Length/@{l1,l2}
Out[35]=
{9,9}
and you can check they are both valid factorizations:
FullSimplify[Times@@l1-Times@@l2]
0
but it is pretty clear which one is preferable.
In fact one can write programs that will perform automatic
factorizations over the reals or complexes and give simpler factors
by using FactorList instead of Factor and applying FullSimplify
FactorListOverComplexes[poly_, x_] := If[PolynomialQ[poly, x],
(FullSimplify[ FactorList[poly, Extension -> (x /. Solve[poly == 0,
x])]]), poly]
but this will take far to long in all but the simplest cases:
Timing[FactorListOverComplexes[x^2 + x + 1, x]]
{0.012298999999998728*Second, {{-1, 1}, {-x + (-1)^(1/3) - 1, 1}, {x
+ (-1)^(1/3), 1}}}
works fine, but if you try it in your case you will have to be pretty
patient before you see any answer.
So I do not think there is any way to deal with this sort of problems
better than the one currently used Mathematica, which requires you to
specify the extension by hand.
Andrzej Kozlowski
- References:
- a fault in the Factor[] function for polynomials?
- From: Roger Bagula <rlbagula@sbcglobal.net>
- a fault in the Factor[] function for polynomials?