Global Trend Radar
Web: dojo.qulacs.org US web_search 2026-05-02 12:02

9-2. 量子エラー — Quantum Native Dojo ドキュメント

元記事を開く →

分析結果

カテゴリ
IT
重要度
45
トレンドスコア
9
要約
9-2. 量子エラー — Quantum Native Dojo ドキュメント ホーム » 第9章 量子誤り訂正 » 9-2. 量子エラー View page source 9-2. 量子エラー  量子ビットに生じるエラーの根本的な要因自体は実は古典ビットとそれほど違いはない。 一つは、外部との環境の相互作用によって一定のレートで外部に情報が漏れ出てしまうことで生じるエラーである。 特に物質を量子ビットとして光やマイクロ波などの電磁波
キーワード
9-2. 量子エラー — Quantum Native Dojo ドキュメント ホーム » 第9章 量子誤り訂正 » 9-2. 量子エラー View page source 9-2. 量子エラー  量子ビットに生じるエラーの根本的な要因自体は実は古典ビットとそれほど違いはない。 一つは、外部との環境の相互作用によって一定のレートで外部に情報が漏れ出てしまうことで生じるエラーである。 特に物質を量子ビットとして光やマイクロ波などの電磁波で情報を読み書きする場合、電磁波を注入する経路を確保せねばならず、そこから一定量の情報が漏れ出てしまう。 また、希釈冷凍機で実験をしていてもマイクロ波はエネルギースケールが環境温度と近いため、熱雑音の影響を大きく受けてしまい、これも定常的なノイズの原因となる。 一方、イオンや中性原子のようなトラップを用いて作成する物質の場合、デコヒーレンスに加えて物質がトラップから外れてしまうエラーも問題となる。 光を量子ビットとして用いた場合は、温度スケールの違いから上記のようなデコヒーレンスは問題とならない。 ただし、光量子ビットをスケールする上ではファイバによる誘導かミラー反射によるパスの確保が必要となり、またレーザの揺らぎも存在するため、 これにともなう光子の損失やコヒーレンス時間の経過によるコヒーレンスの消失が実効的には何もしないでも生じる量子ビットの寿命となる。 もう一つは、デバイスに対する操作に際して生じるノイズである。 超伝導量子ビットなどのマイクロ波を用いる操作の場合、操作に際するエラーはマイクロ波の周波数やパワーの揺らぎによるノイズ、また意図しない相互作用項の寄与によるバイアスなどが挙げられる。 こうしたノイズは反転などにより打ち消しが可能なバイアスノイズとそうでない確率的なノイズに分けられる。また、ノイズの結果も最終的に0,1のどちらかに移動してしまうノイズと、0,1のどちらでもない状態に移動してしまうleakageに分けられる。確率的なノイズやleakageのようなノイズはエラー訂正の観点からするとより深刻である。 こうしたエラーは原理的にはパルスのキャリブレーションやキャンセルパルスの印加で回避可能だが、膨大なビットのキャリブレーションは困難を極める。イオンや中性原子の場合も事情は同様である。 光を量子ビットとして用いる場合、光学結晶との相互作用を介して操作を行うが、この場合物質とはまた異なった問題が生じる。 第一に、光量子ビットをユニバーサルに操作するには3次以上の非線形性を有する相互作用が必須であり、こうした高次非線形性は強い吸収をともなうものが多い。 このため、非破壊に3次非線形操作を行うのをあきらめ、エンタングルした光量子ビットに破壊を伴う光子測定とフィードバック操作を行い、ゲートテレポーテーションという形で所望の非線形操作を実現することが多い。こうした操作は単なる非破壊操作に比べ大きなオーバーヘッドを伴う。 また、電磁波を用いた操作は、量子ビットは動かず電磁波が時間とともに送出されるため、システムのサイズは計算を行う時間に依存しないが、 光量子ビットを用いた通常の実験は物質を固定して光学定盤に配置するために、使用する光学機器の数は計算時間に依存して増えてしまう。 これを回避するためには、一度使用した光学装置をループを介して再度利用する時間多重化が必要となる。こうした光学系の時間多重化は現在盛んに研究がおこなわれている。 量子エラー訂正  量子ビットは通常のビットを拡張し、状態の重ね合わせを許したものである。量子エラー訂正では量子ビットを冗長化し、古典誤り訂正と同様に実効的に小さなエラー確率の獲得を目指す。この際、量子ビットの性質から多くの古典符号と事情の異なる点がいくつかあり、そのほとんどが量子誤り訂正を困難にする方向に働く。 現在提案されている量子エラー訂正の手法は、原則として線形符号を量子版へと拡張したものである。確認のため、線形符号の枠組みを再掲する。 符号:生成行列 \(G\) と検査行列 \(H_c\) で特徴づけられる。これらは \(GH_c = 0\) を満たす。 符号化前: \(k\) -bitの横ベクトルデータ \(v\) がある。 符号化: \(k \times n\) の生成行列 \(G\) を用いて、符号化した状態 \(v'\) は \(v'=vG\) となる。 エラー: 符号化後の \(v'\) にランダムに \(n\) -bit列 \(e\) が足される。 エラー検査: \(n \times (n-k)\) の検査行列 \(H_c\) を用いてシンドローム \(s = e H_c\) が得られる。 \(s \neq 0\) ならばエラーがあると検知できる。 \(s=0\) ならば、エラーが生じていないか、検査できる限界以上のエラーが生じている。 エラー訂正: \((v'+e)\) の値に従って、 \(k\) -bitの横ベクトルデータ \(v\) を推測する。 \(v'+e\) から \(v\) を求めるアルゴリズムを復号アルゴリズムと呼ぶ。 距離: \(e H_c = 0\) となる \(e\) の最小weightが符号の距離 \(d\) である。 量子ビットは \(|0\rangle, |1\rangle\) の二状態のみを用い、重ね合わせを利用しない場合、古典ビットの枠組みに乗せることができる。このことを利用し、上記を古典誤り訂正を量子情報の言葉で書きなおすと以下のようになる。 符号:生成行列 \(G\) と検査行列 \(H_c\) で特徴づけられる。これらは \(GH_c = 0\) を満たす。 符号化前: \(k\) -qubitの計算基底の量子状態 \(|v\rangle\) がある。 符号化: CNOTとPauli- \(X\) のみからなる \(2^n \times 2^n\) のユニタリ行列 \(U_G\) で、 \(|vG\rangle = U_G (|\psi\rangle \otimes |0\rangle^{n-k})\) となるものを \(G\) から構成できる。 エラー: 符号化後の \(|vG\rangle\) にランダムなビットフリップ演算 \(E = X_1^{e_1} X_2 ^{e_2} \ldots X_n^{e_n}\) が作用し、 \(E |vG \rangle = |vG + e \rangle\) となる。 エラー検査: パリティが整合するかを調べる。これは以下の操作に等しい。検査行列 \(H_c\) の \(i\) 列ベクトルを \(h_i\) とした時、パウリ行列 \(P_i = Z_1^{h_{i1}} Z_2^{h_{i2}} \ldots Z_n^{h_{in}}\) というパウリ行列を考え、 \(M_0^{(i)} = (I+P_i)/2, M_1^{(i)} = (I-P_i)/2\) というPOVM \(\{M_0^{(i)}, M_1^{(i)}\}\) を考える( POVM は射影測定を一般化したものである。Nielsen-Chuangだと 2.2.6 POVM measurements )。状態 \(E |\psi' \rangle\) を \(n-k\) 個のPOVM \(\{\{M_0^{(i)}, M_1^{(i)}\}\}_i\) で測定し、 \(n-k\) 個のビット \(s = (vG+e)H_c = eH_c\) を得る。この \(s\) が0であるかを調べる。 復号: \(|vG+e'\rangle\) を \(Z\) 基底で全て測定すると、 \(n\) ビット列 \((vG+e)\) を得る。 \((vG+e)\) の値に従って、 \(R E|vG\rangle = |vG\rangle\) となるようなユニタリ操作 \(R = X_1^{e'_1} X_2 ^{e'_2} \ldots X_n^{e'_n}\) を構成する。 \((vG+e)\) から \(e'\) を求めるアルゴリズムを復号アルゴリズムと呼ぶ。 距離: \(s = 0\) となる \(E\) の最小weightが符号の距離 \(d\) である。 上記のプロトコルは、量子ビットで古典誤り訂正を行う枠組みであり、言っていることは等価である。 例として、1bitを3bitに増やして多数決を行う符号を示す。この符号の生成行列は \[G =\left( \begin{matrix} 1 & 1 & 1 \end{matrix} \right)\] であり、検査行列は \[\begin{split}H_c = \left( \begin{matrix} 1 & 0 \\ 1 & 1 \\ 0 & 1 \end{matrix} \right)\end{split}\] である。 [120]: # set code info repetition = 3 error_probability = 0.2 initial_bit = 1 [121]: def show_quantum_state ( state , eps = 1e-10 , round_digit = 3 ): vector = state . get_vector () state_str = "" qubit_count = int ( np . log2 ( len ( vector ) + eps )) binary_format = "{" + ":0 {} b" . format ( qubit_count ) + "}" for ind in range ( len ( vector )): if abs ( vector [ ind ]) > 1e-10 : if len ( state_str ) > 0 : state_str += " + " state_str += ( " {} |" + binary_format + ">" ) . format ( round ( vector [ ind ], round_digit ), ind ) print ( state_str ) 量子状態を確保し、初期状態を0-thビットに書き込む。 [ ]: ## Google Colaboratoryの場合・Qulacsがインストールされていないlocal環境の場合のみ実行してください ! pip install qulacs ## Google Colaboratory / (Linux or Mac)のjupyter notebook 環境の場合にのみ実行してください。 ## Qulacsのエラーが正常に出力されるようになります。 ! pip3 install wurlitzer % load_ext wurlitzer [122]: import numpy as np from qulacs import QuantumState state = QuantumState ( repetition ) state . set_computational_basis ( initial_bit ) show_quantum_state ( state ) (1+0j) |001> 符号化の回路を作成する。 [123]: from qulacs import QuantumCircuit encode_circuit = QuantumCircuit ( repetition ) for ind in range ( 1 , repetition ): encode_circuit . add_CNOT_gate ( 0 , ind ) encode_circuit . update_quantum_state ( state ) show_quantum_state ( state ) (1+0j) |111> シンドローム値を測定する量子回路を作る。現地点では全てのシンドローム値は0である。 [124]: from qulacs.gate import Instrument from qulacs.gate import DenseMatrix def parity_measure_gate ( fst , scn , register_pos ): parity_measure_matrix_0 = np . zeros ( ( 4 , 4 ) ) parity_measure_matrix_1 = np . zeros ( ( 4 , 4 ) ) parity_measure_matrix_0 [ 0 , 0 ] = parity_measure_matrix_0 [ 3 , 3 ] = 1 parity_measure_matrix_1 [ 1 , 1 ] = parity_measure_matrix_1 [ 2 , 2 ] = 1 parity_measure_0 = DenseMatrix ([ fst , scn ], parity_measure_matrix_0 ) parity_measure_1 = DenseMatrix ([ fst , scn ], parity_measure_matrix_1 ) parity_measure = Instrument ([ parity_measure_0 , parity_measure_1 ], register_pos ) return parity_measure parity_measure_circuit = QuantumCircuit ( repetition ) for ind in range ( repetition - 1 ): parity_measure_circuit . add_gate ( parity_measure_gate ( ind , ind + 1 , ind )) parity_measure_circuit . update_quantum_state ( state ) show_quantum_state ( state ) for ind in range ( repetition - 1 ): print ( "parity( {} , {} ): {} " . format ( ind , ind + 1 , state . get_classical_value ( ind ))) (1+0j) |111> parity(0,1): 0 parity(1,2): 0 ランダムなデータ量子ビットに一つビットエラーを起こす。この時、ビットエラーが起きるとは意図しないPauli- \(X\) 操作が入ってしまうことに相当する。量子状態は \(|vG+e\rangle\) となる。 [125]: # invoke random error from qulacs.gate import Pauli def random_X_error ( num_qubit , error_probability ): error_array = [] for _ in range ( num_qubit ): if np . random . rand () < error_probability : error_array . append ( 1 ) else : error_array . append ( 0 ) return Pauli ( np . arange ( num_qubit ), error_array ) error_operator = random_X_error ( repetition , error_probability ) error_operator . update_quantum_state ( state ) show_quantum_state ( state ) (1+0j) |011> 再度パリティ測定を回収する。 [126]: parity_measure_circuit . update_quantum_state ( state ) show_quantum_state ( state ) for ind in range ( repetition - 1 ): print ( "parity( {} , {} ): {} " . format ( ind , ind + 1 , state . get_classical_value ( ind ))) (1+0j) |011> parity(0,1): 0 parity(1,2): 1 復号を行う。 [135]: # decoding process def compute_recovery_operation ( state , repetition ): cand1 = [] cand2 = [] cand1 . append ( 0 ) cand2 . append ( 1 ) flag = True for ind in range ( repetition - 1 ): val = state . get_classical_value ( ind ) if val == 1 : flag = not flag if flag : cand1 . append ( 0 ) cand2 . append ( 1 ) else : cand1 . append ( 1 ) cand2 . append ( 0 ) if np . sum ( cand1 ) < np . sum ( cand2 ): cand = cand1 else : cand = cand2 return Pauli ( np . arange ( repetition ), cand ) recovery_operation = compute_recovery_operation ( state , repetition ) recovery_operation . update_quantum_state ( state ) show_quantum_state ( state ) (1+0j) |111> 一連の操作は最初の量子状態が計算基底でなくても行うことができる。 [146]: # set code info repetition = 3 error_probability = 0.2 initial_bit = 1 from qulacs.gate import RandomUnitary state = QuantumState ( repetition ) state . set_computational_basis ( 0 ) RandomUnitary ([ 0 ]) . update_quantum_state ( state ) print ( "initial state" ) show_quantum_state ( state ) encode_circuit . update_quantum_state ( state ) print ( "encode" ) show_quantum_state ( state ) error_operator = random_X_error ( repetition , error_probability ) error_operator . update_quantum_state ( state ) print ( "error" ) show_quantum_state ( state ) parity_measure_circuit . update_quantum_state ( state ) print ( "parity measurement" ) show_quantum_state ( state ) recovery_operation = compute_recovery_operation ( state , repetition ) recovery_operation . update_quantum_state ( state ) print ( "recovery" ) show_quantum_state ( state ) initial state (-0.111+0.987j) |000> + (0.053-0.101j) |001> encode (-0.111+0.987j) |000> + (0.053-0.101j) |111> error (-0.111+0.987j) |010> + (0.053-0.101j) |101> parity measurement (-0.111+0.987j) |010> + (0.053-0.101j) |101> recovery (-0.111+0.987j) |000> + (0.053-0.101j) |111> 量子誤り訂正とは、量子状態にビットフリップ(Pauli- \(X\) )だけではなく、位相フリップ(Pauli- \(Z\) )のエラーが起きても誤り訂正が可能な枠組ということができる。生じるエラーが確率的なパウリ演算子であると仮定した場合の、量子誤り訂正の枠組みは以下である。 符号: \(n\) -qubitに作用する生成ユニタリ \(U_G\) と \(n-k\) 個のPOVMの集合 \(\{(M_0^{(i)}, M_1^{(i)})\}_i\) で特徴づけられる。これらは任意の \(k\) -qubit状態 \(|\psi\rangle\) に対して、 \(\langle \psi,0 | U_G^{\dagger} M_j^{(i)} U_G | \psi,0 \rangle\) を満たす。 符号化前: \(k\) -qubitの計算基底の量子状態 \(|\psi\rangle\) がある。 符号化: ユニタリ行列 \(U_G\) で、 \(|\psi' \rangle = U_G (|\psi\rangle \otimes |0\rangle^{n-k})\) を生成する。 エラー: 符号化後の \(|\psi' \rangle\) にランダムなパウリ演算 \(E = X_1^{e_1} X_2 ^{e_2} \ldots X_n^{e_n} Z_1^{e_{n+1}} Z_2 ^{e_{n+2}} \ldots Z_n^{e_{2n}}\) が作用し、 \(E |\psi' \rangle\) となる。 エラー検査: 状態 \(E |\psi' \rangle\) を \(n-k\) 個のPOVM \(\{\{M_0^{(i)}, M_1^{(i)}\}\}_i\) で測定し、 \(n-k\) 個のビット \(s\) を得る。この \(s\) が0であるかを調べる。 復号: \(s\) の値に従って、 \(R E|vG\rangle = |vG\rangle\) となるようなユニタリ操作 \(R = X_1^{e'_1} X_2 ^{e'_2} \ldots X_n^{e'_n} Z_1^{e'_{n+1}} Z_2 ^{e'_{n+2}} \ldots Z_n^{e'_{2n}}\) を構成する。 \(s\) から \(R\) を求めるアルゴリズムを量子誤り訂正の復号アルゴリズムと呼ぶ。 距離: \(s = 0\) となる \(E\) の最小weightが符号の距離 \(d\) である。 古典誤り訂正から量子誤り訂正の枠組みを構成するにあたっての本質的な変更点がある。 量子誤り訂正では位相反転を生じるエラーが発生する。このため、エラーのパウリ演算子 \(E\) はPauli- \(X\) のみでなく、Paul

類似記事(ベクトル近傍)