MAGMA  2.3.0 Matrix Algebra for GPU and Multicore Architectures
laqtrsd: Quasi-Triangular solve with modified diagonal; used by trevc

## Functions

magma_int_t magma_dlaqtrsd (magma_trans_t trans, magma_int_t n, const double *T, magma_int_t ldt, double *x, magma_int_t ldx, const double *cnorm, magma_int_t *info)
DLAQTRSD is used by DTREVC to solve one of the (singular) quasi-triangular systems with modified diagonal (T - lambda*I) * x = 0 or (T - lambda*I)**T * x = 0 with scaling to prevent overflow. More...

magma_int_t magma_slaqtrsd (magma_trans_t trans, magma_int_t n, const float *T, magma_int_t ldt, float *x, magma_int_t ldx, const float *cnorm, magma_int_t *info)
SLAQTRSD is used by STREVC to solve one of the (singular) quasi-triangular systems with modified diagonal (T - lambda*I) * x = 0 or (T - lambda*I)**T * x = 0 with scaling to prevent overflow. More...

## Function Documentation

 magma_int_t magma_dlaqtrsd ( magma_trans_t trans, magma_int_t n, const double * T, magma_int_t ldt, double * x, magma_int_t ldx, const double * cnorm, magma_int_t * info )

DLAQTRSD is used by DTREVC to solve one of the (singular) quasi-triangular systems with modified diagonal (T - lambda*I) * x = 0 or (T - lambda*I)**T * x = 0 with scaling to prevent overflow.

Here T is an upper quasi-triangular matrix with 1x1 or 2x2 diagonal blocks, A**T denotes the transpose of A, and x is an n-element real or complex vector. The eigenvalue lambda is computed from the block diagonal of T. It does not modify T during the computation.

If trans = MagmaNoTrans, lambda is an eigenvalue for the lower 1x1 or 2x2 block, and it solves ( [ That u ] - lambda*I ) * x = 0, ( [ 0 lambda ] ) which becomes (That - lambda*I) * w = -s*u, with x = [ w; 1 ] and scaling s. If the lower block is 1x1, lambda and x are real; if the lower block is 2x2, lambda and x are complex.

If trans = MagmaTrans, lambda is an eigenvalue for the upper 1x1 or 2x2 block, and it solves ( [ lambda v^T ] - lambda I )**T * x = 0, ( [ 0 That ] ) which becomes (That - lambda*I)**T * w = -s*v, with x = [ 1; w ] and scaling s. If the upper block is 1x1, lambda and x are real; if the upper block is 2x2, lambda and x are complex.

Parameters
 [in] trans magma_trans_t Specifies the operation applied to T. = MagmaNoTrans: Solve (T - lambda*I) * x = 0 (No transpose) = MagmaTrans: Solve (T - lambda*I)**T * x = 0 (Transpose) [in] n INTEGER The order of the matrix T. N >= 0. [in] T DOUBLE PRECISION array, dimension (LDT,N) The triangular matrix T. The leading n by n upper triangular part of the array T contains the upper triangular matrix, and the strictly lower triangular part of T is not referenced. [in] ldt INTEGER The leading dimension of the array T. LDT >= max (1,N). [out] x DOUBLE PRECISION array, dimension (LDX,1) or (LDX,2). On exit, X is overwritten by the solution vector x. If LAMBDAI .EQ. 0, X is real and has dimension (LDX,1). If LAMBDAI .NE. 0, X is complex and has dimension (LDX,2); the real part is in X(:,0), the imaginary part in X(:,1). [in] ldx INTEGER The leading dimension of the array X. LDX >= max(1,N). [in,out] cnorm (input) DOUBLE PRECISION array, dimension (N) CNORM(j) contains the norm of the off-diagonal part of the j-th column of T. If TRANS = MagmaNoTrans, CNORM(j) must be greater than or equal to the infinity-norm, and if TRANS = MagmaTrans or MagmaConjTrans, CNORM(j) must be greater than or equal to the 1-norm. [out] info INTEGER = 0: successful exit < 0: if INFO = -k, the k-th argument had an illegal value
 magma_int_t magma_slaqtrsd ( magma_trans_t trans, magma_int_t n, const float * T, magma_int_t ldt, float * x, magma_int_t ldx, const float * cnorm, magma_int_t * info )

SLAQTRSD is used by STREVC to solve one of the (singular) quasi-triangular systems with modified diagonal (T - lambda*I) * x = 0 or (T - lambda*I)**T * x = 0 with scaling to prevent overflow.

Here T is an upper quasi-triangular matrix with 1x1 or 2x2 diagonal blocks, A**T denotes the transpose of A, and x is an n-element real or complex vector. The eigenvalue lambda is computed from the block diagonal of T. It does not modify T during the computation.

If trans = MagmaNoTrans, lambda is an eigenvalue for the lower 1x1 or 2x2 block, and it solves ( [ That u ] - lambda*I ) * x = 0, ( [ 0 lambda ] ) which becomes (That - lambda*I) * w = -s*u, with x = [ w; 1 ] and scaling s. If the lower block is 1x1, lambda and x are real; if the lower block is 2x2, lambda and x are complex.

If trans = MagmaTrans, lambda is an eigenvalue for the upper 1x1 or 2x2 block, and it solves ( [ lambda v^T ] - lambda I )**T * x = 0, ( [ 0 That ] ) which becomes (That - lambda*I)**T * w = -s*v, with x = [ 1; w ] and scaling s. If the upper block is 1x1, lambda and x are real; if the upper block is 2x2, lambda and x are complex.

Parameters
 [in] trans magma_trans_t Specifies the operation applied to T. = MagmaNoTrans: Solve (T - lambda*I) * x = 0 (No transpose) = MagmaTrans: Solve (T - lambda*I)**T * x = 0 (Transpose) [in] n INTEGER The order of the matrix T. N >= 0. [in] T REAL array, dimension (LDT,N) The triangular matrix T. The leading n by n upper triangular part of the array T contains the upper triangular matrix, and the strictly lower triangular part of T is not referenced. [in] ldt INTEGER The leading dimension of the array T. LDT >= max (1,N). [out] x REAL array, dimension (LDX,1) or (LDX,2). On exit, X is overwritten by the solution vector x. If LAMBDAI .EQ. 0, X is real and has dimension (LDX,1). If LAMBDAI .NE. 0, X is complex and has dimension (LDX,2); the real part is in X(:,0), the imaginary part in X(:,1). [in] ldx INTEGER The leading dimension of the array X. LDX >= max(1,N). [in,out] cnorm (input) REAL array, dimension (N) CNORM(j) contains the norm of the off-diagonal part of the j-th column of T. If TRANS = MagmaNoTrans, CNORM(j) must be greater than or equal to the infinity-norm, and if TRANS = MagmaTrans or MagmaConjTrans, CNORM(j) must be greater than or equal to the 1-norm. [out] info INTEGER = 0: successful exit < 0: if INFO = -k, the k-th argument had an illegal value