3
1

Qiskit 基本的な量子ゲートの紹介

Last updated at Posted at 2023-11-06

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')

上の量子回路を図示すると,このような感じです.
ダウンロード.png

ちなみに,このcircQuantumCircuitというクラスに属します.

量子ゲートの具体形

コードの上から順に,($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
  1. https://qiskit.org/documentation/locale/ja_JP/apidoc/index.html

  2. この記事では,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}\}$という基底で行列表示しているため,テンソル積の表現も行列表現も,ここで紹介しているものと異なる表現となっている.

  3. https://qiskit.org/documentation/apidoc/circuit_library.html

3
1
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
3
1