この記事に関して
ここではpythonライブラリのblueqatを用いて量子プログラミングを行っていこうと思います。
内容は公式のチュートリアルを元に作成しています。
今回は複数量子ビットの操作を説明していきます。
回路の作成
まずは2量子ビットの回路を作成してみましょう。
Circuit()
の()
に数を入れるとビット数を指定できます。1
まずは何もゲートを入れずに観測してみます。
実装
from blueqat import Circuit
c = Circuit(2)
c.m[:].run(shots=1000)
結果
Counter({'00': 1000})
よって 00 が観測されることがわかりました。
ベクトルを観測する場合
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%観測されるはずです。
普通に値を観測する場合
from blueqat import Circuit
c = Circuit(2).cx[0, 1]
c.m[:].run(shots=1000)
結果
Counter({'00': 1000})
100%できちんと00が取れました。
ベクトルを観測する場合
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ゲートを施します。
普通に値を観測する場合
from blueqat import Circuit
c = Circuit(2).x[0].cx[0, 1]
c.m[:].run(shots=1000)
結果
Counter({'11': 1000})
100%できちんと11が取れました。
ベクトルを観測する場合
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%観測されるはずです。
状態ベクトルは長くなるので値の観測のみ実装します。
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を用いて複数量子ビットの回路の作成の仕方を説明しました。
次回は量子の重ね合わせを実装してみます。
-
何も書かない場合はゲートを施しているところのみを自動的に調べます。 ↩