1量子ビットゲート(アダマール、位相ゲート)

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

#はじめに
前回は1量子ビットゲートゲートのうち、パウリゲートを説明しました。今回は、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/)
3.[「量子情報工学」森北出版(2016年)](https://www.morikita.co.jp/books/book/3109)

#アダマールゲート

早速、アダマールゲートの行列表現を見てみましょう。

```math
\begin{eqnarray}
H=\frac{1}{\sqrt{2}}
\left[
\begin{array}{cc}
1 & 1 \\
1 & -1 \\
\end{array}
\right]
\tag{1}
\end{eqnarray}
```

前回同様、Z基底で表現すると以下のようになります。

```math
\begin{eqnarray}
H=\frac{1}{\sqrt{2}}
\left(
\ket{0}\bra{0}+\ket{1}\bra{0}+\ket{0}\bra{1}-\ket{1}\bra{1}
\right)
\tag{2}
\end{eqnarray}
```

アダマールゲートがどのようなはたらきをするのか見てみます。$H$ゲートを$\ket{0}$ と $\ket{1}$に作用させます。

```math
\begin{eqnarray}
H\ket{0}
=
\frac{1}{\sqrt{2}}
\left[
\begin{array}{cc}
1  \\
1  \\
\end{array}
\right]
=\frac{1}{\sqrt{2}}
\left(
\ket{0}+\ket{1}
\right)
\tag{3}
\end{eqnarray}
```

```math
\begin{eqnarray}
H\ket{1}
=
\frac{1}{\sqrt{2}}
\left[
\begin{array}{cc}
1  \\
-1  \\
\end{array}
\right]
=\frac{1}{\sqrt{2}}
\left(
\ket{0}-\ket{1}
\right)
\tag{4}
\end{eqnarray}
```

よって$H$ゲートは0と1の重ね合わせ状態を作ることが分かります。また、アダマールゲートを使うと、$X$ゲートと$Z$ゲートを相互に変換できます。これは行列計算をする、またはゲートの基底表示を計算することで導くことができます。

```math
\begin{eqnarray}
HXH=Z , HZH=X
\tag{5}
\end{eqnarray}
```

#位相回転ゲート
次に位相回転ゲートを考えてみます。位相回転ゲートは次のように定義されます。

```math
\begin{eqnarray}
Q(\phi)=
\left[
\begin{array}{cc}
    1 & 0 \\
    0 & e^{i\phi}
\end{array}
\right]
=\ket{0}\bra{1}+e^{i\phi}\ket{1}\bra{1}
\tag{6}
\end{eqnarray}
```

つまり位相回転ゲートは$\ket{1}$状態の位相を$i\phi$だけずらす操作だとわかります。$Z$ゲートは$\phi=\pi$とした特殊な場合と見ることもできます。

```math
\begin{eqnarray}
Q(\pi)=
\left[
\begin{array}{cc}
    1 & 0 \\
    0 & -1
\end{array}
\right]
=Z
\tag{7}
\end{eqnarray}
```

特に$\phi=\pi/2$と$\phi=\pi/4$としたものはそれぞれ$S$ゲート、$T$ゲートと呼ばれます。

```math
\begin{eqnarray}
S=Q(\frac{\pi}{2})=
\left[
\begin{array}{cc}
    1 & 0 \\
    0 & i
\end{array}
\right]
=\ket{0}\bra{1}+i\ket{1}\bra{1}
\tag{8}
\end{eqnarray}
```

```math
\begin{eqnarray}
T=Q(\frac{\pi}{4})=
\left[
\begin{array}{cc}
    1 & 0 \\
    0 & \frac{1+i}{\sqrt{2}}
\end{array}
\right]
=\ket{0}\bra{1}+\frac{1+i}{\sqrt{2}}\ket{1}\bra{1}
\tag{9}
\end{eqnarray}
```

#動作確認
アダマールゲートと位相回転ゲートのはたらきを、シミュレーションしてみます。言語はjuliaを用いています。まずは必要な関数を定義していきます。

- ini0関数でZ基底を用意
- ini関数でZ基底での一般の初期状態を用意
- $X$ゲートと$Z$ゲート、アダマールゲート、位相回転ゲートをini0関数を用いて定義
- $S$ゲートと$T$ゲートは式(8)と式(9)を使って定義

```julia
function ini0(a,b)
    ket0 = [1 0]'
    ket1 = [0 1]'
    psi = a*ket0 + b*ket1
    return psi
end

function ini()
    #0,1 base
    ket0 = [1 0]'
    ket1 = [0 1]'

    #initial state
    a=rand()
    b=1-a
    a1=rand(Uniform(0,a))
    a2=a-a1
    b1=rand(Uniform(0,b))
    b2=b-b1

    psi = (sqrt(a1)+im*sqrt(a2))*ket0 + (sqrt(b1)+im*sqrt(b2))*ket1
    return psi
end

#X_gate
function Xgate(psi)
    X =  ini0(1,0) * ini0(0,1)' +  ini0(0,1) * ini0(1,0)'
    psi = X * psi
    return psi
end

#Z_gate
function Zgate(psi)
    Z = ini0(1,0) * ini0(1,0)' - ini0(0,1) * ini0(0,1)'
    psi = Z * psi
    return psi
end

#hadamard_gate
function Hgate(psi)
    H = 1/sqrt(2) * (ini0(1,0) * ini0(1,0)' + ini0(0,1) * ini0(1,0)' + ini0(1,0) * ini0(0,1)' - ini0(0,1) * ini0(0,1)')
    psi = H * psi
    return psi
end

#phase_gate
function Qgate(psi,phi)
    Q = ini0(1,0) * ini0(1,0)' + exp(im*(phi)) * ini0(0,1) * ini0(0,1)' 
    psi = Q * psi
    return psi
end

#S_gate
Sgate(psi) = Qgate(psi,pi/2)

#T_gate
Tgate(psi) = Qgate(psi,pi/4)
```

1.$T\ket{1}=\frac{1+i}{\sqrt{2}}\ket{1}$の確認

```julia
psi = ini0(0,1)
psi = Tgate(psi)
```
実行結果は以下のようになり、動作を確認できました。

```
2×1 Array{Complex{Float64},2}:
                0.0 + 0.0im
 0.7071067811865476 + 0.7071067811865475im
```

2.$HXH\ket{\psi}=Z\ket{\psi}$の確認
初期状態$\ket{\psi}$に$HXH$と$Z$を作用させたときの状態を比較します。各々状態を$\ket{\psi_1}$と$\ket{\psi_2}$としています。

```julia
psi = ini()
psi1 = copy(psi)
psi2 = copy(psi)
psi1 = Hgate(Xgate(Hgate(psi1)))
psi2 = Zgate(psi2)
println(psi1)
println(psi2)
```

実行結果は以下のようになり、結果が一致していることを確かめられました。

```
Complex{Float64}[0.7593834157482464 + 0.5913499159687791im; -0.135926404468029 - 0.23487468432897862im]
Complex{Float64}[0.7593834157482465 + 0.5913499159687792im; -0.135926404468029 - 0.23487468432897862im]
```


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