#                                        Ren-Cang Li, June 1, 1996
#                                        na.rcli@na-net.ornl.gov

c8Itern:=proc(x0L:vector, c70L, x0U:vector,c70U, xM:vector)
  local niter, xL, c7L, yL, xU, c7U, yU, eps, x0, y0, x1, y1, c70, c71, yM, c7M;
  eps:=10^(-Digits+20): niter:=0:
  xL:=x0L: c7L:=c70L: xU:=x0U: c7U:=c70U:
  #
  c7fixed(xL,c7L): yL:=dc8overdc7(xL,c7L): 
  c7fixed(xU,c7U): yU:=dc8overdc7(xU,c7U):
  if yL*yU>=0 then
     print(`Warning: there may be two zeros or NONE.`);
     print(`Please INTERRUPT to stop!`);
  fi:
  x0:=xL: y0:=yL: c70:=c7L: x1:=xU: y1:=yU: c71:=c7U:
  c7M:=c71-y1*((c71-c70)/(y1-y0)):
  if c7M<c7L or c7M>c7U then
     c7M:=(c7L+c7U)/2:
     xM:=evalm((xL+xU)/2):
  else
     xM:=evalm((y0/(y0-y1))*x1+(y1/(y1-y0))*x0):
  fi:
  c7fixed(xM, c7M):
  yM:=dc8overdc7(xM,c7M):
  # print(c7M); print(c71); print(niter); print(yM); print(eps);
  while abs(c7M-c71)>eps*abs(c7M) and niter<101 and abs(yM)>eps do
        niter := niter + 1:
        if yL*yM>=0 then
           xL:=xM: yL:=yM: c7L:=c7M:
        else
           xU:=xM: yU:=yM: c7U:=c7M:
        fi:
        x0:=x1: y0:=y1: c70:=c71:
        x1:=xM: y1:=yM: c71:=c7M:
        c7M:=c71-y1*((c71-c70)/(y1-y0)):
        if c7M<c7L or c7M>c7U then
           c7M:=(c7L+c7U)/2:
           xM:=evalm((xL+xU)/2):
        else
           xM:=evalm((y0/(y0-y1))*x1+(y1/(y1-y0))*x0):
        fi:
        c7fixed(xM, c7M):
        yM:=dc8overdc7(xM,c7M):
  od:
  if niter>100 then
     print(`In c8Itern: Over 100 iterations`):
  fi:
  # print(yM):
  c7M;
end:
