trsyl3#

Functions

void strsyl3(
    const char* trana,
    const char* tranb,
    const INT   isgn,
    const INT   m,
    const INT   n,
    const f32*  A,
    const INT   lda,
    const f32*  B,
    const INT   ldb,
          f32*  C,
    const INT   ldc,
          f32*  scale,
          INT*  iwork,
    const INT   liwork,
          f32*  swork,
    const INT   ldswork,
          INT*  info
);
void strsyl3(const char *trana, const char *tranb, const INT isgn, const INT m, const INT n, const f32 *A, const INT lda, const f32 *B, const INT ldb, f32 *C, const INT ldc, f32 *scale, INT *iwork, const INT liwork, f32 *swork, const INT ldswork, INT *info)#

STRSYL3 solves the real Sylvester matrix equation:

op(A)*X + X*op(B) = scale*C or op(A)*X - X*op(B) = scale*C,

where op(A) = A or A**T, and A and B are both upper quasi- triangular. A is M-by-M and B is N-by-N; the right hand side C and the solution X are M-by-N; and scale is an output scale factor, set <= 1 to avoid overflow in X.

A and B must be in Schur canonical form (as returned by SHSEQR), that is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each 2-by-2 diagonal block has its diagonal elements equal and its off-diagonal elements of opposite sign.

This is the block version of the algorithm.

Parameters

in
trana

Specifies the option op(A): = ‘N’: op(A) = A (No transpose) = ‘T’: op(A) = A**T (Transpose) = ‘C’: op(A) = A**H (Conjugate transpose = Transpose)

in
tranb

Specifies the option op(B): = ‘N’: op(B) = B (No transpose) = ‘T’: op(B) = B**T (Transpose) = ‘C’: op(B) = B**H (Conjugate transpose = Transpose)

in
isgn

Specifies the sign in the equation: = +1: solve op(A)*X + X*op(B) = scale*C = -1: solve op(A)*X - X*op(B) = scale*C

in
m

The order of the matrix A, and the number of rows in the matrices X and C. m >= 0.

in
n

The order of the matrix B, and the number of columns in the matrices X and C. n >= 0.

in
A

Double precision array, dimension (lda, m). The upper quasi-triangular matrix A, in Schur canonical form.

in
lda

The leading dimension of the array A. lda >= max(1, m).

in
B

Double precision array, dimension (ldb, n). The upper quasi-triangular matrix B, in Schur canonical form.

in
ldb

The leading dimension of the array B. ldb >= max(1, n).

inout
C

Double precision array, dimension (ldc, n). On entry, the M-by-N right hand side matrix C. On exit, C is overwritten by the solution matrix X.

in
ldc

The leading dimension of the array C. ldc >= max(1, m).

out
scale

The scale factor, scale, set <= 1 to avoid overflow in X.

out
iwork

Integer array, dimension (MAX(1, liwork)). On exit, if info = 0, iwork[0] returns the optimal liwork.

in
liwork

The dimension of the array iwork. liwork >= ((m + nb - 1) / nb + 1) + ((n + nb - 1) / nb + 1), where nb is the optimal block size. If liwork = -1, then a workspace query is assumed.

out
swork

Double precision array, dimension (MAX(2, rows), MAX(1, cols)). On exit, if info = 0, swork[0] returns the optimal rows and swork[1] returns the optimal cols.

in
ldswork

The leading dimension of the array swork. ldswork >= MAX(2, rows), where rows = ((m + nb - 1) / nb + 1). If ldswork = -1, then a workspace query is assumed.

out
info

  • = 0: successful exit

  • < 0: if info = -i, the i-th argument had an illegal value

  • = 1: A and B have common or very close eigenvalues; perturbed values were used to solve the equation (but the matrices A and B are unchanged).

Functions

void dtrsyl3(
    const char* trana,
    const char* tranb,
    const INT   isgn,
    const INT   m,
    const INT   n,
    const f64*  A,
    const INT   lda,
    const f64*  B,
    const INT   ldb,
          f64*  C,
    const INT   ldc,
          f64*  scale,
          INT*  iwork,
    const INT   liwork,
          f64*  swork,
    const INT   ldswork,
          INT*  info
);
void dtrsyl3(const char *trana, const char *tranb, const INT isgn, const INT m, const INT n, const f64 *A, const INT lda, const f64 *B, const INT ldb, f64 *C, const INT ldc, f64 *scale, INT *iwork, const INT liwork, f64 *swork, const INT ldswork, INT *info)#

