maximaで行列の平方根

maximaで行列の平方根(固有ベクトルが同じだがすべての固有値が元の行列の平方根になっているもの)を求める関数がなかったので調べながら作ってみた。matlabとかにはsqrtmという名前であるらしいのでとりあえず倣う。固有値が0の固有ベクトルの本数によってはうまく動かないのだけどとりあえず今回の目的には間に合ったのでメモしておく

load(eigen)
sqrtm(mat):=block(local[P,dim],dim:length(mat),P:genmatrix(lambda([i,j],flatten(second(uniteigenvectors(mat)))[i+dim*(j-1)]),dim,dim),P.sqrt(transpose(P).mat.P).transpose(P));

あとload(sqdnst)してratsimpとかsqrtdenestとかrootscontractとかしまくらないとしばしば大変なことに。