量子テレポーテーションは、ある量子ビットの正確な状態を、その量子ビット自体を物理的に運ぶことなく、別の場所に転送します。このプロトコルに必要なのは3つの量子ビット、1組の共有されたもつれ対、そして2つの古典ビットだけで、Qiskitコード30行未満で構築できます。
この名前こそが、このプロトコルをめぐる混乱の大部分を生んでいるので、コードに触れる前にまずそこを整理しておきましょう。
テレポーテーションではないもの
このプロトコルは物質を移動させません。量子ビットの物理的な粒子そのものは、どこにも移動しません。実際に移動するのは情報です。プロトコルの終わりには、受信側の量子ビットが、送信側の量子ビットが最初にあった量子状態とまったく同じ状態になります。
このプロトコルは光より速い通信を可能にしません。送信側から2つの古典ビットが届くまで、受信側の量子ビットは使い物にならないデータのままであり、この伝送はほかのあらゆる古典信号と同様に光速に制限されます。ここで自然はとても慎重です。もつれそのものは結果を相関させるだけで、それ自体が制御可能な信号を運ぶことは決してありません。
このプロトコルは量子ビットをコピーすることもありません。未知の量子状態の完全なコピーが元の状態と同時に存在することは、コピー禁止定理によって禁じられており、テレポーテーションはこれを厳密に守ります。状態を伝送するという行為自体が、送信側の持つコピーを破壊するのです。最終的には状態を保持する量子ビットがちょうど1つだけ存在し、受信側が手にする量子ビットは、あなたが最初に使っていたものとは別物です。
3つのステップで進むプロトコル
- 事前にもつれを共有する。送信側と受信側はそれぞれベル対の半分を持ち、どの状態をテレポートするかが分かるよりも前にこの分配が行われます。
- 送信側は、自分が持つ対の半分と、テレポートしたい量子ビットに対して、同時測定(ベル基底測定)を行います。これにより4通りのランダムな2ビットの結果のいずれかが得られ、副作用として元の量子ビットの状態が破壊されます。
- 送信側はその2つの古典ビットを受信側に送り、受信側は結果に応じて4種類のうちいずれかのゲート(恒等、X、Z、XZ)を自分が持つ対の半分に適用します。この補正により、ステップ2で得られた4通りの結果のどれであったかにかかわらず、元の状態が正確に再構築されます。
ステップ2のランダム性は本物であり避けられませんが、ステップ3の補正はそれを決定論的に打ち消します。この打ち消しこそがこのプロトコルの意義そのものであり、同時に最も間違えやすい部分でもあります。詳しくは後述します。
Qiskitで回路を構築する
3つの量子ビット:q0 はテレポートしたい状態を保持し、q1 はもつれ対のうち送信側が持つ半分、q2 は受信側が持つ半分です。
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, transpile
from qiskit_aer import AerSimulator
theta = 0.9 # arbitrary angle, stands in for "an unknown state"
qr = QuantumRegister(3, "q")
cr = ClassicalRegister(2, "c")
result_reg = ClassicalRegister(1, "result")
qc = QuantumCircuit(qr, cr, result_reg)
# Step 0: prepare the state to teleport on q0. In a real protocol
# this state is unknown. Ry(theta) here only gives us something
# concrete to verify against later.
qc.ry(theta, 0)
qc.barrier()
ステップ1:もつれ対を分配する
qc.h(1)
qc.cx(1, 2)
qc.barrier()
標準的なベル状態の構築方法です。アダマールゲートに続いてCNOTゲートを適用します。これで q1 と q2 は最大限もつれた状態になり、実際の運用ではプロトコルの残りが実行される前に、すでに q1 は送信側、q2 は受信側へと分離されているはずです。
ステップ2:ベル基底測定
qc.cx(0, 1)
qc.h(0)
qc.measure(0, cr[0])
qc.measure(1, cr[1])
qc.barrier()
CNOTとアダマールゲートによって q0 と q1 の同時状態がベル基底へと回転するため、通常の計算基底での測定を行うだけで、その対が4つのベル状態のうちどれに収束したかを読み取れるようになります。この結果は一様にランダムで、cr[0] と cr[1] の4通りの組み合わせそれぞれがおよそ25%の確率で現れます。そしてこのランダム性を補正することこそが、次のステップの役割です。
ステップ3:古典制御による補正
with qc.if_test((cr[1], 1)):
qc.x(2)
with qc.if_test((cr[0], 1)):
qc.z(2)
これは回路の途中に組み込まれた本物の古典条件分岐であり、単なる近道ではありません。q2 は、古典ビット cr[1] が1を測定した場合にのみXゲートを、cr[0] が1を測定した場合にのみZゲートを適用されます。Qiskitの if_test コンテキストマネージャはこれを実際の動的回路にコンパイルします。これは、実機での運用において2つの古典ビットを通常のチャネル経由で送信し、反対側で補正を適用するのに使われるのと同じ仕組みです。
ステップ4:プロトコルが正しく機能したかを検証する
qc.ry(-theta, 2)
qc.measure(2, result_reg[0])
sim = AerSimulator()
tqc = transpile(qc, sim)
counts = sim.run(tqc, shots=4096).result().get_counts()
print(sorted(counts.items()))
検証のトリックはこうです。q2 に元の回転の逆操作を適用し、その量子ビットを測定します。もし q2 が本当に q0 の最初の状態とまったく同じ状態になっていたなら、この回転を打ち消すことで量子ビットは |0⟩ に戻り、result ビットは0を示します。実行全体を通して、(cr[0], cr[1]) の4通りの結果はおおむね均等に分布し、これはベル測定のランダムな結果が期待どおりに振る舞っていることを示しています。一方で result ビットは、4通りのうちどの結果が出たかにかかわらず常に0を示します。これこそが見返りです。補正ステップは、どのランダムな結果が出たとしても、それを毎回、平均としてではなく毎回確実に打ち消すのです。
よくある間違い:「どうせ回路に問題はない」と補正を省略してしまう
この回路を見ると、4通りのベル測定結果のうち3つは恒等操作に「近い」ように見えるため、補正ステップは些細な詳細だと思い込んでしまいがちです。しかしそれは誤りです。if_test ブロックを省略して q2 を直接測定すると、ベル測定がたまたま |00⟩ に落ち着いたおよそ25%の実行でしか正しい結果は返らず、残り4分の3の時間は結果が乱れてしまいます。ここに部分点はありません。補正は最適化ではなく、このプロトコルを4分の1の確率でしか当たらないコイン投げではなく決定論的なものにする、まさにその仕組みそのものなのです。
テレポーテーションの本当の用途
このプロトコル自体は、単独の余興として独立した用途を持つわけではありません。その重要性は構造的なものです。これは、量子ネットワークと分散量子コンピューティングが、事前に共有されたもつれと古典的な通信リンクだけでつながったノード間で量子ビットの状態を移動させるために使う仕組みそのものであり、直接的な量子回線を使うわけではありません。個別のQPUを1つの大きな論理マシンへと連結するあらゆる提案や、長距離の光ファイバーリンクにわたってもつれを拡張する量子リピーターは、いずれもまさにこの基本操作の上に成り立っています。1つの量子ビットの伝送で2つの古典ビットを送る超高密度符号化は、同じ発想を逆向きに使ったものです。
実機ハードウェアでの実行
回路の途中での測定に続いて古典制御ゲートを適用するというのは、静的な回路と比べて明らかに要求水準の高いハードウェア要件です。システムには、量子ビットがデコヒーレンスを起こす前に測定結果を読み出し、補正を同じ回路へフィードバックできる、高速かつ低遅延の古典制御電子回路が必要です。この能力はしばしば「動的回路」と呼ばれ、すべてのクラウドバックエンドがすべての世代のデバイスでサポートしているわけではありません。動的回路が利用できない場合、実装によっては古典的な補正の代わりに条件付き2量子ビットゲートを用い、測定をすべて最後に先送りすることがあります。これはシミュレーション上ではプロトコルの数式を正しく検証できますが、テレポーテーションをそもそもネットワーキングにとって実用的なものにしている、実際の古典通信のステップを回避してしまっています。実機で実行する際は、このコードがそのまま動くと決めてかかる前に、対象のバックエンドが動的回路を明示的にサポートしているかどうかを確認してください。
次のステップ
- Qiskit SDKガイド: 完全なセットアップ、バックエンド、動的回路のサポートについて
- 量子ネットワーキングと分散コンピューティング: テレポーテーションが個別のQPUの連結にどう関わるか
- 用語集: もつれ、ベル状態、超高密度符号化、その他の関連用語