メインコンテンツへスキップ

量子テレポーテーション

このQiskit in Classroomsモジュールを使用するには、以下のパッケージがインストールされた動作するPython環境が必要です:

  • qiskit v2.1.0以降
  • qiskit-ibm-runtime v0.40.1以降
  • qiskit-aer v0.17.0以降
  • qiskit.visualization
  • numpy
  • pylatexenc

上記パッケージのセットアップとインストール方法については、Qiskitのインストールガイドをご参照ください。 実際の量子コンピューターでジョブを実行するには、IBM Cloudアカウントのセットアップガイドの手順に従って、IBM Quantum®のアカウントを作成する必要があります。

このモジュールはテスト済みで、QPU時間を14秒使用しました。これはあくまで推定値です。実際の使用量は異なる場合があります。

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-aer qiskit-ibm-runtime
# Uncomment and modify this line as needed to install dependencies
#!pip install 'qiskit>=2.1.0' 'qiskit-ibm-runtime>=0.40.1' 'qiskit-aer>=0.17.0' 'numpy' 'pylatexenc'

以下のKatie McCormick博士によるモジュール解説動画をご覧いただくか、こちらからYouTubeでご視聴ください。


はじめに・背景

量子テレポーテーションとは、量子物理学における技術の一つで、粒子を物理的に移動させることなく、量子情報をある場所から別の場所へ転送することを可能にします。SFに登場するテレポーテーションの概念とは異なり、この過程では物質は輸送されません。その代わりに、距離に関係なく二つの粒子が結びつく量子もつれの原理を利用します。精密な測定と古典的な通信の組み合わせによって、一方の粒子の量子状態を遠隔地にある別の粒子で再現することができ、量子情報を事実上「テレポート」させます。このモジュールでは、これが数学的にどのように機能するかを確認し、続いて実際の量子コンピューター上で量子テレポーテーションを実装します。ここでの導入は簡潔なものとなりますが、量子情報についてのより詳しい背景や、テレポーテーションについてのより詳しい説明については、John Watrousの量子情報の基礎コース、とりわけテレポーテーションのセクションをお勧めします。

古典ビットは0または1の状態をとることができます。量子ビット(Qubit)は0|0\rangleおよび1|1\rangleと表記される量子状態、さらにこれらの状態の線形結合である「重ね合わせ」、たとえばψ=α00+α11|\psi\rangle = \alpha_0|0\rangle +\alpha_1|1\rangle(ただしα0,α1C\alpha_0,\alpha_1 \in \mathbb{C}、かつα02+α12=1|\alpha_0|^2+|\alpha_1|^2 = 1)をとることができます。状態がこのような重ね合わせとして存在していても、状態を測定するとその状態は0|0\rangleまたは1|1\rangleのいずれかに「収縮」します。パラメータaabbは、各測定結果の確率と以下の関係を持ちます。

P0=α02P_0 = |\alpha_0|^2 P1=α12P_1 = |\alpha_1|^2

したがって、α02+α12=1|\alpha_0|^2+|\alpha_1|^2 = 1という制約が生じます。

もう一つの重要な特徴は、量子ビットが「もつれ」状態になれることです。これは、一方のQubitの測定が、もつれた別のQubitの測定結果に影響を与えることを意味します。もつれが単純な古典的相関とどのように異なるかを理解することは少々難しいです。まず表記法について説明します。友人0(アリス)と友人1(ボブ)にそれぞれ属する二つのQubitを、どちらも0|0\rangle状態にあるものとします。

0B0A|0\rangle_B|0\rangle_A

または

0100|0\rangle_1|0\rangle_0

これは単純に次のように略記されることもあります。

00|00\rangle

最も番号の小さい(または文字の若い)Qubitが最も右に位置することに注意してください。これは「リトルエンディアン」記法と呼ばれる慣習で、Qiskit全体で使用されています。 二人の友人の二Qubit状態が00|00\rangleであり、それぞれ自分のQubitの状態を測定すると、どちらも0が得られます。同様に、Qubitが11|11\rangleの状態にあれば、それぞれの測定結果は1になります。これは古典的な場合と変わりません。しかし量子コンピューティングでは、これを重ね合わせと組み合わせることで、次のような状態を得ることができます。

12(00+11)\frac{1}{\sqrt{2}}(|00\rangle+|11\rangle)

このような状態では、アリスとボブのQubitが0か1かはまだ決まっておらず、自然界によっても未定ですが、それでも二人が同じ状態を測定することはわかっています。たとえば、ボブが自分のQubitを0|0\rangleの状態として測定した場合、それが起こりうる唯一の方法は、測定によって二Qubit状態が二つの可能な状態のうちの一つ、具体的には00|00\rangleに収縮したときです。その結果、アリスのQubitも0|0\rangleの状態になります。

このようなQubitのもつれは、Qubit同士が物理的に近い位置にある必要はありません。言い換えれば、Qubitをもつれ状態にした後で大きく離れた場所に移動させ、そのもつれを利用して情報を送ることができます。上記のようなもつれ状態はもつれの基本単位であり、「e-bit」(1ビットのもつれ)と呼ばれることもあります。これらのe-bitは、遠隔地にいるパートナー間で情報をある場所から別の場所へ移動させるために使えるリソースとして、量子通信における資源と見なすことができます。

