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

### Like this:

Like Loading...

## One thought on “Roots, Multiplicities, and to_poly_solve”