      SUBROUTINE CONEST (N, V, X, EST, KASE)
      INTEGER N, KASE
      COMPLEX V(N), X(N)
      REAL EST
C
C     CONEST ESTIMATES THE 1-NORM OF A SQUARE, COMPLEX MATRIX  A.
C     REVERSE COMMUNICATION IS USED FOR EVALUATING
C     MATRIX-VECTOR PRODUCTS. 
C
C     ON ENTRY
C
C        N       INTEGER
C                THE ORDER OF THE MATRIX.  N .GE. 1.
C
C        KASE    INTEGER
C                = 0.
C
C     ON INTERMEDIATE RETURNS 
C
C        KASE    = 1 OR 2.
C
C        X       COMPLEX(N)
C                MUST BE OVERWRITTEN BY 
C
C                     A*X,          IF KASE=1,
C                     CTRANS(A)*X,  IF KASE=2,
C
C                WHERE  CTRANS(A)  IS THE CONJUGATE TRANSPOSE,
C                AND CONEST MUST BE RE-CALLED, WITH ALL THE OTHER
C                PARAMETERS UNCHANGED.
C
C     ON FINAL RETURN
C
C        KASE    = 0.
C
C        EST     REAL
C                CONTAINS AN ESTIMATE (A LOWER BOUND) FOR NORM(A).
C
C        V       COMPLEX(N)
C                = A*W,   WHERE  EST = NORM(V)/NORM(W)
C                         (W  IS NOT RETURNED).
C
C     THIS VERSION DATED MARCH 16, 1988.
C     NICK HIGHAM, UNIVERSITY OF MANCHESTER.
C
C     REFERENCE
C     N.J. HIGHAM (1987) FORTRAN CODES FOR ESTIMATING
C     THE ONE-NORM OF A REAL OR COMPLEX MATRIX, WITH APPLICATIONS
C     TO CONDITION  ESTIMATION, NUMERICAL ANALYSIS REPORT NO. 135,
C     UNIVERSITY OF MANCHESTER, MANCHESTER M13 9PL, ENGLAND.
C
C     SUBROUTINES AND FUNCTIONS
C     BLAS           CCOPY
C     MODIFIED BLAS  ICMAX1, SCSUM1
C     GENERIC        ABS, CMPLX, REAL
C
      PARAMETER (ITMAX = 5)
      PARAMETER (ZERO = 0.0E0, ONE = 1.0E0, TWO = 2.0E0)
      COMPLEX CZERO, CONE
      PARAMETER (CZERO = (0.0E0, 0.0E0), CONE = (1.0E0, 0.0E0))

C
C     INTERNAL VARIABLES
      INTEGER I, ITER, J, JLAST, JUMP
      REAL ALTSGN, ESTOLD, TEMP
C
      SAVE
C
      IF (KASE .EQ. 0) THEN
         DO 10,I = 1,N
            X(I) = CMPLX( ONE/REAL(N) ) 
   10    CONTINUE
         KASE = 1
         JUMP = 1
         RETURN
      ENDIF
C
      GOTO (100, 200, 300, 400, 500) JUMP
C
C     ................ ENTRY   (JUMP = 1)
C     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY A*X.
C
  100 CONTINUE
      IF (N .EQ. 1) THEN
         V(1) = X(1)
         EST = ABS(V(1))
C        ... QUIT
         GOTO 510
      ENDIF
      EST = SCSUM1(N,X,1)
C
      DO 110,I = 1,N
      IF ( ABS(X(I)) .NE. ZERO ) THEN
         X(I) = X(I) / CMPLX( ABS(X(I)) )
      ELSE
         X(I) = CONE
      ENDIF
  110 CONTINUE
      KASE = 2
      JUMP = 2
      RETURN
C
C     ................ ENTRY   (JUMP = 2)
C     FIRST ITERATION.  X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
C
  200 CONTINUE
      J = ICMAX1(N,X,1)
      ITER = 2
C
C     MAIN LOOP - ITERATIONS 2,3,...,ITMAX.
C
  220 CONTINUE
      DO 230,I = 1,N
         X(I) = CZERO
  230 CONTINUE
      X(J) = CONE
      KASE = 1
      JUMP = 3
      RETURN
C
C     ................ ENTRY   (JUMP = 3)
C     X HAS BEEN OVERWRITTEN BY A*X.
C
  300 CONTINUE
      CALL CCOPY(N,X,1,V,1)
      ESTOLD = EST
      EST = SCSUM1(N,V,1)
C
C     TEST FOR CYCLING.
      IF (EST .LE. ESTOLD) GOTO 410
C
      DO 330,I = 1,N
      IF ( ABS(X(I)) .NE. ZERO ) THEN
         X(I) = X(I) / CMPLX( ABS(X(I)) )
      ELSE
         X(I) = CONE
      ENDIF
  330 CONTINUE
      KASE = 2
      JUMP = 4
      RETURN
C
C     ................ ENTRY   (JUMP = 4)
C     X HAS BEEN OVERWRITTEN BY CTRANS(A)*X.
C
  400 CONTINUE
      JLAST = J
      J = ICMAX1(N,X,1)
      IF (   (  REAL(X(JLAST)) .NE. ABS( REAL(X(J)) )  ) .AND.
     +       (ITER .LT. ITMAX)   ) THEN
         ITER = ITER + 1
         GOTO 220
      ENDIF
C
C     ITERATION COMPLETE.  FINAL STAGE. 
C
  410 CONTINUE
      ALTSGN = ONE
      DO 420,I = 1,N
         X(I) = CMPLX( ALTSGN * (ONE + REAL(I-1)/REAL(N-1)) )
         ALTSGN = -ALTSGN
  420 CONTINUE
      KASE = 1
      JUMP = 5
      RETURN
C
C     ................ ENTRY   (JUMP = 5)
C     X HAS BEEN OVERWRITTEN BY A*X.
C
  500 CONTINUE
      TEMP = TWO*SCSUM1(N,X,1)/REAL(3*N)
      IF (TEMP. GT. EST) THEN 
         CALL CCOPY(N,X,1,V,1)
         EST = TEMP 
      ENDIF
C
  510 KASE = 0
      RETURN
C
      END
