LoginSignup
4
2

More than 3 years have passed since last update.

blueqatで2量子ビットの操作

Last updated at Posted at 2019-12-04

この記事に関して

ここではpythonライブラリのblueqatを用いて量子プログラミングを行っていこうと思います。
内容は公式のチュートリアルを元に作成しています。
今回は複数量子ビットの操作を説明していきます。

回路の作成

まずは2量子ビットの回路を作成してみましょう。
Circuit()()に数を入れるとビット数を指定できます。1
まずは何もゲートを入れずに観測してみます。

実装

sample.ipynb
from blueqat import Circuit

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

結果
Counter({'00': 1000})

よって 00 が観測されることがわかりました。

ベクトルを観測する場合

sample.ipynb
from blueqat import Circuit

c = Circuit(2)
c.run()

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

ベクトルが $(1, 0, 0, 0)$ よりきちんと $\left|0\right>\otimes\left|0\right>$ が取れました。

複数ビットの量子ゲート

今回は 2 量子ビットのゲートを考えて見ます。
CX ゲートを施して見ましょう。
CX ゲートは1量子ビットが $\left|1\right>$ ならば、2量子ビット目にXゲートを施すものでしたね。

回路は以下のように書きます。

\begin{array}{cccccc}
\left|0\right>&-&-&*&-&- \\
\ & & &|& &  \\
\left|0\right>&-&-&\large{X}&-&-
\end{array}

0番目のビットを1番目に作用させているのがわかります。(0番目から始めます。)

CXゲートは回路に.cx[a, b]をつけるとできます。
aは $\left|1\right>$ を判別するビットの位置を、bは Xゲートを施すビットの位置を入れます。

実装 1

上の例のように0番目のビットを見て1番目にXゲートを施してみます。
計算上は $CX\left|0\right>\otimes\left|0\right> = \left|0\right>\otimes\left|0\right>$ より 00 が100%観測されるはずです。
普通に値を観測する場合

sample.ipynb
from blueqat import Circuit

c = Circuit(2).cx[0, 1]
c.m[:].run(shots=1000)

結果
Counter({'00': 1000})

100%できちんと00が取れました。

ベクトルを観測する場合

sample.ipynb
from blueqat import Circuit

c = Circuit(2).cx[0, 1]
c.run()

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

ベクトルが $(1, 0, 0, 0)$ よりきちんと $\left|0\right>\otimes\left|0\right>$ が取れました。

実装 2

次は0番目のビットが $\left|1\right>$ のときを実装してみます。
計算上は $CX\left|1\right>\otimes\left|0\right> = \left|1\right>\otimes\left|1\right>$ より 11 が100%観測されるはずです。
1ビット目を $\left|1\right>$ にするので1番目にXゲートを施して反転させてからCXゲートを施します。

普通に値を観測する場合

sample.ipynb
from blueqat import Circuit

c = Circuit(2).x[0].cx[0, 1]
c.m[:].run(shots=1000)

結果
Counter({'11': 1000})

100%できちんと11が取れました。

ベクトルを観測する場合

sample.ipynb
from blueqat import Circuit

c = Circuit(2).x[0].cx[0, 1]
c.run()

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

ベクトルが $(0, 0, 0, 1)$ よりきちんと $\left|1\right>\otimes\left|1\right>$ が取れました。

実装 3

次は3量子ビット以上を実装してみます。
今回は4量子ビットの全てに Xゲートを施そうと思います。

計算上では
$X\left|0\right>\otimes X\left|0\right>\otimes X\left|0\right>\otimes X\left|0\right> = \left|1\right>\otimes\left|1\right>\otimes\left|1\right>\otimes\left|1\right>$ より 1111 が100%観測されるはずです。
状態ベクトルは長くなるので値の観測のみ実装します。

sample.ipynb
from blueqat import Circuit

c = Circuit(4).x[0].x[1].x[2].x[3]
c.m[:].run(shots=1000)

結果
Counter({'1111': 1000})

100%できちんと1111が取れました。

まとめ

今回はblueqatを用いて複数量子ビットの回路の作成の仕方を説明しました。
次回は量子の重ね合わせを実装してみます。


  1. 何も書かない場合はゲートを施しているところのみを自動的に調べます。 

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