DTRSYL3 solves the real Sylvester matrix equation:

op(A)*X + X*op(B) = scale*C or op(A)*X - X*op(B) = scale*C,

where op(A) = A or A**T, and A and B are both upper quasi- triangular. A is M-by-M and B is N-by-N; the right hand side C and the solution X are M-by-N; and scale is an output scale factor, set <= 1 to avoid overflow in X.

A and B must be in Schur canonical form (as returned by DHSEQR), that is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each 2-by-2 diagonal block has its diagonal elements equal and its off-diagonal elements of opposite sign.

This is the block version of the algorithm.

Parameters

in
trana

Specifies the option op(A): = ‘N’: op(A) = A (No transpose) = ‘T’: op(A) = A**T (Transpose) = ‘C’: op(A) = A**H (Conjugate transpose = Transpose)

in
tranb

Specifies the option op(B): = ‘N’: op(B) = B (No transpose) = ‘T’: op(B) = B**T (Transpose) = ‘C’: op(B) = B**H (Conjugate transpose = Transpose)

in
isgn

Specifies the sign in the equation: = +1: solve op(A)*X + X*op(B) = scale*C = -1: solve op(A)*X - X*op(B) = scale*C

in
m

The order of the matrix A, and the number of rows in the matrices X and C. m >= 0.

in
n

The order of the matrix B, and the number of columns in the matrices X and C. n >= 0.

in
A

Double precision array, dimension (lda, m). The upper quasi-triangular matrix A, in Schur canonical form.

in
lda

The leading dimension of the array A. lda >= max(1, m).

in
B

Double precision array, dimension (ldb, n). The upper quasi-triangular matrix B, in Schur canonical form.

in
ldb

The leading dimension of the array B. ldb >= max(1, n).

inout
C

Double precision array, dimension (ldc, n). On entry, the M-by-N right hand side matrix C. On exit, C is overwritten by the solution matrix X.

in
ldc

The leading dimension of the array C. ldc >= max(1, m).

out
scale

The scale factor, scale, set <= 1 to avoid overflow in X.

out
iwork

Integer array, dimension (MAX(1, liwork)). On exit, if info = 0, iwork[0] returns the optimal liwork.

in
liwork

The dimension of the array iwork. liwork >= ((m + nb - 1) / nb + 1) + ((n + nb - 1) / nb + 1), where nb is the optimal block size. If liwork = -1, then a workspace query is assumed.

out
swork

Double precision array, dimension (MAX(2, rows), MAX(1, cols)). On exit, if info = 0, swork[0] returns the optimal rows and swork[1] returns the optimal cols.

in
ldswork

The leading dimension of the array swork. ldswork >= MAX(2, rows), where rows = ((m + nb - 1) / nb + 1). If ldswork = -1, then a workspace query is assumed.

out
info

  • = 0: successful exit

  • < 0: if info = -i, the i-th argument had an illegal value

  • = 1: A and B have common or very close eigenvalues; perturbed values were used to solve the equation (but the matrices A and B are unchanged).

Functions

void ctrsyl3(
    const char* trana,
    const char* tranb,
    const INT   isgn,
    const INT   m,
    const INT   n,
    const c64*  A,
    const INT   lda,
    const c64*  B,
    const INT   ldb,
          c64*  C,
    const INT   ldc,
          f32*  scale,
          f32*  swork,
    const INT   ldswork,
          INT*  info
);
void ctrsyl3(const char *trana, const char *tranb, const INT isgn, const INT m, const INT n, const c64 *A, const INT lda, const c64 *B, const INT ldb, c64 *C, const INT ldc, f32 *scale, f32 *swork, const INT ldswork, INT *info)#

CTRSYL3 solves the complex Sylvester matrix equation:

op(A)*X + X*op(B) = scale*C or op(A)*X - X*op(B) = scale*C,

where op(A) = A or A**H, and A and B are both upper triangular. A is M-by-M and B is N-by-N; the right hand side C and the solution X are M-by-N; and scale is an output scale factor, set <= 1 to avoid overflow in X.

This is the block version of the algorithm.

Parameters

in
trana

Specifies the option op(A): = ‘N’: op(A) = A (No transpose) = ‘C’: op(A) = A**H (Conjugate transpose)

in
tranb

Specifies the option op(B): = ‘N’: op(B) = B (No transpose) = ‘C’: op(B) = B**H (Conjugate transpose)

in
isgn

