こちらの論文 Misawa and Yamaji Zeros of Green functions in topological insulatorsを読んでいたところ、Eigenvector-eigenvalue identityなるものが出てきて、面白そうだったのでJuliaで実際に試してみました。Eigenvector-eigenvalue identityの原論文はこちら。
試すもの
$n \times n$のエルミート行列$A$の$i$番目の固有ベクトルの$j$番目の要素を$v^{i}_j$とします。この時、固有ベクトルの要素の絶対値は、固有値だけで書けるというのです。
|v^{i}_j|^2 = \frac{\prod_{k=1}^{n-1}|E_i(A) - E_{k}(M_j)|}{\prod_{k=1;k \neq i}^{n-1}|E_i(A)-E_k(A)|}
となるそうです。ここで、$M_j$は行列Aから$j$行$j$列を取り除いて作った行列です。
コード
Julia 1.7.3で動作確認しています。
using LinearAlgebra
function construct_M(A,j)
n,m = size(A)
@assert n == m "A should be a square matrix!"
r = collect(1:n)
deleteat!(r,j)
return A[r,r]
end
function make_v_from_e(A,e,i,j)
n,n = size(A)
Mj = construct_M(A,j)
ej,vj = eigen(Mj)
a = 1.0
for k=1:n
if k == i
continue
end
a *= (e[i]-e[k])
end
b = 1.0
for k=1:n-1
b *= (e[i]-ej[k])
end
return b/a
end
このコード、本当は行列$M$の対角化の回数を減らせますが、コードのみやすさのためにそうしていません。
それでは、試してみます。
function main()
A = [1 2 3
2 4 5
3 5 6]
e,v = eigen(A)
n,n = size(A)
for j=1:n
for i=1:n
vfrome = make_v_from_e(A,e,i,j)
println("$(abs(v[j,i])^2) $(vfrome )")
end
end
A = rand(10,10)
A = A'*A
e,v = eigen(A)
n,n = size(A)
for j=1:n
for i=1:n
vfrome = make_v_from_e(A,e,i,j)
println("$(abs(v[j,i])^2) $(vfrome )")
end
end
end
main()
二つの行列で試してみましたが、確かにそうなっています。面白いですね。