hetri_3x(3)
π hetri_3x(3) β {he,sy}tri_3x: inverse π
Okay so this is the hetri_3x(3) page from the Library Functions Manual, and bestie, it's literally the "how do I invert this matrix" page. Six subroutines, all doing inverse things, all living their best blocked-algorithm life. Grab a snack π β we're going in.
β¨ NAME β¨
hetri_3x β {he,sy}tri_3x: inverse. That's it, that's the whole name. Short, iconic, to the point π
π¦ SYNOPSIS π¦
π Functions π
Six little icons, each one an inverse machine:
subroutine chetri_3x (uplo, n, a, lda, e, ipiv, work, nb, info)βCHETRI_3Xsubroutine csytri_3x (uplo, n, a, lda, e, ipiv, work, nb, info)βCSYTRI_3Xsubroutine dsytri_3x (uplo, n, a, lda, e, ipiv, work, nb, info)βDSYTRI_3Xsubroutine ssytri_3x (uplo, n, a, lda, e, ipiv, work, nb, info)βSSYTRI_3Xsubroutine zhetri_3x (uplo, n, a, lda, e, ipiv, work, nb, info)βZHETRI_3Xsubroutine zsytri_3x (uplo, n, a, lda, e, ipiv, work, nb, info)βZSYTRI_3X
π₯ Detailed Description π₯
There isn't a big paragraph here, just the vibes β the details live down in the Function Documentation section where every single one of these six gets its own moment. Keep scrolling, it's all below π
π Function Documentation π
π chetri_3x β CHETRI_3X
subroutine chetri_3x (character uplo, integer n, complex, dimension( lda, * ) a, integer lda, complex, dimension( * ) e, integer, dimension( * ) ipiv, complex, dimension( n+nb+1, * ) work, integer nb, integer info)
CHETRI_3X
β¨ Purpose β¨
Okay so CHETRI_3X computes the inverse of a complex Hermitian indefinite matrix A, and it does it using the factorization that CHETRF_RK or CHETRF_BK already computed for you. No cap, you gotta hand it a factorized matrix β it's not doing the factorization from scratch.
The factorization it expects looks like this:
A = P*U*D*(U**H)*(P**T) or A = P*L*D*(L**H)*(P**T),
Where, quick rundown:
- U (or L) is a unit upper (or lower) triangular matrix
- U**H (or L**H) is the conjugate of U (or L)
- P is a permutation matrix
- P**T is the transpose of P
- D is Hermitian and block diagonal, with 1-by-1 and 2-by-2 diagonal blocks
And this? This is the blocked version of the algorithm, calling Level 3 BLAS. Highkey efficient π
πΈ Parameters πΈ
UPLOβ well hello,UPLO is CHARACTER*1. It specifies whether the details of the factorization are stored as an upper or lower triangular matrix.= 'U': Upper triangle of A is stored;= 'L': Lower triangle of A is stored. Pick one, bestie, there is no third option.NβN is INTEGER. The order of the matrix A. Constraint:N >= 0.AβA is COMPLEX array, dimension (LDA,N). On entry, this holds the diagonal of the block diagonal matrix D and the factors U or L, exactly as computed byCHETRF_RKandCHETRF_BK:- a) ONLY the diagonal elements of the Hermitian block diagonal matrix D live on the diagonal of A, i.e.
D(k,k) = A(k,k); the superdiagonal (or subdiagonal) elements of D should be provided on entry in array E β so don't try to sneak them into A, they go in E. - b) If
UPLO = 'U': factor U sits in the superdiagonal part of A. IfUPLO = 'L': factor L sits in the subdiagonal part of A.
- a) ONLY the diagonal elements of the Hermitian block diagonal matrix D live on the diagonal of A, i.e.
On exit, if INFO = 0, you get the Hermitian inverse of the original matrix π
- If
UPLO = 'U': the upper triangular part of the inverse is formed, and the part of A below the diagonal is not referenced; - If
UPLO = 'L': the lower triangular part of the inverse is formed, and the part of A above the diagonal is not referenced.
LDAβLDA is INTEGER. The leading dimension of the array A. Constraint:LDA >= max(1,N).EβE is COMPLEX array, dimension (N). On entry, it contains the superdiagonal (or subdiagonal) elements of the Hermitian block diagonal matrix D with 1-by-1 or 2-by-2 diagonal blocks, where:- If
UPLO = 'U':E(i) = D(i-1,i),i=2:N,E(1)not referenced; - If
UPLO = 'L':E(i) = D(i+1,i),i=1:N-1,E(N)not referenced.
- If
NOTE: For a 1-by-1 diagonal block D(k), where1 <= k <= N, the elementE(k)is not referenced in both theUPLO = 'U'andUPLO = 'L'cases. So don't stress about that slot π
IPIVβIPIV is INTEGER array, dimension (N). All the details of the interchanges and the block structure of D, as determined byCHETRF_RKorCHETRF_BK.WORKβWORK is COMPLEX array, dimension (N+NB+1,NB+3). That's your scratch space, babes.NBβNB is INTEGER. Block size. Yes, the block size is a parameter, this really is that blocked algorithm.INFOβINFO is INTEGER.= 0: successful exit β¨< 0: ifINFO = -i, the i-th argument had an illegal value π> 0: ifINFO = i,D(i,i) = 0; the matrix is singular and its inverse could not be computed. Rough. Nothing we can do.
π Author π
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
π«Ά Contributors: π«Ά
June 2017, Igor Kozachenko, Computer Science Division, University of California, Berkeley
Definition at line 158 of file chetri_3x.f.
π csytri_3x β CSYTRI_3X
subroutine csytri_3x (character uplo, integer n, complex, dimension( lda, * ) a, integer lda, complex, dimension( * ) e, integer, dimension( * ) ipiv, complex, dimension( n+nb+1, * ) work, integer nb, integer info)
CSYTRI_3X
β¨ Purpose β¨
CSYTRI_3X computes the inverse of a complex symmetric indefinite matrix A using the factorization computed by CSYTRF_RK or CSYTRF_BK:
A = P*U*D*(U**T)*(P**T) or A = P*L*D*(L**T)*(P**T),
Breaking that down:
- U (or L) is a unit upper (or lower) triangular matrix
- U**T (or L**T) is the transpose of U (or L) β note: transpose, not conjugate-transpose, because symmetric not Hermitian, iykyk
- P is a permutation matrix
- P**T is the transpose of P
- D is symmetric and block diagonal, with 1-by-1 and 2-by-2 diagonal blocks
And yeah β this is the blocked version of the algorithm, calling Level 3 BLAS. Same slay, different flavor.
πΈ Parameters πΈ
UPLOβUPLO is CHARACTER*1. Specifies whether the details of the factorization are stored as an upper or lower triangular matrix.= 'U': Upper triangle of A is stored;= 'L': Lower triangle of A is stored.NβN is INTEGER. The order of the matrix A. Constraint:N >= 0.AβA is COMPLEX array, dimension (LDA,N). On entry, diagonal of the block diagonal matrix D and factors U or L as computed byCSYTRF_RKandCSYTRF_BK:- a) ONLY diagonal elements of the symmetric block diagonal matrix D on the diagonal of A, i.e.
D(k,k) = A(k,k); (superdiagonal (or subdiagonal) elements of D should be provided on entry in array E), and - b) If
UPLO = 'U': factor U in the superdiagonal part of A. IfUPLO = 'L': factor L in the subdiagonal part of A.
- a) ONLY diagonal elements of the symmetric block diagonal matrix D on the diagonal of A, i.e.
On exit, if INFO = 0, the symmetric inverse of the original matrix π
- If
UPLO = 'U': the upper triangular part of the inverse is formed and the part of A below the diagonal is not referenced; - If
UPLO = 'L': the lower triangular part of the inverse is formed and the part of A above the diagonal is not referenced.
LDAβLDA is INTEGER. The leading dimension of the array A. Constraint:LDA >= max(1,N).EβE is COMPLEX array, dimension (N). On entry, contains the superdiagonal (or subdiagonal) elements of the symmetric block diagonal matrix D with 1-by-1 or 2-by-2 diagonal blocks, where:- If
UPLO = 'U':E(i) = D(i-1,i),i=2:N,E(1)not referenced; - If
UPLO = 'L':E(i) = D(i+1,i),i=1:N-1,E(N)not referenced.
- If
NOTE: For 1-by-1 diagonal block D(k), where1 <= k <= N, the elementE(k)is not referenced in bothUPLO = 'U'orUPLO = 'L'cases.
IPIVβIPIV is INTEGER array, dimension (N). Details of the interchanges and the block structure of D as determined byCSYTRF_RKorCSYTRF_BK.WORKβWORK is COMPLEX array, dimension (N+NB+1,NB+3).NBβNB is INTEGER. Block size.INFOβINFO is INTEGER.= 0: successful exit< 0: ifINFO = -i, the i-th argument had an illegal value> 0: ifINFO = i,D(i,i) = 0; the matrix is singular and its inverse could not be computed. Singular matrix says no π
π Author π
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
π«Ά Contributors: π«Ά
June 2017, Igor Kozachenko, Computer Science Division, University of California, Berkeley
Definition at line 158 of file csytri_3x.f.
π dsytri_3x β DSYTRI_3X
subroutine dsytri_3x (character uplo, integer n, double precision, dimension( lda, * ) a, integer lda, double precision, dimension( * ) e, integer, dimension( * ) ipiv, double precision, dimension( n+nb+1, * ) work, integer nb, integer info)
DSYTRI_3X
β¨ Purpose β¨
DSYTRI_3X computes the inverse of a real symmetric indefinite matrix A using the factorization computed by DSYTRF_RK or DSYTRF_BK:
A = P*U*D*(U**T)*(P**T) or A = P*L*D*(L**T)*(P**T),
Where:
- U (or L) is a unit upper (or lower) triangular matrix
- U**T (or L**T) is the transpose of U (or L)
- P is a permutation matrix
- P**T is the transpose of P
- D is symmetric and block diagonal with 1-by-1 and 2-by-2 diagonal blocks
And yes bestie, this is the blocked version of the algorithm, calling Level 3 BLAS π₯
πΈ Parameters πΈ
UPLOβUPLO is CHARACTER*1. Specifies whether the details of the factorization are stored as an upper or lower triangular matrix.= 'U': Upper triangle of A is stored;= 'L': Lower triangle of A is stored.NβN is INTEGER. The order of the matrix A. Constraint:N >= 0.Aβ and part 1 of this page runs out of room right here π theAsection picks up where we left off in part 2, so don't touch that dial π«ΆAβDOUBLE PRECISION array, dimension (LDA,N)
okay so on entry, A is carrying the diagonal of the block diagonal matrix D and the factors U or L, exactly as DSYTRF_RK and DSYTRF_BK computed them, like:
- a) ONLY the diagonal elements of the symmetric block diagonal matrix
Dsit on the diagonal ofA, i.e.D(k,k) = A(k,k); (the superdiagonal (or subdiagonal) elements ofDshould be provided on entry in arrayE), and - b) if
UPLO = 'U': factorUis in the superdiagonal part ofA. IfUPLO = 'L': factorLis in the subdiagonal part ofA.
on exit, if INFO = 0, it's the symmetric inverse of the original matrix, no cap:
- if
UPLO = 'U': the upper triangular part of the inverse is formed and the part ofAbelow the diagonal is not referenced; - if
UPLO = 'L': the lower triangular part of the inverse is formed and the part ofAabove the diagonal is not referenced.
so like, don't go reading the half she didn't touch, bestie π
LDAβINTEGER. the leading dimension of the arrayA. constraint era:LDA >= max(1,N). β¨EβDOUBLE PRECISION array, dimension (N). on entry it contains the superdiagonal (or subdiagonal) elements of the symmetric block diagonal matrixDwith 1-by-1 or 2-by-2 diagonal blocks, where:- if
UPLO = 'U':E(i) = D(i-1,i),i=2:N,E(1)not referenced; - if
UPLO = 'L':E(i) = D(i+1,i),i=1:N-1,E(N)not referenced.
- if
NOTE: for a 1-by-1 diagonal blockD(k), where1 <= k <= N, the elementE(k)is not referenced in both theUPLO = 'U'orUPLO = 'L'cases. she's just sitting there, unbothered, unemployed π«Ά
IPIVβINTEGER array, dimension (N). the deets on the interchanges and the block structure ofD, as determined byDSYTRF_RKorDSYTRF_BK. π₯WORKβDOUBLE PRECISION array, dimension (N+NB+1,NB+3). the workspace, she works hard so the rest of us don't have to β¨NBβINTEGER. block size. that's it. that's the whole description. iconic minimalism πINFOβINTEGER:= 0: successful exit π< 0: ifINFO = -i, thei-th argument had an illegal value π> 0: ifINFO = i,D(i,i) = 0; the matrix is singular and its inverse could not be computed. π so yeah, she's singular, it's giving "no inverse bestie", do not proceed.
πΈ Author πΈ
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
π Contributors π
June 2017, Igor Kozachenko, Computer Science Division, University of California, Berkeley
π Definition π
Definition at line 158 of file dsytri_3x.f.
π subroutine ssytri_3x β the single-precision twin π
subroutine ssytri_3x (character uplo, integer n, real, dimension( lda, * )
a, integer lda, real, dimension( * ) e, integer, dimension( * ) ipiv,
real, dimension( n+nb+1, * ) work, integer nb, integer info)
β¨ Purpose β¨
SSYTRI_3X computes the inverse of a real symmetric indefinite matrix A using the factorization computed by SSYTRF_RK or SSYTRF_BK:
A = P*U*D*(U**T)*(P**T) or A = P*L*D*(L**T)*(P**T),
where U (or L) is unit upper (or lower) triangular matrix, U**T (or L**T) is the transpose of U (or L), P is a permutation matrix, P**T is the transpose of P, and D is symmetric and block diagonal with 1-by-1 and 2-by-2 diagonal blocks.
and the flex? this is the blocked version of the algorithm, calling Level 3 BLAS. she's not doing this one element at a time, she's doing it in blocks, iykyk π
π Parameters π
UPLOβCHARACTER*1. specifies whether the details of the factorization are stored as an upper or lower triangular matrix:= 'U': upper triangle ofAis stored;= 'L': lower triangle ofAis stored.
NβINTEGER. the order of the matrixA.N >= 0.AβREAL array, dimension (LDA,N). on entry: the diagonal of the block diagonal matrixDand the factorsUorLas computed bySYTRF_RKandSSYTRF_BK:- a) ONLY the diagonal elements of the symmetric block diagonal matrix
Dgo on the diagonal ofA, i.e.D(k,k) = A(k,k); (the superdiagonal (or subdiagonal) elements ofDshould be provided on entry in arrayE), and - b) if
UPLO = 'U': factorUin the superdiagonal part ofA. IfUPLO = 'L': factorLin the subdiagonal part ofA.
- a) ONLY the diagonal elements of the symmetric block diagonal matrix
on exit, if INFO = 0, the symmetric inverse of the original matrix:
- if
UPLO = 'U': the upper triangular part of the inverse is formed and the part ofAbelow the diagonal is not referenced; - if
UPLO = 'L': the lower triangular part of the inverse is formed and the part ofAabove the diagonal is not referenced.
LDAβINTEGER. the leading dimension of the arrayA.LDA >= max(1,N). πEβREAL array, dimension (N). on entry, contains the superdiagonal (or subdiagonal) elements of the symmetric block diagonal matrixDwith 1-by-1 or 2-by-2 diagonal blocks, where:- if
UPLO = 'U':E(i) = D(i-1,i),i=2:N,E(1)not referenced; - if
UPLO = 'L':E(i) = D(i+1,i),i=1:N-1,E(N)not referenced.
- if
NOTE: for a 1-by-1 diagonal blockD(k), where1 <= k <= N, the elementE(k)is not referenced in both theUPLO = 'U'orUPLO = 'L'cases. she's off the clock in both scenarios fr π
IPIVβINTEGER array, dimension (N). details of the interchanges and the block structure ofDas determined bySSYTRF_RKorSSYTRF_BK. π¦WORKβREAL array, dimension (N+NB+1,NB+3). the workspace bestie, she's grinding β¨NBβINTEGER. block size. short king of a description πINFOβINTEGER:= 0: successful exit π₯³< 0: ifINFO = -i, thei-th argument had an illegal value.> 0: ifINFO = i,D(i,i) = 0; the matrix is singular and its inverse could not be computed. π singular queen, inverse denied.
πΈ Author πΈ
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
π Contributors π
June 2017, Igor Kozachenko, Computer Science Division, University of California, Berkeley
π Definition π
Definition at line 158 of file ssytri_3x.f.
π¦ subroutine zhetri_3x β complex Hermitian edition π¦
subroutine zhetri_3x (character uplo, integer n, complex*16, dimension( lda,
* ) a, integer lda, complex*16, dimension( * ) e, integer, dimension( *
) ipiv, complex*16, dimension( n+nb+1, * ) work, integer nb, integer
info)
β¨ Purpose β¨
ZHETRI_3X computes the inverse of a complex Hermitian indefinite matrix A using the factorization computed by ZHETRF_RK or ZHETRF_BK:
A = P*U*D*(U**H)*(P**T) or A = P*L*D*(L**H)*(P**T),
where U (or L) is unit upper (or lower) triangular matrix, U**H (or L**H) is the conjugate of U (or L), P is a permutation matrix, P**T is the transpose of P, and D is Hermitian and block diagonal with 1-by-1 and 2-by-2 diagonal blocks.
and yeah β this is the blocked version of the algorithm, calling Level 3 BLAS. same energy, but make it complex and conjugate-transposed π β¨
π Parameters π
UPLOβCHARACTER*1. specifies whether the details of the factorization are stored as an upper or lower triangular matrix:= 'U': upper triangle ofAis stored;= 'L': lower triangle ofAis stored.
NβINTEGER. the order of the matrixA.N >= 0. πAβCOMPLEX*16 array, dimension (LDA,N). on entry, the diagonal of the block diagonal matrixDand the factorsUorLas computed byZHETRF_RKandZHETRF_BK:- a) ONLY the diagonal elements of the Hermitian block diagonal matrix
Don the diagonal ofA, i.e.D(k,k) = A(k,k); (the superdiagonal (or subdiagonal) elements ofDshould be provided on entry in arrayE), and - b) if
UPLO = 'U': factorUin the superdiagonal part ofA. IfUPLO = 'L': factorLin the subdiagonal part ofA.
- a) ONLY the diagonal elements of the Hermitian block diagonal matrix
on exit, if INFO = 0, the Hermitian inverse of the original matrix:
- if
UPLO = 'U': the upper triangular part of the inverse is formed and the part ofAbelow the diagonal is not referenced; - if
UPLO = 'L': the lower triangular part of the inverse is formed and the part ofAabove the diagonal is not referenced.
LDAβINTEGER. the leading dimension of the arrayA.LDA >= max(1,N). no notes, just vibes and a hard constraint πEβCOMPLEX*16 array, dimension (N). on entry, contains the superdiagonal (or subdiagonal) elements of the Hermitian block diagonal matrixDwith 1-by-1 or 2-by-2 diagonal blocks, where:- if
UPLO = 'U':E(i) = D(i-1,i),i=2:N,E(1)not referenced; - if
UPLO = 'L':E(i) = D(i+1,i),i=1:N-1,E(N)not referenced.
- if
NOTE: for a 1-by-1 diagonal blockD(k), where1 <= k <= N, the elementE(k)is not referenced in both theUPLO = 'U'orUPLO = 'L'cases. she does not get read, in either timeline π
IPIVβINTEGER array, dimension (N). details of the interchanges and the block structure ofDas determined byZHETRF_RKorZHETRF_BK. π₯WORKβCOMPLEX*16 array, dimension (N+NB+1,NB+3). workspace, but make it complex π§NBβINTEGER. block size. (still just block size. still iconic.) β
β¦and INFO is up next, which is exactly where this chunk runs out β keep scrolling bestie, it picks right back up π
INFO is INTEGER β bestie, this is the final vibe check on your call π₯
= 0: successful exit, we ate and left no crumbs π< 0: ifINFO = -i, thei-th argument had an illegal value π> 0: ifINFO = i,D(i,i) = 0; the matrix is singular and its inverse could not be computed π
Author πΈ
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Contributors π«Ά
!>
!> June 2017, Igor Kozachenko,
!> Computer Science Division,
!> University of California, Berkeley
!>
!>
Definition at line 158 of file zhetri_3x.f.
subroutine zsytri_3x (character uplo, integer n, complex*16, dimension( lda, * ) a, integer lda, complex*16, dimension( * ) e, integer, dimension( * ) ipiv, complex*16, dimension( n+nb+1, * ) work, integer nb, integer info) π
subroutine zsytri_3x (character uplo, integer n, complex*16, dimension( lda,
* ) a, integer lda, complex*16, dimension( * ) e, integer, dimension( *
) ipiv, complex*16, dimension( n+nb+1, * ) work, integer nb, integer
info)
ZSYTRI_3X
Purpose: β¨
ZSYTRI_3X computes the inverse of a complex symmetric indefinite matrix A using the factorization computed by ZSYTRF_RK or ZSYTRF_BK:
A = P*U*D*(U**T)*(P**T) or A = P*L*D*(L**T)*(P**T),
where U (or L) is unit upper (or lower) triangular matrix, U**T (or L**T) is the transpose of U (or L), P is a permutation matrix, P**T is the transpose of P, and D is symmetric and block diagonal with 1-by-1 and 2-by-2 diagonal blocks.
This is the blocked version of the algorithm, calling Level 3 BLAS. π
Parameters π
UPLOβ isCHARACTER*1. Specifies whether the details of the factorization are stored as an upper or lower triangular matrix.= 'U': Upper triangle ofAis stored;= 'L': Lower triangle ofAis stored.
Nβ isINTEGER. The order of the matrixA.N >= 0.Aβ isCOMPLEX*16array, dimension(LDA,N). On entry, diagonal of the block diagonal matrixDand factorsUorLas computed byZSYTRF_RKandZSYTRF_BK:- a) ONLY diagonal elements of the symmetric block diagonal matrix
Don the diagonal ofA, i.e.D(k,k) = A(k,k); (superdiagonal (or subdiagonal) elements ofDshould be provided on entry in arrayE), and - b) If
UPLO = 'U': factorUin the superdiagonal part ofA. IfUPLO = 'L': factorLin the subdiagonal part ofA.
- a) ONLY diagonal elements of the symmetric block diagonal matrix
On exit, if INFO = 0, the symmetric inverse of the original matrix.
- If
UPLO = 'U': the upper triangular part of the inverse is formed and the part ofAbelow the diagonal is not referenced; - If
UPLO = 'L': the lower triangular part of the inverse is formed and the part ofAabove the diagonal is not referenced.
LDAβ isINTEGER. The leading dimension of the arrayA.LDA >= max(1,N).Eβ isCOMPLEX*16array, dimension(N). On entry, contains the superdiagonal (or subdiagonal) elements of the symmetric block diagonal matrixDwith 1-by-1 or 2-by-2 diagonal blocks, where- If
UPLO = 'U':E(i) = D(i-1,i),i=2:N,E(1)not referenced; - If
UPLO = 'L':E(i) = D(i+1,i),i=1:N-1,E(N)not referenced.
- If
NOTE: For 1-by-1 diagonal block D(k), where 1 <= k <= N, the element E(k) is not referenced in both UPLO = 'U' or UPLO = 'L' cases.
IPIVβ isINTEGERarray, dimension(N). Details of the interchanges and the block structure ofDas determined byZSYTRF_RKorZSYTRF_BK.WORKβ isCOMPLEX*16array, dimension(N+NB+1,NB+3).NBβ isINTEGER. Block size.INFOβ isINTEGER.= 0: successful exit< 0: ifINFO = -i, thei-th argument had an illegal value> 0: ifINFO = i,D(i,i) = 0; the matrix is singular and its inverse could not be computed.
Author πΈ
- Univ. of Tennessee
- Univ. of California Berkeley
- Univ. of Colorado Denver
- NAG Ltd.
Contributors π«Ά
!>
!> June 2017, Igor Kozachenko,
!> Computer Science Division,
!> University of California, Berkeley
!>
!>
Definition at line 158 of file zsytri_3x.f.
This iconic page was generated automatically by Doxygen for LAPACK from the source code π. LAPACK, Version 3.12.0, hetri_3x(3) β periodt. π
π¦ where this page comes from
- arch rolling: lapack-doc 3.12.1-2 Β· custom
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms