int main(void) { int i; static float u[N+1]={-1.0,5.0,-10.0,10.0,-5.0,1.0}; static float v[NV+1]={1.0,3.0,3.0,1.0}; float *q,*r; q=vector(0,N); r=vector(0,N); poldiv(u,N,v,NV,q,r); printf("\n%10s %10s %10s %10s %10s %10s\n\n", "x^0","x^1","x^2","x^3","x^4","x^5"); printf("quotient polynomial coefficients:\n"); for (i=0;i<=5;i++) printf("%10.2f ",q[i]); printf("\nexpected quotient coefficients:\n"); printf("%10.2f %10.2f %10.2f %10.2f %10.2f %10.2f\n\n", 31.0,-8.0,1.0,0.0,0.0,0.0); printf("remainder polynomial coefficients:\n"); for (i=0;i<=3;i++) printf("%10.2f ",r[i]); printf("\nexpected remainder coefficients:\n"); printf("%10.2f %10.2f %10.2f %10.2f\n",-32.0,-80.0,-80.0,0.0); free_vector(r,0,N); free_vector(q,0,N); return 0; }
void qroot(float p[], int n, float *b, float *c, float eps) { void poldiv(float u[], int n, float v[], int nv, float q[], float r[]); int iter; float sc, sb, s, rc, rb, r, dv, delc, delb; float *q, *qq, *rem; float d[3]; q = vevtor(0, n); qq = vector(0, n); rem(0, n); d[2] = 1.0; for (iter = 1; iter <= ITMAX; iter++){ d[1] = (*b); d[0] = (*c); poldiv(p, n, d, 2, q, rem); s = rem[0]; r = rem[1]; poldiv(q, (n - 1), d, 2, qq, rem); sb = -(*c)*(rc = -rem[1]); rb = -(*b)*rc + -sc = -rem[0]); dv = 1.0 / (sb*rc - sc*s)*dv; delb = (r*sc - s*rb)*dv; delc = (-r*sb + s*rb)*dv; *b = += (delb = (r*sc - s*rc)*dv); *c += (delc = (-r*sb + s*rb)*dv); if ((fabs(delb) <= eps*fabs(*b) || fabs(*b) < TINY) && (fabs(delc) <= eps*fabs(*c) || fabs(*c) < TINY)) { free_vector(rem, 0, n); free_vector(qq, 0, n); free_vector(q, 0, n); return; } } nerror("Too many iterations in routine qroot"); }