teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

15

編集

2018/10/20 15:43

投稿

Fallout_18
Fallout_18

スコア124

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

14

内容変更

2018/10/20 15:43

投稿

Fallout_18
Fallout_18

スコア124

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

内容変更

2018/10/05 07:14

投稿

Fallout_18
Fallout_18

スコア124

title CHANGED
File without changes
body CHANGED
@@ -3,42 +3,18 @@
3
3
  ### 欲しい結果
4
4
  ![20*20の正方格子](7c8308f5057a6e57ebfeea4b0bdf97ee.jpeg)
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
  ![正方格子量子探索](7ae71615029fd007225a2f924e5c1e7c.png)
12
10
  上の図は3×③の正方格子点を表しており、赤い点がマーキングされた点です(マーキングされた点は任意です)。欲しい結果にある結果は190番目の格子点にマーキングをした20×20の正方格子の結果です。
13
- ### 実行してみた
14
- ```python
11
+ ```
15
- import numpy as np
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[2,2],psi[2,2]))
29
+ prob.append(np.inner(psi[16,16],psi[16,16]))
53
- plt.plot(time,prob)
54
- plt.show()
55
30
  ```
31
+ ### 実行してみた
56
32
  ![イメージ説明](3b192866ddf979e8d53194625f9b8147.png)
57
- こんなへんちくりんな結果になります。
33
+ こんなへんちくりんな結果になります。
58
- どこが悪いのかわかりません!! 教えてくれる人も周りにいません。。。ご教授のほどよろしくお願い致します。

12

追記

2018/10/02 15:16

投稿

Fallout_18
Fallout_18

スコア124

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

内容変更

2018/10/02 04:49

投稿

Fallout_18
Fallout_18

スコア124

title CHANGED
@@ -1,1 +1,1 @@
1
- 2次元正方格子上グローバーアルゴリズムがうまくかな
1
+ 論文の結果を再現できる方らっしゃますか
body CHANGED
@@ -1,105 +1,58 @@
1
- ### 目的
2
- 20×20の正方格子上のマークされた一つの座標をグローバーアルゴリズム(量子アルゴリズムの一つ)と周期境界条件をつかって時間ごとの存在確率を見る
3
1
  ### 問題点
4
- やり方をわかっているつもりだが、以下の結果が得られない
2
+ 論文の結果が再現できない
5
- _________________________________________________
6
3
  ### 欲しい結果
7
- ![イメージ説明](6d24453c3dbd07f5291b0900a8572767.jpeg)
8
- ### 3次元立方体の量子ウォークを用いたグローバー探索の場合
9
- ![イメージ説明](0407161182184a928d49aa398be7e063.png)
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で考えた場合上の欲しい結果と一致しません。
4
+ ![20*20の正方格子](7c8308f5057a6e57ebfeea4b0bdf97ee.jpeg)
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
+ ![正方格子量子探索](7ae71615029fd007225a2f924e5c1e7c.png)
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
- n = 10
18
+ N = 20
41
- N = (2*n)**2
19
+ d = 4
42
- step = 100
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
- p_list = []
21
+ #拡散行列
47
- ####################
48
- G = np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]]) / 2
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
- P = np.zeros((4,4)); P[0,:] = G[0,:]
30
+ left = np.zeros((4,4));left[0,:] = C[0,:] #stage[x,y][2]
50
- Q = np.zeros((4,4)); Q[1,:] = G[1,:]
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
- phi_map = np.ones((2*n, 2*n,4),dtype="complex")
33
+ psi = np.ones((N,N,4),dtype="float")/np.sqrt(N*N*4)
63
- phi_map /= np.sqrt(4*N)
34
+ prob =[]
64
- next_phi_map = np.zeros((2*n, 2*n,4),dtype="complex")
65
- ######################
66
- for t in range(0,step+1):
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
- x1 = (x-1 + 2*n) % (2*n)
44
+ #boundary condition
76
- #p
77
- x2 = (x+1) % (2*n)
45
+ x0 = (x+1) % N
78
- #s
79
- y1 = (y-1 + 2*n) % (2*n)
46
+ x1 = (x-1 + N) % N
80
- #r
81
- y2 = (y+1) % (2*n)
47
+ y0 = (y+1) % N
82
-
83
- if i == (12,12):
48
+ y1 = (y-1) % N
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])]))
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
- phi_map = np.copy(next_phi_map)
50
+ psi = np.copy(next_psi)
89
- print(t, phi_map)
51
+ #print(t,psi)
90
- p_list.append(np.real(np.vdot(phi_map[12,12] , phi_map[12,12])))
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.tight_layout()
53
+ plt.plot(time,prob)
97
54
  plt.show()
98
-
99
55
  ```
