１量子ビットゲート(パウリゲート)

$\phantom{}$$
\newcommand\bra[1]{\mathinner{\langle{#1}|}}
\newcommand\ket[1]{\mathinner{|{#1}\rangle}}
\newcommand\bk[2]{\mathinner{\langle{#1}|{#2}\rangle}}
$

#はじめに
はじめまして、物理学を専攻している大学生です。量子コンピューターに興味を持ち勉強しています。今回初めての投稿になりますが、よろしくお願いします。
今回は1量子ビットゲートゲートのうち、パウリゲートを説明したいと思います。最後に、動作をシミュレーションして確かめたいと思います。
参考にさせていただいた文献は以下になります。
1.[Michael A. Nielsen & Isaac L. Chuang 「Quantum Computation and Quantum Information」](http://mmrc.amss.cas.cn/tlb/201702/W020170224608149940643.pdf)
2.[「量子コンピューティング 基本アルゴリズムから量子機械学習まで」オーム社(2020年)](https://www.ohmsha.co.jp/book/9784274226212/)


#パウリゲート
はじめに、2つの基底 $\ket{0}$ と $\ket{1}$は以下のように表されます。


```math
\begin{align}
\ket{0}=
\left[
\begin{array}{cc}
1  \\
0  \\
\end{array}
\right]
,& &
\ket{1}=
\left[
\begin{array}{cc}
0 \\
1 \\
\end{array}
\right]
\tag{1}
\end{align}
```

1量子ビットゲートの基本的なゲート操作であるパウリゲートについて考えます。以下の行列で表現できます。

```math
\begin{eqnarray}
X=
\left[
\begin{array}{cc}
0 & 1 \\
1 & 0 \\
\end{array}
\right]
,& &
Y=
\left[
\begin{array}{cc}
0 & -i \\
i & 0 \\
\end{array}
\right]
,& &
Z=
\left[
\begin{array}{cc}
1 & 0 \\
0 & -1 \\
\end{array}
\right]
\tag{2}
\end{eqnarray}
```
これらのゲートがどのようなはたらきをするのか見てみます。まず$X$ゲートについてです。$X$ゲートを$\ket{0}$ と $\ket{1}$に作用させます。

```math
\begin{eqnarray}
X\ket{0}=
\left[
\begin{array}{cc}
0 & 1 \\
1 & 0 \\
\end{array}
\right]
\left[
\begin{array}{cc}
1  \\
0  \\
\end{array}
\right]
=
\left[
\begin{array}{cc}
0  \\
1  \\
\end{array}
\right]
=\ket{1}
\tag{3}
\end{eqnarray}
```

```math
\begin{eqnarray}
X\ket{1}=
\left[
\begin{array}{cc}
0 & 1 \\
1 & 0 \\
\end{array}
\right]
\left[
\begin{array}{cc}
0  \\
1  \\
\end{array}
\right]
=
\left[
\begin{array}{cc}
1  \\
0  \\
\end{array}
\right]
=\ket{0}
\tag{4}
\end{eqnarray}
```

よって$X$ゲートは量子コンピューター版のNOT演算のように作用します。$Z$ゲートについても同様の操作をしてみましょう。

```math
\begin{eqnarray}
Z\ket{0}=
\left[
\begin{array}{cc}
1  \\
0  \\
\end{array}
\right]
=\ket{0}
\tag{5}
\end{eqnarray}
```

```math
\begin{eqnarray}
Z\ket{1}=
-\left[
\begin{array}{cc}
0 \\
1  \\
\end{array}
\right]
=-\ket{1}
\tag{6}
\end{eqnarray}
```
$Z$ゲートは位相を反転させる操作だとわかります。最後に$Y$ゲートです。$Y=iXZ$となるので、ビット反転と位相反転を組み合わせた操作になります。

###さまざまな基底
ここまで、各ゲートのはたらきを見てきました。初めに勝手に$\ket{0}$と$\ket{1}$という基底を用意し、各性質を見てきたのですが、この基底が他のものではどうなるのでしょうか。ここでは別の基底について説明していきます。

まずは、先ほど使用した$\ket{0}$と$\ket{1}$の基底について考えてみます。式(5)と式(6)を見てみると線形代数で登場した、固有値と固有ベクトルの関係になっています。つまり、$Z$に対して、$\ket{0}$は固有値1に対応する固有ベクトル、$\ket{1}$は固有値-1に対応する固有ベクトルと見ることができます。$X$と$Y$に対しては、固有ベクトルになっていません。このような性質を持つので、$\ket{0}$と$\ket{1}$はZ基底と呼ばれます。

ではX基底とY基底がどのようなものか見てみましょう。先ほどのZ基底と同様に、固有値1と-1をもつ基底を設定します。

```math
\begin{eqnarray}
X\ket{+}
=(+1)\ket{+}
,& &
X\ket{-}
=(-1)\ket{-}
\tag{7}
\end{eqnarray}
```
```math
\begin{eqnarray}
Y\ket{+i}
=(+1)\ket{+i}
,& &
Y\ket{-i}
=(-1)\ket{-i}
\tag{8}
\end{eqnarray}
```
式(7)のように設定したものがX基底$\\{\ket{+},\ket{-}\\}$で、式(8)のように設定したものがY基底$\\{\ket{+i},\ket{-i}\\}$になります。これらとZ基底$\\{\ket{0},\ket{1}\\}$がどのような関係かは後ほど見ていきます。

###基底によるゲート表現
各パウリゲートの行列は式(1)で与えられていました。これをZ基底$\\{\ket{0},\ket{1}\\}$で表すことを考えてみます。はじめに、基底の内積が必要なので求めておきます。

```math
\begin{eqnarray}
\bk{0}{0}
=\left[
\begin{array}{cc}
1 & 0 \\
\end{array}
\right]
\left[
\begin{array}{c}
1 \\
0 \\
\end{array}
\right]
=1
,& &
\bk{1}{1}
=\left[
\begin{array}{cc}
0 & 1 \\
\end{array}
\right]
\left[
\begin{array}{c}
0 \\
1 \\
\end{array}
\right]
=1
\tag{9}
\end{eqnarray}
```

```math
\begin{eqnarray}
\bk{0}{1}
=\left[
\begin{array}{cc}
1 & 0 \\
\end{array}
\right]
\left[
\begin{array}{c}
0 \\
1 \\
\end{array}
\right]
=0
,& &
\bk{1}{0}
=\left[
\begin{array}{cc}
1 & 0 \\
\end{array}
\right]
\left[
\begin{array}{c}
0 \\
1 \\
\end{array}
\right]
=0
\tag{10}
\end{eqnarray}
```

よって$\bk{i}{j}=\delta_{ij}$の性質があります。では$Z$について、基底による表現を考えてみます。$\ket{0}$は$\ket{0}$のまま、$\ket{1}$は$-\ket{1}$に変換するという性質なので、以下の式で表すことができます。

```math 
\begin{eqnarray}
Z=\ket{0}\bra{0} - \ket{1}\bra{1}
\tag{11}
\end{eqnarray}
```

実際に行列表現と同じはたらきをしていることを確認してみましょう。

```math
\begin{eqnarray}
Z\ket{0} 
&=& (\ket{0}\bra{0} - \ket{1}\bra{1})\ket{0} \nonumber \\
&=& \ket{0}\bk{0}{0} - \ket{1}\bk{1}{0} \nonumber \\
&=& \ket{0}
\tag{12}
\end{eqnarray}
```

```math
\begin{eqnarray}
Z\ket{1} 
&=& (\ket{0}\bra{0} - \ket{1}\bra{1})\ket{1} \nonumber \\
&=& \ket{0}\bk{0}{1} - \ket{1}\bk{1}{1} \nonumber \\
&=& -\ket{1}
\tag{13}
\end{eqnarray}
```

また、行列表現でも確認することができます。

```math 
\begin{eqnarray}
\ket{0}\bra{0} - \ket{1}\bra{1} 
&=& \left[
\begin{array}{c}
1 \\
0 \\
\end{array}
\right]
\left[
\begin{array}{cc}
1 & 0\\
\end{array}
\right]
-
\left[
\begin{array}{c}
0 \\
1 \\
\end{array}
\right]
\left[
\begin{array}{cc}
0 & 1\\
\end{array}
\right] \nonumber \\
&=&
\left[
\begin{array}{cc}
1 & 0 \\
0 & 0 \\
\end{array}
\right] 
-
\left[
\begin{array}{cc}
0 & 0 \\
0 & 1 \\
\end{array}
\right]
\nonumber \\
&=& 
\left[
\begin{array}{cc}
1 & 0 \\
0 & -1 \\
\end{array}
\right] \nonumber \\
&=&Z
\tag{14}
\end{eqnarray}
```
$X$ゲートは$\ket{0}$を$\ket{1}$に変換し、$\ket{1}$を$\ket{0}$に変換するので、以下の式で書けることが分かります。

```math
\begin{eqnarray}
X=\ket{0}\bra{1}+\ket{1}\bra{0}
\tag{15}
\end{eqnarray}
```

###基底間の関係
先ほど、基底は固有ベクトルになっているというお話でした。つまり、線形代数で習った固有値を求める一連の流れを行ってみましょう。固有値を$\lambda$、固有ベクトルを$\ket{\psi}$とします。なお、固有ベクトルは大きさ1に規格化します。まずはX基底からです。

```math
\begin{eqnarray}
det(X-\lambda I) &=& 0  \nonumber \\
det \left(
\begin{array}{cc}
    -\lambda & 1  \\
    1 & -\lambda \\
\end{array}
\right) & = & 0 \nonumber \\
\lambda &=& \pm1
\tag{16}
\end{eqnarray}
```

このように、きちんと+1と-1の固有値がでてきました。固有ベクトルを求めてみましょう。
$\lambda=1$のとき

```math
\begin{eqnarray}
X-\lambda I =
\left[
\begin{array}{cc}
    -1 & 1 \\
    1 & -1
\end{array}
\right]
\Rightarrow
\ket{\psi}=\frac{1}{\sqrt{2}}\left[
\begin{array}{c}
1 \\
1 \\
\end{array}
\right]
(=\ket{+})
\tag{17}
\end{eqnarray}
```

$\lambda=-1$のとき

```math
\begin{eqnarray}
X-\lambda I =
\left[
\begin{array}{cc}
    1 & 1 \\
    1 & 1
\end{array}
\right]
\Rightarrow
\ket{\psi}=\frac{1}{\sqrt{2}}\left[
\begin{array}{c}
1 \\
-1 \\
\end{array}
\right]
(=\ket{-})
\tag{18}
\end{eqnarray}
```

上記のように、固有ベクトルを求めることでX基底が分かります。これをZ基底の$\ket{0}$と$\ket{1}$で表しましょう。

```math
\begin{eqnarray}
\ket{+}=\frac{1}{\sqrt{2}}(\ket{0}+\ket{1}) \tag{19}\\
\ket{-}=\frac{1}{\sqrt{2}}(\ket{0}-\ket{1}) \tag{20}
\end{eqnarray}
```

同様の手続きを行うことでY基底は以下のようになります。

```math
\begin{eqnarray}
\ket{+i}=\frac{1}{\sqrt{2}}(\ket{0}+i\ket{1}) \tag{21}\\
\ket{-i}=\frac{1}{\sqrt{2}}(\ket{0}-i\ket{1}) \tag{22}
\end{eqnarray}
```

#動作確認
[julia](https://julialang.org/)という言語を使用して、パウリゲートの働きを確認してみます。

###実装
各ゲートをZ基底で表現した形を用います。式(11)と式(15)を参照します。$Y$ゲートに関しては$Y=iXZ$の関係があるので、これを用います。各ゲートの実装です。

```julia
function ini(a,b)
    ket0 = [1 0]'
    ket1 = [0 1]'
    psi = a*ket0 + b*ket1
    return psi
end
function Xgate(psi)
    X =  ini(1,0) * ini(0,1)' +  ini(0,1) * ini(1,0)'
    psi = X * psi
    return psi
end
function Zgate(psi)
    Z = ini(1,0) * ini(1,0)' - ini(0,1) * ini(0,1)'
    psi = Z * psi
    return psi
end
function Ygate(psi)
    psi = im * Xgate(Zgate(psi)) 
    return psi
end
```

次に、具体的に初期状態にゲート操作を施してみましょう。
1.$X\ket{0}=\ket{1}$の確認

```julia
psi = ini(1,0)
psi = Xgate(psi)
```

結果は以下のようになり、きちんと動作していることが確認できました。

```
2×1 Array{Int64,2}:
 0
 1
```

2.$Y\ket{1}=-i\ket{0}$の確認

```julia
psi = ini(0,1)
psi = Ygate(psi)
```

結果は以下のようになり、これも正しく動作することが確認できました。

```
2×1 Array{Complex{Int64},2}:
 0 - 1im
 0 + 0im
```

#おわりに
今回は1量子ビットゲートであるパウリゲートについて説明してきました。簡単なものですが、シミュレーションでゲートが正しく作用することが確認できました。次回は1量子ビットゲートのうち、アダアールゲートや位相回転ゲートを取り扱いたいと思います。