質問編集履歴

15

編集

2018/10/20 15:43

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
@@ -1 +1 @@
1
- 論文の結果を再現できる方いっしゃますか
1
+ 数値計算問題点がわか
test CHANGED
@@ -9,14 +9,6 @@
9
9
  [該当論文](https://arxiv.org/abs/1010.4705)
10
10
 
11
11
  ちなみに理解しているつもりなんですが、全くできません。コードもエラーなしで動くのですが、、、(ということは何かがわかっていないということなのですが)
12
-
13
- 要点は初期状態が等しい重ね合わせ状態であることと、メイン計算は欲しいい点の確率振幅にマイナスを毎回かけながらすべての格子点に拡散行列とフリップフロップシフトというシフトの仕方が必要なようです。
14
-
15
- ### イメージ図
16
-
17
- ![正方格子量子探索](7ae71615029fd007225a2f924e5c1e7c.png)
18
-
19
- 上の図は3×③の正方格子点を表しており、赤い点がマーキングされた点です(マーキングされた点は任意です)。欲しい結果にある結果は190番目の格子点にマーキングをした20×20の正方格子の結果です。
20
12
 
21
13
  ```
22
14
 

14

内容変更

2018/10/20 15:43

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
@@ -36,16 +36,6 @@
36
36
 
37
37
  y = i[1]
38
38
 
39
- #boundary condition
40
-
41
- x0 = (x+1) % N
42
-
43
- x1 = (x-1 + N) % N
44
-
45
- y0 = (y+1) % N
46
-
47
- y1 = (y-1) % N
48
-
49
39
  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
40
 
51
41
  psi = np.copy(next_psi)

13

内容変更

2018/10/05 07:14

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
@@ -7,10 +7,6 @@
7
7
  ![20*20の正方格子](7c8308f5057a6e57ebfeea4b0bdf97ee.jpeg)
8
8
 
9
9
  [該当論文](https://arxiv.org/abs/1010.4705)
10
-
11
- [参考論文2](https://arxiv.org/abs/1203.3950)
12
-
13
- [参考論文](https://arxiv.org/abs/1005.3676)
14
10
 
15
11
  ちなみに理解しているつもりなんですが、全くできません。コードもエラーなしで動くのですが、、、(ということは何かがわかっていないということなのですが)
16
12
 
@@ -22,49 +18,9 @@
22
18
 
23
19
  上の図は3×③の正方格子点を表しており、赤い点がマーキングされた点です(マーキングされた点は任意です)。欲しい結果にある結果は190番目の格子点にマーキングをした20×20の正方格子の結果です。
24
20
 
25
- ### 実行してみた
21
+ ```
26
22
 
27
- ```python
28
-
29
- import numpy as np
23
+ #main calculation
30
-
31
- import matplotlib.pyplot as plt
32
-
33
- import itertools
34
-
35
- N = 20 #0<=x,y<=N
36
-
37
- d = 4 #フリップフロップシフトの移動方向(4方向(4状態ともいう))
38
-
39
- itr =100
40
-
41
- #拡散行列
42
-
43
- C = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]])/2
44
-
45
- x_list = [i for i in range(N)]
46
-
47
- y_list = [i for i in range(N)]
48
-
49
- time = [i for i in range(itr)]
50
-
51
- #フリップフロップシフトに場合分け(ここが怪しい?)
52
-
53
- #right =[1,0,0,0],down=[0,1,0,0],left=[0,0,1,0],up=[0,0,0,1]
54
-
55
- right= np.zeros((4,4));right[2,:] = C[2,:] #stage[x,y][0]
56
-
57
- down = np.zeros((4,4));down[3,:] = C[3,:] #stage[x,y][1]
58
-
59
- left = np.zeros((4,4));left[0,:] = C[0,:] #stage[x,y][2]
60
-
61
- up = np.zeros((4,4));up[1,:] = C[1,:] #stage[x,y][3]にそれぞれ作用させる
62
-
63
- #初期状態
64
-
65
- psi = np.ones((N,N,4),dtype="float")/np.sqrt(N*N*4)
66
-
67
- prob =[]
68
24
 
69
25
  for t in range(itr):
70
26
 
@@ -74,11 +30,7 @@
74
30
 
75
31
  else:
76
32
 
77
- next_psi = np.zeros((N,N,4),dtype="float") #t+1秒後のpsiを収納する
78
-
79
- psi[2,2] *= -1 #マーキング
80
-
81
- for i in itertools.product(x_list,y_list): #すべての格子点で計算
33
+ for i in itertools.product(x_list,y_list):
82
34
 
83
35
  x = i[0]
84
36
 
@@ -100,16 +52,14 @@
100
52
 
101
53
  #print(t,psi)
102
54
 
103
- prob.append(np.inner(psi[2,2],psi[2,2]))
55
+ mark_prob.append(np.inner(psi[8,8],psi[8,8]))
104
56
 
105
- plt.plot(time,prob)
57
+ prob.append(np.inner(psi[16,16],psi[16,16]))
106
-
107
- plt.show()
108
58
 
109
59
  ```
60
+
61
+ ### 実行してみた
110
62
 
111
63
  ![イメージ説明](3b192866ddf979e8d53194625f9b8147.png)
112
64
 
113
65
  こんなへんちくりんな結果になります。
114
-
115
- どこが悪いのかわかりません!! 教えてくれる人も周りにいません。。。ご教授のほどよろしくお願い致します。

12

追記

2018/10/02 15:16

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
@@ -32,11 +32,11 @@
32
32
 
33
33
  import itertools
34
34
 
35
- N = 20
35
+ N = 20 #0<=x,y<=N
36
36
 
37
- d = 4
37
+ d = 4 #フリップフロップシフトの移動方向(4方向(4状態ともいう))
38
38
 
39
- itr =100
39
+ itr =100
40
40
 
41
41
  #拡散行列
42
42
 

11

内容変更

2018/10/02 04:49

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
@@ -1 +1 @@
1
- 2次元正格子上のグローバーアルゴリズムがうくいない
1
+ この論文の結果を再現できるいらっしゃい
test CHANGED
@@ -1,70 +1,28 @@
1
- ### 目的
2
-
3
- 20×20の正方格子上のマークされた一つの座標をグローバーアルゴリズム(量子アルゴリズムの一つ)と周期境界条件をつかって時間ごとの存在確率を見る
4
-
5
1
  ### 問題点
6
2
 
7
- やり方をわかっているつもりだが、以下の結果が得られない
3
+ 論文の結果が再現できない
8
-
9
- _________________________________________________
10
4
 
11
5
  ### 欲しい結果
12
6
 
13
- ![イメージ説明](6d24453c3dbd07f5291b0900a8572767.jpeg)
7
+ ![20*20の正方格子](7c8308f5057a6e57ebfeea4b0bdf97ee.jpeg)
14
8
 
15
- ### 3次元立方体の量子ウォークを用いたグローバー探索の場合
9
+ [該当論文](https://arxiv.org/abs/1010.4705)
16
10
 
17
- ![イメージ説明](0407161182184a928d49aa398be7e063.png)
11
+ [参考論文2](https://arxiv.org/abs/1203.3950)
18
12
 
19
- 上記の図の|100>の解をマーキングしてその確率を見たい場合、グローバーアルゴリズムのやり方にのっとると、
13
+ [参考論文](https://arxiv.org/abs/1005.3676)
20
14
 
21
- ```
15
+ ちなみに理解しているつもりなんですが、全くできません。コードもエラーなしで動くのですが、、、(ということは何かがわかっていないということなのですが)
22
16
 
23
- 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>))
17
+ 要点は初期状態が等しい重ね合わせ状態であることと、メイン計算は欲しいい点の確率振幅にマイナスを毎回かけながらすべての格子点に拡散行列とフリップフロップシフトというシフトの仕方が必要なようです。
24
18
 
25
- となり、欲しい解をマキング→コイン演算子→シフト演算子をtstep繰り返します。今は2回繰り返すと、
19
+ ### イメジ図
26
20
 
27
- #marking
21
+ ![正方格子量子探索](7ae71615029fd007225a2f924e5c1e7c.png)
28
22
 
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>))
23
+ 上の図は3×③の正方格子点を表しており、赤い点がマーキングされた点です(マーキングされた点は任意です)。欲しい結果にある結果は190番目の格子点にマーキングをした20×20の正方格子の結果です。
30
24
 
31
- #coin
32
-
33
- C = [[-1,2,2],[2,-1,2],[2,2,-1]]/3
34
-
35
- 各方向への重み
36
-
37
- |0>=1/3*(-|0>+2|1>+2|2>)
38
-
39
- |1>=1/3*(2|0>-|1>+2|2>)
40
-
41
- |2>=1/3*(2|0>+2|1>-|2>)
42
-
43
- これを上に代入すると、
44
-
45
- 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>))
46
-
47
- #Shift
48
-
49
- |000>|0> → |001>|0>
50
-
51
- |000>|1> → |010>|1>
52
-
53
- |000>|2> → |100>|2>
54
-
55
- とすると、
56
-
57
- 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>))
58
-
59
- 同様に繰り返すと、
60
-
61
- 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>))
62
-
63
- と、マーキングした|100>が増幅されていることがわかります。
64
-
65
- ```
66
-
67
- これを2次元格子且つ、4方向の20*20で考えた場合上の欲しい結果と一致しません。
25
+ ### 実行してみた
68
26
 
69
27
  ```python
70
28
 
@@ -74,61 +32,41 @@
74
32
 
75
33
  import itertools
76
34
 
77
- ##################
35
+ N = 20
78
36
 
79
- n = 10
37
+ d = 4
80
38
 
81
- N = (2*n)**2
39
+ itr =100
82
40
 
83
- step = 100
41
+ #拡散行列
84
42
 
85
- x_list = [i for i in range(0,2*n)]
43
+ C = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]])/2
86
44
 
87
- y_list = [i for i in range(0,2*n)]
45
+ x_list = [i for i in range(N)]
88
46
 
89
- t_list = [i for i in range(0,step+1)]
47
+ y_list = [i for i in range(N)]
90
48
 
91
- p_list = []
49
+ time = [i for i in range(itr)]
92
50
 
93
- ####################
51
+ #フリップフロップシフトに場合分け(ここが怪しい?)
94
52
 
95
- G = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]]) / 2
53
+ #right =[1,0,0,0],down=[0,1,0,0],left=[0,0,1,0],up=[0,0,0,1]
96
54
 
97
- P = np.zeros((4,4)); P[0,:] = G[0,:]
55
+ right= np.zeros((4,4));right[2,:] = C[2,:] #stage[x,y][0]
98
56
 
99
- Q = np.zeros((4,4)); Q[1,:] = G[1,:]
57
+ down = np.zeros((4,4));down[3,:] = C[3,:] #stage[x,y][1]
100
58
 
101
- R = np.zeros((4,4)); R[2,:] = G[2,:]
59
+ left = np.zeros((4,4));left[0,:] = C[0,:] #stage[x,y][2]
102
60
 
103
- S = np.zeros((4,4)); S[3,:] = G[3,:]
61
+ up = np.zeros((4,4));up[1,:] = C[1,:] #stage[x,y][3]にそれぞれ作用させる
104
62
 
105
- ####################
63
+ #初期状態
106
64
 
107
- O = np.array([[1,-1,-1,-1],[-1,1,-1,-1],[-1,-1,1,-1],[-1,-1,-1,1]]) / 2
65
+ psi = np.ones((N,N,4),dtype="float")/np.sqrt(N*N*4)
108
66
 
109
- p = np.zeros((4,4)); p[0,:] = O[0,:]
67
+ prob =[]
110
68
 
111
- q = np.zeros((4,4)); q[1,:] = O[1,:]
112
-
113
- r = np.zeros((4,4)); r[2,:] = O[2,:]
114
-
115
- s = np.zeros((4,4)); s[3,:] = O[3,:]
116
-
117
- ###############
118
-
119
- ###初期設定
120
-
121
- #initphi
122
-
123
- phi_map = np.ones((2*n, 2*n,4),dtype="complex")
124
-
125
- phi_map /= np.sqrt(4*N)
126
-
127
- next_phi_map = np.zeros((2*n, 2*n,4),dtype="complex")
128
-
129
- ######################
130
-
131
- for t in range(0,step+1):
69
+ for t in range(itr):
132
70
 
133
71
  if t == 0:
134
72
 
@@ -136,74 +74,42 @@
136
74
 
137
75
  else:
138
76
 
139
- for i in itertools.product(x_list,y_list):
77
+ next_psi = np.zeros((N,N,4),dtype="float") #t+1秒後のpsiを収納する
140
78
 
79
+ psi[2,2] *= -1 #マーキング
141
80
 
81
+ for i in itertools.product(x_list,y_list): #すべての格子点で計算
142
82
 
143
83
  x = i[0]
144
84
 
145
85
  y = i[1]
146
86
 
147
- #q
87
+ #boundary condition
148
88
 
149
- x1 = (x-1 + 2*n) % (2*n)
89
+ x0 = (x+1) % N
150
90
 
151
- #p
91
+ x1 = (x-1 + N) % N
152
92
 
153
- x2 = (x+1) % (2*n)
93
+ y0 = (y+1) % N
154
94
 
155
- #s
95
+ y1 = (y-1) % N
156
96
 
157
- y1 = (y-1 + 2*n) % (2*n)
97
+ 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])))
158
98
 
159
- #r
99
+ psi = np.copy(next_psi)
160
100
 
161
- y2 = (y+1) % (2*n)
101
+ #print(t,psi)
162
102
 
103
+ prob.append(np.inner(psi[2,2],psi[2,2]))
163
104
 
164
-
165
- if i == (12,12):
166
-
167
- 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])]))
168
-
169
- else:
170
-
171
- 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])]))
172
-
173
- #p_map[i] = np.real(np.vdot(next_phi_map[i], next_phi_map[i]))
174
-
175
- phi_map = np.copy(next_phi_map)
176
-
177
- print(t, phi_map)
178
-
179
- p_list.append(np.real(np.vdot(phi_map[12,12] , phi_map[12,12])))
180
-
181
- ########
182
-
183
- plt.xlabel("t",fontsize="24")
184
-
185
- plt.ylabel("probability",fontsize="24")
186
-
187
- plt.plot(t_list,p_list,color="red",label="quantum walk",linewidth="1")
188
-
189
- plt.legend(title="markedvertexprobablity",loc="best",fontsize=10)
190
-
191
- plt.tight_layout()
105
+ plt.plot(time,prob)
192
106
 
193
107
  plt.show()
194
108
 
195
-
196
-
197
109
  ```
198
110
 
199
- ![イメージ説明](c8c4eec927043ae73aca2f61c3548fe2.png)
111
+ ![イメージ説明](3b192866ddf979e8d53194625f9b8147.png)
200
112
 
201
- たか、上記の理想結果を実装できる方、または量子情報詳しい方がいらっしゃいしたら、是非ご教授下さい
113
+ こんへんちくりんな結果になり
202
114
 
203
- 個人ごとです、結構困っていましくお願い致します。
115
+ どこ悪いのかわかりません!! 教えくれる人も周りにいません。。ご教授のほどよろしくお願い致します。
204
-
205
- この質問はstackoverflowでもすることにします。
206
-
207
- これはほぼ諦め状態です。(なんでできないのかわからないです。。)
208
-
209
- ![イメージ説明](f6db0c9b740d730c1e799a23a644bd0c.png)

10

追加

2018/10/02 04:47

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
@@ -203,3 +203,7 @@
203
203
  個人ごとですが、結構困っています。宜しくお願い致します。。
204
204
 
205
205
  この質問はstackoverflowでもすることにします。
206
+
207
+ これはほぼ諦め状態です。(なんでできないのかわからないです。。)
208
+
209
+ ![イメージ説明](f6db0c9b740d730c1e799a23a644bd0c.png)

9

追加

2018/08/31 14:28

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
@@ -201,3 +201,5 @@
201
201
  どなたか、上記の理想結果を実装できる方、または量子情報に詳しい方がいらっしゃいましたら、是非ご教授下さい。。
202
202
 
203
203
  個人ごとですが、結構困っています。宜しくお願い致します。。
204
+
205
+ この質問はstackoverflowでもすることにします。

8

内容変更

2018/08/18 14:44

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
@@ -4,53 +4,67 @@
4
4
 
5
5
  ### 問題点
6
6
 
7
- 論文通りの実装が得られない。
7
+ 方をわかっているつもりだが、以下結果が得られない。
8
-
9
- ###参考にした試料
10
-
11
- もっと詳細に知りたい方は、以下の論文の3章を参考にしていただきますようお願い致します。
12
-
13
- [Spatial search using the discrete time quantum walk](https://www.arxiv-vanity.com/papers/1010.4705/)
14
-
15
- ### グローバーアルゴリズムとは
16
-
17
- 以下にグローバーアルゴリズムの流れをポストします。
18
-
19
- ______________________________________________
20
-
21
- ![イメージ説明](cd8f2c0376cd6947f40c8e6f8874964d.png)
22
-
23
- 初期状態については、格子内の全ての可能なサイトを均等に重ね合わせて量子歩行者を開始し、すべての方向を等しく重ね合わせる。
24
8
 
25
9
  _________________________________________________
26
10
 
27
- 初期値は原点に[1000]をもっていき、それ以外は[0000]とします。
28
-
29
11
  ### 欲しい結果
30
12
 
31
- ![](487303f840156a0634d15a4cedd44ccd.jpeg)
32
-
33
- これは正確な答えではありません、あくまでイメジです。黒ような(maxが0.25として)周期をとります。
34
-
35
- (上の参考文献に正確な欲しい結果が掲載されています。そちらを参考にしていただければ幸いです。)
36
-
37
- ### 追
38
-
39
- どうやら、上のコインを作用させた後に、フリップフロップウォークという歩き方でシフト演算子を作用させなければいけなかったみたいです。フリップフロップウォークとは
40
-
41
- |>|x,y> |>|x+1,y>
42
-
43
- |←>|x,y> |>|x+1,y>
44
-
45
- |↑>|x,y> → |↓>|x,y+1>
46
-
47
- |>|x,y> |>|x,y-1>
48
-
49
- のように変化前の内部状態と変化後の内部状態が逆になるように歩かせる必要があります。
50
-
51
- 以下を踏まえて。。。
52
-
53
- ### 実装
13
+ ![イメージ説明](6d24453c3dbd07f5291b0900a8572767.jpeg)
14
+
15
+ ### 3次元立方体の量子ウォクを用たグローバー探索場合
16
+
17
+ ![イメージ説明](0407161182184a928d49aa398be7e063.png)
18
+
19
+ の図の|100>の解をマーキングしてその確率を見たい場合、グローバーアルゴリズムのやり方にのっとると、
20
+
21
+ ```
22
+
23
+ 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>))
24
+
25
+ となり、欲しい解をマーキングコイン演算子シフト演算子をtstep繰り返します。今は2回繰り返すと、
26
+
27
+ #marking
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
+ #coin
32
+
33
+ C = [[-1,2,2],[2,-1,2],[2,2,-1]]/3
34
+
35
+ 各方向への重み
36
+
37
+ |0>=1/3*(-|0>+2|1>+2|2>)
38
+
39
+ |1>=1/3*(2|0>-|1>+2|2>)
40
+
41
+ |2>=1/3*(2|0>+2|1>-|2>)
42
+
43
+ これを上に代入すると、
44
+
45
+ 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>))
46
+
47
+ #Shift
48
+
49
+ |000>|0> → |001>|0>
50
+
51
+ |000>|1> → |010>|1>
52
+
53
+ |000>|2> → |100>|2>
54
+
55
+ とすると、
56
+
57
+ 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>))
58
+
59
+ 同様に繰り返すと、
60
+
61
+ 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>))
62
+
63
+ と、マーキングした|100>が増幅されていることがわかります。
64
+
65
+ ```
66
+
67
+ これを2次元格子且つ、4方向の20*20で考えた場合上の欲しい結果と一致しません。
54
68
 
55
69
  ```python
56
70
 
@@ -64,13 +78,13 @@
64
78
 
65
79
  n = 10
66
80
 
67
- N = 4*(n**2)
81
+ N = (2*n)**2
68
-
82
+
69
- step = 30
83
+ step = 100
70
-
84
+
71
- x_list = [i for i in range(0,2*n+1)]
85
+ x_list = [i for i in range(0,2*n)]
72
-
86
+
73
- y_list = [i for i in range(0,2*n+1)]
87
+ y_list = [i for i in range(0,2*n)]
74
88
 
75
89
  t_list = [i for i in range(0,step+1)]
76
90
 
@@ -80,9 +94,9 @@
80
94
 
81
95
  G = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]]) / 2
82
96
 
83
- P = np.zeros((4,4)); P[1,:] = G[1,:]
97
+ P = np.zeros((4,4)); P[0,:] = G[0,:]
84
-
98
+
85
- Q = np.zeros((4,4)); Q[0,:] = G[0,:]
99
+ Q = np.zeros((4,4)); Q[1,:] = G[1,:]
86
100
 
87
101
  R = np.zeros((4,4)); R[2,:] = G[2,:]
88
102
 
@@ -92,9 +106,9 @@
92
106
 
93
107
  O = np.array([[1,-1,-1,-1],[-1,1,-1,-1],[-1,-1,1,-1],[-1,-1,-1,1]]) / 2
94
108
 
95
- p = np.zeros((4,4)); p[1,:] = O[1,:]
109
+ p = np.zeros((4,4)); p[0,:] = O[0,:]
96
-
110
+
97
- q = np.zeros((4,4)); q[0,:] = O[0,:]
111
+ q = np.zeros((4,4)); q[1,:] = O[1,:]
98
112
 
99
113
  r = np.zeros((4,4)); r[2,:] = O[2,:]
100
114
 
@@ -102,19 +116,15 @@
102
116
 
103
117
  ###############
104
118
 
105
- ###ここの初期設定があやしい
119
+ ###初期設定
120
+
106
-
121
+ #initphi
122
+
107
- phi_map = np.zeros((2*n+1, 2*n+1,4),dtype="complex")
123
+ phi_map = np.ones((2*n, 2*n,4),dtype="complex")
108
-
124
+
109
- phi_map[0,0]= np.array([1,0,0,0])
125
+ phi_map /= np.sqrt(4*N)
110
-
111
- #####初期確率
126
+
112
-
113
- next_phi_map = np.zeros((2*n+1, 2*n+1,4),dtype="complex")
127
+ next_phi_map = np.zeros((2*n, 2*n,4),dtype="complex")
114
-
115
- p_map = np.zeros([2*n+1,2*n+1])
116
-
117
- p_map[0,0] = 1.0
118
128
 
119
129
  ######################
120
130
 
@@ -128,50 +138,46 @@
128
138
 
129
139
  for i in itertools.product(x_list,y_list):
130
140
 
141
+
142
+
131
143
  x = i[0]
132
144
 
133
145
  y = i[1]
134
146
 
135
- #境界条件
147
+ #q
136
-
148
+
137
- x1 = (x-1 + 2*n+1) % (2*n+1)
149
+ x1 = (x-1 + 2*n) % (2*n)
150
+
138
-
151
+ #p
152
+
139
- x2 = (x+1) % (2*n+1)
153
+ x2 = (x+1) % (2*n)
154
+
140
-
155
+ #s
156
+
141
- y1 = (y-1 + 2*n+1) % (2*n+1)
157
+ y1 = (y-1 + 2*n) % (2*n)
158
+
142
-
159
+ #r
160
+
143
- y2 = (y+1) % (2*n+1)
161
+ y2 = (y+1) % (2*n)
144
-
145
- #マーキング
162
+
163
+
146
164
 
147
165
  if i == (12,12):
148
166
 
149
- next_phi_map[i] = np.array([np.dot(p, phi_map[x2,y]) + np.dot(q, phi_map[x1,y])
167
+ 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])]))
150
-
151
- + np.dot(r, phi_map[x,y2])+ np.dot(s, phi_map[x,y1])
152
-
153
- #それ以外
154
168
 
155
169
  else:
156
170
 
157
- next_phi_map[i] = np.array([np.dot(P, phi_map[x2,y]) + np.dot(Q, phi_map[x1,y])
171
+ 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])]))
158
-
159
- + np.dot(R, phi_map[x,y2])+ np.dot(S, phi_map[x,y1])])
172
+
160
-
161
-
162
-
163
- p_map[i] = np.real(np.inner(next_phi_map[i], np.conj(next_phi_map[i])))
173
+ #p_map[i] = np.real(np.vdot(next_phi_map[i], next_phi_map[i]))
164
174
 
165
175
  phi_map = np.copy(next_phi_map)
166
176
 
167
-
177
+ print(t, phi_map)
168
-
169
-
170
178
 
171
179
  p_list.append(np.real(np.vdot(phi_map[12,12] , phi_map[12,12])))
172
180
 
173
-
174
-
175
181
  ########
176
182
 
177
183
  plt.xlabel("t",fontsize="24")
@@ -186,12 +192,12 @@
186
192
 
187
193
  plt.show()
188
194
 
195
+
196
+
189
197
  ```
190
198
 
191
- ### 結果
192
-
193
- ![イメージ説明](fe190f0f52a7c553b96575f708cc37b9.png)
199
+ ![イメージ説明](c8c4eec927043ae73aca2f61c3548fe2.png)
194
-
195
- 周期的になりません。。。
200
+
196
-
197
- 少し専門寄りなのですが、グローバーのアルゴリズム自体は簡単なルールなので、どなたか再現できる方がいらっしゃいましたら、宜しくお願致します。。
201
+ どなたか、上記の理想結果を実装できる方、または量子情報に詳しい方がいらっしゃいましたら、是非ご教授下さい。。
202
+
203
+ 個人ごとですが、結構困っています。宜しくお願い致します。。

7

修正

2018/08/18 13:42

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
@@ -1 +1 @@
1
- 子アルゴリズム実装していす。本当にどこが悪見当もつかないので助けて欲しいです。
1
+ 2次元正方格上のグローバーアルゴリズムがういかない
test CHANGED
@@ -4,9 +4,7 @@
4
4
 
5
5
  ### 問題点
6
6
 
7
- 本当にどこ悪いのか見当もつかないので助けが欲しいです
7
+ 論文通りの実装得られない
8
-
9
- (2週間以上進歩せず流石に教えて欲しいのですが、専門寄りでかつ、周りで知っている方がいないという理由で質問させて頂きます)
10
8
 
11
9
  ###参考にした試料
12
10
 
@@ -35,6 +33,22 @@
35
33
  これは正確な答えではありません、あくまでイメージです。黒い線のような(maxが0.25として)周期をとります。
36
34
 
37
35
  (上の参考文献に正確な欲しい結果が掲載されています。そちらを参考にしていただければ幸いです。)
36
+
37
+ ### 追記
38
+
39
+ どうやら、上のコインを作用させた後に、フリップフロップウォークという歩き方でシフト演算子を作用させなければいけなかったみたいです。フリップフロップウォークとは
40
+
41
+ |→>|x,y> → |←>|x+1,y>
42
+
43
+ |←>|x,y> → |→>|x+1,y>
44
+
45
+ |↑>|x,y> → |↓>|x,y+1>
46
+
47
+ |↓>|x,y> → |↑>|x,y-1>
48
+
49
+ のように変化前の内部状態と変化後の内部状態が逆になるように歩かせる必要があります。
50
+
51
+ 以下を踏まえて。。。
38
52
 
39
53
  ### 実装
40
54
 
@@ -66,9 +80,9 @@
66
80
 
67
81
  G = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]]) / 2
68
82
 
69
- P = np.zeros((4,4)); P[0,:] = G[0,:]
83
+ P = np.zeros((4,4)); P[1,:] = G[1,:]
70
84
 
71
- Q = np.zeros((4,4)); Q[1,:] = G[1,:]
85
+ Q = np.zeros((4,4)); Q[0,:] = G[0,:]
72
86
 
73
87
  R = np.zeros((4,4)); R[2,:] = G[2,:]
74
88
 
@@ -78,9 +92,9 @@
78
92
 
79
93
  O = np.array([[1,-1,-1,-1],[-1,1,-1,-1],[-1,-1,1,-1],[-1,-1,-1,1]]) / 2
80
94
 
81
- p = np.zeros((4,4)); p[0,:] = O[0,:]
95
+ p = np.zeros((4,4)); p[1,:] = O[1,:]
82
96
 
83
- q = np.zeros((4,4)); q[1,:] = O[1,:]
97
+ q = np.zeros((4,4)); q[0,:] = O[0,:]
84
98
 
85
99
  r = np.zeros((4,4)); r[2,:] = O[2,:]
86
100
 
@@ -92,7 +106,7 @@
92
106
 
93
107
  phi_map = np.zeros((2*n+1, 2*n+1,4),dtype="complex")
94
108
 
95
- phi_map[0,0]= np.array([1,1,-1,-1])/2#/(np.sqrt(4*N))
109
+ phi_map[0,0]= np.array([1,0,0,0])
96
110
 
97
111
  #####初期確率
98
112
 
@@ -130,7 +144,7 @@
130
144
 
131
145
  #マーキング
132
146
 
133
- if i == (8,8):
147
+ if i == (12,12):
134
148
 
135
149
  next_phi_map[i] = np.array([np.dot(p, phi_map[x2,y]) + np.dot(q, phi_map[x1,y])
136
150
 
@@ -154,7 +168,7 @@
154
168
 
155
169
 
156
170
 
157
- p_list.append(np.real(np.vdot(phi_map[8,8] , phi_map[8,8])))
171
+ p_list.append(np.real(np.vdot(phi_map[12,12] , phi_map[12,12])))
158
172
 
159
173
 
160
174
 
@@ -176,36 +190,8 @@
176
190
 
177
191
  ### 結果
178
192
 
179
- ![](d798953e40a861905b167b4282fe6829.png)
193
+ ![イメージ説明](fe190f0f52a7c553b96575f708cc37b9.png)
180
194
 
181
- 上の結果と違いすぎで何がなんだがもうお手上げ状態です
195
+ 周期的にりません。。。
182
196
 
183
- 上述した初期状態の取り方の意味がよくわかっていません(参考論文に書いてあるものをgoogle翻訳しました)。
184
-
185
- 前述ましたが、周りにだれも教えてくれい中一人奮闘している状況です。。ことも良のでご意見頂戴す。。
197
+ 専門寄りなのですが、グローバーのアルゴリズム自体は簡単ルールなのどなたか再現きる方がらっしゃいましたらくお願致します。。
186
-
187
- 何卒宜しくお願い致します。
188
-
189
-
190
-
191
- 追記】
192
-
193
- 初期状態において、格子内の全ての可能なサイトに対して等しく重ね合わせると書いてあるので、上のコードの初期状態を
194
-
195
- ```python
196
-
197
- phi_map = np.ones((2*n+1, 2*n+1,4),dtype="complex")
198
-
199
- phi_map /= np.linalg.norm(phi_map)
200
-
201
- #p_map[0,0]=1
202
-
203
- ```
204
-
205
- と変更してみました。結果は
206
-
207
- ![イメージ説明](b78569dbba646cb0b75ac3c831d3dc2d.png)
208
-
209
- 。。。。。周期的にならない。。
210
-
211
- 本当に、お手上げ状態です。

6

タグ追加

2018/08/12 04:38

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
File without changes

5

タグ追加

2018/08/06 12:37

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
File without changes

4

追記

2018/08/06 09:53

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
@@ -198,6 +198,8 @@
198
198
 
199
199
  phi_map /= np.linalg.norm(phi_map)
200
200
 
201
+ #p_map[0,0]=1
202
+
201
203
  ```
202
204
 
203
205
  と変更してみました。結果は

3

追記

2018/08/04 16:39

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
@@ -185,3 +185,25 @@
185
185
  前述しましたが、周りにだれも教えてくれない中一人で奮闘している状況です。。どんなことでも良いので、ご意見頂戴したいです。。
186
186
 
187
187
  何卒宜しくお願い致します。
188
+
189
+
190
+
191
+ 追記】
192
+
193
+ 初期状態において、格子内の全ての可能なサイトに対して等しく重ね合わせると書いてあるので、上のコードの初期状態を
194
+
195
+ ```python
196
+
197
+ phi_map = np.ones((2*n+1, 2*n+1,4),dtype="complex")
198
+
199
+ phi_map /= np.linalg.norm(phi_map)
200
+
201
+ ```
202
+
203
+ と変更してみました。結果は
204
+
205
+ ![イメージ説明](b78569dbba646cb0b75ac3c831d3dc2d.png)
206
+
207
+ 。。。。。周期的にならない。。
208
+
209
+ 本当に、お手上げ状態です。

2

欲しい結果を明記しなおした

2018/08/04 16:35

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
@@ -32,7 +32,9 @@
32
32
 
33
33
  ![](487303f840156a0634d15a4cedd44ccd.jpeg)
34
34
 
35
+ これは正確な答えではありません、あくまでイメージです。黒い線のような(maxが0.25として)周期をとります。
36
+
35
- これが絶対ではないのですが、黒い線のような周期をとります。(上の参考文献に正確な欲しい結果が掲載されていますお手数ですが、宜くお願致します。)
37
+ (上の参考文献に正確な欲しい結果が掲載されています。そちらを参考にただければ幸いです。)
36
38
 
37
39
  ### 実装
38
40
 

1

情報追加

2018/08/04 13:08

投稿

Fallout_18
Fallout_18

スコア124

test CHANGED
File without changes
test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  ![](487303f840156a0634d15a4cedd44ccd.jpeg)
34
34
 
35
- これが絶対ではないのですが、黒い線のような周期をとります。
35
+ これが絶対ではないのですが、黒い線のような周期をとります。(上の参考文献に正確な欲しい結果が掲載されていますお手数ですが、宜しくお願い致します。)
36
36
 
37
37
  ### 実装
38
38