はじめに
GWに時間があったので、量子コンピューターについて少し勉強した。
理解を深めるため、Blueqatを触ってみた。
(基本的な事)量子ビットと量子ゲート
Quantum logic gate - Wikipedia
量子ビットの状態は、
次元のベクトルで記述することができる。
1量子ビットの場合:
2量子ビットの場合:
量子ビットに作用する量子ゲートは、
のユニタリー行列で表される。
例: 1量子ビットに作用するNOTゲート(いわゆるビットフリップ)
Blueqatの使い方
from blueqat import Circuit # 量子ビット数を指定しない回路 c = Circuit() # 2量子ビットの回路 c = Circuit(2) # 状態ベクトルを計算 c.run() ## array([1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j]) # m[:]で全量子ビットの値を計算 c.m[:].run() ## array([1.+0.j, 0.+0.j, 0.+0.j, 0.+0.j]) # 第0ビットをアダマール変換 Circuit().h[0].run() ## array([0.70710678+0.j, 0.70710678+0.j]) # 観測すると波束が収束し、[1, 0]と[0, 1]が半々の確率で得られる Circuit().h[0].m[:].run() ## array([1.+0.j, 0.+0.j]) # 1000回計算する Circuit().h[0].m[:].run(shots=1000) ## Counter({'1': 505, '0': 495}) # 2回アダマール変換すると元に戻る Circuit().h[0].h[0].run() ## array([1.+0.j, 0.+0.j]) # 観測すると波束は収束するのでダメになる Circuit().h[0].m[0].h[0].run() ## array([0.70710678+0.j, 0.70710678+0.j])
アダマール変換をに作用させると、
の重ね合わせ状態が得られる。
Blueqatで半加算器を作る
量子コンピューター的な半加算器はトフォリゲートとCNOTゲートで実現できる。
第0, 1ビットが入力で、第2ビットが桁上り出力、第3が出力の、4量子ビットの回路とすると、以下のように組めば良い。
- 第0, 1ビットをアダマール変換(h)
- トフォリゲート(ccx)によって第0, 1ビットが両方とも1のとき、第2ビットを反転する
- CNOTゲート(cx)によって、第0ビットが1のとき第3ビットを反転、第1ビットが1のとき第3ビットを反転する
入力と出力の関係は以下の表の通り。
0 | 1 | 2 | 3 |
---|---|---|---|
0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 |
1 | 0 | 0 | 1 |
1 | 1 | 1 | 0 |
Blueqatで実装すると、以下のようになる。
Circuit().h[0,1].ccx[0,1,2].cx[0,3].cx[1,3] ## array([5.00000000e-01+0.00000000e+00j, 0.00000000e+00+0.00000000e+00j, ## 0.00000000e+00+0.00000000e+00j, 2.77555756e-17+2.77555756e-17j, ## 3.92523115e-17-5.88784672e-17j, 0.00000000e+00+0.00000000e+00j, ## 0.00000000e+00+0.00000000e+00j, 5.00000000e-01-3.36731597e-18j, ## 0.00000000e+00+0.00000000e+00j, 5.00000000e-01-3.36731597e-18j, ## 5.00000000e-01+5.21438353e-17j, 0.00000000e+00+0.00000000e+00j, ## 0.00000000e+00+0.00000000e+00j, 0.00000000e+00+0.00000000e+00j, ## 0.00000000e+00+0.00000000e+00j, 0.00000000e+00+0.00000000e+00j]) # 1000回計算して0,1,2,3ビットを観測 Circuit().h[0,1].ccx[0,1,2].cx[0,3].cx[1,3].m[:].run(shots=1000) ## Counter({'1001': 236, '0101': 277, '0000': 244, '1110': 243})
対応表の通りの結果が得られた。