初めてこれを学ぶ人の多くが最初に思いつくのは、相対性理論の違反についてです。これを使って情報を光速より速く送れるのでは?と。ぜひ科学的ルールを疑い問い続けてください。しかし残念ながら、このモジュールを通じて明らかになる理由から、これで光速を超えて情報を送ることはできません。ネタバレになりますが、驚くべきことに、その理由はこの収縮が伝わる速度ではありません。収縮は光速より速く起こるように見えます [1]。 まず、最初は同じ場所にいて同じQubitを一緒に操作できる二人の協力者、アリスとボブから始めます。二人はそれぞれのQubitをもつれ状態にします。その後、二人は別々の地理的な場所へ移動し、それぞれ自分のQubitを持ち運びます。アリスはその後、新しいQubit Qに量子情報を受け取ります。Qに含まれる情報については何も仮定しません。Qの状態はアリスにも知られていない秘密の状態かもしれませんし、誰にも知られていない状態かもしれません。しかしアリスは、Q上の情報をボブへ転送するという課題を与えられます。アリスはこれを量子テレポーテーションを使って実現します。

これを実現するために、いくつかの量子演算、すなわち「Gate」について理解する必要があります。

量子演算子(Gate)

量子Gateに既に精通している場合は、このセクションを飛ばしても構いません。これらのGateについてより深く理解したい場合は、IBM Quantum Learningの量子情報の基礎、特に最初の二つのレッスンをご確認ください。

このテレポーテーションプロトコルでは、主に二種類の量子Gateを使用します。アダマールGateとCNOT Gateです。その他にも補助的な役割を果たすものとして、XX Gate、ZZ Gate、およびSWAP Gateがあります。

このモジュールは線形代数の知識が非常に限られていても完了できますが、量子力学的なGateを行列とベクトルを使って視覚化することは有用です。そのため、量子Gate・状態の行列/ベクトル表現もここで紹介します。

既に示した状態は(一部は慣習によって、一部は制約によって)次のベクトル形式をとるよう選ばれています。

0=(10)|0\rangle = \begin{pmatrix}1 \\ 0\end{pmatrix} 1=(01)|1\rangle = \begin{pmatrix}0 \\ 1\end{pmatrix}

このように、任意の状態ψ=a0+b1|\psi\rangle = a|0\rangle+b|1\rangleは次のように書けます。

ψ=(ab)|\psi\rangle =\begin{pmatrix}a \\ b\end{pmatrix}

複数Qubit状態への表記の拡張方法にはいくつかの選択肢がありますが、以下の選択肢は非常に標準的です:

00=(1000),01=(0100),10=(0010),11=(0001).|00\rangle = \begin{pmatrix}1 \\ 0 \\ 0 \\ 0\end{pmatrix},|01\rangle = \begin{pmatrix}0 \\ 1 \\ 0 \\ 0\end{pmatrix}, |10\rangle = \begin{pmatrix}0 \\ 0 \\ 1 \\0\end{pmatrix},|11\rangle = \begin{pmatrix}0 \\ 0 \\ 0 \\ 1\end{pmatrix}.

このベクトル表記を念頭に置いて、必要な量子Gate、それらが量子状態に与える影響、および行列形式を紹介します。

H アダマールGate: 重ね合わせ状態を生成します。単一Qubit Gateです。

H0=12(0+1),H|0\rangle = \frac{1}{\sqrt{2}}\left(|0\rangle+|1\rangle\right), H1=12(01)H|1\rangle = \frac{1}{\sqrt{2}}\left(|0\rangle-|1\rangle\right) H=12(1111)H=\frac{1}{\sqrt{2}}\begin{pmatrix} 1 & 1 \\ 1 & -1 \end{pmatrix}

アダマールGateを含むCircuitは次のように作成します:

from qiskit import QuantumCircuit

qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")

Output of the previous code cell

CNOT 制御NOTゲート(Controlled-NOT Gate): このGateは二つのQubitを使用します。制御Qubitとターゲットです。制御Qubitの状態を確認しますが、制御Qubitは変化しません。制御Qubitが1|1\rangleの状態にある場合、Gateはターゲットの状態を変更します。制御Qubitが0|0\rangleの状態にある場合は何も変更されません。以下の表記では、Qubit AA(最右Qubit)が制御、Qubit BB(最左Qubit)がターゲットとします。以下、CNOT(qcontrol,qtarget)BACNOT(q_{control},q_{target})|BA\rangleの表記を使用します。

CNOT(A,B)00=00,CNOT(A,B)01=11,CNOT(A,B)10=10,CNOT(A,B)11=01CNOT(A,B)|00\rangle = |00\rangle, \\ CNOT(A,B)|01\rangle = |11\rangle, \\ CNOT(A,B)|10\rangle = |10\rangle, \\ CNOT(A,B)|11\rangle = |01\rangle

CNOTは制御とターゲットの順序が単に暗黙的な形で書かれることもありますが、コードやCircuit図ではそのような曖昧さはありません。

CNOT=(1000000100100100)CNOT=\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}

CNOT Gateは二つのQubitを必要とするため、Circuit内での見た目が少し異なります。実装方法は次の通りです:

qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")

Output of the previous code cell

理解度チェック

以下の問題を読み、答えを考えてから、三角形をクリックして解答を表示してください。

ほとんどのGateはQiskitでも他の場所と同じ行列形式を持っています。しかしCNOT Gateは二つのQubitに作用するため、Qubitの順序の慣習が問題になります。Qubitをq0,q1,...|q_0,q_1,...\rangleの順に並べるテキストでは、CNOT Gateの行列形式が異なって示されます。上記のCNOT行列が状態01|01\rangleに対して正しい作用をすることを、明示的な行列乗算によって確認してください。

解答:

CNOT01=(1000000100100100)(0100)=(0001)=11CNOT|01\rangle =\begin{pmatrix} 1 & 0 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0\end{pmatrix}\begin{pmatrix}0 \\ 1 \\ 0 \\0\end{pmatrix} = \begin{pmatrix}0 \\ 0 \\ 0 \\1\end{pmatrix} = |11\rangle

