質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

275閲覧

量子ウォークの別の書き方にチャレンジしており、少してこずっております。。。

Fallout_18

総合スコア124

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/06/11 13:15

編集2018/06/13 12:43

1次元量子ウォークの別の書き方をしています。
設定】
イメージ説明
上のスピンを[1,0],下のスピンは[0,1]とします。まず初期状態[1,0]の内部スピンをquantumcoinといわれるもので変更します。
その計算した内部スピンを上図のように上ならx+1,下はx-1に移動させます。この状態を時間発展させていきたいのですが、少しエラーがでてしまい一日奮闘したのですが、あと一歩のところで、上手くいきません。

python

1import numpy as np 2import matplotlib.pyplot as plt 3import math 4 5n=4 6m=3 7theta=3*(math.pi)/12 8 9phi_list=[] 10init_phi=[] 11new_phi=[] 12 13for i in range(0,2*n+1): 14 a=[0,0] 15 new_phi.append(a) 16 phi_list.append(a) 17 18 19 20#内部自由度をかえるコイン↓ 21def quantumcoin(theta): 22 C = [[np.cos(theta),-np.sin(theta)],[np.sin(theta),np.cos(theta)]] 23 return C 24#print(quantumcoin(3*(math.pi)/12)) 25 26#t=0の時のphi状態 27def initPositionPhi(): 28 phi = [1,0] 29 othersphi=[0,0] 30 for i in range(0,2*n+1): 31 if i == n: 32 init_phi.append(phi) 33 else: 34 init_phi.append(othersphi) 35 return init_phi 36#print(initPositionPhi()) 37 38def CoinOperator(x,new_phi):  #内部自由度を変える処理 39 new_phi[x]=np.dot(quantumcoin(theta),new_phi[x]) 40 return new_phi[x] 41print(CoinOperator(n,initPositionPhi())) 42 43 44#def ShiftOperator(steps,phi):   45for t in range(1,m+1):      #内部自由度を変えた物に合わせて座標を移動(x=nがスタート) 46 #if t==0: #怪しい 47 #initPositionPhi() 48 if t==1: 49 new_phi[n-t][1] = (CoinOperator(n,initPositionPhi()))[1] 50 new_phi[n+t][0] = (CoinOperator(n,initPositionPhi()))[0] 51 print(t,new_phi) 52 else: 53 new_phi[n-t] = (CoinOperator(n-(t-1),new_phi))[1] + (CoinOperator(n-(t+1),new_phi))[0] 54 new_phi[n+t] = (CoinOperator(n+(t-1),new_phi))[0] + (CoinOperator(n+(t+1),new_phi))[1] 55 #print(t,new_phi) 56

結果は

python

1[0.70710678 0.70710678] 21 [[0, 0], [0, 0], [0, 0], [0, 1.0000000000000002], [0, 0], [-0.7071067811865477, 0], [0, 0], [0, 0], [0, 0]] 31 [[0, 0], [0, 0], [0, 0], [0, 1.0000000000000002], [0, 0], [-0.7071067811865477, 0], [0, 0], [0, 0], [0, 0]] 42 [[0, 0], array([0., 0.]), 0.7071067811865477, array([-0.70710678, 0.70710678]), [0, 0], array([-0.5, -0.5]), -0.5000000000000001, array([0., 0.]), [0, 0]] 53 [array([0., 0.]), array([0.5, 0.5]), array([[ 0.5, -0.5], 6 [ 0.5, 0.5]]), array([-0.70710678, 0.70710678]), [0, 0], array([-0.5, -0.5]), array([[-0.35355339, 0.35355339], 7 [-0.35355339, -0.35355339]]), array([-0.35355339, 0.35355339]), array([0., 0.])]

と、結果が少しおかしくなってしまいます。
というのも、内部状態を変えた後の下スピンが反映されません。
式の定義が少しおかしいのかもしれませんが、解決できませんでした。
ご指摘、アドバイスよろしくお願いします。
以下のような答えになります。
R=[1 0],L=[0,1]としています。よろしくお願いします。
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/06/12 11:33 編集

