Last week I posted a Maxima utility to factor polynomials using complex roots. The idea was to use the built-in solver **solve** to find each root with multiplicity , and then construct a factor of the form . Typically, **solve** can fail to identify some roots that are returned by the more robust **to_poly_solve**. My problem at that time was that I didn’t know how to access the multiplicities for the roots returned by **to_poly_solve**.

I’ve written a utility to determine multiplicities for the roots returned by to_poly_solve. With that, here’s an updated version of **factorC** that takes advantage of the more robust solver.

/* factor a polynomial using all its complex roots */
factorC(_f,_z):=block(
[s,n,m,fp,j],
fp:1,
ss:to_poly_solve(_f,_z),
s:create_list(args(ss)[k][1],k,1,length(ss)),
m:tpsmult1(_f,_z,ss),
/*These lines were needed before I figured out how
how to handle multiplicities with to_poly_solve
s:solve(_f,_z),
m:multiplicities,*/
n:length(s),
for j:1 thru n do
if lhs(s[j])#0
then fp:fp*(_z-(rhs(s[j])))^m[j],
fp:fp*divide(_f,fp)[1],
fp
);

### Like this:

Like Loading...