LoginSignup
6
2

More than 3 years have passed since last update.

blueqatで量子の重ね合わせ

Last updated at Posted at 2019-12-04

この記事に関して

ここではpythonライブラリのblueqatを用いて量子プログラミングを行っていこうと思います。
内容は公式のチュートリアルを元に作成しています。
今回は量子の重ね合わせを実装します。

回路の作成

今回はHゲート(hadamard gate)を用います。
Hゲートを施すと量子ビットは以下のように変換されます。

\left|0\right> → \frac{1}{\sqrt2}\left|0\right>+\frac{1}{\sqrt2}\left|1\right>,
\left|1\right> → \frac{1}{\sqrt2}\left|0\right>-\frac{1}{\sqrt2}\left|1\right>

この $\left|0\right>$ と $\left|1\right>$ が混ざっている状態を重ね合わせ状態と言います。
上の状態では計算上 0, 1 がそれぞれ50%の確率で観測されることがわかります。

$H\left|0\right>$ のことを +状態ともいい、$\left|+\right>$ と表します。
また $H\left|1\right>$ のことを -状態ともいい、$\left|-\right>$ と言います。

実装 1

上の状態を実際に実装してみます。$H\left|0\right>=\left|+\right>$ を測定して見ます。
Hゲートは回路に.h[a]をつけるとできます。(aはHゲートを施すビットの位置)

普通に値を観測する場合

sample.ipynb
from blueqat import Circuit

c = Circuit().h[0]
c.m[:].run(shots=1000)

結果
Counter({'0': 517, '1': 483})

完璧ではないですが 0 と 1 がそれぞれ約50%の確率で取れていることがわかります。

ベクトルを観測する場合

sample.ipynb
from blueqat import Circuit

c = Circuit().h[0]
c.run()

結果
array([0.70710678+0.j, 0.70710678+0.j])

値がそれぞれ $\frac{1}{\sqrt2}$ よりきちんと取れました。

実装 2

次に $H\left|1\right>=\left|-\right>$ を測定してみます。
計算上では観測する確率は同じはずです。

普通に値を観測する場合

sample.ipynb
from blueqat import Circuit

c = Circuit().x[0].h[0]
c.m[:].run(shots=1000)

結果
Counter({'0': 527, '1': 473})

$\left|+\right>$ と同じく、約50%の確率で取れていることがわかります。

ベクトルを観測する場合

sample.ipynb
from blueqat import Circuit

c = Circuit().x[0].h[0]
c.run()

結果
array([ 0.70710678+0.j, -0.70710678+0.j])

$\left|1\right>$ の係数が - できちんと取れました。

まとめ

今回はblueqatを用いて量子の重ね合わせを実装しました。
次回は量子もつれ(entanglement)を実装してみます。

6
2
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
6
2