ランダム行列の固有値


ほー「ランダム行列の固有値のほうは、お互いにあまり近づきたくない様子がみてとれて、結果的に無作為な点より等間隔に並んでいるように見えるのです。」 Now Browsing:『素数に憑かれた人たち』 | TETRA'S MATH http://bit.ly/JDEz0Z
(https://twitter.com/#!/utatakiyoshi/status/194800793570906113)

について,実験してみました.

4,000個の32*32ランダム行列を作って固有値を求め,その間隔をヒストグラムにします.
結果はこのとおり.
f:id:utata_kiyoshi:20120425214232p:image:w360

比較用に,(-15~15の一様乱数を32個とってきたものの間隔たち)*4000回分 もヒストグラムにしてみました.
f:id:utata_kiyoshi:20120425214606p:image:w360
一様分布の間隔はたぶん指数分布だと思います(ちゃんと示してない).0付近の頻度が一番多い.
対して,ランダム行列の方は0付近で明らかに下がっています.確かにより等間隔に近そう.

ネタ元リンクにはゼータ関数とかの話が載ってますが,僕はよく知らないのでパス.


以下ソースコードです.
いま個人的に流行っているR言語を使ってみました.
逆にR言語を使いたかったがために実験してみた,という感じ.
正規分布に従う乱数がrnorm(個数,平均,標準偏差)で生成できるとか,
ヒストグラムがhist(リスト)で書けたりして大変楽しい.

#ランダム行列の固有値の間隔
result<-c()
for(case in 1:4000){
msize <- 32

#32*32のランダムなエルミート行列を作る
rmtrx <- matrix(rnorm(msize*msize,0,1),msize,msize) 
imtrx <- matrix(rnorm(msize*msize,0,1),msize,msize)
rmtrx[lower.tri(rmtrx)]<-0 
imtrx[lower.tri(imtrx,diag=TRUE)]<-0
mtrx <- rmtrx + 1i * imtrx
mtrx <- mtrx + Conj(t(mtrx))

#固有値を求め,間隔をresultに追加する
res <- Re(eigen(mtrx)$values)
result<-append(result,diff(sort(res)))
}
#4000回分をヒストグラムに表示
hist(result,breaks=seq(0,10,by=0.2))
#一様分布の間隔
result<-c()
for(case in 1:4000)
{
msize <- 32

#-15~15の一様乱数から32個取り,間隔をresultに追加
res<-sort(runif(msize,-15,15))
result<-append(result,diff(res))
}
#4000回分をヒストグラムに表示
hist(result,breaks=seq(0,10,by=0.2))