A few days ago I posted some code to factor and perform partial fraction decomposition using all available complex roots. The approach is to find roots — taking note of the multiplicity of each — and then construct factors of the form .

As I’ve noted before, the built-in command **solve** can fail to find solutions. The more robust Maxima solver is **to_poly_solve**. That said, after a call to **to_poly_solve**, I don’t know how to get my hands on the multiplicities. So, I’ve written a little utility to compute and return a list of multiplicities for the roots returned by **to_poly_solve**. Here’s an example, followed by the code. Notice that because **to_poly_solve** returns solutions using the** %union** construction, extracting the th root requires something like **root:rhs(part(s,j,1))**

/* tpsmult1 assumes results of to_poly_solve applied to _f, are passed in the argument s */ tpsmult1(_f,_z,s):=block( [d,root,nroots,mult,m1], nroots:length(s), mult:[], for j:1 thru nroots do ( root:rhs(part(s,j,1)), m1:rootmult(_f,_z,root), mult: endcons(m1,mult) ), mult ); /* find the multiplicity of a root _a for the polynomial _f */ rootmult(_f,_z,_a):=block( [d,val,m,mm], m:1, d:divide(_f,(_z-_a)), val:subst(_z=_a,part(d,1)), if (val=0) then ( mm:rootmult(part(d,1),_z,_a), m:m+mm ), m );