100
- ![イメージ説明](c8c4eec927043ae73aca2f61c3548fe2.png)
56
+ ![イメージ説明](3b192866ddf979e8d53194625f9b8147.png)
57
+ こんなへんちくりんな結果になります。
101
- なたか、上記理想結果を実装できる方、たは量子情報詳し方がいらっしゃいしたら、是非ご教授下さい。
58
+ こが悪いかわかりせん!! 教えてくれる人も周りにいません。。。ご教授のほどよろしくお願致します
102
- 個人ごとですが、結構困っています。宜しくお願い致します。。
103
- この質問はstackoverflowでもすることにします。
104
- これはほぼ諦め状態です。(なんでできないのかわからないです。。)
105
- ![イメージ説明](f6db0c9b740d730c1e799a23a644bd0c.png)

10

追加

2018/10/02 04:47

投稿

Fallout_18
Fallout_18

スコア124

title CHANGED
File without changes
body CHANGED
@@ -100,4 +100,6 @@
100
100
  ![イメージ説明](c8c4eec927043ae73aca2f61c3548fe2.png)
101
101
  どなたか、上記の理想結果を実装できる方、または量子情報に詳しい方がいらっしゃいましたら、是非ご教授下さい。。
102
102
  個人ごとですが、結構困っています。宜しくお願い致します。。
103
- この質問はstackoverflowでもすることにします。
103
+ この質問はstackoverflowでもすることにします。
104
+ これはほぼ諦め状態です。(なんでできないのかわからないです。。)
105
+ ![イメージ説明](f6db0c9b740d730c1e799a23a644bd0c.png)

9

追加

2018/08/31 14:28

投稿

Fallout_18
Fallout_18

スコア124

title CHANGED
File without changes
body CHANGED
@@ -99,4 +99,5 @@
99
99
  ```
100
100
  ![イメージ説明](c8c4eec927043ae73aca2f61c3548fe2.png)
101
101
  どなたか、上記の理想結果を実装できる方、または量子情報に詳しい方がいらっしゃいましたら、是非ご教授下さい。。
102
- 個人ごとですが、結構困っています。宜しくお願い致します。。
102
+ 個人ごとですが、結構困っています。宜しくお願い致します。。
103
+ この質問はstackoverflowでもすることにします。

8

内容変更

2018/08/18 14:44

投稿

Fallout_18
Fallout_18

スコア124

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
- ![イメージ説明](cd8f2c0376cd6947f40c8e6f8874964d.png)
12
- 初期状態については、格子内の全ての可能なサイトを均等に重ね合わせて量子歩行者を開始し、すべての方向を等しく重ね合わせる。
13
5
  _________________________________________________
14
- 初期値は原点に[1000]をもっていき、それ以外は[0000]とします。
15
6
  ### 欲しい結果
16
- ![](487303f840156a0634d15a4cedd44ccd.jpeg)
17
- これは正確な答えではありません、あくまでイメジです。黒ような(maxが0.25として)周期をとります。
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
- 以下を踏まえて。。。
27
- ### 実装
7
+ ![イメージ説明](6d24453c3dbd07f5291b0900a8572767.jpeg)
8
+ ### 3次元立方体の量子ウォクを用たグローバー探索場合
9
+ ![イメージ説明](0407161182184a928d49aa398be7e063.png)
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 = 4*(n**2)
41
+ N = (2*n)**2
35
- step = 30
42
+ step = 100
36
- x_list = [i for i in range(0,2*n+1)]
43
+ x_list = [i for i in range(0,2*n)]
37
- y_list = [i for i in range(0,2*n+1)]
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[1,:] = G[1,:]
49
+ P = np.zeros((4,4)); P[0,:] = G[0,:]
43
- Q = np.zeros((4,4)); Q[0,:] = G[0,:]
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[1,:] = O[1,:]
55
+ p = np.zeros((4,4)); p[0,:] = O[0,:]
49
- q = np.zeros((4,4)); q[0,:] = O[0,:]
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.zeros((2*n+1, 2*n+1,4),dtype="complex")
62
+ phi_map = np.ones((2*n, 2*n,4),dtype="complex")
55
- phi_map[0,0]= np.array([1,0,0,0])
63
+ phi_map /= np.sqrt(4*N)
56
- #####初期確率
57
- next_phi_map = np.zeros((2*n+1, 2*n+1,4),dtype="complex")
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+1) % (2*n+1)
75
+ x1 = (x-1 + 2*n) % (2*n)
76
+ #p
70
- x2 = (x+1) % (2*n+1)
77
+ x2 = (x+1) % (2*n)
78
+ #s
71
- y1 = (y-1 + 2*n+1) % (2*n+1)
79
+ y1 = (y-1 + 2*n) % (2*n)
80
+ #r
72
- y2 = (y+1) % (2*n+1)
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.inner(next_phi_map[i], np.conj(next_phi_map[i])))
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
- ![イメージ説明](fe190f0f52a7c553b96575f708cc37b9.png)
100
+ ![イメージ説明](c8c4eec927043ae73aca2f61c3548fe2.png)
98
- 周期的になりません。。。
99
- 少し専門寄りなのですが、グローバーのアルゴリズム自体は簡単なルールなので、どなたか再現できる方がいらっしゃいましたら、宜しくお願致します。。
101
+ どなたか、上記の理想結果を実装できる方、または量子情報に詳しい方がいらっしゃいましたら、是非ご教授下さい。。
102
+ 個人ごとですが、結構困っています。宜しくお願い致します。。

7

修正

2018/08/18 13:42

投稿

Fallout_18
Fallout_18

スコア124

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
  ![](487303f840156a0634d15a4cedd44ccd.jpeg)
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[0,:] = G[0,:]
42
+ P = np.zeros((4,4)); P[1,:] = G[1,:]
36
- Q = np.zeros((4,4)); Q[1,:] = G[1,:]
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[0,:] = O[0,:]
48
+ p = np.zeros((4,4)); p[1,:] = O[1,:]
42
- q = np.zeros((4,4)); q[1,:] = O[1,:]
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,1,-1,-1])/2#/(np.sqrt(4*N))
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 == (8,8):
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[8,8] , phi_map[8,8])))
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
- ![](d798953e40a861905b167b4282fe6829.png)
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
- ![イメージ説明](b78569dbba646cb0b75ac3c831d3dc2d.png)
97
+ ![イメージ説明](fe190f0f52a7c553b96575f708cc37b9.png)
105
- 。。。。。周期的にならない。。
98
+ 周期的になりません。。
106
- 本当にお手上げ状態です。
99
+ 少し専門寄りなのですがグローバーのアルゴリズム自体は簡単なルールなの、どなたか再現できる方がいらっしゃいましたら、宜しくお願い致します。

6

タグ追加

2018/08/12 04:38

投稿

Fallout_18
Fallout_18

スコア124

title CHANGED
File without changes
body CHANGED
File without changes

5

タグ追加

2018/08/06 12:37

投稿

Fallout_18
Fallout_18

スコア124

title CHANGED
File without changes
body CHANGED
File without changes

4

追記

2018/08/06 09:53

投稿

Fallout_18
Fallout_18

スコア124

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
  ![イメージ説明](b78569dbba646cb0b75ac3c831d3dc2d.png)

3

追記

2018/08/04 16:39

投稿

Fallout_18
Fallout_18

スコア124

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
+ ![イメージ説明](b78569dbba646cb0b75ac3c831d3dc2d.png)
104
+ 。。。。。周期的にならない。。
105
+ 本当に、お手上げ状態です。

2

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

2018/08/04 16:35

投稿

Fallout_18
Fallout_18

スコア124

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

1

情報追加

2018/08/04 13:08

投稿

Fallout_18
Fallout_18

スコア124

title CHANGED
File without changes
body CHANGED
@@ -15,7 +15,7 @@
15
15
  初期値は原点に[1000]をもっていき、それ以外は[0000]とします。
16
16
  ### 欲しい結果
17
17
  ![](487303f840156a0634d15a4cedd44ccd.jpeg)
18
- これが絶対ではないのですが、黒い線のような周期をとります。
18
+ これが絶対ではないのですが、黒い線のような周期をとります。(上の参考文献に正確な欲しい結果が掲載されていますお手数ですが、宜しくお願い致します。)
19
19
  ### 実装
20
20
  ```python
21
21
  import numpy as np