XX Gate:NOT演算と同等です。単一Qubit Gateです。

X0=1,X1=0X|0\rangle = |1\rangle,\\X|1\rangle=|0\rangle X=(0110)X=\begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix}

QiskitでXX Gateを含むCircuitを作成すると次のようになります:

qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")

Output of the previous code cell

ZZ Gate:状態に「位相」(前因子)を付加します。Zの固有状態0|0\rangle1|1\rangleに対してはそれぞれ1または-1となります。単一Qubit Gateです。

Z0=0,Z1=1Z|0\rangle = |0\rangle,\\Z|1\rangle=-|1\rangle Z=(1001)Z=\begin{pmatrix} 1 & 0 \\ 0 & -1 \end{pmatrix}

QiskitでZZ Gateを含むCircuitを作成すると次のようになります:

qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")

Output of the previous code cell

理論

まず数学を使って量子テレポーテーションのプロトコルを整理しましょう。その後、次のセクションでこの設定を量子コンピューターを使って実現します。

アリスとボブのQubitのもつれ: 最初、アリスのQubitとボブのQubitはそれぞれ独立して0|0\rangleの状態にあります(これは妥当な仮定であり、IBM®量子コンピューターの正しい初期化状態でもあります)。これを0B0A|0\rangle_B|0\rangle_A、または単純に00|00\rangleと書けます。アリスが自分のQubitにアダマールGateを適用し、続いてアリスのQubitを制御、ボブのQubitをターゲットとするCNOT Gateを適用したときに何が起こるかを計算しましょう:

CNOT(A,B)HA0B0A=CNOT(A,B)0B12(0A+1A)=12(CNOT(A,B)0B0A+CNOT(A,B)0B1A)=12(0B0A+1B1A)\begin{aligned} CNOT(A,B)H_A |0\rangle_B|0\rangle_A &= CNOT(A,B)|0\rangle_B\frac{1}{\sqrt{2}}\left(|0\rangle_A+|1\rangle_A\right)\\ &=\frac{1}{\sqrt{2}}\left(CNOT(A,B)|0\rangle_B|0\rangle_A+CNOT(A,B)|0\rangle_B|1\rangle_A\right)\\ &=\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right) \end{aligned}

アリスとボブのQubitがもつれ状態になったことに注目してください。どちらのQubitも0|0\rangle1|1\rangleかはまだ自然界によって決まっていませんが、二つのQubitが同じ状態にあることはわかっています。 アリスとボブの分離: 二人の友人はそれぞれのQubitを新しい場所へ移動させます。場合によっては非常に遠く離れた場所へ移動することもあります。これには多くの注意点があります。量子情報を乱さずに移動させることは簡単ではありません。しかし移動させることは可能で、このモジュールでも実際に移動させます。ただし、量子情報を多く移動させる際にはいくらかのエラーが生じることが予想される点に注意してください。

Qの導入: 秘密の状態がQubit Q上で準備されます:

ψQ=α00Q+α11Q|\psi\rangle_Q = \alpha_0 |0\rangle_Q + \alpha_1 |1\rangle_Q

この時点でQはアリスのQubit(A)に隣接しているだけです。もつれは発生していないため、三つのQubit全体の量子状態は次のように書けます:

ψABψQ=12(0B0A+1B1A)(α00Q+α11Q).|\psi\rangle_{AB}|\psi\rangle_Q = \frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)\left(\alpha_0 |0\rangle_Q + \alpha_1 |1\rangle_Q\right).

目標は、Q上の情報をアリスの場所からボブの場所へ移動させることです。この時点では、情報転送の秘密性や速度についての主張や要件は設けていません。単純に、アリスからボブへ情報がどのように移動できるかを探求しています。 情報がQ上から始まるため、QはQubit番号の中で最も小さい番号が割り当てられており、リトルエンディアン記法によってQが以下の数式の最右Qubitとなります。

アリスによるQubit AとQのもつれ: アリスは自分のQubitを制御、Qをターゲットとするに CNOT Gateを適用し、その後QにアダマールGateを適用します。その操作後の三Qubit状態を計算しましょう:

HQCNOT(A,Q)ψABψQ=HQCNOT(A,Q)12(0B0A+1B1A)(α00Q+α11Q)=HQCNOT(A,Q)12((α00B0A0Q+α10B0A1Q)+(α01B1A0Q+α11B1A1Q))=HQ12(α00B0A0Q+α10B1A1Q+α01B1A0Q+α11B0A1Q)=12(α00B0A0Q+α00B0A1Q+α10B1A0Qα10B1A1Q)+12(α01B1A0Q+α01B1A1Q+α11B0A0Qα11B0A1Q)\begin{aligned} H_Q CNOT(A,Q)|\psi\rangle_{AB}|\psi\rangle_Q &= H_Q CNOT(A,Q)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)\left(\alpha_0 |0\rangle_Q + \alpha_1 |1\rangle_Q\right)\\ &= H_Q CNOT(A,Q)\frac{1}{\sqrt{2}}\left(\left(\alpha_0 |0\rangle_B|0\rangle_A|0\rangle_Q + \alpha_1 |0\rangle_B|0\rangle_A|1\rangle_Q\right)+\left(\alpha_0 |1\rangle_B|1\rangle_A|0\rangle_Q + \alpha_1 |1\rangle_B|1\rangle_A|1\rangle_Q\right)\right)\\ &= H_Q \frac{1}{\sqrt{2}}\left(\alpha_0 |0\rangle_B|0\rangle_A|0\rangle_Q + \alpha_1 |0\rangle_B|1\rangle_A|1\rangle_Q+\alpha_0 |1\rangle_B|1\rangle_A|0\rangle_Q + \alpha_1 |1\rangle_B|0\rangle_A|1\rangle_Q\right)\\ &= \frac{1}{2}\left(\alpha_0 |0\rangle_B|0\rangle_A|0\rangle_Q + \alpha_0 |0\rangle_B|0\rangle_A|1\rangle_Q + \alpha_1 |0\rangle_B|1\rangle_A|0\rangle_Q-\alpha_1 |0\rangle_B|1\rangle_A|1\rangle_Q\right)\\ &+\frac{1}{2}\left(\alpha_0 |1\rangle_B|1\rangle_A|0\rangle_Q + \alpha_0 |1\rangle_B|1\rangle_A|1\rangle_Q + \alpha_1 |1\rangle_B|0\rangle_A|0\rangle_Q - \alpha_1 |1\rangle_B|0\rangle_A|1\rangle_Q\right) \end{aligned}

