LoginSignup
5
3

More than 3 years have passed since last update.

量子コンピューティングやってみた

Posted at

動機

技術書展で購入した、高校数学からはじめる量子コンピュータを読んでなんとなく、イメージはできた気がするので実際に手を動かして理解を深めようと思いました。

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})

観測結果は適用前と変わりませんが、符号が反転していますね。

まとめ

次は実際に量子回路を組み立てることで理解を深めたいと思います。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3