home *** CD-ROM | disk | FTP | other *** search
- nabair(p1,q1,a,itag,n,eps,root,b,c)
-
- /*Bairstow's method for finding roots of nth degree polynomial */
- /*with real coefficients. polynomial is of the form */
- /*a(0)x**n + a(1)x**(n - 1) + a(2)x**(n-2) + ... + a(n-1)x + a(n).*/
-
- int *itag,*n;
- float a[],b[],c[],eps,p1,q1,root[];
-
- {
-
- int i,iitag,j,l,m;
- float cbarl,d,deltp,deltq,den,e,f,p,q,sum,sum1;
- extern double fabs(),sqrt();
-
- iitag = *itag;
- *itag = 0;
- d = a[0];
-
- for(i = 0; i <= *n-1; i++)
- a[i] = a[i + 1]/d;
-
- strt:if(*n <= 1)
- {
- *itag = *itag + 1;
- l = *itag + *itag - 1;
- root[l] = 0.;
- root[l-1] = -a[0];
- *n = *itag;
- *itag = 4;
- return;
- }
- if(*n <= 2)
- {
- p = a[0];
- q = a[1];
- goto intr;
- }
- p = p1;
- q = q1;
- m = 1;
- reit: b[0] = a[0] - p;
- b[1] = a[1] - p * b[0] - q;
- l = *n - 2;
- c[0] = b[0] - p;
- c[1] = b[1] - p * c[0] - q;
- if(l == 1) l = 2; /* watch this!!! */
- for(j = 2; j <= l; j++)
- {
- b[j] = a[j] - p * b[j-1] - q * b[j-2];
- c[j] = b[j] - p * c[j-1] - q * c[j-2];
- }
- l = *n - 2;
- cbarl = c[l] - b[l];
- den = -cbarl;
- if(*n != 3) den = den * c[*n-4];
- den = den + c[*n-3]*c[*n-3];
- if(den == 0.0)
- {
- *n = *itag;
- *itag = 1;
- return;
- }
-
- b[*n-1] = a[*n-1] - p * b[*n-2] - q * b[*n-3];
- deltp = -b[*n-1];
- if(*n != 3) deltp = deltp * c[*n-4];
- deltp = (b[*n-2] * c[*n-3] + deltp)/den;
- deltq = (b[*n-1]*c[*n-3] - b[*n-2]*cbarl)/den;
- p = p + deltp;
- q = q + deltq;
- sum = fabs(deltp) + fabs(deltq);
- if(m == 1) sum1 = sum;
- if(m == 5 && sum > sum1)
- {
- *n = *itag;
- *itag = 2;
- return;
- }
- if(sum > eps)
- {
- if(m >= iitag)
- {
- *n = *itag;
- *itag = 3;
- return;
- }
- m ++;
- goto reit;
- }
- intr: d = -p * 0.5;
- *itag = *itag + 2;
- f = q - d*d;
- e = sqrt(fabs(f));
- l = *itag + *itag - 1;
- if(f <= 0.0)
- {
- root[l] = 0.0;
- root[l - 1] = d - e;
- root[l-2] = 0.0;
- root[l-3] = d + e;
- }
- else
- {
- root[l] = -e;
- root[l - 1] = d;
- root[l - 2] = e;
- root[l - 3] = d;
- }
- *n = *n - 2;
- if(*n <= 0)
- {
- *n = *itag;
- *itag = 4;
- return;
- }
- for(i = 0; i <= *n-1; i++)
- a[i] = b[i];
- goto strt;
- }