ビットフリップ符号はXエラー(ビット反転)を直せましたが、量子にはもう一種類、位相反転(Zエラー) があります。この記事ではそれを訂正する 位相フリップ符号 をQiskitで実装します。ポイントは「アダマール基底に移すと、位相反転がビット反転に化ける」こと。同じ理屈が使い回せます。
発想:基底を変えれば同じ問題
Zエラー(位相反転)は、アダマールで基底を変えると Xエラー(ビット反転)に変わります。だからビットフリップ符号を H で挟むだけで位相フリップ符号になります。
Hで挟んで同じ理屈に
H変換
位相→ビット反転へ
符号化
3個に広げる
訂正
多数決で戻す
準備
pip install qiskit qiskit-aer① 符号化:Hで挟む
守りたいビットを3個に広げ、各ビットをアダマールでX基底へ移します。
from qiskit import QuantumCircuit
qc = QuantumCircuit(5, 2) # データ3 + シンドローム2
qc.x(0) # テスト用に |1⟩
qc.cx(0, 1); qc.cx(0, 2) # 3個に広げる
qc.h([0, 1, 2]) # X基底へ(ここが位相フリップ用)
qc.barrier()② 位相反転エラーを注入
Zエラーを1個のビットに起こします。
qc.z(1) # q1 に位相反転エラー
qc.barrier()③ 基底を戻してシンドローム測定
Hで元の基底に戻すと、Zエラーがビット反転として現れるので、ビットフリップ符号と同じパリティ測定で位置を特定できます。
qc.h([0, 1, 2]) # 基底を戻す(Zエラー→Xエラーとして見える)
qc.cx(0, 3); qc.cx(1, 3) # パリティ (q0,q1)
qc.cx(1, 4); qc.cx(2, 4) # パリティ (q1,q2)
qc.measure(3, 0); qc.measure(4, 1)
from qiskit_aer import AerSimulator
print(AerSimulator().run(qc, shots=1000).result().get_counts())結果は {'11': 1000}。シンドローム11=q1が反転と正しく特定できました。ビットフリップ符号とまったく同じ読み方です。
両方直すのがショア符号
ビットフリップ符号(Xエラー用)と位相フリップ符号(Zエラー用)を入れ子に組み合わせると、両方のエラーを同時に直せる9量子ビットのショア符号になります。実機の表面符号もこの発想の延長です。
まとめ
- 位相反転(Zエラー)は量子だけに存在する誤り
- アダマールで基底を変えるとZエラーはXエラーに化ける
- だからビットフリップ符号をHで挟むだけで位相フリップ符号になる
- 両方を組み合わせると9量子ビットのショア符号
📚 もう少し詳しく(背景と理論)気になる人向け・タップで開く
次の一歩 🌸
Xエラー版はビットフリップ符号、誤り訂正の全体像は誤り訂正入門、基底を変えるゲートは量子ゲート入門へどうぞ。
