はじめに
ゲート型量子コンピュータの量子回路を学習しようと思ったところ、回路図だけではどうなるのかわからず、式があった方がわかりやすいと感じた。とはいえ式も説明の目的・観点によって色々な表現があり、どういう場合にどんな表現を使えばいいのかよくわからない。
というわけで、まずは基本のCNOTゲートの表現を比べてみようと思う。
対象読者
自分用。
用語や内容が正確でないかもしれないし、細かい説明もしていない。
結論
以下の式で演算子を表すのが便利そうだと思った。
CNOTゲートの演算子 = |0\rangle\langle 0|I \otimes I + |1\rangle\langle 1|I \otimes X
CNOTゲートとは
制御ノットゲート、コントロールノットゲートと呼ばれる。表記もCXと書く場合がある。
制御ビット(コントロールビット)と標的ビット(ターゲットビット)の2量子ビットからなる量子ゲートで、制御ビットが $|1\rangle$ のとき標的ビットにXゲートを適用する。入力の制御ビット、標的ビットとも重ね合わせの場合がある。
CNOTゲートの表現
1.回路図
|c> ----*---- |c>
|
|t> ----X---- |t'>
2量子ビット間をつないでいるのがCNOTゲート。
図で書くと、大抵は*の部分は黒の点、Xの部分は$\oplus$記号になっている。
入力は2量子ビットで、(* がある)制御ビットと(X がある)標的ビット。
出力も2量子ビット。
- 制御ビットは入力がそのまま出力される。
- 標的ビットは、制御ビットが $|1\rangle$ のときXゲートを適用した状態になり、一般的に $|t'\rangle = |c\oplus t\rangle$ と書く。($\oplus$ はビットの排他的論理和(XOR))
回路図の入力に具体的な基底状態を入れると以下のようになる。
(1)制御ビットが|0>のとき
(1-1)標的ビットが |0> (1-2)標的ビットが |1>
|0> ----*---- |0> |0> ----*---- |0>
| |
|0> ----X---- |0> |1> ----X---- |1>
(2)制御ビットが|1>のとき
(2-1)標的ビットが |0> (2-2)標的ビットが |1>
|1> ----*---- |1> |1> ----*---- |1>
| |
|0> ----X---- |1> |1> ----X---- |0>
感想
動きはシンプルで4パターンだけなので最初の回路図だけで動きが想像できるので、これだけ見るのなら十分そう。
しかし入力が $|0\rangle、|1\rangle$の基底状態ではなく重ね合わせ状態になると、図だけで考えるのが難しくなる。さらにこの後別の量子ゲートを適用することを考えると、個人的には回路図だけで状態を追っていくのは無理。(回路図は量子回路を実装するためのものではないか)
|c\rangle = c_0|0\rangle + c_1|1\rangle \\
|t\rangle = t_0|0\rangle + t_1|1\rangle \\
|t'\rangle = |c\oplus t\rangle
というわけで、他の表現も理解したいというのがこの記事の発端。
2.真理値表
CNOTゲートの真理値表を一般形で書くと、以下のように排他的論理和(XOR)で書ける。
入力1 (|c>) |
入力2 (|t>) |
出力1 (|c>) |
出力2 (|t'>) |
---|---|---|---|
|c> | |t> | |c> | |c$\oplus$t> |
入力に具体的な基底状態を入れると、出力2は確かに入力1と入力2の排他的論理和になっている。
入力1 (|c>) |
入力2 (|t>) |
出力1 (|c>) |
出力2 (|t'>) |
---|---|---|---|
|0> | |0> | |0> | |0> |
|0> | |1> | |0> | |1> |
|1> | |0> | |1> | |1> |
|1> | |1> | |1> | |0> |
感想
わかりやすい。
とはいえ、CNOTゲート自体の動きの説明としてはいいが、量子回路の流れを追う中でこれをずっと書いていくのはどうなんだろう?
3.演算子行列(テンソル)
CNOTゲートはテンソル積のベクトルに対する演算子の行列として書ける。
CNOTゲート =
\left(\begin{matrix}1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{matrix}\right)
どうやってこれが出るのだろう。
まずは基底状態の2量子ビットから2階のテンソル積のベクトルを作る。
|c\rangle\otimes|t\rangle
= (c_0|0\rangle + c_1|1\rangle)\otimes(t_0|0\rangle + t_1|1\rangle)
= \left(\begin{matrix}c_0t_0 \\ c_0t_1 \\ c_1t_0 \\ c_1t_1\end{matrix}\right)
\begin{matrix}…|00\rangle \\ …|01\rangle \\ …|10\rangle \\ …|11\rangle \end{matrix}
CNOTゲートはベクトルを次のように変換する。
\begin{matrix}|00\rangle \\ |01\rangle \\ |10\rangle \\ |11\rangle\end{matrix}
→CNOTゲート→
\begin{matrix}|00\rangle \\ |01\rangle \\ |11\rangle \\ |10\rangle\end{matrix}
CNOTゲートを4列のベクトルから4列のベクトルに変換する4 x 4行列と考えると次のようになる。
CNOTゲート =
\left(\begin{matrix}1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{matrix}\right)
ちゃんとは理解できていないのだが、列は入力のテンソル積ベクトルに対応し、行は出力のテンソル積ベクトルに対応している気がする。
例えば4行3列の"1"は、入力がベクトルの3要素目($|10\rangle$)の場合、出力はベクトルの4要素目($|11\rangle$)になる。逆かな?よくわからない。
試しに $|10\rangle$ (ベクトルの3要素目)をCNOTゲートの行列で変換してみる。
\left(\begin{matrix}1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{matrix}\right)
\left(\begin{matrix}0 \\ 0 \\ 1 \\ 0\end{matrix}\right)
=
\left(\begin{matrix}0 \\ 0 \\ 0 \\ 1\end{matrix}\right)
3要素目の$|10\rangle$が4要素目の$|11\rangle$に変換された。
ベクトルの要素は(テンソル積の要素の)確率振幅を表すので、値は1に限らず重ね合わせ状態も変換できる(気がする)。
感想
演算子行列は真理値表を基底状態で展開したものをそのまま行列にしたような感じだろうか。しかし行列は行列同士で計算できるのがメリット。この後に他の量子ゲートの演算子が適用されても行列の積で計算を進めていけるのはいい感じ。
4.ブラケット式(計算)
書き方がいまいちでどうしたらいいのかよくわからないが、とりあえず。
CNOTゲートは制御ビットが $|1\rangle$ のとき標的ビットにXゲートを適用する。
\begin{align}
& CNOT(|c\rangle \otimes |t\rangle) \\
& = CNOT((c_0|0\rangle + c_1|1\rangle) \otimes |t\rangle) \\
& = c_0|0\rangle \otimes |t\rangle + c_1|1\rangle \otimes X|t\rangle
\end{align}
うーん、表現というよりは計算そのものになっている。
実際に計算してみる。
まず$|c\rangle$と$|t\rangle$をそれぞれ重ね合わせ状態で用意する。
|c\rangle = c_0|0\rangle + c_1|1\rangle \\
|t\rangle = t_0|0\rangle + t_1|1\rangle \\
量子ビットのテンソル積を作って、CNOTゲートを適用する。
\begin{align}
& |c\rangle \otimes |t\rangle \\
& = (c_0|0\rangle + c_1|1\rangle) \otimes |t\rangle \\
& = c_0|0\rangle \otimes |t\rangle + c_1|1\rangle \otimes |t\rangle\\
& CNOTゲートを適用(制御ビットが|1\rangleのとき標的ビットにXゲートを適用) \\
& c_0|0\rangle \otimes |t\rangle + c_1|1\rangle \otimes X |t\rangle\\
& = c_0|0\rangle \otimes (t_0|0\rangle + t_1|1\rangle) + c_1|1\rangle \otimes X (t_0|0\rangle + t_1|1\rangle) \\
& = c_0|0\rangle \otimes (t_0|0\rangle + t_1|1\rangle) + c_1|1\rangle \otimes (t_0|1\rangle + t_1|0\rangle) \\
& = c_0t_0|0\rangle\otimes|0\rangle + c_0t_1|0\rangle\otimes|1\rangle + c_1t_0|1\rangle\otimes|1\rangle + c_1t_1|1\rangle\otimes|0\rangle \\
& = c_0t_0|00\rangle + c_0t_1|01\rangle + c_1t_0|11\rangle + c_1t_1|10\rangle
\end{align}
量子ビットを展開したり、テンソル積の性質を使ったり、表記の変換を使ったりで、まさしく計算という感じ。
さて $|10\rangle$ にCNOTゲートを適用してみよう。
\begin{align}
& |10\rangle \\
& = |1\rangle\otimes|0\rangle \\
& = (0|0\rangle + 1|1\rangle)\otimes(1|0\rangle + 0|1\rangle) \\
& つまり c_0 = 0, c_1 = 1, t_0 = 1, t_1 = 0 \\
& 上記の最後の式に入れると |11\rangle になる。
\end{align}
行列演算で計算した結果と同じになったので合ってるようだ。
感想
計算だね。
制御ビットを展開して確率振幅の変数が見えてるのがいまいちな感じ。
5.ブラケット式(ブラケット表記)
さらによくわかっていないが書いてみる。
\begin{align}
& CNOT(|c\rangle \otimes |t\rangle) \\
& = |0\rangle\langle 0|c\rangle \otimes I |t\rangle + |1\rangle\langle 1|c\rangle \otimes X |t\rangle
\end{align}
うーん。よくわからん(笑)
計算してみる。
\begin{align}
& |0\rangle\langle 0|c\rangle \otimes I |t\rangle + |1\rangle\langle 1|c\rangle \otimes X |t\rangle \\
& = |0\rangle\langle 0|(c_0|0\rangle + c_1|1\rangle)\otimes I|t\rangle + |1\rangle\langle 1|(c_0|0\rangle + c_1|1\rangle)\otimes X|t\rangle \\
& = (c_0|0\rangle\langle 0|0\rangle + c_1|0\rangle\langle 0|1\rangle)\otimes I|t\rangle + (c_0|1\rangle\langle 1|0\rangle + c_1|1\rangle\langle 1|1\rangle)\otimes X|t\rangle
& = (c_0|0\rangle + c_1|0\rangle\langle 0|1\rangle)\otimes I|t\rangle + (c_0|1\rangle\langle 1|0\rangle + c_1|1\rangle\langle 1|1\rangle)\otimes X|t\rangle \\
& = (c_0|0\rangle)\otimes I|t\rangle + (c_1|1\rangle)\otimes X|t\rangle \\
& = c_0|0\rangle \otimes |t\rangle + c_1|1\rangle \otimes X|t\rangle
\end{align}
ブラケットのかけ算とか、ベクトルの内積とか、単位行列Iは掛けても変わらないとかの性質を使ってるが、なんか計算できてる。
とりあえず、4.ブラケット式(計算)の最初の式と同じになったので合ってるっぽい。
$|0\rangle$ の確率振幅の変数を出すかわりに、$|0\rangle\langle 0|$ で $|0\rangle$ の確率振幅を取り出せるのかな? 正規直交基底の内積の性質($\langle 0|0\rangle = \langle 1|1\rangle = 1, \langle 0|1\rangle = \langle 1|0\rangle = 0$)を利用して、計算をせずに項が消えていくのが楽。
感想
式が何を表すのか理解できれば表現がシンプルでよい。ブラケットのまま計算できるし。問題は「式が何を表すのか理解」できないことだな(笑)
6.ゲート演算子のテンソル積
5.をもう少し考えてみる。
CNOTゲートは
- 1ビット目は制御ビット、2ビット目標的ビット
- 制御ビットが $|0\rangle$ のとき、制御ビットに何もしない、標的ビットに何もしない
- 制御ビットが $|1\rangle$ のとき、制御ビットに何もしない、標的ビットにXゲートを適用
「制御ビットが $|0\rangle$ のとき」は「$|0\rangle\langle 0|$」で表せる。
「なにもしない」はIゲート(単位行列)をかけることで表せる。
制御ビットと標的ビットのテンソル積を考えると、それに適用するCNOTゲートの演算子は以下のようになりそう。
CNOTゲート = |0\rangle\langle 0|I \otimes I + |1\rangle\langle 1|I \otimes X
読み方は、
- 1ビット目が$|0\rangle$のとき、1ビット目にIゲート、2ビット目にIゲートを適用する。
- 1ビット目が$|1\rangle$のとき、1ビット目にIゲート、2ビット目にXゲートを適用する。
何かの本にこんな式が出てた気がするけど、やっとわかった気がする。
一応計算してみる。
\begin{align}
& CNOTゲート \\
& = |0\rangle\langle 0|I \otimes I + |1\rangle\langle 1|I \otimes X \\
& = \left(\begin{matrix}1 \\ 0\end{matrix}\right) \left(\begin{matrix}1 & 0\end{matrix}\right) I \otimes I +
\left(\begin{matrix}0 \\ 1\end{matrix}\right) \left(\begin{matrix}0 & 1\end{matrix}\right) I \otimes X \\
& = \left(\begin{matrix}1 & 0 \\ 0 & 0\end{matrix}\right) I \otimes I +
\left(\begin{matrix}0 & 0\\0 & 1\end{matrix}\right) I \otimes X \\
& = \left(\begin{matrix}1 & 0 \\ 0 & 0\end{matrix}\right) \otimes I +
\left(\begin{matrix}0 & 0\\0 & 1\end{matrix}\right) \otimes X \\
& = \left(\begin{matrix}1\cdot I & 0\cdot O \\ 0\cdot O & 0\cdot O\end{matrix}\right) +
\left(\begin{matrix}0\cdot O & 0\cdot O\\0\cdot 0 & 1\cdot X\end{matrix}\right) \\
& = \left(\begin{matrix}1\cdot I & 0\cdot O \\ 0\cdot O & 1\cdot X\end{matrix}\right) \\
& = \left(\begin{matrix}\left(\begin{matrix}1 & 0\\0 & 1\end{matrix}\right) & \left(\begin{matrix}0 & 0\\0 & 0\end{matrix}\right) \\ \left(\begin{matrix}0 & 0\\0 & 0\end{matrix}\right) & \left(\begin{matrix}0 & 1\\1 & 0\end{matrix}\right) \end{matrix}\right) \\
& = \left(\begin{matrix}1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{matrix}\right)
\end{align}
3.に書いたCNOTゲートの行列になった。
5.の式は
|c\rangle \otimes |t\rangle
に
CNOTゲート = |0\rangle\langle 0|I \otimes I + |1\rangle\langle 1|I \otimes X
を適用して以下のようになっている。
(単位行列Iは掛けても何もしないので消してもよい)
\begin{align}
& CNOT(|c\rangle \otimes |t\rangle) \\
& = |0\rangle\langle 0|I |c\rangle \otimes I |t\rangle + |1\rangle\langle 1|I |c\rangle \otimes X |t\rangle \\
& = |0\rangle\langle 0||c\rangle \otimes I |t\rangle + |1\rangle\langle 1||c\rangle \otimes X |t\rangle \\
& = |0\rangle\langle 0|c\rangle \otimes I |t\rangle + |1\rangle\langle 1|c\rangle \otimes X |t\rangle
\end{align}
最後に
本を読んでてもいまいち実感できなかったが、計算してみたら納得できた。
個人的にはやってみてよかった。