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