Created
December 27, 2016 19:32
-
-
Save ultimatile/4cf3f0956f40ddaaae68c07f4d42211f to your computer and use it in GitHub Desktop.
for文を殺したい
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#密度(spin)相関函数を計算してFourier変換するプログラム | |
''' | |
sitesize,elecsize,basissizeはint型のparameterで | |
basisseqは演算子の行列表示を作るのに使う基底の列で | |
たとえば4siteで | |
1234←siteindex | |
↑ ↓ ←電子の状態 | |
を配列として(配列の行indexがsite index) | |
np.array( | |
[[1,0,0,0],←upspinがあるところが1 | |
[0,0,1,0]]←downspinがあるところが1 | |
)として表現してこれを取りうる基底をまとめたもの(大きさはbasisize*2*sitesize). | |
gsvecは基底状態の実数値成分を持つ固有ベクトルでbaissizeの次元. | |
''' | |
import numpy as np | |
from scipy.fftpack import fft,ifft | |
def CalCorFFT(sitesize,elecsize,basisseq,basissize,gsvec): | |
numupseq=np.array([np.diag(basisseq.reshape(basissize,2*sitesize)[:,n]) for n in range(sitesize)]) | |
numdownseq=np.array([np.diag(basisseq.reshape(basissize,2*sitesize)[:,n+sitesize]) for n in range(sitesize)]) | |
sumspin=numupseq+numdownseq | |
densitycor=sumspin-(elecsize/sitesize)*np.tile(np.identity(basissize),(sitesize,1,1)) | |
spincor=(numupseq-numdownseq)/2 | |
nmq=np.array([fft(densitycor,sitesize,axis=0)[q]@gsvec for q in range(sitesize)]) | |
smq=np.array([fft(spincor,sitesize,axis=0)[q]@gsvec for q in range(sitesize)]) | |
nq=np.array([ifft(densitycor,sitesize,axis=0)[q]@gsvec for q in range(sitesize)]) | |
sq=np.array([ifft(spincor,sitesize,axis=0)[q]@gsvec for q in range(sitesize)]) | |
ftd=np.array([nmq[i]@nq[i] for i in range(sitesize)]) | |
fts=np.array([smq[i]@sq[i] for i in range(sitesize)]) | |
return ftd,fts | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment