はじめに
量子もつれは大事ですのでみてみます。
2量子ビット
こちらは基本ですね。
from blueqat import Circuit
Circuit().h[0].cx[0,1].m[:].run(shots=100)
#Counter({'00': 54, '11': 46})
Counter({'11': 42, '00': 58})
00と11のもつれになりました。片方にXをかけると、
Circuit().h[0].cx[0,1].x[0].m[:].run(shots=100)
#Counter({'01': 54, '10': 46})
Counter({'01': 58, '10': 42})
001,010,100のもつれ
こちらは確率振幅を
001
010
100
のもつれ
これを利用します。
初期状態の
をRyゲートを使って回転させると、
|0>の確率振幅を
これは、
を計算すればよく、numpyを使って、
import numpy as np
np.arccos(1/np.sqrt(3))
#0.9553166181245092
0.9553166181245092
出ました。そこで、Ryゲートには、この倍の角度を適用すればよく、
Circuit().ry(0.9553166181245092*2)[0].run()
#array([0.57735027+0.j, 0.81649658+0.j])
array([0.57735027+0.j, 0.81649658+0.j])
できました。
1/np.sqrt(3)
#0.5773502691896258
0.5773502691896258
いい感じです。あとは、残りの確率振幅を等分すればいいので、
np.arccos(1/np.sqrt(2))
#0.7853981633974484
0.7853981633974484
を使って、
Circuit().ry(0.9553166181245092*2)[0].cry(0.7853981633974484*2)[0,1].run()
#array([0.57735027+0.j, 0.57735027+0.j, 0. +0.j, 0.57735027+0.j])
array([0.57735027+0.j, 0.57735027+0.j, 0. +0.j, 0.57735027+0.j])
できました。
Circuit().ry(0.9553166181245092*2)[0].cry(0.7853981633974484*2)[0,1].m[:].run(shots=100)
#Counter({'00': 36, '10': 32, '11': 32})
Counter({'00': 41, '10': 31, '11': 28})
この回路に3量子ビット目を追加してみます。
Circuit(3).ry(0.9553166181245092*2)[0].cry(0.7853981633974484*2)[0,1].m[:].run(shots=100)
#Counter({'000': 32, '100': 28, '110': 40})
Counter({'110': 34, '100': 36, '000': 30})
あとはこれを調整してみますが、
Circuit(3).ry(0.9553166181245092*2)[0].cry(0.7853981633974484*2)[0,1].x[2].cx[0, 2].cx[1, 0].m[:].run(shots=100)
#Counter({'001': 33, '010': 38, '100': 29})
Counter({'001': 35, '010': 36, '100': 29})
でできます。
000
100
110
の状態から、x[2]で、
001
101
111
cx[0,2]で、
001
100
110
cx[1,0]で、
001
100
010
となって無事できました。
0001,0010,0100,1000のもつれ
続いてこの調子で。まずは2量子ビットを使って、00,01,10,11のもつれを
Circuit().h[0,1].m[:].run(shots=100)
#Counter({'00': 22, '01': 28, '10': 25, '11': 25})
Counter({'11': 25, '10': 19, '01': 28, '00': 28})
これにより、
00
01
10
11
ができます。ここにさらに2量子ビット付けます。
Circuit(4).h[0,1].m[:].run(shots=100)
#Counter({'0000': 17, '0100': 35, '1000': 28, '1100': 20})
Counter({'0100': 29, '0000': 29, '1000': 18, '1100': 24})
0000
0100
1000
1100
続いて、一番最後にXかけて、
0001
0101
1001
1101
二番目をコントロールビットにして四番目CX
0001
0100
1001
1100
一番目をコントロールビットにして四番目CX
0001
0100
1000
1101
一番目と二番目をコントロールビットにして三番目CCX
0001
0100
1000
1111
あとは三番目をコントロールビットにして順番に1、2、4をCXして
0001
0100
1000
0010
できました!
Circuit().h[0,1].x[3].cx[1,3].cx[0,3].ccx[0,1,2].cx[2,0].cx[2,1].cx[2,3].m[:].run(shots=100)
#Counter({'0001': 27, '0010': 28, '0100': 27, '1000': 18})
Counter({'0001': 17, '1000': 29, '0010': 19, '0100': 35})
いい量子コンピュータライフを!