Help us understand the problem. What is going on with this article?

blueqatで量子の重ね合わせ

この記事に関して

ここでは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)を実装してみます。

gleap
九州大学公式のプログラミングサークルです。
https://gleap.tech
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away