AとQは同じ場所にあるため、Qubit AとQの測定結果に従って上記の項をまとめましょう:

ψ=12((α00B+α11B)0A0Q+(α00Bα11B)0A1Q+(α10B+α01B)1A0Q+(α10B+α01B)1A1Q)\begin{aligned} |\psi\rangle = \frac{1}{2}\left((\alpha_0 |0\rangle_B+\alpha_1 |1\rangle_B)|0\rangle_A|0\rangle_Q + (\alpha_0 |0\rangle_B-\alpha_1 |1\rangle_B)|0\rangle_A|1\rangle_Q + (\alpha_1 |0\rangle_B+\alpha_0 |1\rangle_B)|1\rangle_A|0\rangle_Q+ (-\alpha_1 |0\rangle_B+\alpha_0 |1\rangle_B)|1\rangle_A|1\rangle_Q \right)\\ \end{aligned}

理解度チェック

以下の問題を読み、答えを考えてから、三角形をクリックして解答を表示してください。

三つのQubitすべての状態についての上記の式から、Qubit AとQの測定で0A0Q|0\rangle_A|0\rangle_Qが得られる確率はいくらでしょうか?

解答:

25%です。これを確認するには、ボブの状態が規格化されていることを思い出すと、 A0Q0120A0Q(α00B+α11B)2=14(α00B+α11B)2=14 |_A \langle0|_Q\langle0| \frac{1}{2} |0\rangle_A|0\rangle_Q (\alpha_0 |0\rangle_B+\alpha_1 |1\rangle_B)|^2 = \frac{1}{4}|(\alpha_0 |0\rangle_B+\alpha_1 |1\rangle_B)|^2 = \frac{1}{4}

次にアリスはQubit AとQを測定することができます。量子測定は確率的であるため、アリスはその結果を制御できません。したがって、測定すると4つの可能な結果があり、4つすべてが等確率です:0A0Q|0\rangle_A|0\rangle_Q0A1Q|0\rangle_A|1\rangle_Q1A0Q|1\rangle_A|0\rangle_Q、および1A1Q|1\rangle_A|1\rangle_Q。各結果はボブのQubitに異なる影響を与えることに注意してください。たとえば、アリスのQubitが0A0Q|0\rangle_A|0\rangle_Qとなった場合、3Qubit量子状態全体が(α00B+α11B)0A0Q(\alpha_0|0\rangle_B+\alpha_1|1\rangle_B)|0\rangle_A|0\rangle_Qへ収縮します。アリスの他の測定結果はボブに対して異なる状態をもたらします。これらを以下の表にまとめます。

アリスの結果ボブの状態ボブへの指示結果
0A0Q \vert 0\rangle_A \vert 0\rangle_Qα00B+α11B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_Bなしα00B+α11B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B
0A1Q \vert 0\rangle_A \vert 1\rangle_Qα00Bα11B\alpha_0\vert 0\rangle_B-\alpha_1\vert 1\rangle_BZZα00B+α11B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B
1A0Q \vert 1\rangle_A \vert 0\rangle_Qα10B+α01B\alpha_1\vert 0\rangle_B+\alpha_0\vert 1\rangle_BXXα00B+α11B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B
1A1Q \vert 1\rangle_A \vert 1\rangle_Qα10B+α01B-\alpha_1\vert 0\rangle_B+\alpha_0\vert 1\rangle_BXXの後ZZα00B+α11B\alpha_0\vert 0\rangle_B+\alpha_1\vert 1\rangle_B

アリスのQubitに対して可能なすべての測定結果において、ボブのQubitはQの元の秘密状態にぼんやりと似た状態に残されます。アリスが0C0A|0\rangle_C|0\rangle_Aを測定した場合(表の第1行)、ボブのQubitはまさに秘密の状態のままです!それ以外の場合は、状態に何らかのズレがあります。係数(α\alpha)が入れ替わっていたり、「+」符号のべき場所に「-」符号があったり、あるいはその両方が起きています。ボブのQubitを秘密の状態と完全に一致させるために修正するには、アリスはボブに電話(何らかの古典的な通信手段を使用)して、表に示したように追加の操作を行うよう指示しなければなりません。たとえば第3行では係数が入れ替わっています。アリスがボブに電話してXX Gateを適用するよう伝えると、0|0\rangle1|1\rangleが入れ替わり、秘密の状態が復元されます。

