手を上げるキュビットくんゆるふわ量子コンピュータ
すまし顔のキュビットくん

位相フリップ符号をQiskitで実装する|もう一つの誤りを訂正する

2026-08-22実践

#Qiskit#誤り訂正#位相フリップ#Python#実践

ビットフリップ符号は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}。シンドローム11q1が反転と正しく特定できました。ビットフリップ符号とまったく同じ読み方です。

🌱

両方直すのがショア符号

ビットフリップ符号(Xエラー用)と位相フリップ符号(Zエラー用)を入れ子に組み合わせると、両方のエラーを同時に直せる9量子ビットのショア符号になります。実機の表面符号もこの発想の延長です。

まとめ

  • 位相反転(Zエラー)は量子だけに存在する誤り
  • アダマールで基底を変えるとZエラーはXエラーに化ける
  • だからビットフリップ符号をHで挟むだけで位相フリップ符号になる
  • 両方を組み合わせると9量子ビットのショア符号

もう少し詳しく(背景と理論)

位相フリップ符号は、アダマール変換が X と Z を入れ替える(HXH=Z, HZH=X)という性質を使い、Z エラーの問題をビットフリップ符号の X エラーの問題へ写して解きます1。量子の誤りは連続的にも見えますが、任意の1量子ビット誤りは恒等・X・Y・Z のパウリ基底に展開でき、X と Z を訂正できれば Y=iXZ も自動的に扱えます——これが誤りの離散化という量子誤り訂正の基本定理です2。ビットフリップ(X用)と位相フリップ(Z用)を入れ子にすると、任意の単一誤りを訂正するショア符号になります。

次の一歩 🌸

Xエラー版はビットフリップ符号、誤り訂正の全体像は誤り訂正入門、基底を変えるゲートは量子ゲート入門へどうぞ。

Footnotes

  1. アダマール H は基底を X↔Z に回す。Z エラーは X 基底で見るとビット反転として現れるため、H で挟めば既存のビットフリップ符号の仕組みがそのまま使える。

  2. 誤りの離散化定理:連続的なノイズも {I, X, Y, Z} の線形結合で表せ、X と Z(したがって Y)を訂正できれば任意の単一量子ビット誤りに対処できる。量子誤り訂正が「有限種類の誤り」で済む理由。

🔥 この分野の最新トレンドをチェック →

あわせて読みたい