Qiskit1のドキュメントを眺めながら今後使いそうなところ,面白そうな所をまとめていきます.
量子ゲートを記載したコード
以下のコードにある,基本的な量子ゲートを紹介していきます.
(今後作成する記事によって追記があると思います.)
from qiskit import QuantumCircuit
import numpy as np
# 3つの量子ビットを持つ量子回路を作成
circ = QuantumCircuit(3)
# 量子ビット0にアダマールゲートを適用
circ.h(0)
# 量子ビット1にXゲート(ビット反転)を適用
circ.x(1)
# 量子ビット2にZゲートを適用
circ.z(2)
# 量子ビット1にRXゲートを適用し、角度がπ(180度)の回転を行う
circ.rx(np.pi, 1)
# 量子ビット1にRZゲートを適用し、角度がπ(180度)の回転を行う
circ.rz(np.pi, 1)
# 量子ビット0から量子ビット1への制御Xゲート(CNOT)を適用
circ.cx(0, 1)
# 量子ビット0から量子ビット2への制御Zゲートを適用
circ.cz(0, 2)
# 量子ビット1と量子ビット2に対してRXXゲートを適用
circ.rxx(np.pi, 1, 2)
# 量子ビット0と量子ビット2に対してRZXゲートを適用
circ.rzx(np.pi, 0, 2)
# 量子回路の描画(matplotlibを使用)
circ.draw('mpl')
ちなみに,このcirc
はQuantumCircuit
というクラスに属します.
量子ゲートの具体形
コードの上から順に,($Z$の固有状態$\{|0\rangle, |1\rangle\}$を基底とした)行列表示をすると,以下のようになります.まずは1量子ビットゲートは
$$
\begin{align}
H&=\frac{1}{\sqrt{2}}\begin{pmatrix}
1 & 1 \\
1 & -1
\end{pmatrix}\\
X&=\left(\begin{array}{ll}
0 & 1 \\
1 & 0
\end{array}\right)\\
Z&=\left(\begin{array}{cc}
1 & 0 \\
0 & -1
\end{array}\right)\\
R_X(\theta)&=\exp \left(-i \frac{\theta}{2} X\right)=\left(\begin{array}{cc}
\cos \left(\frac{\theta}{2}\right) & -i \sin \left(\frac{\theta}{2}\right) \\
-i \sin \left(\frac{\theta}{2}\right) & \cos \left(\frac{\theta}{2}\right)
\end{array}\right)\\
R_Z(\lambda)&=\exp \left(-i \frac{\lambda}{2} Z\right)=\left(\begin{array}{cc}
e^{-i \frac{\lambda}{2}} & 0 \\
0 & e^{i \frac{\lambda}{2}}
\end{array}\right)
\end{align}
$$
です.
次に,2量子ビットゲートが作用しています.これらは$\{|00\rangle_{ab},|01\rangle_{ab},|10\rangle_{ab},|11\rangle_{ab}\}$という基底で行列表示すれば2
$$
\begin{align}
CX(a,b) &=|0\rangle_a\langle 0| \otimes I_b + | 1\rangle_a\langle 1| \otimes X_b =\left(\begin{array}{cccc}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 0 & 1 \\
0 & 0 & 1 & 0
\end{array}\right)\\
C Z(a,b)&=|0\rangle_a\langle 0|\otimes I_b+| 1\rangle_a\langle 1|\otimes Z_b=\left(\begin{array}{cccc}
1 & 0 & 0 & 0 \\
0 & 1 & 0 & 0 \\
0 & 0 & 1 & 0 \\
0 & 0 & 0 & -1
\end{array}\right)\\
R_{X X}(\theta,a,b)&=\exp \left(-i \frac{\theta}{2} X_a \otimes X_b\right)=\left(\begin{array}{cccc}
\cos \left(\frac{\theta}{2}\right) & 0 & 0 & -i \sin \left(\frac{\theta}{2}\right) \\
0 & \cos \left(\frac{\theta}{2}\right) & -i \sin \left(\frac{\theta}{2}\right) & 0 \\
0 & -i \sin \left(\frac{\theta}{2}\right) & \cos \left(\frac{\theta}{2}\right) & 0 \\
-i \sin \left(\frac{\theta}{2}\right) & 0 & 0 & \cos \left(\frac{\theta}{2}\right)
\end{array}\right)\\
R_{Z X}(\theta,a,b)&=\exp \left(-i \frac{\theta}{2} Z_a \otimes X_b\right)=\left(\begin{array}{cccc}
\cos \left(\frac{\theta}{2}\right) & -i \sin \left(\frac{\theta}{2}\right) & 0 & 0 \\
-i \sin \left(\frac{\theta}{2}\right) & \cos \left(\frac{\theta}{2}\right) & 0 & 0 \\
0 & 0 & \cos \left(\frac{\theta}{2}\right) & i \sin \left(\frac{\theta}{2}\right) \\
0 & 0 & i \sin \left(\frac{\theta}{2}\right) & \cos \left(\frac{\theta}{2}\right)
\end{array}\right)
\end{align}
$$
となります.
このような,量子ゲートの行列表示を確認するには,qiskit.library
を用いると良いです.
from qiskit.circuit.library import HGate, RZXGate
# アダマールゲート(Hゲート)の行列形式を表示
print(HGate().to_matrix())
# Hゲートの行列は以下のようになります
# [[ 0.70710678+0.j 0.70710678+0.j]
# [ 0.70710678+0.j -0.70710678+0.j]]
# RZXゲートの行列形式を表示
print(np.round(RZXGate(np.pi).to_matrix(), 5))
# RZXゲートの行列は以下のようになります
# [[ 0.+0.j 0.+0.j -0.-1.j 0.+0.j]
# [ 0.+0.j 0.+0.j 0.+0.j 0.+1.j]
# [-0.-1.j 0.+0.j 0.+0.j 0.+0.j]
# [ 0.+0.j 0.+1.j 0.+0.j 0.+0.j]]
上述したように,行列表示の際の基底の順番が異なることに注意してください.
qiskit.library
ではさまざまなゲートが紹介されているので,ぜひ見てみてください3.
既存のゲートから新たなゲートを自作する
ここでは,既存のゲートを組み合わせて新たなゲートを作ることを考えてみます.
例えば,RZYゲートというものはQiskit上に実装されていません.これを作ってみます.
まず,$X$と$RZ$ゲートから,
$$
\begin{align}
X&=\left(\begin{array}{ll}
0 & 1 \\
1 & 0
\end{array}\right)\\
R_Z\left(\frac{\pi}{2}\right)&=\left(\begin{array}{cc}
e^{-i \frac{\pi}{4}} & 0 \\
0 & e^{i \frac{\pi}{4}}
\end{array}\right)\\
R_Z\left(\frac{\pi}{2}\right)XR_Z \left(-\frac{\pi}{2}\right)&= \left(\begin{array}{cc}
e^{-i \frac{\pi}{4}} & 0 \\
0 & e^{i \frac{\pi}{4}}
\end{array}\right)\left(\begin{array}{ll}
0 & 1 \\
1 & 0
\end{array}\right)\left(\begin{array}{cc}
e^{i \frac{\pi}{4}} & 0 \\
0 & e^{-i \frac{\pi}{4}}
\end{array}\right)\\
&= \left(\begin{array}{ll}
0 & -i \\
i & 0
\end{array}\right)=Y
\end{align}
$$
が成り立つので,
$$
\begin{align}
R_{Z Y}(\theta,a,b)&:=\exp \left(-i \frac{\theta}{2} Z_a \otimes Y_b\right)\\
&=\exp \left(-i \frac{\theta}{2} Z_a \otimes R_{Z,b}\left(-\frac{\pi}{2}\right)X_bR_{Z,b}\left(\frac{\pi}{2}\right)\right)\\
&=I_a\otimes R_{Z,b}\left(-\frac{\pi}{2}\right)\exp \left(-i \frac{\theta}{2} Z_a \otimes X_b\right)I_a\otimes R_{Z,b}\left(\frac{\pi}{2}\right)\\
&=I_a\otimes R_{Z,b}\left(-\frac{\pi}{2}\right)R_{ZX}(\theta,a,b
)I_a\otimes R_{Z,b}\left(\frac{\pi}{2}\right)
\end{align}
$$
が成り立つことがわかる.これは以下のように実装できる.
from qiskit import QuantumCircuit
import numpy as np
# 2つの量子ビットを持つ量子回路を作成
circ = QuantumCircuit(2)
# RZYゲートの作成
circ.rz(-np.pi / 2, 1)
circ.rzx(np.pi, 0, 1)
circ.rz(np.pi / 2, 1)
次に,RXXXゲートというものを作ってみましょう.そのために,まず,以下の計算をしてみます.
$$
\begin{align}
CX(a,b) R_ {ZZ}(\theta,b,c) CX(a,b) &=CX(a,b) \exp \left(-i \frac{\theta}{2} Z_b \otimes Z_c\right)CX(a,b) \\
&=\left(\ket{0}_a\bra{0}\otimes I_b+\ket{1}_a\bra{1}\otimes X_b\right) \exp \left(-i \frac{\theta}{2} Z_b \otimes Z_c\right)\left(\ket{0}_a\bra{0}\otimes I_b+\ket{1}_a\bra{1}\otimes X_b\right)\\
&=\ket{0}_a\bra{0}\otimes \exp \left(-i \frac{\theta}{2} Z_b \otimes Z_c\right)+\ket{1}_a\bra{1}\otimes \exp \left(i \frac{\theta}{2} Z_b\otimes Z_c\right) \\
&=\exp \left(-i \frac{\theta}{2} Z_a \otimes Z_b \otimes Z_c\right)\\
&=R _{ZZZ}(\theta,a,b,c)
\end{align}
$$
このように,回転ゲートに$CX$を作用させると多体の回転ゲートになることが分かります.これより,
$$
\begin{align}
H_a\otimes H_b\otimes H_cCX(a,b) R_ {ZZ}(\theta,b,c) CX(a,b) H_a\otimes H_b\otimes H_c&=\exp \left(-i \frac{\theta}{2} X_a \otimes X_b \otimes X_c\right)\\
&=R _{XXX}(\theta,a,b,c)
\end{align}
$$
とすれば良いことが分かります.
終わりに
今回紹介したものを使って今後計算していく予定です.
Version Information
Software | Version |
---|---|
qiskit | 0.45.0 |
System information | |
---|---|
Python version | 3.10.12 |
-
https://qiskit.org/documentation/locale/ja_JP/apidoc/index.html ↩
-
この記事では,Qiskit( https://qiskit.org/documentation/locale/ja_JP/stubs/qiskit.circuit.library.CXGate.html#qiskit.circuit.library.CXGate )における2量子ビットゲートの表現と異なる表現を用いている(個人の趣味).Qiskitでは$a<b$のときに,例えば
$$
CX(a,b) =|0\rangle_b\langle 0| \otimes I_a + | 1\rangle_b\langle 1| \otimes X_a
$$
のように表し,$\{|00\rangle_{ba},|01\rangle_{ba},|10\rangle_{ba},|11\rangle_{ba}\}$という基底で行列表示しているため,テンソル積の表現も行列表現も,ここで紹介しているものと異なる表現となっている. ↩ -
https://qiskit.org/documentation/apidoc/circuit_library.html ↩