量子計算理論(森前 著) の演習問題を解く part1.1

こんにちは。Kumaです。

最近、量子コンピュータについて勉強しています。
今回は有名な以下の本も参考に、コントロールゲート(トフォリゲート含む)を直感的に理解してみます。
f:id:phymath1991:20181224165540p:plain
量子計算理論 量子コンピュータの原理 | 森北出版株式会社

量子ビットのコントロールNOTゲート

コントロールNOTゲート、あるいは制御NOTゲートとは二量子ビットの系

 |q_{1} q_{0} \rangle , q_{0,1} \in \{0,1\}^{2}
に対して

制御ビット q_{1} が1であるときにのみ標的ビットq_{0}を反転させるようなゲート演算CNOTです。
すなわち、

 CNOT |0 0 \rangle = |0 0 \rangle \\
 CNOT |0 1 \rangle = |0 1 \rangle \\
 CNOT |1 0 \rangle = |1 1 \rangle \\
 CNOT |1 1 \rangle = |1 0 \rangle \\
です。
CNOTは次のようにかけます。

 CNOT = |0 \rangle \langle 0| \otimes I +  |1 \rangle \langle 1| \otimes NOT

この記事では、これを納得しましょう!

演算子表現に納得するには


 CNOT = |0 \rangle \langle 0| \otimes I +  |1 \rangle \langle 1| \otimes NOT
は一見よくわからない表式にみえます。
これを納得するには、自分で作ってみればよいです。

まず制御bitが0か1かで動作が変わるのだから、制御ビットの情報をなんとかして抜く必要がありますね。
それには 、制御bitについて \langle 1| との内積を取ればいいのです。
直交性から、制御bitが |0 \rangleのときには0,  |1 \rangleのときには1が得られます。

しかし \langle 1| というのはベクトルであって、演算子ではありません。
演算子であるためには、 |1 \rangle \langle 1| のようにする必要があります。
これは |1 \rangle 方向への射影演算子と呼ばれるものです。

これで、制御bitが |0 \rangleのときには0,  |1 \rangleのときには  |1 \rangleが得られます。
制御bitの0/1に応じて、標的bitのほうにはNOTを作用させたりさせなかったりするのだから、NOTとテンソル積をとってみます。

CNOT (?) = |1 \rangle \langle 1| \otimes NOT
としてみましょう。
作用は、

CNOT (?) | 1 0 \rangle = ( |1 \rangle \langle 1| \otimes NOT) | 1 0 \rangle  = |1 1 \rangle
となりました。おお!うまくいっていますね!

でも実はまだ今ひとつです。制御bitが0だと

CNOT (?) | 0 1 \rangle = ( |1 \rangle \langle 1| \otimes NOT) | 0 1 \rangle  = 0
となるので状態が消えてしまいました。制御bitの直交性を利用して作ったので当然そうなります。
どうすればいいでしょうか。制御bitが0のときは入力がそのまま出てきてほしいので、
 |0 \rangle \langle 0|  と  Iテンソル積を取るとよいでしょう。

これをさっきのやつに足してみると

CNOT (??) =  ( |0 \rangle \langle 0| \otimes I) + ( |1 \rangle \langle 1| \otimes NOT)
です。作用をみてみると、

CNOT (??)| 0 1 \rangle =  ( |0 \rangle \langle 0| \otimes I)| 0 1 \rangle + ( |1 \rangle \langle 1| \otimes NOT) | 0 1 \rangle \\
=| 0 1 \rangle + 0 \\
=| 0 1 \rangle
よって、制御bitが0のときにちゃんと入力がそのまま出てくるようになりました。

制御bitが1のときの動作も変わりないでしょうか?確かめてみましょう。

CNOT (??)| 1 0 \rangle =  ( |0 \rangle \langle 0| \otimes I)| 1 0 \rangle + ( |1 \rangle \langle 1| \otimes NOT) | 1 0 \rangle \\
=0 +  | 1 1 \rangle \\
=| 1 1 \rangle
変わりなくうまくいっていますね!
制御bitが1のときと0のときの動作を独立に考えて、それを足しただけなのにうまくいきました*1
この表式こそ、理解したかったCNOTの表式そのものですね!


 CNOT = |0 \rangle \langle 0| \otimes I +  |1 \rangle \langle 1| \otimes NOT

量子ビットのコントロールNOTゲート

量子ビットのコントロールNOTも、楽勝で作れます。
まず制御bitが1つで、標的bitが2つの場合を考えますと、

 CNOT = |0 \rangle \langle 0| \otimes I  \otimes I +  |1 \rangle \langle 1| \otimes NOT \otimes NOT
となることが容易に予想できるでしょう。
制御bitが1つで標的bitが1つ(真ん中のbitとします)、最後のbitは何も関与しない場合*2

 CNOT = |0 \rangle \langle 0| \otimes I  \otimes I +  |1 \rangle \langle 1| \otimes NOT \otimes I
です。

少しむずかしいのは制御bitが2つのパターンです。ここで制御bitは左側の2bitとします。
両方の制御bitが1のときだけ標的bitを反転させる場合を作ってみましょう。 |11 \rangle への射影を考えるのがポイントです。

 CNOT = |00 \rangle \langle 00|  \otimes I +  |01 \rangle \langle 01|  \otimes I + |10 \rangle \langle 10|  \otimes I + |11 \rangle \langle 11|  \otimes NOT
ふむふむ。これはよくみると納得できると思います。

しかし更に、これは別の表現もできます。ここがポイント。

 CNOT =  (I \otimes I -|11 \rangle \langle 11|) \otimes I + |11 \rangle \langle 11|  \otimes NOT

何が起こったのかわからないみなさん、大丈夫です。私も一見わかりませんでした!

ここは射影演算子の「完全性」と呼ばれる性質を使いました。それは、以下の関係式です。
1量子ビット系では

 I =  |0 \rangle \langle 0| +   |1 \rangle \langle 1|
2量子ビット系では

 I \otimes I =  |00 \rangle \langle 00| +   |01 \rangle \langle 01| + |10 \rangle \langle 10| +   |11 \rangle \langle 11|
です。直感的には「量子状態を各基底に射影して分解したあとに全部足し合わせると元に戻るので、射影演算子の和は恒等演算子といえる」 

完全性を適応すると、先程の変な表式もすぐわかると思います!
ちなみにこれがトフォリゲートでした。

コントロールUゲート

一般に、標的bitに作用させるのはNOTでなくてもいいはずです。
任意のユニタリゲートを作用させるものを単にコントロールゲートといいます。


さて、だいぶゲートの作り方がわかってきましたかね。
ここらへんはいちいち検索して調べると忙しいので、直感的に理解しておくこと、慣れることは重要そうです。*3
今回はここまで。

*1:一般にうまくいくわけではない

*2:これは単に二量子ビットのコントロールNOTと同じ

*3:私も勉強始めたばかりなので確証はありません