Specifies the sign in the equation: = +1: solve op(A)*X + X*op(B) = scale*C = -1: solve op(A)*X - X*op(B) = scale*C

in
m

The order of the matrix A, and the number of rows in the matrices X and C. m >= 0.

in
n

The order of the matrix B, and the number of columns in the matrices X and C. n >= 0.

in
A

Complex*16 array, dimension (lda, m). The upper triangular matrix A.

in
lda

The leading dimension of the array A. lda >= max(1, m).

in
B

Complex*16 array, dimension (ldb, n). The upper triangular matrix B.

in
ldb

The leading dimension of the array B. ldb >= max(1, n).

inout
C

Complex*16 array, dimension (ldc, n). On entry, the M-by-N right hand side matrix C. On exit, C is overwritten by the solution matrix X.

in
ldc

The leading dimension of the array C. ldc >= max(1, m).

out
scale

The scale factor, scale, set <= 1 to avoid overflow in X.

out
swork

Single precision array, dimension (MAX(2, ROWS), MAX(1, COLS)). On exit, if info = 0, swork[0] returns the optimal value ROWS and swork[1] returns the optimal COLS.

in
ldswork

The leading dimension of the array swork. ldswork >= MAX(2, ROWS) + MAX(m, n), where ROWS = ((m + nb - 1) / nb + 1). If ldswork = -1, then a workspace query is assumed.

out
info

= 0: successful exit < 0: if info = -i, the i-th argument had an illegal value = 1: A and B have common or very close eigenvalues; perturbed values were used to solve the equation (but the matrices A and B are unchanged).

Functions

void ztrsyl3(
    const char* trana,
    const char* tranb,
    const INT   isgn,
    const INT   m,
    const INT   n,
    const c128* A,
    const INT   lda,
    const c128* B,
    const INT   ldb,
          c128* C,
    const INT   ldc,
          f64*  scale,
          f64*  swork,
    const INT   ldswork,
          INT*  info
);
void ztrsyl3(const char *trana, const char *tranb, const INT isgn, const INT m, const INT n, const c128 *A, const INT lda, const c128 *B, const INT ldb, c128 *C, const INT ldc, f64 *scale, f64 *swork, const INT ldswork, INT *info)#

ZTRSYL3 solves the complex Sylvester matrix equation:

op(A)*X + X*op(B) = scale*C or op(A)*X - X*op(B) = scale*C,

where op(A) = A or A**H, and A and B are both upper triangular. A is M-by-M and B is N-by-N; the right hand side C and the solution X are M-by-N; and scale is an output scale factor, set <= 1 to avoid overflow in X.

This is the block version of the algorithm.

Parameters

in
trana

Specifies the option op(A): = ‘N’: op(A) = A (No transpose) = ‘C’: op(A) = A**H (Conjugate transpose)

in
tranb

Specifies the option op(B): = ‘N’: op(B) = B (No transpose) = ‘C’: op(B) = B**H (Conjugate transpose)

in
isgn

Specifies the sign in the equation: = +1: solve op(A)*X + X*op(B) = scale*C = -1: solve op(A)*X - X*op(B) = scale*C

in
m

The order of the matrix A, and the number of rows in the matrices X and C. m >= 0.

in
n

The order of the matrix B, and the number of columns in the matrices X and C. n >= 0.

in
A

Complex*16 array, dimension (lda, m). The upper triangular matrix A.

in
lda

The leading dimension of the array A. lda >= max(1, m).

in
B

Complex*16 array, dimension (ldb, n). The upper triangular matrix B.

in
ldb

The leading dimension of the array B. ldb >= max(1, n).

inout
C

Complex*16 array, dimension (ldc, n). On entry, the M-by-N right hand side matrix C. On exit, C is overwritten by the solution matrix X.

in
ldc

The leading dimension of the array C. ldc >= max(1, m).

out
scale

The scale factor, scale, set <= 1 to avoid overflow in X.

out
swork

Double precision array, dimension (MAX(2, ROWS), MAX(1, COLS)). On exit, if info = 0, swork[0] returns the optimal value ROWS and swork[1] returns the optimal COLS.

in
ldswork

The leading dimension of the array swork. ldswork >= MAX(2, ROWS) + MAX(m, n), where ROWS = ((m + nb - 1) / nb + 1). If ldswork = -1, then a workspace query is assumed.

out
info

= 0: successful exit < 0: if info = -i, the i-th argument had an illegal value = 1: A and B have common or very close eigenvalues; perturbed values were used to solve the equation (but the matrices A and B are unchanged).