質問編集履歴
15
編集
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
数値計算の問題点がわからない
|
body
CHANGED
@@ -4,10 +4,6 @@
|
|
4
4
|

|
5
5
|
[該当論文](https://arxiv.org/abs/1010.4705)
|
6
6
|
ちなみに理解しているつもりなんですが、全くできません。コードもエラーなしで動くのですが、、、(ということは何かがわかっていないということなのですが)
|
7
|
-
要点は初期状態が等しい重ね合わせ状態であることと、メイン計算は欲しいい点の確率振幅にマイナスを毎回かけながらすべての格子点に拡散行列とフリップフロップシフトというシフトの仕方が必要なようです。
|
8
|
-
### イメージ図
|
9
|
-

|
10
|
-
上の図は3×③の正方格子点を表しており、赤い点がマーキングされた点です(マーキングされた点は任意です)。欲しい結果にある結果は190番目の格子点にマーキングをした20×20の正方格子の結果です。
|
11
7
|
```
|
12
8
|
#main calculation
|
13
9
|
for t in range(itr):
|
14
内容変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -17,11 +17,6 @@
|
|
17
17
|
for i in itertools.product(x_list,y_list):
|
18
18
|
x = i[0]
|
19
19
|
y = i[1]
|
20
|
-
#boundary condition
|
21
|
-
x0 = (x+1) % N
|
22
|
-
x1 = (x-1 + N) % N
|
23
|
-
y0 = (y+1) % N
|
24
|
-
y1 = (y-1) % N
|
25
20
|
next_psi[x,y] = np.copy(np.array(np.dot(right,psi[x1,y])+np.dot(down,psi[x,y0])+np.dot(left,psi[x0,y])+ np.dot(up,psi[x,y1])))
|
26
21
|
psi = np.copy(next_psi)
|
27
22
|
#print(t,psi)
|
13
内容変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -3,42 +3,18 @@
|
|
3
3
|
### 欲しい結果
|
4
4
|

|
5
5
|
[該当論文](https://arxiv.org/abs/1010.4705)
|
6
|
-
[参考論文2](https://arxiv.org/abs/1203.3950)
|
7
|
-
[参考論文](https://arxiv.org/abs/1005.3676)
|
8
6
|
ちなみに理解しているつもりなんですが、全くできません。コードもエラーなしで動くのですが、、、(ということは何かがわかっていないということなのですが)
|
9
7
|
要点は初期状態が等しい重ね合わせ状態であることと、メイン計算は欲しいい点の確率振幅にマイナスを毎回かけながらすべての格子点に拡散行列とフリップフロップシフトというシフトの仕方が必要なようです。
|
10
8
|
### イメージ図
|
11
9
|

|
12
10
|
上の図は3×③の正方格子点を表しており、赤い点がマーキングされた点です(マーキングされた点は任意です)。欲しい結果にある結果は190番目の格子点にマーキングをした20×20の正方格子の結果です。
|
13
|
-
### 実行してみた
|
14
|
-
```
|
11
|
+
```
|
15
|
-
|
12
|
+
#main calculation
|
16
|
-
import matplotlib.pyplot as plt
|
17
|
-
import itertools
|
18
|
-
N = 20 #0<=x,y<=N
|
19
|
-
d = 4 #フリップフロップシフトの移動方向(4方向(4状態ともいう))
|
20
|
-
itr =100
|
21
|
-
#拡散行列
|
22
|
-
C = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]])/2
|
23
|
-
x_list = [i for i in range(N)]
|
24
|
-
y_list = [i for i in range(N)]
|
25
|
-
time = [i for i in range(itr)]
|
26
|
-
#フリップフロップシフトに場合分け(ここが怪しい?)
|
27
|
-
#right =[1,0,0,0],down=[0,1,0,0],left=[0,0,1,0],up=[0,0,0,1]
|
28
|
-
right= np.zeros((4,4));right[2,:] = C[2,:] #stage[x,y][0]
|
29
|
-
down = np.zeros((4,4));down[3,:] = C[3,:] #stage[x,y][1]
|
30
|
-
left = np.zeros((4,4));left[0,:] = C[0,:] #stage[x,y][2]
|
31
|
-
up = np.zeros((4,4));up[1,:] = C[1,:] #stage[x,y][3]にそれぞれ作用させる
|
32
|
-
#初期状態
|
33
|
-
psi = np.ones((N,N,4),dtype="float")/np.sqrt(N*N*4)
|
34
|
-
prob =[]
|
35
13
|
for t in range(itr):
|
36
14
|
if t == 0:
|
37
15
|
pass
|
38
16
|
else:
|
39
|
-
next_psi = np.zeros((N,N,4),dtype="float") #t+1秒後のpsiを収納する
|
40
|
-
psi[2,2] *= -1 #マーキング
|
41
|
-
for i in itertools.product(x_list,y_list):
|
17
|
+
for i in itertools.product(x_list,y_list):
|
42
18
|
x = i[0]
|
43
19
|
y = i[1]
|
44
20
|
#boundary condition
|
@@ -49,10 +25,9 @@
|
|
49
25
|
next_psi[x,y] = np.copy(np.array(np.dot(right,psi[x1,y])+np.dot(down,psi[x,y0])+np.dot(left,psi[x0,y])+ np.dot(up,psi[x,y1])))
|
50
26
|
psi = np.copy(next_psi)
|
51
27
|
#print(t,psi)
|
28
|
+
mark_prob.append(np.inner(psi[8,8],psi[8,8]))
|
52
|
-
prob.append(np.inner(psi[
|
29
|
+
prob.append(np.inner(psi[16,16],psi[16,16]))
|
53
|
-
plt.plot(time,prob)
|
54
|
-
plt.show()
|
55
30
|
```
|
31
|
+
### 実行してみた
|
56
32
|

|
57
|
-
こんなへんちくりんな結果になります。
|
33
|
+
こんなへんちくりんな結果になります。
|
58
|
-
どこが悪いのかわかりません!! 教えてくれる人も周りにいません。。。ご教授のほどよろしくお願い致します。
|
12
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -15,9 +15,9 @@
|
|
15
15
|
import numpy as np
|
16
16
|
import matplotlib.pyplot as plt
|
17
17
|
import itertools
|
18
|
-
N = 20
|
18
|
+
N = 20 #0<=x,y<=N
|
19
|
-
d = 4
|
19
|
+
d = 4 #フリップフロップシフトの移動方向(4方向(4状態ともいう))
|
20
|
-
itr =100
|
20
|
+
itr =100
|
21
21
|
#拡散行列
|
22
22
|
C = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]])/2
|
23
23
|
x_list = [i for i in range(N)]
|
11
内容変更
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
この論文の結果を再現できる方いらっしゃいますか
|
body
CHANGED
@@ -1,105 +1,58 @@
|
|
1
|
-
### 目的
|
2
|
-
20×20の正方格子上のマークされた一つの座標をグローバーアルゴリズム(量子アルゴリズムの一つ)と周期境界条件をつかって時間ごとの存在確率を見る
|
3
1
|
### 問題点
|
4
|
-
|
2
|
+
論文の結果が再現できない
|
5
|
-
_________________________________________________
|
6
3
|
### 欲しい結果
|
7
|
-
![
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
#
|
17
|
-
C = [[-1,2,2],[2,-1,2],[2,2,-1]]/3
|
18
|
-
各方向への重み
|
19
|
-
|0>=1/3*(-|0>+2|1>+2|2>)
|
20
|
-
|1>=1/3*(2|0>-|1>+2|2>)
|
21
|
-
|2>=1/3*(2|0>+2|1>-|2>)
|
22
|
-
これを上に代入すると、
|
23
|
-
Phi(t=1) = 1/np.sqrt(2**3*3)*(|000>(|0>+|1>+|2>) + |001>(|0>+|1>+|2>) + |010>(|0>+|1>+|2>) - |100>(|0>+|1>+|2>) + |011>(|0>+|1>+|2>) + |101>(|0>+|1>+|2>) + |110>(|0>+|1>+|2>) + |111>(|0>+|1>+|2>))
|
24
|
-
#Shift
|
25
|
-
|000>|0> → |001>|0>
|
26
|
-
|000>|1> → |010>|1>
|
27
|
-
|000>|2> → |100>|2>
|
28
|
-
とすると、
|
29
|
-
Phi(t=1) = 1/np.sqrt(2**3*3)*(|000>(|0>+|1>+|2>) + |001>(|0>+|1>+|2>) + |010>(|0>+|1>+|2>) - |100>(|0>+|1>+|2>) + |011>(|0>+|1>-|2>) + |101>(-|0>+|1>+|2>) + |110>(|0>-|1>+|2>) + |111>(|0>+|1>+|2>))
|
30
|
-
同様に繰り返すと、
|
31
|
-
phi(t=2) = 1/3*np.sqrt(2**3*3)*(|000>(3|0>+3|1>-3|2>) + |001>(-|0>+3|1>-2|2>) + |010>(3|0>-|1>-2|2>) - |100>(5|0>+5|1>+5|2>) + |011>(3|0>+3|1>+3|2>) + |101>(-3|0>+3|1>+3|2>) + |110>(3|0>-3|1>+3|2>) + |111>(-|0>-|1>+3|2>))
|
32
|
-
と、マーキングした|100>が増幅されていることがわかります。
|
33
|
-
```
|
34
|
-
これを2次元格子且つ、4方向の20*20で考えた場合上の欲しい結果と一致しません。
|
4
|
+

|
5
|
+
[該当論文](https://arxiv.org/abs/1010.4705)
|
6
|
+
[参考論文2](https://arxiv.org/abs/1203.3950)
|
7
|
+
[参考論文](https://arxiv.org/abs/1005.3676)
|
8
|
+
ちなみに理解しているつもりなんですが、全くできません。コードもエラーなしで動くのですが、、、(ということは何かがわかっていないということなのですが)
|
9
|
+
要点は初期状態が等しい重ね合わせ状態であることと、メイン計算は欲しいい点の確率振幅にマイナスを毎回かけながらすべての格子点に拡散行列とフリップフロップシフトというシフトの仕方が必要なようです。
|
10
|
+
### イメージ図
|
11
|
+

|
12
|
+
上の図は3×③の正方格子点を表しており、赤い点がマーキングされた点です(マーキングされた点は任意です)。欲しい結果にある結果は190番目の格子点にマーキングをした20×20の正方格子の結果です。
|
13
|
+
### 実行してみた
|
35
14
|
```python
|
36
15
|
import numpy as np
|
37
16
|
import matplotlib.pyplot as plt
|
38
17
|
import itertools
|
39
|
-
##################
|
40
|
-
|
18
|
+
N = 20
|
41
|
-
|
19
|
+
d = 4
|
42
|
-
|
20
|
+
itr =100
|
43
|
-
x_list = [i for i in range(0,2*n)]
|
44
|
-
y_list = [i for i in range(0,2*n)]
|
45
|
-
t_list = [i for i in range(0,step+1)]
|
46
|
-
|
21
|
+
#拡散行列
|
47
|
-
####################
|
48
|
-
|
22
|
+
C = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]])/2
|
23
|
+
x_list = [i for i in range(N)]
|
24
|
+
y_list = [i for i in range(N)]
|
25
|
+
time = [i for i in range(itr)]
|
26
|
+
#フリップフロップシフトに場合分け(ここが怪しい?)
|
27
|
+
#right =[1,0,0,0],down=[0,1,0,0],left=[0,0,1,0],up=[0,0,0,1]
|
28
|
+
right= np.zeros((4,4));right[2,:] = C[2,:] #stage[x,y][0]
|
29
|
+
down = np.zeros((4,4));down[3,:] = C[3,:] #stage[x,y][1]
|
49
|
-
|
30
|
+
left = np.zeros((4,4));left[0,:] = C[0,:] #stage[x,y][2]
|
50
|
-
|
31
|
+
up = np.zeros((4,4));up[1,:] = C[1,:] #stage[x,y][3]にそれぞれ作用させる
|
51
|
-
R = np.zeros((4,4)); R[2,:] = G[2,:]
|
52
|
-
S = np.zeros((4,4)); S[3,:] = G[3,:]
|
53
|
-
####################
|
54
|
-
O = np.array([[1,-1,-1,-1],[-1,1,-1,-1],[-1,-1,1,-1],[-1,-1,-1,1]]) / 2
|
55
|
-
p = np.zeros((4,4)); p[0,:] = O[0,:]
|
56
|
-
q = np.zeros((4,4)); q[1,:] = O[1,:]
|
57
|
-
r = np.zeros((4,4)); r[2,:] = O[2,:]
|
58
|
-
s = np.zeros((4,4)); s[3,:] = O[3,:]
|
59
|
-
###############
|
60
|
-
#
|
32
|
+
#初期状態
|
61
|
-
#initphi
|
62
|
-
|
33
|
+
psi = np.ones((N,N,4),dtype="float")/np.sqrt(N*N*4)
|
63
|
-
|
34
|
+
prob =[]
|
64
|
-
next_phi_map = np.zeros((2*n, 2*n,4),dtype="complex")
|
65
|
-
######################
|
66
|
-
for t in range(
|
35
|
+
for t in range(itr):
|
67
36
|
if t == 0:
|
68
37
|
pass
|
69
38
|
else:
|
39
|
+
next_psi = np.zeros((N,N,4),dtype="float") #t+1秒後のpsiを収納する
|
40
|
+
psi[2,2] *= -1 #マーキング
|
70
|
-
for i in itertools.product(x_list,y_list):
|
41
|
+
for i in itertools.product(x_list,y_list): #すべての格子点で計算
|
71
|
-
|
72
42
|
x = i[0]
|
73
43
|
y = i[1]
|
74
|
-
#q
|
75
|
-
|
44
|
+
#boundary condition
|
76
|
-
#p
|
77
|
-
|
45
|
+
x0 = (x+1) % N
|
78
|
-
#s
|
79
|
-
|
46
|
+
x1 = (x-1 + N) % N
|
80
|
-
#r
|
81
|
-
|
47
|
+
y0 = (y+1) % N
|
82
|
-
|
83
|
-
|
48
|
+
y1 = (y-1) % N
|
84
|
-
|
49
|
+
next_psi[x,y] = np.copy(np.array(np.dot(right,psi[x1,y])+np.dot(down,psi[x,y0])+np.dot(left,psi[x0,y])+ np.dot(up,psi[x,y1])))
|
85
|
-
else:
|
86
|
-
next_phi_map[i] = np.copy(np.array([np.dot(P, phi_map[x2,y]) + np.dot(Q, phi_map[x1,y]) + np.dot(R, phi_map[x,y2])+ np.dot(S, phi_map[x,y1])]))
|
87
|
-
#p_map[i] = np.real(np.vdot(next_phi_map[i], next_phi_map[i]))
|
88
|
-
|
50
|
+
psi = np.copy(next_psi)
|
89
|
-
print(t,
|
51
|
+
#print(t,psi)
|
90
|
-
|
52
|
+
prob.append(np.inner(psi[2,2],psi[2,2]))
|
91
|
-
########
|
92
|
-
plt.xlabel("t",fontsize="24")
|
93
|
-
plt.ylabel("probability",fontsize="24")
|
94
|
-
plt.plot(t_list,p_list,color="red",label="quantum walk",linewidth="1")
|
95
|
-
plt.legend(title="markedvertexprobablity",loc="best",fontsize=10)
|
96
|
-
plt.
|
53
|
+
plt.plot(time,prob)
|
97
54
|
plt.show()
|
98
|
-
|
99
55
|
```
|
100
|
-

|
57
|
+
こんなへんちくりんな結果になります。
|
101
|
-
ど
|
58
|
+
どこが悪いのかわかりません!! 教えてくれる人も周りにいません。。。ご教授のほどよろしくお願い致します。
|
102
|
-
個人ごとですが、結構困っています。宜しくお願い致します。。
|
103
|
-
この質問はstackoverflowでもすることにします。
|
104
|
-
これはほぼ諦め状態です。(なんでできないのかわからないです。。)
|
105
|
-

|
10
追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -100,4 +100,6 @@
|
|
100
100
|

|
101
101
|
どなたか、上記の理想結果を実装できる方、または量子情報に詳しい方がいらっしゃいましたら、是非ご教授下さい。。
|
102
102
|
個人ごとですが、結構困っています。宜しくお願い致します。。
|
103
|
-
この質問はstackoverflowでもすることにします。
|
103
|
+
この質問はstackoverflowでもすることにします。
|
104
|
+
これはほぼ諦め状態です。(なんでできないのかわからないです。。)
|
105
|
+

|
9
追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -99,4 +99,5 @@
|
|
99
99
|
```
|
100
100
|

|
101
101
|
どなたか、上記の理想結果を実装できる方、または量子情報に詳しい方がいらっしゃいましたら、是非ご教授下さい。。
|
102
|
-
個人ごとですが、結構困っています。宜しくお願い致します。。
|
102
|
+
個人ごとですが、結構困っています。宜しくお願い致します。。
|
103
|
+
この質問はstackoverflowでもすることにします。
|
8
内容変更
title
CHANGED
File without changes
|
body
CHANGED
@@ -1,90 +1,93 @@
|
|
1
1
|
### 目的
|
2
2
|
20×20の正方格子上のマークされた一つの座標をグローバーアルゴリズム(量子アルゴリズムの一つ)と周期境界条件をつかって時間ごとの存在確率を見る
|
3
3
|
### 問題点
|
4
|
-
|
4
|
+
やり方をわかっているつもりだが、以下の結果が得られない。
|
5
|
-
###参考にした試料
|
6
|
-
もっと詳細に知りたい方は、以下の論文の3章を参考にしていただきますようお願い致します。
|
7
|
-
[Spatial search using the discrete time quantum walk](https://www.arxiv-vanity.com/papers/1010.4705/)
|
8
|
-
### グローバーアルゴリズムとは
|
9
|
-
以下にグローバーアルゴリズムの流れをポストします。
|
10
|
-
______________________________________________
|
11
|
-

|
12
|
-
初期状態については、格子内の全ての可能なサイトを均等に重ね合わせて量子歩行者を開始し、すべての方向を等しく重ね合わせる。
|
13
5
|
_________________________________________________
|
14
|
-
初期値は原点に[1000]をもっていき、それ以外は[0000]とします。
|
15
6
|
### 欲しい結果
|
16
|
-

|
8
|
+
### 3次元立方体の量子ウォークを用いたグローバー探索の場合
|
9
|
+

|
10
|
+
上記の図の|100>の解をマーキングしてその確率を見たい場合、グローバーアルゴリズムのやり方にのっとると、
|
11
|
+
```
|
12
|
+
initial_Phi = 1/np.sqrt(2**3*3)*(|000>(|0>+|1>+|2>) + |001>(|0>+|1>+|2>) + |010>(|0>+|1>+|2>) + |100>(|0>+|1>+|2>) + |011>(|0>+|1>+|2>) + |101>(|0>+|1>+|2>) + |110>(|0>+|1>+|2>) + |111>(|0>+|1>+|2>))
|
13
|
+
となり、欲しい解をマーキング→コイン演算子→シフト演算子をtstep繰り返します。今は2回繰り返すと、
|
14
|
+
#marking
|
15
|
+
Phi(t=1) = 1/np.sqrt(2**3*3)*(|000>(|0>+|1>+|2>) + |001>(|0>+|1>+|2>) + |010>(|0>+|1>+|2>) - |100>(|0>+|1>+|2>) + |011>(|0>+|1>+|2>) + |101>(|0>+|1>+|2>) + |110>(|0>+|1>+|2>) + |111>(|0>+|1>+|2>))
|
16
|
+
#coin
|
17
|
+
C = [[-1,2,2],[2,-1,2],[2,2,-1]]/3
|
18
|
+
各方向への重み
|
19
|
+
|0>=1/3*(-|0>+2|1>+2|2>)
|
20
|
+
|1>=1/3*(2|0>-|1>+2|2>)
|
21
|
+
|2>=1/3*(2|0>+2|1>-|2>)
|
22
|
+
これを上に代入すると、
|
23
|
+
Phi(t=1) = 1/np.sqrt(2**3*3)*(|000>(|0>+|1>+|2>) + |001>(|0>+|1>+|2>) + |010>(|0>+|1>+|2>) - |100>(|0>+|1>+|2>) + |011>(|0>+|1>+|2>) + |101>(|0>+|1>+|2>) + |110>(|0>+|1>+|2>) + |111>(|0>+|1>+|2>))
|
24
|
+
#Shift
|
25
|
+
|000>|0> → |001>|0>
|
26
|
+
|000>|1> → |010>|1>
|
27
|
+
|000>|2> → |100>|2>
|
28
|
+
とすると、
|
29
|
+
Phi(t=1) = 1/np.sqrt(2**3*3)*(|000>(|0>+|1>+|2>) + |001>(|0>+|1>+|2>) + |010>(|0>+|1>+|2>) - |100>(|0>+|1>+|2>) + |011>(|0>+|1>-|2>) + |101>(-|0>+|1>+|2>) + |110>(|0>-|1>+|2>) + |111>(|0>+|1>+|2>))
|
30
|
+
同様に繰り返すと、
|
31
|
+
phi(t=2) = 1/3*np.sqrt(2**3*3)*(|000>(3|0>+3|1>-3|2>) + |001>(-|0>+3|1>-2|2>) + |010>(3|0>-|1>-2|2>) - |100>(5|0>+5|1>+5|2>) + |011>(3|0>+3|1>+3|2>) + |101>(-3|0>+3|1>+3|2>) + |110>(3|0>-3|1>+3|2>) + |111>(-|0>-|1>+3|2>))
|
32
|
+
と、マーキングした|100>が増幅されていることがわかります。
|
33
|
+
```
|
34
|
+
これを2次元格子且つ、4方向の20*20で考えた場合上の欲しい結果と一致しません。
|
28
35
|
```python
|
29
36
|
import numpy as np
|
30
37
|
import matplotlib.pyplot as plt
|
31
38
|
import itertools
|
32
39
|
##################
|
33
40
|
n = 10
|
34
|
-
N =
|
41
|
+
N = (2*n)**2
|
35
|
-
step =
|
42
|
+
step = 100
|
36
|
-
x_list = [i for i in range(0,2*n
|
43
|
+
x_list = [i for i in range(0,2*n)]
|
37
|
-
y_list = [i for i in range(0,2*n
|
44
|
+
y_list = [i for i in range(0,2*n)]
|
38
45
|
t_list = [i for i in range(0,step+1)]
|
39
46
|
p_list = []
|
40
47
|
####################
|
41
48
|
G = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]]) / 2
|
42
|
-
P = np.zeros((4,4)); P[
|
49
|
+
P = np.zeros((4,4)); P[0,:] = G[0,:]
|
43
|
-
Q = np.zeros((4,4)); Q[
|
50
|
+
Q = np.zeros((4,4)); Q[1,:] = G[1,:]
|
44
51
|
R = np.zeros((4,4)); R[2,:] = G[2,:]
|
45
52
|
S = np.zeros((4,4)); S[3,:] = G[3,:]
|
46
53
|
####################
|
47
54
|
O = np.array([[1,-1,-1,-1],[-1,1,-1,-1],[-1,-1,1,-1],[-1,-1,-1,1]]) / 2
|
48
|
-
p = np.zeros((4,4)); p[
|
55
|
+
p = np.zeros((4,4)); p[0,:] = O[0,:]
|
49
|
-
q = np.zeros((4,4)); q[
|
56
|
+
q = np.zeros((4,4)); q[1,:] = O[1,:]
|
50
57
|
r = np.zeros((4,4)); r[2,:] = O[2,:]
|
51
58
|
s = np.zeros((4,4)); s[3,:] = O[3,:]
|
52
59
|
###############
|
53
|
-
###
|
60
|
+
###初期設定
|
61
|
+
#initphi
|
54
|
-
phi_map = np.
|
62
|
+
phi_map = np.ones((2*n, 2*n,4),dtype="complex")
|
55
|
-
phi_map
|
63
|
+
phi_map /= np.sqrt(4*N)
|
56
|
-
#####初期確率
|
57
|
-
next_phi_map = np.zeros((2*n
|
64
|
+
next_phi_map = np.zeros((2*n, 2*n,4),dtype="complex")
|
58
|
-
p_map = np.zeros([2*n+1,2*n+1])
|
59
|
-
p_map[0,0] = 1.0
|
60
65
|
######################
|
61
66
|
for t in range(0,step+1):
|
62
67
|
if t == 0:
|
63
68
|
pass
|
64
69
|
else:
|
65
70
|
for i in itertools.product(x_list,y_list):
|
71
|
+
|
66
72
|
x = i[0]
|
67
73
|
y = i[1]
|
68
|
-
#
|
74
|
+
#q
|
69
|
-
x1 = (x-1 + 2*n
|
75
|
+
x1 = (x-1 + 2*n) % (2*n)
|
76
|
+
#p
|
70
|
-
x2 = (x+1) % (2*n
|
77
|
+
x2 = (x+1) % (2*n)
|
78
|
+
#s
|
71
|
-
y1 = (y-1 + 2*n
|
79
|
+
y1 = (y-1 + 2*n) % (2*n)
|
80
|
+
#r
|
72
|
-
y2 = (y+1) % (2*n
|
81
|
+
y2 = (y+1) % (2*n)
|
73
|
-
|
82
|
+
|
74
83
|
if i == (12,12):
|
75
|
-
next_phi_map[i] = np.array([np.dot(p, phi_map[x2,y]) + np.dot(q, phi_map[x1,y])
|
84
|
+
next_phi_map[i] = np.copy(np.array([np.dot(p, phi_map[x2,y]) + np.dot(q, phi_map[x1,y]) + np.dot(r, phi_map[x,y2])+ np.dot(s, phi_map[x,y1])]))
|
76
|
-
+ np.dot(r, phi_map[x,y2])+ np.dot(s, phi_map[x,y1])
|
77
|
-
#それ以外
|
78
85
|
else:
|
79
|
-
next_phi_map[i] = np.array([np.dot(P, phi_map[x2,y]) + np.dot(Q, phi_map[x1,y])
|
86
|
+
next_phi_map[i] = np.copy(np.array([np.dot(P, phi_map[x2,y]) + np.dot(Q, phi_map[x1,y]) + np.dot(R, phi_map[x,y2])+ np.dot(S, phi_map[x,y1])]))
|
80
|
-
+ np.dot(R, phi_map[x,y2])+ np.dot(S, phi_map[x,y1])])
|
81
|
-
|
82
|
-
p_map[i] = np.real(np.
|
87
|
+
#p_map[i] = np.real(np.vdot(next_phi_map[i], next_phi_map[i]))
|
83
88
|
phi_map = np.copy(next_phi_map)
|
84
|
-
|
89
|
+
print(t, phi_map)
|
85
|
-
|
86
90
|
p_list.append(np.real(np.vdot(phi_map[12,12] , phi_map[12,12])))
|
87
|
-
|
88
91
|
########
|
89
92
|
plt.xlabel("t",fontsize="24")
|
90
93
|
plt.ylabel("probability",fontsize="24")
|
@@ -92,8 +95,8 @@
|
|
92
95
|
plt.legend(title="markedvertexprobablity",loc="best",fontsize=10)
|
93
96
|
plt.tight_layout()
|
94
97
|
plt.show()
|
98
|
+
|
95
99
|
```
|
96
|
-
### 結果
|
97
|
-

|
98
|
-
周期的になりません。。。
|
99
|
-
|
101
|
+
どなたか、上記の理想結果を実装できる方、または量子情報に詳しい方がいらっしゃいましたら、是非ご教授下さい。。
|
102
|
+
個人ごとですが、結構困っています。宜しくお願い致します。。
|
7
修正
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
|
1
|
+
2次元正方格子上のグローバーアルゴリズムがうまくいかない
|
body
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
### 目的
|
2
2
|
20×20の正方格子上のマークされた一つの座標をグローバーアルゴリズム(量子アルゴリズムの一つ)と周期境界条件をつかって時間ごとの存在確率を見る
|
3
3
|
### 問題点
|
4
|
-
|
4
|
+
論文通りの実装が得られない。
|
5
|
-
(2週間以上進歩せず流石に教えて欲しいのですが、専門寄りでかつ、周りで知っている方がいないという理由で質問させて頂きます)
|
6
5
|
###参考にした試料
|
7
6
|
もっと詳細に知りたい方は、以下の論文の3章を参考にしていただきますようお願い致します。
|
8
7
|
[Spatial search using the discrete time quantum walk](https://www.arxiv-vanity.com/papers/1010.4705/)
|
@@ -17,6 +16,14 @@
|
|
17
16
|

|
18
17
|
これは正確な答えではありません、あくまでイメージです。黒い線のような(maxが0.25として)周期をとります。
|
19
18
|
(上の参考文献に正確な欲しい結果が掲載されています。そちらを参考にしていただければ幸いです。)
|
19
|
+
### 追記
|
20
|
+
どうやら、上のコインを作用させた後に、フリップフロップウォークという歩き方でシフト演算子を作用させなければいけなかったみたいです。フリップフロップウォークとは
|
21
|
+
|→>|x,y> → |←>|x+1,y>
|
22
|
+
|←>|x,y> → |→>|x+1,y>
|
23
|
+
|↑>|x,y> → |↓>|x,y+1>
|
24
|
+
|↓>|x,y> → |↑>|x,y-1>
|
25
|
+
のように変化前の内部状態と変化後の内部状態が逆になるように歩かせる必要があります。
|
26
|
+
以下を踏まえて。。。
|
20
27
|
### 実装
|
21
28
|
```python
|
22
29
|
import numpy as np
|
@@ -32,20 +39,20 @@
|
|
32
39
|
p_list = []
|
33
40
|
####################
|
34
41
|
G = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]]) / 2
|
35
|
-
P = np.zeros((4,4)); P[
|
42
|
+
P = np.zeros((4,4)); P[1,:] = G[1,:]
|
36
|
-
Q = np.zeros((4,4)); Q[
|
43
|
+
Q = np.zeros((4,4)); Q[0,:] = G[0,:]
|
37
44
|
R = np.zeros((4,4)); R[2,:] = G[2,:]
|
38
45
|
S = np.zeros((4,4)); S[3,:] = G[3,:]
|
39
46
|
####################
|
40
47
|
O = np.array([[1,-1,-1,-1],[-1,1,-1,-1],[-1,-1,1,-1],[-1,-1,-1,1]]) / 2
|
41
|
-
p = np.zeros((4,4)); p[
|
48
|
+
p = np.zeros((4,4)); p[1,:] = O[1,:]
|
42
|
-
q = np.zeros((4,4)); q[
|
49
|
+
q = np.zeros((4,4)); q[0,:] = O[0,:]
|
43
50
|
r = np.zeros((4,4)); r[2,:] = O[2,:]
|
44
51
|
s = np.zeros((4,4)); s[3,:] = O[3,:]
|
45
52
|
###############
|
46
53
|
###ここの初期設定があやしい
|
47
54
|
phi_map = np.zeros((2*n+1, 2*n+1,4),dtype="complex")
|
48
|
-
phi_map[0,0]= np.array([1,
|
55
|
+
phi_map[0,0]= np.array([1,0,0,0])
|
49
56
|
#####初期確率
|
50
57
|
next_phi_map = np.zeros((2*n+1, 2*n+1,4),dtype="complex")
|
51
58
|
p_map = np.zeros([2*n+1,2*n+1])
|
@@ -64,7 +71,7 @@
|
|
64
71
|
y1 = (y-1 + 2*n+1) % (2*n+1)
|
65
72
|
y2 = (y+1) % (2*n+1)
|
66
73
|
#マーキング
|
67
|
-
if i == (
|
74
|
+
if i == (12,12):
|
68
75
|
next_phi_map[i] = np.array([np.dot(p, phi_map[x2,y]) + np.dot(q, phi_map[x1,y])
|
69
76
|
+ np.dot(r, phi_map[x,y2])+ np.dot(s, phi_map[x,y1])
|
70
77
|
#それ以外
|
@@ -76,7 +83,7 @@
|
|
76
83
|
phi_map = np.copy(next_phi_map)
|
77
84
|
|
78
85
|
|
79
|
-
p_list.append(np.real(np.vdot(phi_map[
|
86
|
+
p_list.append(np.real(np.vdot(phi_map[12,12] , phi_map[12,12])))
|
80
87
|
|
81
88
|
########
|
82
89
|
plt.xlabel("t",fontsize="24")
|
@@ -87,20 +94,6 @@
|
|
87
94
|
plt.show()
|
88
95
|
```
|
89
96
|
### 結果
|
90
|
-

|
91
|
-
上の結果と違いすぎで何がなんだがもうお手上げ状態です。
|
92
|
-
上述した初期状態の取り方の意味がよくわかっていません(参考論文に書いてあるものをgoogle翻訳しました)。
|
93
|
-
前述しましたが、周りにだれも教えてくれない中一人で奮闘している状況です。。どんなことでも良いので、ご意見頂戴したいです。。
|
94
|
-
何卒宜しくお願い致します。
|
95
|
-
|
96
|
-
追記】
|
97
|
-
初期状態において、格子内の全ての可能なサイトに対して等しく重ね合わせると書いてあるので、上のコードの初期状態を
|
98
|
-
```python
|
99
|
-
phi_map = np.ones((2*n+1, 2*n+1,4),dtype="complex")
|
100
|
-
phi_map /= np.linalg.norm(phi_map)
|
101
|
-
#p_map[0,0]=1
|
102
|
-
```
|
103
|
-
と変更してみました。結果は
|
104
|
-

|
105
|
-
|
98
|
+
周期的になりません。。。
|
106
|
-
|
99
|
+
少し専門寄りなのですが、グローバーのアルゴリズム自体は簡単なルールなので、どなたか再現できる方がいらっしゃいましたら、宜しくお願い致します。。
|
6
タグ追加
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|
5
タグ追加
title
CHANGED
File without changes
|
body
CHANGED
File without changes
|
4
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -98,6 +98,7 @@
|
|
98
98
|
```python
|
99
99
|
phi_map = np.ones((2*n+1, 2*n+1,4),dtype="complex")
|
100
100
|
phi_map /= np.linalg.norm(phi_map)
|
101
|
+
#p_map[0,0]=1
|
101
102
|
```
|
102
103
|
と変更してみました。結果は
|
103
104
|

|
3
追記
title
CHANGED
File without changes
|
body
CHANGED
@@ -91,4 +91,15 @@
|
|
91
91
|
上の結果と違いすぎで何がなんだがもうお手上げ状態です。
|
92
92
|
上述した初期状態の取り方の意味がよくわかっていません(参考論文に書いてあるものをgoogle翻訳しました)。
|
93
93
|
前述しましたが、周りにだれも教えてくれない中一人で奮闘している状況です。。どんなことでも良いので、ご意見頂戴したいです。。
|
94
|
-
何卒宜しくお願い致します。
|
94
|
+
何卒宜しくお願い致します。
|
95
|
+
|
96
|
+
追記】
|
97
|
+
初期状態において、格子内の全ての可能なサイトに対して等しく重ね合わせると書いてあるので、上のコードの初期状態を
|
98
|
+
```python
|
99
|
+
phi_map = np.ones((2*n+1, 2*n+1,4),dtype="complex")
|
100
|
+
phi_map /= np.linalg.norm(phi_map)
|
101
|
+
```
|
102
|
+
と変更してみました。結果は
|
103
|
+

|
104
|
+
。。。。。周期的にならない。。
|
105
|
+
本当に、お手上げ状態です。
|
2
欲しい結果を明記しなおした
title
CHANGED
File without changes
|
body
CHANGED
@@ -15,7 +15,8 @@
|
|
15
15
|
初期値は原点に[1000]をもっていき、それ以外は[0000]とします。
|
16
16
|
### 欲しい結果
|
17
17
|

|
18
|
+
これは正確な答えではありません、あくまでイメージです。黒い線のような(maxが0.25として)周期をとります。
|
18
|
-
|
19
|
+
(上の参考文献に正確な欲しい結果が掲載されています。そちらを参考にしていただければ幸いです。)
|
19
20
|
### 実装
|
20
21
|
```python
|
21
22
|
import numpy as np
|
1
情報追加
title
CHANGED
File without changes
|
body
CHANGED
@@ -15,7 +15,7 @@
|
|
15
15
|
初期値は原点に[1000]をもっていき、それ以外は[0000]とします。
|
16
16
|
### 欲しい結果
|
17
17
|

|
18
|
-
これが絶対ではないのですが、黒い線のような周期をとります。
|
18
|
+
これが絶対ではないのですが、黒い線のような周期をとります。(上の参考文献に正確な欲しい結果が掲載されていますお手数ですが、宜しくお願い致します。)
|
19
19
|
### 実装
|
20
20
|
```python
|
21
21
|
import numpy as np
|