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