LoginSignup
7
4

More than 3 years have passed since last update.

blueqatで量子ゲートの作成

Last updated at Posted at 2019-12-07

この記事に関して

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

量子ゲート

基本的な量子ゲートはここで確認してください。

1量子ゲート

I, X, Y, Z, H, T, T†, S, S†

I, X, Y, Z, H, T, T†, S, S† ゲートはそれぞれ以下で実装できます。

I X Y Z H S S† T T†
i x y z h s sdg t tdg

実装

以上のゲートを実装します。

I ゲート
sample.ipynb
from blueqat import Circuit

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

結果
Counter({'0': 1000})
X ゲート
sample.ipynb
from blueqat import Circuit

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

結果
Counter({'1': 1000})
Y ゲート
sample.ipynb
from blueqat import Circuit

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

結果
Counter({'1': 1000})
Z ゲート
sample.ipynb
from blueqat import Circuit

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

結果
Counter({'0': 1000})
H ゲート
sample.ipynb
from blueqat import Circuit

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

結果
Counter({'0': 511, '1': 489})
S ゲート
sample.ipynb
from blueqat import Circuit

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

結果
Counter({'0': 1000})
S† ゲート
sample.ipynb
from blueqat import Circuit

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

結果
Counter({'0': 1000})
T ゲート
sample.ipynb
from blueqat import Circuit

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

結果
Counter({'0': 1000})
T† ゲート
sample.ipynb
from blueqat import Circuit

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

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

Rx, Ry, Rz, U1, U2, U3

U1, U2, U3に関して

ゲートを汎用的に使うために U1, U2, U3 ゲートというものがあります。
U1, U2, U3 はそれぞれ以下のように表します。

U_1(\lambda) = \left(\begin{array}{cc}1 & 0 \\ 0 & e^{i\lambda} \end{array}\right),
U_2(\phi, \lambda) = \frac{1}{\sqrt2}\left(\begin{array}{cc}1 & -e^{i\lambda} \\ e^{i\phi} & e^{i(\lambda+\phi)} \end{array}\right),
U_3(\theta, \phi, \lambda) = \left(\begin{array}{cc}\cos\left(\frac{\theta}{2}\right) & -e^{i\lambda}\sin\left(\frac{\theta}{2}\right) \\ e^{i\phi}\sin\left(\frac{\theta}{2}\right) & e^{i(\lambda+\phi)}\cos\left(\frac{\theta}{2}\right) \end{array}\right)\\

