      subroutine lanczo (a,t,n,b,c,x,iolp,ind)
      implicit doubleprecision(a-h,o-z)
      integer flagx, flagy, iolp, ind
      integer maxcor, maxcr2, maxcr4, maxcr5, maxcr6, maxcr7, maxcr8
c     parameter (maxcor=2, maxcr2=maxcor*maxcor, maxcr4=maxcr2*maxcr2,
c    1 maxcr5=maxcr2*(maxcr2+1)/2, maxcr6=maxcor*2, maxcr7=maxcr6+1,
c    2 maxcr8=maxcr6*maxcr7+1)
      parameter (maxcor=2, maxcr2=4, maxcr4=16,
     1 maxcr5=10, maxcr6=4, maxcr7=5,
     2 maxcr8=21)
      double precision a(maxcr7,maxcr6), t(maxcr6,maxcr6), x(maxcr6
     1 ,maxcr7), y(maxcr6,maxcr7), b(maxcr7), c(maxcr7), yta(maxcr6)
      nminus=n-1
      do 10 i=1,nminus
      x(i,1)=0.0d0
c choose x(1),y(1)
   10 y(i,1)=0.0d0
      x(n,1)=1.0d0
      y(n,1)=1.0d0
c initialize t
   20 do 30 i=1,n
      do 30 j=1,n
   30 t(i,j)=0.0d0
      do 40 i=2,n
   40 t(i,i-1)=1.0d0
      flagx=0
      flagy=0
      do 190 k=1,n
c find b(k)
      do 50 j=1,n
      yta(j)=0.0d0
      do 50 i=1,n
   50 yta(j)=yta(j)+y(i,k)*a(i,j)
      ytax=0.0d0
      do 60 i=1,n
   60 ytax=ytax+yta(i)*x(i,k)
      ytx=0.0d0
      do 70 i=1,n
   70 ytx=ytx+y(i,k)*x(i,k)
c if ytx=0, go rechoose x(1),y(1) & start over
      if (dabs(ytx).lt.1.0d-8) go to 210
      b(k)=ytax/ytx
      if (k.ne.1) go to 120
c find x(2) when k=1
      do 90 i=1,n
      x(i,2)=0.0d0
      do 80 j=1,n
   80 x(i,2)=x(i,2)+a(i,j)*x(j,1)
   90 x(i,2)=x(i,2)-b(1)*x(i,1)
c set flagx=1 if x(2)=0
      call test (x,n,2,flagx)
c find y(2) when k=1
      do 110 i=1,n
      y(i,2)=0.0d0
      do 100 j=1,n
  100 y(i,2)=y(i,2)+a(j,i)*y(j,1)
  110 y(i,2)=y(i,2)-b(1)*y(i,1)
c set flagy=1 if y(2)=0
      call test (y,n,2,flagy)
      go to 180
c find c(k-1)
  120 save=ytx
      ytx=0.0d0
      do 130 i=1,n
  130 ytx=ytx+y(i,k-1)*x(i,k-1)
      c(k-1)=save/ytx
      t(k-1,k)=c(k-1)
      if ((flagx.eq.1).or.(flagy.eq.1)) t(k-1,k)=0.0d0
      km1=k-1
      if (k.eq.n) go to 180
c find x(k+1)
      csave=c(k-1)
      if (flagy.eq.1) csave=0.0d0
      flagy=0
      do 150 i=1,n
      x(i,k+1)=0.0d0
      do 140 j=1,n
  140 x(i,k+1)=x(i,k+1)+a(i,j)*x(j,k)
  150 x(i,k+1)=x(i,k+1)-b(k)*x(i,k)-csave*x(i,k-1)
      kp1=k+1
c find y(k+1)
      csave=c(k-1)
      if (flagx.eq.1) csave=0.0d0
      flagx=0
      do 170 i=1,n
      y(i,k+1)=0.0d0
      do 160 j=1,n
  160 y(i,k+1)=y(i,k+1)+a(j,i)*y(j,k)
  170 y(i,k+1)=y(i,k+1)-b(k)*y(i,k)-csave*y(i,k-1)
c set flagx=1 if x(k+1)=0
      call test (x,n,kp1,flagx)
c if (x(k+1)=0, rechoose it
      if (flagx.eq.1) call rechos (y,n,x,kp1)
c set flagy=1 if y(k+1)=0
      call test (y,n,kp1,flagy)
c if y(k+1)=0, rechoose it
      if (flagy.eq.1) call rechos (x,n,y,kp1)
  180 t(k,k)=b(k)
  190 continue
c fix c to correspond with final t matrix
      do 200 k=2,n
  200 c(k-1)=t(k-1,k)
      return
c rechoose x(1),y(1)
  210 do 220 k=1,n
      if (dabs(x(k,1)).gt.1.0d-8) go to 230
  220 continue
  230 if (k.eq.1) go to 250
      do 240 i=1,n
      x(i,1)=0.0d0
  240 y(i,1)=0.0d0
      x(k-1,1)=1.0d0
      y(k-1,1)=1.0d0
      go to 20
  250 if (ind.ge.0) then
         write (unit=iolp,fmt=260)
         call linect (1)
      endif
      return
c
  260 format (10x,'n starting vectors have been attempted')
      end
