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

Qiskit[^0]のドキュメントを眺めながら今後使いそうなところ，面白そうな所をまとめていきます．

## 量子ゲートを記載したコード

以下のコードにある，基本的な量子ゲートを紹介していきます．
（今後作成する記事によって追記があると思います．）

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

上の量子回路を図示すると，このような感じです[^4]．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887541/508151c6-2c32-3295-46c2-574fcce4af34.png)

ちなみに，この`circ`は`QuantumCircuit`というクラスに属します．また，次のようしてゲートを挿入することもできます．

```python
from qiskit.circuit.library import HGate

circ = QuantumCircuit(3)
circ.append(HGate(), [0])
```

## 量子ゲートの具体形

コードの上から順に，（$Z$の固有状態$\\{|0\rangle, |1\rangle\\}$を基底とした）行列表示をすると，以下のようになります．まずは１量子ビットゲートは
$$
\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}
$$
です．

次に，２量子ビットゲートが作用しています．**これらは$\\{|00\rangle_{ab},|01\rangle_{ab},|10\rangle_{ab},|11\rangle_{ab}\\}$という基底で行列表示**すれば[^1]
$$
\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`を用いると良いです．

```python
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`ではさまざまなゲートが紹介されているので，ぜひ見てみてください[^2]．

# 既存のゲートから新たなゲートを自作する

ここでは，既存のゲートを組み合わせて新たなゲートを作ることを考えてみます．
例えば，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}
$$
が成り立つことがわかる．これは以下のように実装できる．


```python
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|1.3.1|


||System information|
|---|---|
|Python version	|3.10.12|





[^0]: https://qiskit.org/documentation/locale/ja_JP/apidoc/index.html

[^4]: 実際の量子コンピュータ上では，以下のようにより冗長な回路が走ることとなります．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/887541/03493717-9719-fc89-1ed3-e558588100e6.png)

[^1]: この記事では，Qiskit（ https://qiskit.org/documentation/locale/ja_JP/stubs/qiskit.circuit.library.CXGate.html#qiskit.circuit.library.CXGate ）における２量子ビットゲートの表現と異なる表現を用いている（個人の趣味）．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}\\}$という基底で行列表示しているため，テンソル積の表現も行列表現も，ここで紹介しているものと異なる表現となっている．

[^2]:https://qiskit.org/documentation/apidoc/circuit_library.html