ggev3(3)
β¨ ggev3(3) β Library Functions Manual, but make it cute β¨
bestie, welcome to the ggev3 glow-up π
this is the generalized eigenvalue/eigenvector saga for GE matrices, blocked-algorithm edition, and it's honestly giving main character energy. π¦
πΈ NAME πΈ
ggev3 β ggev3: eig β aka the whole generalized eig friend group: cggev3, dggev3, sggev3, and zggev3. They compute eigenvalues and, optionally, left and/or right eigenvectors for GE matrices using the blocked algorithm. Periodt. π
π¦ SYNOPSIS π¦
β¨ Functions β¨
cggev3β CGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (blocked algorithm)
subroutine cggev3 (jobvl, jobvr, n, a, lda, b, ldb, alpha, beta, vl,
ldvl, vr, ldvr, work, lwork, rwork, info)
dggev3β DGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (blocked algorithm)
subroutine dggev3 (jobvl, jobvr, n, a, lda, b, ldb, alphar, alphai,
beta, vl, ldvl, vr, ldvr, work, lwork, info)
sggev3β SGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (blocked algorithm)
subroutine sggev3 (jobvl, jobvr, n, a, lda, b, ldb, alphar, alphai,
beta, vl, ldvl, vr, ldvr, work, lwork, info)
zggev3β ZGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (blocked algorithm)
subroutine zggev3 (jobvl, jobvr, n, a, lda, b, ldb, alpha, beta, vl,
ldvl, vr, ldvr, work, lwork, rwork, info)
π DETAILED DESCRIPTION π
okay so this is where the ggev3 family actually spills the tea. It's the blocked-algorithm version of generalized eig for GE matrices, and the full deets live right below. Grab a strawberry π and let's get into it.
π FUNCTION DOCUMENTATION π
π¦ subroutine cggev3 π¦
subroutine cggev3 (character jobvl, character jobvr, integer n, complex,
dimension( lda, * ) a, integer lda, complex, dimension( ldb, * ) b,
integer ldb, complex, dimension( * ) alpha, complex, dimension( * )
beta, complex, dimension( ldvl, * ) vl, integer ldvl, complex,
dimension( ldvr, * ) vr, integer ldvr, complex, dimension( * ) work,
integer lwork, real, dimension( * ) rwork, integer info)
CGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (blocked algorithm). slay. β¨
π Purpose π
CGGEV3 computes for a pair of N-by-N complex nonsymmetric matrices (A,B), the generalized eigenvalues, and optionally, the left and/or right generalized eigenvectors. no cap, that's the whole vibe.
A generalized eigenvalue for a pair of matrices (A,B) is a scalar lambda or a ratio alpha/beta = lambda, such that A - lambda*B is singular. It is usually represented as the pair (alpha,beta), as there is a reasonable interpretation for beta=0, and even for both being zero.
The right generalized eigenvector v(j) corresponding to the generalized eigenvalue lambda(j) of (A,B) satisfies
A * v(j) = lambda(j) * B * v(j).
The left generalized eigenvector u(j) corresponding to the generalized eigenvalues lambda(j) of (A,B) satisfies
u(j)**H * A = lambda(j) * u(j)**H * B
where u(j)**H is the conjugate-transpose of u(j). iykyk π
π Parameters π
JOBVLβCHARACTER*1;= 'N': do not compute the left generalized eigenvectors;= 'V': compute the left generalized eigenvectors. πJOBVRβCHARACTER*1;= 'N': do not compute the right generalized eigenvectors;= 'V': compute the right generalized eigenvectors. πNβINTEGER; the order of the matricesA,B,VL, andVR.N >= 0. πAβCOMPLEX array, dimension (LDA, N); on entry, the matrixAin the pair(A,B). On exit,Ahas been overwritten. she's changed, bestie. πLDAβINTEGER; the leading dimension ofA.LDA >= max(1,N). β¨BβCOMPLEX array, dimension (LDB, N); on entry, the matrixBin the pair(A,B). On exit,Bhas been overwritten. also changed, lowkey. πLDBβINTEGER; the leading dimension ofB.LDB >= max(1,N). β¨ALPHAβCOMPLEX array, dimension (N). πBETAβCOMPLEX array, dimension (N); on exit,ALPHA(j)/BETA(j),j=1,...,N, will be the generalized eigenvalues.
bestie, listen: the quotientsALPHA(j)/BETA(j)may easily over- or underflow, andBETA(j)may even be zero. Thus, the user should avoid naively computing the ratioalpha/beta. However,ALPHAwill be always less than and usually comparable withnorm(A)in magnitude, andBETAalways less than and usually comparable withnorm(B). do not just divide and pray, okay? π
VLβCOMPLEX array, dimension (LDVL,N); ifJOBVL = 'V', the left generalized eigenvectorsu(j)are stored one after another in the columns ofVL, in the same order as their eigenvalues. Each eigenvector is scaled so the largest component hasabs(real part) + abs(imag. part) = 1. Not referenced ifJOBVL = 'N'. π¦LDVLβINTEGER; the leading dimension of the matrixVL.LDVL >= 1, and ifJOBVL = 'V',LDVL >= N. β¨VRβCOMPLEX array, dimension (LDVR,N); ifJOBVR = 'V', the right generalized eigenvectorsv(j)are stored one after another in the columns ofVR, in the same order as their eigenvalues. Each eigenvector is scaled so the largest component hasabs(real part) + abs(imag. part) = 1. Not referenced ifJOBVR = 'N'. π¦LDVRβINTEGER; the leading dimension of the matrixVR.LDVR >= 1, and ifJOBVR = 'V',LDVR >= N. β¨WORKβCOMPLEX array, dimension (MAX(1,LWORK)); on exit, ifINFO = 0,WORK(1)returns the optimalLWORK. πLWORKβINTEGER; the dimension of the arrayWORK.LWORK >= MAX(1,2*N). For good performance,LWORKmust generally be larger.
workspace query tea: ifLWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of theWORKarray, returns this value as the first entry of theWORKarray, and no error message related toLWORKis issued byXERBLA. so don't panic, it's just asking, not doing. π
RWORKβREAL array, dimension (8*N). πΈINFOβINTEGER;= 0: successful exit;< 0: ifINFO = -i, thei-th argument had an illegal value;=1,...,N: the QZ iteration failed. No eigenvectors have been calculated, butALPHA(j)andBETA(j)should be correct forj=INFO+1,...,N;> N:=N+1: other then QZ iteration failed inCHGEQZ,=N+2: error return fromCTGEVC. not the slay we wanted, but at least the receipts are clear. π
π Author π
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
π Definition at line 215 of file cggev3.f. π
π¦ subroutine dggev3 π¦
subroutine dggev3 (character jobvl, character jobvr, integer n, double
precision, dimension( lda, * ) a, integer lda, double precision,
dimension( ldb, * ) b, integer ldb, double precision, dimension( * )
alphar, double precision, dimension( * ) alphai, double precision,
dimension( * ) beta, double precision, dimension( ldvl, * ) vl, integer
ldvl, double precision, dimension( ldvr, * ) vr, integer ldvr, double
precision, dimension( * ) work, integer lwork, integer info)
DGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (blocked algorithm). real nonsymmetric edition, let's goooo. π₯
π Purpose π
DGGEV3 computes for a pair of N-by-N real nonsymmetric matrices (A,B) the generalized eigenvalues, and optionally, the left and/or right generalized eigenvectors.
A generalized eigenvalue for a pair of matrices (A,B) is a scalar lambda or a ratio alpha/beta = lambda, such that A - lambda*B is singular. It is usually represented as the pair (alpha,beta), as there is a reasonable interpretation for beta=0, and even for both being zero.
The right eigenvector v(j) corresponding to the eigenvalue lambda(j) of (A,B) satisfies
A * v(j) = lambda(j) * B * v(j).
The left eigenvector u(j) corresponding to the eigenvalue lambda(j) of (A,B) satisfies
u(j)**H * A = lambda(j) * u(j)**H * B .
where u(j)**H is the conjugate-transpose of u(j). same energy, real arithmetic. π
π Parameters π
JOBVLβCHARACTER*1;= 'N': do not compute the left generalized eigenvectors;= 'V': compute the left generalized eigenvectors. πJOBVRβCHARACTER*1;= 'N': do not compute the right generalized eigenvectors;= 'V': compute the right generalized eigenvectors. πNβINTEGER; the order of the matricesA,B,VL, andVR.N >= 0. πAβDOUBLE PRECISION array, dimension (LDA, N); on entry, the matrixAin the pair(A,B). On exit,Ahas been overwritten. again, she's not the same matrix after. πLDAβINTEGER; the leading dimension ofA.LDA >= max(1,N). β¨BβDOUBLE PRECISION array, dimension (LDB, N); on entry, the matrixBin the pair(A,B). On exit,Bhas been overwritten. same story, bestie. πLDBβINTEGER; the leading dimension ofB.LDB >= max(1,N). β¨ALPHARβDOUBLE PRECISION array, dimension (N). πALPHAIβDOUBLE PRECISION array, dimension (N). πBETAβ part 2 is about to spill the rest of this parameter's deets, bestie β the page cuts off right here in part 1 π
part 1 out, part 2 incoming β don't touch that dial, we're not done slaying β¨
BETAβ DOUBLE PRECISION array, dimension (N). On exit,(ALPHAR(j) + ALPHAI(j)*i)/BETA(j),j=1,...,N, will be the generalized eigenvalues. IfALPHAI(j)is zero then the j-th eigenvalue is real; if it's positive then the j-th and (j+1)-st eigenvalues form a complex conjugate pair, andALPHAI(j+1)is negative. π
β οΈ bestie, listen: the quotientsALPHAR(j)/BETA(j)andALPHAI(j)/BETA(j)may easily over- or underflow, andBETA(j)may even be zero. So please, do not naively compute the ratioalpha/betaπ. That said,ALPHARandALPHAIwill always be less than and usually comparable withnorm(A)in magnitude, andBETAalways less than and usually comparable withnorm(B). π
VLβ DOUBLE PRECISION array, dimension (LDVL,N). IfJOBVL = 'V', the left eigenvectorsu(j)are stored one after another in the columns ofVL, in the same order as their eigenvalues. If the j-th eigenvalue is real, thenu(j) = VL(:,j), the j-th column ofVL. If the j-th and (j+1)-th eigenvalues form a complex conjugate pair, thenu(j) = VL(:,j)+i*VL(:,j+1)andu(j+1) = VL(:,j)-i*VL(:,j+1). Each eigenvector is scaled so the largest component hasabs(real part)+abs(imag. part)=1. β¨ Not referenced ifJOBVL = 'N'.LDVLβ INTEGER. The leading dimension of the matrixVL.LDVL >= 1, and ifJOBVL = 'V',LDVL >= N. πVRβ DOUBLE PRECISION array, dimension (LDVR,N). IfJOBVR = 'V', the right eigenvectorsv(j)are stored one after another in the columns ofVR, in the same order as their eigenvalues. If the j-th eigenvalue is real, thenv(j) = VR(:,j), the j-th column ofVR. If the j-th and (j+1)-th eigenvalues form a complex conjugate pair, thenv(j) = VR(:,j)+i*VR(:,j+1)andv(j+1) = VR(:,j)-i*VR(:,j+1). Each eigenvector is scaled so the largest component hasabs(real part)+abs(imag. part)=1. π¦ Not referenced ifJOBVR = 'N'.LDVRβ INTEGER. The leading dimension of the matrixVR.LDVR >= 1, and ifJOBVR = 'V',LDVR >= N. πWORKβ DOUBLE PRECISION array, dimension (MAX(1,LWORK)). On exit, ifINFO = 0,WORK(1)returns the optimalLWORK. πLWORKβ INTEGER. The dimension of the arrayWORK.LWORK >= MAX(1,8*N). For good performance,LWORKshould generally be larger β like, treat yourself, give it room to breathe π«Ά.
π§ IfLWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of theWORKarray, returns this value as the first entry of theWORKarray, and no error message related toLWORKis issued byXERBLA. It's giving "just asking, not committing" energy.
INFOβ INTEGER:= 0: successful exit π< 0: ifINFO = -i, the i-th argument had an illegal value. π= 1,...,N: the QZ iteration failed. No eigenvectors have been calculated, butALPHAR(j),ALPHAI(j), andBETA(j)should be correct forj=INFO+1,...,N. π> N:=N+1: other than QZ iteration failed inDLAQZ0.=N+2: error return fromDTGEVC. π
π Author
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Definition at line 225 of file dggev3.f. π
π subroutine sggev3
subroutine sggev3 (character jobvl, character jobvr, integer n, real,
dimension( lda, * ) a, integer lda, real, dimension( ldb, * ) b, integer
ldb, real, dimension( * ) alphar, real, dimension( * ) alphai, real,
dimension( * ) beta, real, dimension( ldvl, * ) vl, integer ldvl, real,
dimension( ldvr, * ) vr, integer ldvr, real, dimension( * ) work,
integer lwork, integer info)
SGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices (blocked algorithm) π₯
π Purpose:
Okay so picture this: SGGEV3 computes for a pair of N-by-N real nonsymmetric matrices (A,B) the generalized eigenvalues, and optionally, the left and/or right generalized eigenvectors. π«
A generalized eigenvalue for a pair of matrices (A,B) is a scalar lambda or a ratio alpha/beta = lambda, such that A - lambda*B is singular. It's usually represented as the pair (alpha,beta), because there's a reasonable interpretation for beta=0, and even for both being zero. π§ β¨
The right eigenvector v(j) corresponding to the eigenvalue lambda(j) of (A,B) satisfies
A * v(j) = lambda(j) * B * v(j).
The left eigenvector u(j) corresponding to the eigenvalue lambda(j) of (A,B) satisfies
u(j)**H * A = lambda(j) * u(j)**H * B .
where u(j)**H is the conjugate-transpose of u(j). π¦ (yes the **H goes on the outside, it's that girl)
Parameters
JOBVLβ CHARACTER*1:= 'N': do not compute the left generalized eigenvectors;= 'V': compute the left generalized eigenvectors. π
JOBVRβ CHARACTER*1:= 'N': do not compute the right generalized eigenvectors;= 'V': compute the right generalized eigenvectors. β¨
Nβ INTEGER. The order of the matricesA,B,VL, andVR.N >= 0. π’Aβ REAL array, dimension (LDA, N). On entry, the matrixAin the pair(A,B). On exit,Ahas been overwritten. π¬ yeah she's gone, hope you didn't need her.LDAβ INTEGER. The leading dimension ofA.LDA >= max(1,N). πBβ REAL array, dimension (LDB, N). On entry, the matrixBin the pair(A,B). On exit,Bhas been overwritten. π same deal, she's not coming back.LDBβ INTEGER. The leading dimension ofB.LDB >= max(1,N). πALPHARβ REAL array, dimension (N). πΈALPHAIβ REAL array, dimension (N). πΈBETAβ REAL array, dimension (N). On exit,(ALPHAR(j) + ALPHAI(j)*i)/BETA(j),j=1,...,N, will be the generalized eigenvalues. IfALPHAI(j)is zero, then the j-th eigenvalue is real; if positive, then the j-th and (j+1)-st eigenvalues are a complex conjugate pair, withALPHAI(j+1)negative. π
β οΈ the quotientsALPHAR(j)/BETA(j)andALPHAI(j)/BETA(j)may easily over- or underflow, andBETA(j)may even be zero. Thus, the user should avoid naively computing the ratioalpha/betaπ. However,ALPHARandALPHAIwill be always less than and usually comparable withnorm(A)in magnitude, andBETAalways less than and usually comparable withnorm(B). π
VLβ REAL array, dimension (LDVL,N). IfJOBVL = 'V', the left eigenvectorsu(j)are stored one after another in the columns ofVL, in the same order as their eigenvalues. If the j-th eigenvalue is real, thenu(j) = VL(:,j), the j-th column ofVL. If the j-th and (j+1)-th eigenvalues form a complex conjugate pair, thenu(j) = VL(:,j)+i*VL(:,j+1)andu(j+1) = VL(:,j)-i*VL(:,j+1). Each eigenvector is scaled so the largest component hasabs(real part)+abs(imag. part)=1. β¨ Not referenced ifJOBVL = 'N'.LDVLβ INTEGER. The leading dimension of the matrixVL.LDVL >= 1, and ifJOBVL = 'V',LDVL >= N. πVRβ REAL array, dimension (LDVR,N). IfJOBVR = 'V', the right eigenvectorsv(j)are stored one after another in the columns ofVR, in the same order as their eigenvalues. If the j-th eigenvalue is real, thenv(j) = VR(:,j), the j-th column ofVR. If the j-th and (j+1)-th eigenvalues form a complex conjugate pair, thenv(j) = VR(:,j)+i*VR(:,j+1)andv(j+1) = VR(:,j)-i*VR(:,j+1). Each eigenvector is scaled so the largest component hasabs(real part)+abs(imag. part)=1. π¦ Not referenced ifJOBVR = 'N'.LDVRβ INTEGER. The leading dimension of the matrixVR.LDVR >= 1, and ifJOBVR = 'V',LDVR >= N. πWORKβ REAL array, dimension (MAX(1,LWORK)). On exit, ifINFO = 0,WORK(1)returns the optimalLWORK. πLWORKβ INTEGER. The dimension of the arrayWORK.LWORK >= MAX(1,8*N). For good performance,LWORKshould generally be larger. π«Ά
π§ IfLWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of theWORKarray, returns this value as the first entry of theWORKarray, and no error message related toLWORKis issued byXERBLA. Same vibe check as before, no cap.
INFOβ INTEGER:= 0: successful exit π< 0: ifINFO = -i, the i-th argument had an illegal value. π= 1,...,N: the QZ iteration failed. No eigenvectors have been calculated, butALPHAR(j),ALPHAI(j), andBETA(j)should be correct forj=INFO+1,...,N. π> N:=N+1: other than QZ iteration failed inSLAQZ0.=N+2: error return fromSTGEVC. π
πΈ Author
Univ. of Tennessee
Univ. of California Berkeley
okay bestie that's the subroutine rundown, and next up we've got the rest of the parameter tea to spill π
Univ. of Colorado Denver
NAG Ltd.
Definition at line 225 of file sggev3.f.
πΈ zggev3 β complex generalized eigenvalues, bestie πΈ
subroutine zggev3 (character jobvl, character jobvr, integer n, complex*16,
dimension( lda, * ) a, integer lda, complex*16, dimension( ldb, * ) b,
integer ldb, complex*16, dimension( * ) alpha, complex*16, dimension( *
) beta, complex*16, dimension( ldvl, * ) vl, integer ldvl, complex*16,
dimension( ldvr, * ) vr, integer ldvr, complex*16, dimension( * ) work,
integer lwork, double precision, dimension( * ) rwork, integer info)
Short version, because we love a summary: ZGGEV3 computes the eigenvalues and, optionally, the left and/or right eigenvectors for GE matrices β blocked algorithm edition. π
π Purpose π
Okay so ZGGEV3 computes, for a pair of N-by-N complex nonsymmetric matrices (A,B), the generalized eigenvalues, and optionally the left and/or right generalized eigenvectors. Main character math energy, honestly.
A generalized eigenvalue for a pair of matrices (A,B) is a scalar lambda or a ratio alpha/beta = lambda, such that A - lambda*B is singular. It is usually represented as the pair (alpha,beta), as there is a reasonable interpretation for beta=0, and even for both being zero. Yes bestie, both zero is allowed to be a whole mood.
The right generalized eigenvector v(j) corresponding to the generalized eigenvalue lambda(j) of (A,B) satisfies
A * v(j) = lambda(j) * B * v(j).
The left generalized eigenvector u(j) corresponding to the generalized eigenvalues lambda(j) of (A,B) satisfies
u(j)**H * A = lambda(j) * u(j)**H * B
where u(j)**H is the conjugate-transpose of u(j). Conjugate-transpose is iconic, she contains multitudes.
π Parameters π
JOBVLβJOBVLisCHARACTER*1;= 'N': do not compute the left generalized eigenvectors;= 'V': compute the left generalized eigenvectors.JOBVRβJOBVRisCHARACTER*1;= 'N': do not compute the right generalized eigenvectors;= 'V': compute the right generalized eigenvectors.NβNisINTEGER; the order of the matricesA,B,VL, andVR.N >= 0.AβAisCOMPLEX*16array, dimension(LDA, N). On entry, the matrixAin the pair(A,B). On exit,Ahas been overwritten.LDAβLDAisINTEGER; the leading dimension ofA.LDA >= max(1,N).BβBisCOMPLEX*16array, dimension(LDB, N). On entry, the matrixBin the pair(A,B). On exit,Bhas been overwritten.LDBβLDBisINTEGER; the leading dimension ofB.LDB >= max(1,N).ALPHAβALPHAisCOMPLEX*16array, dimension(N).BETAβBETAisCOMPLEX*16array, dimension(N). On exit,ALPHA(j)/BETA(j),j=1,...,N, will be the generalized eigenvalues.- Note: the quotients
ALPHA(j)/BETA(j)may easily over- or underflow, andBETA(j)may even be zero. Thus, the user should avoid naively computing the ratioalpha/beta. - However,
ALPHAwill be always less than and usually comparable withnorm(A)in magnitude, andBETAalways less than and usually comparable withnorm(B). So the vibes are bounded-ish, but do not be feral with the raw ratio.
- Note: the quotients
VLβVLisCOMPLEX*16array, dimension(LDVL,N). IfJOBVL = 'V', the left generalized eigenvectorsu(j)are stored one after another in the columns ofVL, in the same order as their eigenvalues. Each eigenvector is scaled so the largest component hasabs(real part) + abs(imag. part) = 1. Not referenced ifJOBVL = 'N'.LDVLβLDVLisINTEGER; the leading dimension of the matrixVL.LDVL >= 1, and ifJOBVL = 'V',LDVL >= N.VRβVRisCOMPLEX*16array, dimension(LDVR,N). IfJOBVR = 'V', the right generalized eigenvectorsv(j)are stored one after another in the columns ofVR, in the same order as their eigenvalues. Each eigenvector is scaled so the largest component hasabs(real part) + abs(imag. part) = 1. Not referenced ifJOBVR = 'N'.LDVRβLDVRisINTEGER; the leading dimension of the matrixVR.LDVR >= 1, and ifJOBVR = 'V',LDVR >= N.WORKβWORKisCOMPLEX*16array, dimension(MAX(1,LWORK)). On exit, ifINFO = 0,WORK(1)returns the optimalLWORK.LWORKβLWORKisINTEGER; the dimension of the arrayWORK.LWORK >= MAX(1,2*N). For good performance,LWORKmust generally be larger.- If
LWORK = -1, then a workspace query is assumed; the routine only calculates the optimal size of theWORKarray, returns this value as the first entry of theWORKarray, and no error message related toLWORKis issued byXERBLA. Workspace query is the shortcut queen, no cap.
- If
RWORKβRWORKisDOUBLE PRECISIONarray, dimension(8*N).INFOβINFOisINTEGER.= 0: successful exit.< 0: ifINFO = -i, the i-th argument had an illegal value.=1,...,N: The QZ iteration failed. No eigenvectors have been calculated, butALPHA(j)andBETA(j)should be correct forj=INFO+1,...,N.> N:=N+1: other then QZ iteration failed inZHGEQZ,=N+2: error return fromZTGEVC. Read those statuses carefully, bestie β they are literally telling you where the drama happened.
π Author π
Univ. of Tennessee
Univ. of California Berkeley
Univ. of Colorado Denver
NAG Ltd.
Definition at line 215 of file zggev3.f.
πͺ Author πͺ
Generated automatically by Doxygen for LAPACK from the source code.
Footer cuteness: LAPACK Version 3.12.0, page ggev3(3), generated automatically by Doxygen for LAPACK from the source code. Date? The footer line we were handed doesnβt print a separate date, so Iβm not inventing one β bestie honesty only. π
π¦ 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