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 );

Advertisements