回答する人的には、理想の出力的なものを示していただけると多少協力しやすくなるかもしれません
Fallout_18

2018/06/12 11:34

わかりました、少々お待ちください。
guest

回答1

0

ベストアンサー

位置の移動を行なう時にnew_phiに直接計算結果をいれず,例えばtemp_phiなどのリストに計算結果を入れておき,全ての座標での計算が終わった後にnew_phiを更新する方がバグが少なくなる気がします.
また,[0,0]のリストをつくる時にa=[0,0]を代入してますが,aを定義せず[0,0]を直接入れた方が個人的には安心です(私はリストのコピー時の振る舞いをきちんと追えてないので).

座標を辞書のkeyとして管理するverを書いてみました.辞書であれば新しい座標が増えた時も対応が楽なので,速度が気にならないなら試してみてください.
問題設定を誤解していたら申し訳ありません.
参考になれば幸いです(根本的に間違っていたら申し訳ありません).

コード

python

1import math as m 2import numpy as np 3 4nstep = 4 5theta = m.pi/4 6# States {step:{pos:[R,L]}} 7QStates = {0:{0:[1,0]}} # initial state 8 9# Spinを回転 10def quantumcoin(theta): 11 C = [[np.cos(theta),-np.sin(theta)], 12 [np.sin(theta),np.cos(theta)]] 13 return C 14 15# 状態を確認し,移動させる. 16def movState(temp_state,dotted_state): 17 pos = dotted_state.keys() 18 for s in sorted(pos): 19 for i, pos_ in enumerate([s+1,s-1]): 20 if pos_ not in temp_state: temp_state[pos_]=[0,0] 21 temp_state[pos_][i] += dotted_state[s][i] 22 return temp_state 23 24 25if __name__=="__main__": 26 27 # main loop 28 for s in range(nstep): 29 temp = {} 30 coined = {i:np.dot(quantumcoin(theta),QStates[s][i]) for i in sorted(QStates[s].keys())} 31 QStates[s+1] = movState(temp,coined) 32 33 # 結果を出力 34 print("Step|"+"|".join([str(i) for i in range(-nstep,nstep+1)])) 35 print("---|"+"|".join(["---" for i in range(-nstep,nstep+1)])) 36 for s in sorted(QStates.keys()): 37 text = str(s) 38 for i in range(-nstep,nstep+1): 39 if i in QStates[s]: 40 text += "|({0:.3f}, {1:.3f})".format(QStates[s][i][0],QStates[s][i][1]) 41 else: 42 text += "|(0,0)" 43 print(text) 44

出力結果

Step|-4|-3|-2|-1|0|1|2|3|4 ---|---|---|---|---|---|---|---|---|--- 0|(0,0)|(0,0)|(0,0)|(0,0)|(1.000, 0.000)|(0,0)|(0,0)|(0,0)|(0,0) 1|(0,0)|(0,0)|(0,0)|(0.000, 0.707)|(0,0)|(0.707, 0.000)|(0,0)|(0,0)|(0,0) 2|(0,0)|(0,0)|(0.000, 0.500)|(0,0)|(-0.500, 0.500)|(0,0)|(0.500, 0.000)|(0,0)|(0,0) 3|(0,0)|(0.000, 0.354)|(0,0)|(-0.354, 0.000)|(0,0)|(-0.707, 0.354)|(0,0)|(0.354, 0.000)|(0,0) 4|(0.000, 0.250)|(0,0)|(-0.250, -0.250)|(0,0)|(-0.250, -0.250)|(0,0)|(-0.750, 0.250)|(0,0)|(0.250, 0.000)

投稿2018/06/14 00:28

編集2018/06/14 00:40
winophy

総合スコア41

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Fallout_18

2018/06/14 06:08 編集

ありがとうございます,少しコードが難しいですね(~~'')。 頑張ってみます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問