光速より速く情報を送るためにこの設定を使えない理由がここで明らかになります。0A0Q|0\rangle_A|0\rangle_Qを運良く測定した場合、ボブはすぐに正確な秘密の状態を持っています。しかしボブは、「私たちは0A0Q|0\rangle_A|0\rangle_Qを測定しました。何もする必要はありません」と電話で教えられるまで、それを知ることができません。

この思考実験では、Qubitはしばしば物理的に分離されて新しい場所へ移動されます。IBM®の量子コンピューターは、分離できないチップ上の固体Qubitを使用しています。したがって、アリスとボブを別々の場所に移動させる代わりに、チップ上で「スワップGate」を使用してある Qubitから別のQubitへ情報を移動させることで、チップ上の情報自体を分離します。

実験1:基本的なテレポーテーション

IBM Quantumは、「Qiskitパターン」と呼ばれるフレームワークを使用して量子コンピューティングの問題に取り組むことを推奨しています。このフレームワークは以下のステップで構成されています。

  • ステップ1:問題を量子Circuitにマッピングする
  • ステップ2:実際の量子ハードウェアで実行できるようにCircuitを最適化する
  • ステップ3:Runtime Primitivesを使用してIBM量子コンピューターでジョブを実行する
  • ステップ4:結果を後処理する

ステップ1:問題を量子回路にマッピングする

上で行った数学的な考察はすべて、ステップ1の概要説明でした。ここではそれを実装し、Qiskitを使って量子回路を構築します。まず3つのQubitを持つ量子回路を作成し、AliceとBobの2つのQubitをエンタングルさせます。これらをQubit 1および2とし、Qubit 0は秘密の状態のために確保しておきます。

# Step 1: Map your problem to a quantum circuit

# Import some general packages
from qiskit import ClassicalRegister, QuantumCircuit, QuantumRegister
import numpy as np

# Define registers
secret = QuantumRegister(1, "Q")
Alice = QuantumRegister(1, "A")
Bob = QuantumRegister(1, "B")

cr = ClassicalRegister(3, "c")

qc = QuantumCircuit(secret, Alice, Bob, cr)

# We entangle Alice's and Bob's qubits as in our work above. We apply a Hadamard gate and then a CNOT gate.
# Note that the second argument in the CNOT gate is the target.
qc.h(Alice)
qc.cx(Alice, Bob)

# Inserting a barrier changes nothing about the logic. It just allows us to force gates to be positioned in "layers".
qc.barrier()

# Now we will use random variables to create the secret state. Don't worry about the "u" gate and the details.
np.random.seed(42) # fixing seed for repeatability
theta = np.random.uniform(0.0, 1.0) * np.pi # from 0 to pi
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi

# Assign the secret state to the qubit on the other side of Alice's (qubit 0), labeled Q
qc.u(theta, varphi, 0.0, secret)
qc.barrier()

# Now entangle Q and Alice's qubits as in the discussion above.
qc.cx(secret, Alice)
qc.h(secret)
qc.barrier()

# Now Alice measures her qubits, and stores the outcomes in the "classical registers" cr[]
qc.measure(Alice, cr[1])
qc.measure(secret, cr[0])

# Now we insert some conditional logic. If Alice measures Q in a "1" we need a Z gate, and if Alice measures A in a "1" we need an X gate (see the table).
with qc.if_test((cr[1], 1)):
qc.x(Bob)
with qc.if_test((cr[0], 1)):
qc.z(Bob)

qc.draw(output="mpl")

Output of the previous code cell

AliceのQuantum状態をBobへテレポートさせるために必要な操作はこれだけです。ただし、量子状態 α00+α11\alpha_0 |0\rangle+\alpha_1|1\rangle を測定すると、結果は 0|0\rangle または 1|1\rangle のどちらかになることを思い出してください。つまり、この手順が終わった時点でBobは確かにAliceの秘密の状態を持っていますが、それを測定で簡単に検証することはできません。正しく操作が行われたことを測定で確認するためには、ひとつのトリックが必要です。AliceのQuantum秘密状態の準備に使った「U」(ユニタリ)演算子があります。回路の末尾にUの逆演算を適用することができます。UがAliceの 0|0\rangle 状態を α00+α11\alpha_0 |0\rangle+\alpha_1|1\rangle にマッピングしたのであれば、Uの逆演算はBobの α00+α11\alpha_0 |0\rangle+\alpha_1|1\rangle0|0\rangle に戻すことになります。したがってこの最後の部分は、単に量子情報を転送することが目的であれば必ずしも必要ではありません。これはあくまでも自分たちで結果を確認するために行うものです。

# Add the inverse of U and measure Bob's qubit.
qc.barrier()

qc.u(theta, varphi, 0.0, Bob).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(Bob, cr[2]) # add measurement gate

qc.draw(output="mpl")

Output of the previous code cell

つまり、この操作が正しく行われていれば、BobのQubitの測定は 0|0\rangle 状態をもたらすはずです。もちろん、これらの測定は確率的です。BobのQubitが 1|1\rangle 状態で測定されるわずかな可能性があるため、1回の測定で 1|1\rangle が結果として出ることもあります。0|0\rangle の確率が十分に高いことを確認するためには、多くの測定を繰り返したいところです。

ステップ2:量子実行のために問題を最適化する

このステップでは、実行したい操作を特定の量子コンピュータの機能に合わせた形で表現します。また、問題を量子コンピュータのレイアウトにマッピングします。

まず、IBMの量子コンピュータと通信するために必要なパッケージをいくつかロードします。また、実行するBackendを選択する必要があります。最も空いているBackendを選ぶか、特性がわかっている特定のBackendを指定することができます。

初回使用時に認証情報を保存するためのコードが以下にあります。認証情報を環境に保存したら、ノートブックからこの情報を必ず削除してください。ノートブックを共有する際に認証情報が誤って漏洩しないようにするためです。詳細については、IBM Cloudアカウントの設定および信頼できない環境でのサービスの初期化をご覧ください。

# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService

# Load the Qiskit Runtime service

# Syntax for first saving your token. Delete these lines after saving your credentials.
# QiskitRuntimeService.save_account(channel='ibm_quantum_platform', instance = '<YOUR_IBM_INSTANCE_CRN>', token='<YOUR-API_KEY>', overwrite=True, set_as_default=True)
# service = QiskitRuntimeService(channel='ibm_quantum_platform')

# Load saved credentials
service = QiskitRuntimeService()

# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)
ibm_sherbrooke

測定に対するロジックを明示的に有効化します。

from qiskit.circuit import IfElseOp

backend.target.add_instruction(IfElseOp, name="if_else")

次に、量子回路を「トランスパイル(transpile)」する必要があります。これには多くのサブステップが含まれており、非常に興味深いトピックです。サブステップの一例を挙げると、すべての量子コンピュータがQiskitのすべての論理Gateを直接実行できるわけではありません。そのため、回路内のGateを量子コンピュータが実装できるGateに書き換える必要があります。このような処理やその他の処理は、プリセットパスマネージャを使って実行できます。optimization = 3(最高レベルの最適化)に設定することで、抽象的な量子回路から量子コンピュータへの命令へのマッピングが、前処理の範囲で最も効率的になるようにします。

# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)

「Sampler」は、量子回路から生じる可能性のある状態をサンプリングし、どの状態がどの確率で測定されるかの統計を収集するように設計されたプリミティブです。ここではQiskit RuntimeのSamplerをインポートします。

# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler

sampler = Sampler(mode=backend)

量子コンピュータ上のすべての計算が古典コンピュータで合理的にシミュレートできるわけではありません。このシンプルなテレポーテーションは確かにシミュレート可能ですが、情報をある場所から別の場所に古典的に保存できることはまったく驚くことではありません。本物のIBM量子コンピュータを使ってこれらの計算を行うことを強くお勧めします。ただし、無料の月次使用量を使い果たした場合や、授業中に完了しなければならずキューで待てない場合には、このモジュールをシミュレータで完了することもできます。そのためには、以下のセルを実行して、「実行」ステップの関連行のコメントを解除してください。

# Load the backend sampler
from qiskit.primitives import BackendSamplerV2

# Load the Aer simulator and generate a noise model based on the currently-selected backend.
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel

noise_model = NoiseModel.from_backend(backend)

# Define a simulator using Aer, and use it in Sampler.
backend_sim = AerSimulator(noise_model=noise_model)
sampler_sim = BackendSamplerV2(backend=backend_sim)

# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# sampler_gen = BackendSamplerV2(backend=backend_gen)

ステップ3:実行

Samplerを使用してジョブを実行します。引数としてCircuitを渡します。

job = sampler.run([qc_isa])
# job = sampler_sim.run([qc_isa])
res = job.result()
counts = res[0].data.c.get_counts()

ステップ4:後処理と分析

結果をプロットして解釈しましょう。

# This required 5 s to run on a Heron r2 processor on 10-28-24
from qiskit.visualization import plot_histogram

plot_histogram(counts)

Output of the previous code cell

理解度チェック

以下の質問を読み、答えを考えてから、三角形をクリックして解答を確認してください。

上記の状態のうち、テレポーテーション成功を示すものはどれですか?またその根拠は何ですか?

解答:

状態 000,|000\rangle, 001,|001\rangle, 010,|010\rangle, 011|011\rangle はすべてテレポーテーション成功と一致します。これは、秘密の状態の初期準備を元に戻すGateを追加したためです。秘密の状態がBobのQubitに正常にテレポートされていれば、その追加のGateによってBobのQubitは 0|0\rangle 状態に戻るはずです。したがって、上記の状態のうち、BobのQubit(Qubit 0、古典レジスタの0番目の成分に測定され、最上位/右端に表示される)が 0|0\rangle 状態にあるものはすべて成功を示します。

このプロットは、5,000回の試行(「ショット」)における3つのQubitのすべての測定結果を示しています。先ほど述べたように、AliceはQubit AとQのすべての可能な状態を等しい確率で測定します。回路ではQubit 0〜2をそれぞれQ、A、Bに割り当てました。リトルエンディアン表記では、BobのQubitは最左端/最下位になります。したがって、左側の4本のバーはBobのQubitが 0|0\rangle であり、他の2つのQubitがおよそ等しい確率であらゆる組み合わせにある場合に対応しています。測定のほぼすべて(通常は約95%)でBobのQubitが 0|0\rangle 状態になっており、実装が成功していることがわかります。BobのQubitが 1|1\rangle 状態になるショットがわずか(約5%)あります。これは論理的にはあり得ないはずです。しかし、現代のすべての量子コンピュータは古典コンピュータよりもはるかに大きなノイズとエラーに悩まされており、量子誤り訂正はまだ発展途上の分野です。

実験2:プロセッサをまたいだテレポーテーション

量子テレポーテーションで最も興味深い点は、量子状態が長距離にわたって瞬時にテレポートできることです(追加Gateに関する古典通信は瞬時ではありませんが)。すでに述べたように、プロセッサからQubitを切り離して移動させることはできません。しかし、情報をあるQubitから別のQubitへと移動させることで、テレポーテーションに関わるQubitがプロセッサの反対側に位置するようにすることができます。上記のステップを繰り返しますが、今回はプロセッサ全体にまたがるのに十分な数のQubitを持つ、より大きな回路を作成します。

