$\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」
2.「量子コンピューティング 基本アルゴリズムから量子機械学習まで」オーム社(2020年)
3.「量子情報工学」森北出版(2016年)
#アダマールゲート
早速、アダマールゲートの行列表現を見てみましょう。
\begin{eqnarray}
H=\frac{1}{\sqrt{2}}
\left[
\begin{array}{cc}
1 & 1 \\
1 & -1 \\
\end{array}
\right]
\tag{1}
\end{eqnarray}
前回同様、Z基底で表現すると以下のようになります。
\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}$に作用させます。
\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}
\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$ゲートを相互に変換できます。これは行列計算をする、またはゲートの基底表示を計算することで導くことができます。
\begin{eqnarray}
HXH=Z , HZH=X
\tag{5}
\end{eqnarray}
#位相回転ゲート
次に位相回転ゲートを考えてみます。位相回転ゲートは次のように定義されます。
\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$とした特殊な場合と見ることもできます。
\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$ゲートと呼ばれます。
\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}
\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)を使って定義
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}$の確認
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}$としています。
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量子ビットゲートを取り扱いたいと思います。