>void laguer(Complex a[], int m, Complex *x, int *its) >{ > int iter, j; > double abx, abp, abm, err; > Complex dx,x1, b, d, f, g, h, sq, gp, gm, g2; > static double frac[MR+1] = {0.0, 0.5, 0.25, 0.75, 0.13, > 0.38, 0.62, 0.88, 1.0}; > Complex xx, yy; > > for (iter = 1; iter <= MAXIT; iter++) { > *its = iter; > b = a[m]; > err = abs(b); > d = f = Complex(0.0, 0.0); > abx = abs(*x); > for (j=m-1;j>=0;j--) { > f = f = (*x) * f + d; > d = (*x) * d + b; > b = (*x) * b + a[j]; > err = abs(b) + abx * err; > } > err *= EPSS; > > if ( abs(b) <= err ) return; > g = d/b; > g2 = g*g; > h = g2 - f/b * 2.0; > sq = sqrt( (h*(m*1.0) - g2) * ((m-1)*1.0) ); > gp = g + sq; > gm = g - sq; > abp = abs(gp); > abm = abs(gm); > if (abp < abm) gp=gm; > > dx = (((abp > 0.0) || (abm>0)) > ? Complex(m,0)/gp > : Complex( cos(iter), sin(iter)) * exp( log(1+abx) ) ); > > // : Complex( cos(iter), sin(iter) ) * exp( log(1+abx) ) ); > > x1 = *x - dx; > if (real(*x) == real(x1) && imag(*x) == imag(x1)) return; > if (iter % MT) *x = x1; > else *x = *x - frac[iter/MT] * dx; > } > assert( 0 ); > // exit(1); >} >Um... you'd have to reinvent complex arithmetics, best as a custom class and/or a set of functions or methods to this class. You'd need a method to add, multiply, divide, take module, take real part, take imaginary part of such numbers... and then eventually figure what's this code actually doing.