ステップ1:問題を量子回路にマッピングする

今回は、AliceとBobに対応するQubitが変化します。そのため、単一のQubitを「A」、別のQubitを「B」と名付けるのではなく、QubitをQubitsに番号を付け、AliceとBobの情報が現在どのQubitにあるかを変数で表します。スワップGateを除くその他のステップはすべて前述の通りです。

# Step 1: Map

# Define registers
qr = QuantumRegister(13, "q")

qc = QuantumCircuit(qr, cr)

# Define registers
secret = QuantumRegister(1, "Q")
ebitsa = QuantumRegister(6, "A")
ebitsb = QuantumRegister(6, "B")
# q = ClassicalRegister(1, "q meas")
# a = ClassicalRegister(1, "a")
# b = ClassicalRegister(1, "b")
cr = ClassicalRegister(3, "c")
qc = QuantumCircuit(secret, ebitsa, ebitsb, cr)

# We'll start Alice in the middle of the circuit, then move information outward in both directions.
Alice = 5
Bob = 0
qc.h(ebitsa[Alice])
qc.cx(ebitsa[Alice], ebitsb[Bob])

# Starting with Bob and Alice in the center, we swap their information onto adjacent qubits, until the information is on distant qubits.

for n in range(Alice):
qc.swap(ebitsb[Bob], ebitsb[Bob + 1])
qc.swap(ebitsa[Alice], ebitsa[Alice - 1])
Alice = Alice - 1
Bob = Bob + 1

qc.barrier()

# Create a random state for Alice (qubit zero)
np.random.seed(42) # fixing seed for repeatability
# theta = np.random.uniform(0.0, 1.0) * np.pi #from 0 to pi
theta = 0.3
varphi = np.random.uniform(0.0, 2.0) * np.pi # from 0 to 2*pi

qc.u(theta, varphi, 0.0, secret)

# Entangle Alice's two qubits
qc.cx(secret, ebitsa[Alice])
qc.h(secret)

qc.barrier()

# Make measurements of Alice's qubits and store the results in the classical register.
qc.measure(ebitsa[Alice], cr[1])
qc.measure(secret, cr[0])

# Send instructions to Bob's qubits based on the outcome of Alice's measurements.
with qc.if_test((cr[1], 1)):
qc.x(ebitsb[Bob])
with qc.if_test((cr[0], 1)):
qc.z(ebitsb[Bob])

qc.barrier()

# Invert the preparation we did for Carl's qubit so we can check whether we did this correctly.
qc.u(theta, varphi, 0.0, ebitsb[Bob]).inverse() # inverse of u(theta,varphi,0.0)
qc.measure(ebitsb[Bob], cr[2]) # add measurement gate

qc.draw("mpl")

Output of the previous code cell

回路図を見ると、論理的なステップは同じであることがわかります。唯一の違いは、スワップGateを使ってAliceのQubit状態をQubit 6(A5A_5)からQubit 1(A0A_0)へ、つまりQの隣まで移動させたことです。またスワップGateを使って、BobのQuantum初期状態をQubit 7(B0B_0)からQubit 12(B5B_5)へ移動させました。Qubit 12の状態は、遠く離れたQubit 0と1で測定が行われるまでQの秘密の状態とは無関係であり、条件付き XX および ZZ Gateが適用されるまで秘密の状態と等しくはならないことに注意してください。

ステップ2:回路を最適化する

通常、パスマネージャを使って回路をトランスパイルおよび最適化する際には、回路を可能な限り効率的にしたいため optimization_level = 3 に設定することが適切です。しかし今回の場合、Qubit 6および7からQubit 1および12へ状態を転送することに計算上の意義はありません。それはテレポーテーションを長距離にわたって実演するために行ったものです。パスマネージャに回路の最適化を依頼すると、これらのスワップGateに論理的な理由がないと判断し、スワップGateを削除して隣接するQubitに対してGate操作を実行してしまいます。そのため、この特別なケースでは optimization_level = 0 を使用します。

# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

target = backend.target
pmzero = generate_preset_pass_manager(target=target, optimization_level=0)

qc_isa_zero = pmzero.run(qc)

print(qc_isa_zero.depth())
105

plot_circuit_layout 関数を使用して、これらの Qubit が量子プロセッサ上のどこに配置されているかを可視化できます。

ステップ3:実行する

前回と同様に、実際の IBM 量子コンピューター上で実行することをお勧めします。月間の無料使用量に達した場合は、シミュレーターのセルをアンコメントしてシミュレーター上で実行してください。

# This required 5 s to run on a Heron r2 processor on 10-28-24
job = sampler.run([qc_isa_zero])
# job = sampler_sim.run([qc_isa_zero])
counts = job.result()[0].data.c.get_counts()
from qiskit.visualization import plot_histogram

plot_histogram(counts)

Output of the previous code cell

ステップ4:古典的後処理

アリスの Qubit に対する測定結果の確率はほぼ均一です。秘密のコードを反転させた後、ボブの Qubit が 0|0\rangle で見つかる確率が高いことがわかります。これはつまり、プロセッサ上で Q からボブ(Qubit 0 から 12)へ秘密の状態を正しくテレポートできた可能性が高いことを意味します。ただし、ボブの測定結果が 0|0\rangleならない確率も多少高くなっていることに注目してください。これは量子コンピューティングにおける重要な教訓です:Gate の数が増えるほど、特にスワップゲートのような複数 Qubit の Gate が多いほど、ノイズやエラーが増加します。

問題

