動機
技術書展で購入した、高校数学からはじめる量子コンピュータを読んでなんとなく、イメージはできた気がするので実際に手を動かして理解を深めようと思いました。
Blueqat
ツールはBlueqatを使用します。
Install
$ pipenv --python 3.7
$ pipenv install blueqat
1量子ビット
>>> from blueqat import Circuit
>>> import math
>>> c = Circuit(1) # 1量子ビットを作成
>>> c.run() # 状態を確認
array([1.+0.j, 0.+0.j])
>>> c.m[:].run(shots=100) # 100回観測
Counter({'0': 100})
ここで状態に着目してみるとarray([1.+0.j, 0.+0.j])
と表示されています。
これは下記のベクトルに対応しています。
{|0〉} := \left(
\begin{array}{c}
1 \\
0 \\
\end{array}
\right)
1^2 + 0^2 = 1
ということで単位ベクトルですね。
また、100回観測した結果Counter({'0': 100})
と表示されているので、100%の確率で|0〉
が観測できました。
Xゲートでビット反転
反転させたビットを確認するためにXゲート(パウリ行列X)を適用してみます。
>>> from blueqat import Circuit
>>> import math
>>> c = Circuit(1).x[0] # 1量子ビットを作成してXゲートを適用
>>> c.run() # 状態を確認
array([0.+0.j, 1.+0.j])
>>> c.m[:].run(shots=100) # 100回観測
Counter({'1': 100})
ここで状態に着目してみるとarray([0.+0.j, 1.+0.j])
と表示されています。
これは下記のベクトルに対応しています。
{|1〉} := \left(
\begin{array}{c}
0 \\
1 \\
\end{array}
\right)
0^2 + 1^2 = 1
ということで単位ベクトルですね。
また、100回観測した結果Counter({'1': 100})
と表示されているので、100%の確率で|1〉
が観測できました。
Hゲートで重ね合わせ状態
量子ビットの重要な特性である重ね合わせ状態を作るためにHゲート(アダマール行列)を適用してみます。
>>> from blueqat import Circuit
>>> import math
>>> c = Circuit(1).h[0] # 1量子ビットを作成してHゲートを適用
>>> c.run() # 状態を確認
array([0.70710678+0.j, 0.70710678+0.j])
>>> c.m[:].run(shots=100) # 100回観測
Counter({'0': 53, '1': 47})
また、数字に着目してみると
\frac{1}{\sqrt{2}} = 0.70710678118
なので
(\frac{1}{\sqrt{2}})^2 + (\frac{1}{\sqrt{2}})^2 = 1
ということで単位ベクトルですね。
また、100回観測した結果Counter({'0': 53, '1': 47})
と表示されているので、ほぼ50%の確率で|0〉
または|1〉
が観測できました。
また、可逆性も確認してみます。
>>> from blueqat import Circuit
>>> import math
>>> c = Circuit(1).h[0].h[0] # 1量子ビットを作成してHゲートを2回適用
>>> c.run() # 状態を確認
array([1.+0.j, 0.+0.j])
>>> c.m[:].run(shots=100) # 100回観測
Counter({'0': 100})
元に戻ってますね!
Zゲート
Zゲート(パウリ行列Z)も確認してみます。
>>> from blueqat import Circuit
>>> import math
>>> c = Circuit(1).z[0] # 1量子ビットを作成してZゲートを適用
>>> c.run() # 状態を確認
array([ 1.+0.j, -0.+0.j])
>>> c.m[:].run(shots=100) # 100回観測
Counter({'0': 100})
観測結果は適用前と変わりませんが、符号が反転していますね。
まとめ
次は実際に量子回路を組み立てることで理解を深めたいと思います。