/* cminv.c CCMATH mathematics library source code. * * Copyright (C) 2000 Daniel A. Atkinson All rights reserved. * This code may be redistributed under the terms of the GNU library * public license (LGPL). ( See the lgpl.license file for details.) * ------------------------------------------------------------------------ */ #include #include "complex.h" int cminv(Cpx *a,int n) { int i,j,k,m,lc,*le; Cpx *ps,*p,*q,*pa,*pd; Cpx z,h,*q0; double s,t,tq=0.,zr=1.e-15; le=(int *)calloc(n,sizeof(int)); q0=(Cpx *)calloc(n,sizeof(Cpx)); pa=pd=a; for(j=0; j0){ for(i=0,p=pa,q=q0; ire*q->re-p->im*q->im; z.im+=p->im*q->re+p->re*q->im; } q0[i].re-=z.re; q0[i].im-=z.im; } for(i=0,p=pa,q=q0; ire)+fabs(pd->im); lc=j; for(k=j+1,ps=pd; kre)+fabs(ps->im))>s){ s=t; lc=k;} } tq=tq>s?tq:s; if(sre*pd->re+pd->im*pd->im; h.re=pd->re/t; h.im= -(pd->im)/t; for(k=j+1,ps=pd+n; kre*h.re-ps->im*h.im; z.im=ps->im*h.re+ps->re*h.im; *ps=z; } *pd=h; } for(j=1,pd=ps=a; jre*pd->re-q->im*pd->im; z.im=q->im*pd->re+q->re*pd->im; *q=z; } } for(j=1,pa=a; jre*q->re-p->im*q->im; h.im-=p->im*q->re+p->re*q->im; ++p; ++q; } q0[k]=h; } for(i=0,q=q0,p=pa; i=0 ;--j){ --pa; pd-=n+1; for(i=0,m=n-j-1,q=q0,p=pd+n; ij ;--k,ps-=n){ z.re= -ps->re; z.im= -ps->im; for(i=j+1,p=ps+1,q=q0; ire*q->re-p->im*q->im; z.im-=p->im*q->re+p->re*q->im; } q0[--m]=z; } for(i=0,m=n-j-1,q=q0,p=pd+n; ik){ h.re=h.im=0.; p=ps+j; i=j;} else{ h=q0[j]; p=ps+k+1; i=k+1;} for(; ire*q0[i].re-p->im*q0[i].im; h.im+=p->im*q0[i].re+p->re*q0[i].im; } q0[j]=h; } for(i=0,q=q0,p=pa; i=0 ;--j){ for(k=0,p=a+j,q=a+ *(--le); k