量子誤り訂正の話

前回IBM量子コンピュータで量子アルゴリズムを実行してみた記事を投稿してみましたが結果のグラフを見てちょっと気になった人はいなかったでしょうか.

f:id:kadora:20160910223325j:plain これが前回の結果のグラフなんですが理論的に正しい結果としてはこのアルゴリズムだと0010が確率1で得られることになっています. f:id:kadora:20160911024808j:plain 実際こちらのグラフが前回のアルゴリズムをIdealQuantumProcessorでシミュレートした時の結果です.2つの結果を見比べてみると前回の方はシミュレート通りの結果が得られる確率は0.873となっています.

……なんかえらく正しい結果が得られる確率低くない?と思った人もいるでしょう.実はこの辺りが現在の量子コンピュータの弱点の一つでqubitは非常にノイズに弱いのです.そのためノイズに邪魔され正しい量子状態ではなくなり最終的に得られる結果も正しい結果が得られなくなってしまうのです.

今回はこのような現象に対する対策の一つである量子誤り訂正について話します.

誤り訂正

古典の世界でも誤り訂正の技術というものは存在します.特に昔,今よりも通信回線の品質が良くなかった時代には0を送ったはずなのに受信者が受け取るときには1になっていた,ということが今よりも頻繁に発生していました.その時に受信者が送られてきたデータが本当はなんなのかということを復元するための技術,それが誤り訂正の技術です.

古典の世界で用いられる誤り訂正の技術にはハミング符号や巡回符号などの種類があります.これらにより実際にある程度ノイズによる誤りが発生したとしても誤りがある程度であれば受信者は受け取ったデータのみを用いてその誤りを訂正し,真に送られてきたデータを復元することが出来ます.

しかしこれらの誤り訂正の技術は古典の環境を前提としているため,そのままqubitに応用しようとしてもqubitの重ねあわせの状態というものを全く考えていないためうまくいきません.そこでqubit用の誤り訂正技術である量子誤り訂正というものが考案されました.

量子誤り訂正

前回紹介したIBM量子コンピュータチュートリアルにも量子誤り訂正の章があります.今回はそこで紹介されている2つの手法のうち「Quantum Repetition Code」の方についての説明と実際にやってみた結果について話します.

まずは元となった古典のアイデアの紹介からです.ノイズが各bitに対してランダムで発生するという状況を考えた時に誤りを訂正出来るようにする単純な方法は同じbit情報を繰り返して送ることです.例えば0を送りたいなら000,1を送りたいなら111を送るといったようにします.こうすることで一つのbitにノイズが発生して受信者が受け取ったものが101となっていたとしても送りたかった情報は1であるということが分かります.この考えをqubitにも応用させます.

一般的な単一のqubitは \left|\psi\right\rangle = \alpha\left|0\right\rangle + \beta\left|1\right\rangleのように表されます.これを繰り返しでの表現で表すと \left|\psi\right\rangle = \alpha\left|000\right\rangle + \beta\left|111\right\rangleのようになります.重要なのは \left|\psi\right\rangleの完全なコピーを3つ繰り返したものである (\alpha\left|0\right\rangle + \beta\left|1\right\rangle)(\alpha\left|0\right\rangle + \beta\left|1\right\rangle)(\alpha\left|0\right\rangle + \beta\left|1\right\rangle)で表すのではないということです.これで送ってしまうとノイズが全く発生しなかった場合でも正しい結果を得ることが出来ず全く意味を成さなくなってしまいます.そもそも量子の複製不可能性原理により,一般的な量子状態 \left|\psi\right\rangle = \alpha\left|0\right\rangle + \beta\left|1\right\rangleの完全なコピーは不可能となっています.

ではこのような状態をどのように作るのでしょうか.こちらチュートリアルのページにあるEncoder into bit-flip code (qubits 1-3)の回路がその例となっています. f:id:kadora:20160917150440j:plain この例ではまず, Q_2のqubitに3つのゲート(H,T,H)を適用させることで, Q_2= \cos(\frac{\pi}{8})\left|0\right\rangle - i\sin(\frac{\pi}{8})\left|1\right\rangleという状態にします. f:id:kadora:20160917150704j:plain この状態から,先ほど説明したような繰り返しの状態を作るために Q_1,Q_2,Q_3をもつれさせて, \cos(\frac{\pi}{8})\left|000\right\rangle - i\sin(\frac{\pi}{8})\left|111\right\rangleという状態にします.

f:id:kadora:20160917150724j:plain

この部分についてもう少し説明します. この部分では  Q_2 \left|0\right\rangleの時に Q_1,Q_3 \left|0\right\rangleに, Q_2 \left|1\right\rangleの時に Q_1,Q_3 \left|1\right\rangleになるようにすることで \left|\psi\right\rangle = \alpha\left|000\right\rangle + \beta\left|111\right\rangleの状態を作り出そうとしています.CNOTゲートの性質でコントロールbitが0の時は何もせず,1の時は対象bitを反転させるということと, Q_1,Q_3 \left|0\right\rangleで初期化されていることを考えれば次のように Q_2をコントロールbitとして, Q_1,Q_3にCNOTを作用させればよいということになります.

f:id:kadora:20160917151711j:plain

しかし実際にはそうなっていません.なぜでしょうか.私のこの量子コンピュータのプログラムに対する理解が足りないのかは分かりませんがCNOTゲートを適用させる先として Q_2しか選ぶことができなくなっているのです(公式のサンプルコードがこうなっているので仕様な気もしますが). そこでCNOTゲートの等価性を利用します.次の2つのゲートは同じ結果となります.

f:id:kadora:20160917152108j:plain

f:id:kadora:20160917152111j:plain

このことを利用すると先ほどこうすれば良いと言った回路は次のようになります.

f:id:kadora:20160917152517j:plain

更にHゲートの性質として,連続して2回適用させると一切変化を加えない恒等変換となる性質があります.これにより真ん中の2つ連続しているHゲート同士が恒等変換なので無いものとしてみなせ最終的に赤い枠で囲んだような回路となるのです.

この回路の最後の状態を測定した結果が次のグラフです. f:id:kadora:20160913234502j:plain 0が多い方の結果の合計が約0.84なので確かに (\cos(\frac{\pi}{8}))^{2}に近い値になっていて無事qubitを繰り返す状態にしてビット反転ノイズ対策がある程度は出来ていることが確認できます.

問題点

このようにすることでこの3つのqubitを測定することで得られた結果から先ほど古典の例として紹介したものと同様にして一つのbitに対してビット反転のノイズが発生したとしても訂正することができます.また,特別な基底で測定することで通常の基底で測定した時のようにもつれを消失させることなく誤りを検知し訂正する事もできます.しかしこの手法だと位相反転ノイズに対しては訂正することが出来ません.位相反転ノイズとは \left|\psi\right\rangle = \alpha\left|000\right\rangle - \beta\left|111\right\rangleとなるノイズのことですが,測定によってではこの位相反転が発生していることは検知することが出来ません. 今回の手法とは逆に位相反転ノイズに対して効果があり,ビット反転に対しては効果がないという符号化も存在し今回の手法とほぼ同じで一部を変えるだけで実現できます. この位相反転とビット反転のどちらの誤りからも守ることの出来るShorの符号というものがありますが,この符号化は1つのbitを9つのbitで符号化するものなので今回のこのIBM量子コンピュータで試すことはできません.