インストラクターは、これらのノートブックの解答例と一般的なカリキュラムへの組み込みに関するガイダンスを入手するために、ノートブックの利用状況に関するこちらの簡単なアンケートにご記入ください。

重要な概念

  • Qubit は量子もつれ状態になることができます。つまり、一方の Qubit を測定すると、もう一方の Qubit の状態に影響を与えたり、決定したりすることがあります。
  • 量子もつれは古典的な相関とは異なります。たとえば、Qubit A と B は α000+α111\alpha_0|00\rangle+\alpha_1|11\rangle のような状態の重ね合わせになることができます。A または B の状態は自然によって不確定であるにもかかわらず、A と B が常に同じ状態にあることが保証されます。
  • 量子もつれと測定を組み合わせることで、ある Qubit から別の Qubit へ状態(情報を格納できる)を転送することができます。この転送は長距離でも実現可能であり、これを量子テレポーテーションと呼びます。
  • 量子テレポーテーションは確率的な量子測定に依存しています。そのため、テレポートされた状態を調整するために古典的な通信が必要になる場合があります。これにより、量子テレポーテーションが光より速く情報を転送することを防いでいます。量子テレポーテーションは相対性理論や因果律に違反しません。
  • 現代の量子コンピューターは古典コンピューターよりもノイズやエラーの影響を受けやすくなっています。数パーセント程度のエラーが生じることを想定してください。
  • Gate を連続して追加するほど(特に2 Qubit Gate)、エラーやノイズが増加します。

正誤問題

  1. 正/誤:量子テレポーテーションを使って光より速く情報を送ることができる。
  2. 正/誤:現代の実験的証拠は、量子状態の収縮が光より速く伝播することを示している。
  3. 正/誤:Qiskit では、Qubit は最も番号の小さい Qubit が右端になるよう q3,q2,q1,q0|q_3,q_2,q_1, q_0\rangle の順に並べられている。

多肢選択問題

  1. Qubit A と B が量子もつれ状態にされた後、距離 dd だけ離されました。Qubit A が測定されます。Qubit B の状態が影響を受ける速さについて、正しい記述はどれですか?
  • a. これまでに行われた実験では、実験の誤差の範囲内で、Qubit B は即座に影響を受ける。
  • b. Qubit B は d/cd/c の時間後に影響を受ける。つまり、量子状態は実験の誤差の範囲内で、ほぼ光速で「収縮」する。
  • c. Qubit B が影響を受けるのは古典的な通信が行われた後のみであり、d/cd/c より長い時間がかかる。
  • d. 上記のいずれでもない。
  1. 測定確率は量子状態の振幅に関連していることを思い出してください。たとえば、ある Qubit が最初に α00+α11\alpha_0|0\rangle+\alpha_1 |1\rangle という状態にある場合、0|0\rangle を測定する確率は α02|\alpha_0|^2 です。有限のサンプリングによって(コインを投げると2回連続で表が出ることがあるように)、すべての測定結果がこれらの確率と正確に一致するわけではありません。以下の測定ヒストグラムに対応する可能性がある量子状態はどれですか?最も適切な選択肢を選んでください。

entangled_teleportation_fig

  • a. 0|0\rangle
  • b. 12(01)\frac{1}{\sqrt{2}}\left(|0\rangle-|1\rangle\right)
  • c. 12(0+1)\frac{1}{\sqrt{2}}\left(|0\rangle+|1\rangle\right)
  • d. 450+351\frac{4}{5}|0\rangle+\frac{3}{5}|1\rangle
  • e. 350+451\frac{3}{5}|0\rangle+\frac{4}{5}|1\rangle
  1. 次の状態のうち、Qubit A と B が量子もつれ状態にあるものはどれですか?当てはまるものをすべて選んでください。
  • a. 12(0B0A+1B1A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)
  • b. 450B0A+351B1A\frac{4}{5}|0\rangle_B|0\rangle_A+\frac{3}{5}|1\rangle_B|1\rangle_A
  • c. 12(0B1A1B0A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|1\rangle_A-|1\rangle_B|0\rangle_A\right)
  • d. 12(0B0A+1B0A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|0\rangle_A\right)
  • e. 0B0A|0\rangle_B|0\rangle_A
  1. このモジュールでは、12(0B0A+1B1A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right) という量子もつれ状態を準備しました。しかし、同様のプロトコルに使用できる量子もつれ状態は他にも多数あります。以下のどの状態が、次のような2 Qubit 測定ヒストグラムを生成する可能性がありますか?最も適切な選択肢を選んでください。

entangled_teleportation_fig_0110

  • a. 12(0B0A+1B1A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right)
  • b. 450B0A+351B1A\frac{4}{5}|0\rangle_B|0\rangle_A+\frac{3}{5}|1\rangle_B|1\rangle_A
  • c. 12(0B1A1B0A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|1\rangle_A-|1\rangle_B|0\rangle_A\right)
  • d. 450B1A+351B0A\frac{4}{5}|0\rangle_B|1\rangle_A+\frac{3}{5}|1\rangle_B|0\rangle_A
  • e. 0B0A|0\rangle_B|0\rangle_A

ディスカッション問題

  1. 量子テレポーテーションのプロトコルを最初から最後まで、パートナーやグループに説明してください。補足事項や質問がないか確認し合いましょう。

  2. アリスとボブ間の初期量子もつれ状態 12(0B0A+1B1A)\frac{1}{\sqrt{2}}\left(|0\rangle_B|0\rangle_A+|1\rangle_B|1\rangle_A\right) には何か特別な点がありますか?あるとすれば、それは何ですか?ないとすれば、他にどのような量子もつれ状態を使用できたでしょうか?