// zhegv.cc // 複素エルミート行列の一般化固有値方程式を解く #include #include typedef std::complex Complex; extern "C" { void zhegv_ ( const int& ITYPE, const char& JOBZ, const char& UPLO, const int& N, Complex** A, const int& LDA, Complex** B, const int& LDB, double* W, Complex* WORK, const int& LWORK, double* RWORK, int& INFO, int JOBZlen, int UPLOlen ); }; // 複素エルミート行列 H,S の一般化固有値方程式 H x = E S x を解く簡易関数 // Input: H[N][N], S[N][N], Output: U[N][N], E[N] // ただし、H[i][j<=i] S[i][j<=i] の下三角しか参照されない // U^\dagger H U が対角行列、U^\dagger S U が単位行列 // template int zhegv( Complex H[N][N], Complex S[N][N], Complex U[N][N], double E[N] ) { int i, j, info; static Complex cwork[4*N]; static double rwork[4*N]; static Complex B[N][N]; for( i=0; i