/* csolv.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 csolv(Cpx *a,Cpx *b,int n) { int i,j,k,lc; Cpx *ps,*p,*q,*pa,*pd; Cpx z,h,*q0; double s,t,tq=0.,zr=1.e-15; q0=(Cpx *)calloc(n,sizeof(Cpx)); pa=a; 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; } } for(j=1,ps=b+1; jre*q->re-p->im*q->im; z.im+=p->im*q->re+p->re*q->im; ++p; ++q; } ps->re-=z.re; ps->im-=z.im; } for(j=n-1,--ps,pd=a+n*n-1; j>=0 ;--j,pd-=n+1){ for(k=j+1,p=pd+1,q=b+j+1,z.re=z.im=0.; kre*q->re-p->im*q->im; z.im+=p->im*q->re+p->re*q->im; ++p; ++q; } h.re=ps->re-z.re; h.im=ps->im-z.im; t=pd->re*pd->re+pd->im*pd->im; ps->re=(h.re*pd->re+h.im*pd->im)/t; ps->im=(h.im*pd->re-h.re*pd->im)/t; --ps; } free(q0); return 0; }