この記事に関して
ここでは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 ゲート
from blueqat import Circuit
c = Circuit().i[0].m[:].run(shots=1000)
結果
Counter({'0': 1000})
X ゲート
from blueqat import Circuit
c = Circuit().x[0].m[:].run(shots=1000)
結果
Counter({'1': 1000})
Y ゲート
from blueqat import Circuit
c = Circuit().y[0].m[:].run(shots=1000)
結果
Counter({'1': 1000})
Z ゲート
from blueqat import Circuit
c = Circuit().z[0].m[:].run(shots=1000)
結果
Counter({'0': 1000})
H ゲート
from blueqat import Circuit
c = Circuit().h[0].m[:].run(shots=1000)
結果
Counter({'0': 511, '1': 489})
S ゲート
from blueqat import Circuit
c = Circuit().s[0].m[:].run(shots=1000)
結果
Counter({'0': 1000})
S† ゲート
from blueqat import Circuit
c = Circuit().sdg[0].m[:].run(shots=1000)
結果
Counter({'0': 1000})
T ゲート
from blueqat import Circuit
c = Circuit().t[0].m[:].run(shots=1000)
結果
Counter({'0': 1000})
T† ゲート
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 ゲート
from blueqat import Circuit
import math
c = Circuit().rx(math.pi/2)[0].m[:].run(shots=1000)
結果
Counter({'1': 469, '0': 531})
Ry ゲート
from blueqat import Circuit
import math
c = Circuit().ry(math.pi/2)[0].m[:].run(shots=1000)
結果
Counter({'1': 524, '0': 476})
Rz ゲート
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 ゲート
from blueqat import Circuit
import math
c = Circuit().u1(math.pi)[0].m[:].run(shots=1000)
結果
Counter({'0': 1000})
U2 ゲート
from blueqat import Circuit
import math
c = Circuit().u2(0, math.pi)[0].m[:].run(shots=1000)
結果
Counter({'0': 486, '1': 514})
U3 ゲート
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 |
---|---|
cx orcnot
|
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 ゲート
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 ゲート
from blueqat import Circuit
c = Circuit().cz[0,1].m[:].run(shots=1000)
結果
Counter({'00': 1000})
CRx ゲート
from blueqat import Circuit
import math
c = Circuit().crx(math.pi/2)[0,1].m[:].run(shots=1000)
結果
Counter({'00': 1000})
CRy ゲート
from blueqat import Circuit
import math
c = Circuit().crx(math.pi/2)[0,1].m[:].run(shots=1000)
結果
Counter({'00': 1000})
CRz ゲート
from blueqat import Circuit
import math
c = Circuit().crz(math.pi/2)[0,1].m[:].run(shots=1000)
結果
Counter({'00': 1000})
CU1 ゲート
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 ゲート
from blueqat import Circuit
import math
c = Circuit().cu2(0,math.pi)[0,1].m[:].run(shots=1000)
結果
Counter({'00': 1000})
CU3 ゲート
from blueqat import Circuit
import math
c = Circuit().cu3(math.pi/2,0,math.pi)[0].m[:].run(shots=1000)
結果
Counter({'00': 1000})
Swap ゲート
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 ゲート
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で実装してみます。