U_1 \left\{ \begin{array}{c} \left|0\right> → \left|0\right> \\
\left|1\right> → e^{i\lambda}\left|1\right> \end{array} \right. ,
U_2 \left\{ \begin{array}{c} \left|0\right> → \frac{1}{\sqrt2}(\left|0\right> +
e^{i\phi} \left|1\right>) \\
\left|1\right> → -\frac{1}{\sqrt2}e^{i\lambda}(\left|0\right> -
e^{i\phi}\left|1\right>) \end{array} \right. ,
U_3 \left\{ \begin{array}{c} \left|0\right> → \cos\left(\frac{\theta}{2}\right)\left|0\right> +
e^{i\phi}\sin\left(\frac{\theta}{2}\right)\left|1\right> \\
\left|1\right> → -e^{i\lambda}(\sin\left(\frac{\theta}{2}\right)\left|0\right>-
e^{i\phi}\cos\left(\frac{\theta}{2}\right)\left|1\right>) \end{array} \right. 

U1ゲートは一般の位相ゲートとなります。
( $U_1(\pi) = Z, U_1(\frac{\pi}{2})=S, U_1(\frac{\pi}{4})=T$ )

U2ゲートでは、bloch球の $\theta → \pi/4, \phi → \phi$ の軸で $\pi$ 回転させるゲートです。
( $U_2(0,\pi) = H$ )

U3ゲートは、bloch球の $\theta → \theta/2, \phi → \phi$ の軸で $\pi$ 回転させるゲートになります。
$U_3\left|0\right>$ は bloch球の式に対応しています。
よってビットを任意の位置に移動させることができます。

$U_2, U_3$ の $\lambda$ に関して、

\left|\theta, \phi\right>_0 = \cos\left(\frac{\theta}{2}\right)\left|0\right> +
e^{i\phi}\sin\left(\frac{\theta}{2}\right)\left|1\right> \\
\left|\theta, \phi\right>_1 = \sin\left(\frac{\theta}{2}\right)\left|0\right> -
e^{i\phi}\cos\left(\frac{\theta}{2}\right)\left|1\right>

という基底を考えると、それぞれこの基底に関する位相が $\lambda$ によって変わることがわかります。

Rx, Ry, Rz, U1, U2, U3 ゲートはそれぞれ以下で実装できます。

Rx Ry Rz U1 U2 U3
rx(θ) ry(θ) rz(θ)orphase(θ) u1(λ) u2(φ,λ) u3(φ,λ,θ)

Rx, Ry, Rz の $\theta$ には各軸による回転角を記入します。

実装

以上のゲートを実装します。

Rx ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().rx(math.pi/2)[0].m[:].run(shots=1000)

結果
Counter({'1': 469, '0': 531})
Ry ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().ry(math.pi/2)[0].m[:].run(shots=1000)

結果
Counter({'1': 524, '0': 476})
Rz ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().rz(math.pi/2)[0].m[:].run(shots=1000)
又は
c = Circuit().phase(math.pi/2)[0].m[:].run(shots=1000)

結果
Counter({'0': 1000})
U1 ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().u1(math.pi)[0].m[:].run(shots=1000)

結果
Counter({'0': 1000})
U2 ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().u2(0, math.pi)[0].m[:].run(shots=1000)

結果
Counter({'0': 486, '1': 514})
U3 ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().u3(math.pi/2,0,math.pi)[0].m[:].run(shots=1000)

結果
Counter({'0': 503, '1': 497})

2量子ゲート

2量子ゲートは主に1量子ゲートに制御ビットが加わったものがあります。

CX, CZ

CX, CZ ゲートは以下で実装できます。

CX CZ
cxorcnot cz

CRx, CRy, CRz, CU1, CU2, CU3

CRx, CRy, CRz, CU1, CU2, CU3 ゲートは以下で実装できます。

CRx CRy CRz CU1 CU2 CU3
crx(θ) cry(θ) crz(θ) cu1(λ)orcphase(λ) cu2(φ,λ) cu3(φ,λ,θ)

$\theta, \lambda, \phi$ に関しては1量子ゲートのときと同じです。

Swap

Swap ゲートは以下で実装できます。

SWAP
swap

実装

以上のゲートを実装します。

CX ゲート
sample.ipynb
from blueqat import Circuit

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

結果
Counter({'00': 1000})
CZ ゲート
sample.ipynb
from blueqat import Circuit

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

結果
Counter({'00': 1000})
CRx ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().crx(math.pi/2)[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
CRy ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().crx(math.pi/2)[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
CRz ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().crz(math.pi/2)[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
CU1 ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().cu1(math.pi)[0,1].m[:].run(shots=1000)
又は
c = Circuit().cphase(math.pi)[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
CU2 ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().cu2(0,math.pi)[0,1].m[:].run(shots=1000)

結果
Counter({'00': 1000})
CU3 ゲート
sample.ipynb
from blueqat import Circuit
import math

c = Circuit().cu3(math.pi/2,0,math.pi)[0].m[:].run(shots=1000)

結果
Counter({'00': 1000})
Swap ゲート
sample.ipynb
from blueqat import Circuit

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

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

3量子ゲート

3量子ゲートはCCX(Toffoli)ゲートのみあります。

CCX(Toffoli)

CCX ゲートは以下で実装できます。

CCX
ccx又はtoffoli

実装

以上のゲートを実装します。

CCX ゲート
sample.ipynb
from blueqat import Circuit

c = Circuit().ccx[0,1,2].m[:].run(shots=1000)
又は
c = Circuit().toffoli[0,1,2].m[:].run(shots=1000)

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

まとめ

今回はblueqatを用いて全ゲートの関数を実装しました。
次回は2進数の和をblueqatで実装してみます。

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