I’m getting ready for my fall Complex Variables class. I noticed that the built-in Maxima function **residue** doesn’t reliably do the right thing. My goal is to make some improvements to Maxima residue calculations in Maxima over the course of the next month.

As I started to look at some test cases, I realized I didn’t know how to factor a polynomial into complex factors. In the simplest case:

but I wanted to see

Maybe someone will find this and let me know that there’s a simple way to make that happen using existing Maxima commands. Until then, I’ve written a little utility to identify the roots (both real and complex) of a polynomial and return a factorization. Here’s an example, and the code. Notice that it only works as well as the root finder **solve**. I tried to upgrade to the more robust **to_poly_solve**, but I don’t yet know how to handle multiplicities in that case.

factorC(_f,_z):=block( [s,n,m,fp,j], fp:1, /* This commented code was meant to use the more robust solver to_poly_solve, but I couldn't understand how to handle multiplicities ss:args(to_poly_solve(_f,_z)), s:create_list(ss[k][1],k,1,length(ss)),*/ 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 );