量子テレポーテーション
このQiskit in Classroomsモジュールでは、以下のパッケージがインストールされた Python 環境が必要です:
qiskitv2.1.0 または新しいqiskit-ibm-runtimev0.40.1 または新しいqiskit-aerv0.17.0 または新しいqiskit.visualizationnumpypylatexenc
上記のパッケージをセットアップしてインストールするには、 Qiskitのインストールガイドをご覧ください。 実際の量子コンピュータでジョブを実行するには、 IBM Quantum® のアカウントを設定する必要があります。 IBM Cloud アカウントの設定ガイドの手順に従ってください。
このモジュールはテストされ、14秒のQPU時間を使用した。 これはあくまでも目安である。 実際の使用方法は異なる場合があります。
# 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'ケイティ博士( McCormick )によるモジュールのウォークスルーを以下でご覧いただくか、 こちらをクリックして YouTube でご覧ください。
はじめにおよび背景
量子テレポーテーションとは、量子物理学における技術の一つであり、粒子を物理的に移動させることなく、ある場所から別の場所へ量子情報を転送することを可能にするものである。 SFに登場するテレポーテーションという概念とは異なり、このプロセスでは物質の移動は伴いません。 その代わりに、距離に関係なく2つの粒子が結びつくという「量子もつれ」の原理を利用しています。 一連の精密な測定と古典的な通信を通じて、ある粒子の量子状態を遠く離れた場所にある別の粒子に再現することができ、これにより量子情報が事実上「テレポーテーション」されることになる。 このモジュールでは、これが数学的にどのように機能するかを解説し、その後、実際の量子コンピュータ上で量子テレポーテーションを実装していきます。 ここでは簡単な紹介にとどめます。量子情報の背景やテレポーテーションに関するより詳しい説明については、ジョン・ワトラウス氏による「 量子情報の基礎 」講座、特に「 テレポーテーション」 に関するセクションをご覧になることをお勧めします。
従来のビットは、0 または 1 の状態をとることができます。 量子ビット(キュービット)は、 や で表される量子状態、およびこれらの状態の線形結合である「重ね合わせ」状態(例: 、 、 など)をとることができます。これらの状態は重ね合わせとして存在し得ますが、状態を測定すると、 または のいずれかの状態に「収束」します。 パラメータ および は、以下の式に従って、各測定結果の確率に関連しています
したがって、 という制約が成り立つ。
もう一つの重要な特徴は、量子ビットが "もつれ "ることである。これは、ある量子ビットの測定が、別のもつれた量子ビットの測定結果に影響を与える可能性があることを意味する。 エンタングルメントが単純な古典的相関とどう違うのかを理解するのは少し難しい。 まず、表記法を説明しよう。 友人0(アリス)と友人1(ボブ)に属する2つの量子ビットを、それぞれ
または
と略されることもある
なお、番号(または文字)が最も小さい量子ビットは、一番右側に位置することに注意してください。 これは「リトルエンディアン」表記と呼ばれる規約であり、Qiskit全体で採用されています。 もし友人たちの2量子ビット状態が であり、彼らがそれぞれの量子ビットの状態を測定した場合、それぞれ0という結果が得られることになる。 同様に、量子ビットが という状態にあった場合、それぞれの測定結果は1となる。 それは、従来のケースと何ら変わりません。 しかし、量子コンピューティングでは、これを重ね合わせと組み合わせることで、次のような状態を得ることができます
このような状態では、アリスとボブの量子ビットが状態 0 にあるのか状態 1 にあるのかはまだわかっていないし、自然界においてもまだ決定されていない。それにもかかわらず、私たちは、彼らがそれぞれの量子ビットについて同じ状態を測定することになると知っている。 例えば、ボブが自分の量子ビットを測定した結果、 という状態にあることが判明した場合、これが起こる唯一の理由は、測定によって2量子ビット状態が2つの可能な状態のうちの1つ、具体的には に収縮したからである。その結果、アリスの量子ビットも という状態になる。
このように量子ビットをエンタングルする場合、量子ビットが物理的に互いに接近している必要はない。 言い換えれば、量子ビットをもつれさせ、それを大きな距離で分離し、そのもつれを使って情報を送ることができる。 上記のようなもつれた状態は、もつれの基本単位であり、「eビット」(もつれの1ビット)と呼ばれることもある。 このeビットは、量子通信における資源と考えることができる。なぜなら、離れたパートナー間で共有される各eビットは、ここで概説するように、ある場所から別の場所へ情報を移動させるために使用できるからである。
このことを初めて知った多くの人が最初に考えるのは、相対性理論に反するということだ。これを使えば、光よりも速く情報を送ることができるのだろうか? しかし残念なことに、このモジュールを通して明らかになるであろう理由により、光よりも速く情報を送ることはできない。 ネタバレ》 驚くべきことに、それは崩壊の伝播速度によるものではなく、光よりも速く起こっているように見える [1]。
アリスとボブは同じ場所にいて、同じ量子ビットを扱うことができる。 これらの協力者は、それぞれの量子ビットを絡ませる。 そして、それぞれの量子ビットを携えて、2つの異なる地理的な場所に移動する。 アリスは新しい量子ビットQの量子情報を得る。 Qの情報については何も仮定していない。 Qの状態はアリスにとって未知の秘密かもしれないし、すべての人にとって未知のものかもしれない。 しかし、アリスはQの情報をボブに伝える仕事を与えられている。 彼女は量子テレポーテーションを使ってこれを行う。
そのためには、いくつかの量子操作や "ゲート "を知る必要がある。
量子演算子(ゲート)
量子ゲートについてすでにご存知の方は、このセクションは読み飛ばしていただいて結構です。 これらのゲートをより深く理解したい場合は、 IBM Quantum Learningにある Basics of quantum information、特に最初の2つのレッスンをチェックしてほしい。
このテレポーテーション・プロトコルでは、主にハダマード・ゲートとCNOTゲートという2種類の量子ゲートを使用する。 、 、SWAPゲートなどだ。
このモジュールは、ごく限られた線形代数の知識で完成させることができるが、行列やベクトルを使って量子力学的ゲートを視覚化することが役に立つこともある。 そこで、ここでは量子ゲート/状態の行列/ベクトル形式も紹介する。
すでに紹介した状態は、(部分的には慣例によって、部分的には制約によって)ベクトル形を持つように選ばれている:
このようにして、任意の状態 は次のように書くことができる
多重量子ビット状態に表記法を拡張する方法にはいくつかの選択肢があるが、以下の選択は極めて標準的である:
このベクトル表記法の選択を念頭に置いて、必要な量子ゲート、量子状態に対するその効果、およびその行列形式を紹介しよう。
H ハダマードゲート: 重ね合わせ状態を作り出す。 単一量子ビットゲート。
ハダマードゲートを使った回路は次のように作られる:
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
qc.h(0)
qc.draw("mpl")Output:
CNOT(制御NOT)ゲート: このゲートは、制御用と対象用の2つの量子ビットを使用します。 変更されていない制御キュービットの状態を確認します。 しかし、制御量子ビットが の状態にある場合、このゲートは対象量子ビットの状態を変化させる。一方、制御量子ビットの状態が である場合は、何の変化も生じない。 以下の表記において、クビット (右端のクビット)を制御クビット、クビット (左端のクビット)をターゲットクビットとする。 以下では、 という表記法を用いる。
時々、コントロールとターゲットの順番が単に暗示されているCNOTを見ることがある。 しかし、コードや回路図にはそのような曖昧さはない。
CNOTゲートは、2つの量子ビットを必要とするので、回路的には少し違って見える。 これが実施方法だ:
qc = QuantumCircuit(2)
qc.cx(0, 1)
qc.draw("mpl")Output:
理解度チェック
Qiskit では、ほとんどのゲートが他の場所と同様にマトリックス形式で表現されています。 しかし、CNOTゲートは2つの量子ビットに作用するため、量子ビットの順序に関する規約が突然問題となってくる。 で量子ビットの並び順を指定したテキストでは、CNOTゲートについて異なる行列形式が示されます。 上記のCNOT行列が、状態 に対して正しい作用を持つことを、明示的な行列乗算によって確認してください。
ゲート :NOT演算に相当。 単一量子ビットゲート。
Qiskitでは、 ゲートで回路を作ると次のようになる:
qc = QuantumCircuit(1)
qc.x(0)
qc.draw("mpl")Output:
ゲート :ゲート:状態に「位相」を加える(前因子。Z固有状態の場合、 と は、それぞれ1か -1 のいずれか)。 単一量子ビットゲート。
Qiskitでは、 ゲートで回路を作ると次のようになる:
qc = QuantumCircuit(1)
qc.z(0)
qc.draw("mpl")Output:
理論
量子テレポーテーションのプロトコルを数学で説明しよう。 そして次のセクションでは、量子コンピューターを使ってこの設定を実現する。
アリスとボブは量子ビットをエンタングルする: 最初は、アリスの量子ビットとボブの量子ビットは、それぞれ別々に (良い仮定であり、 IBM® 量子コンピューターの正しい初期化でもある)状態である。 これを と書くこともできるし、単に と書くこともできる。アリスとボブがアリスの量子ビットのハダマードゲートと、アリスの量子ビットをコントロール、ボブの量子ビットをターゲットとするCNOTゲートで行動したときに何が起こるかを計算してみましょう:
今、アリスとボブの量子ビットはエンタングルされていることに注意。 両者の量子ビットが 状態か 状態かはまだ自然界では決定されていないが、両者の量子ビットが同じ状態にあることは知られている。
アリスとボブは別れる: アリスとボブは別れる:2人の友人は、それぞれの量子ビットを新しい場所に移動する。 量子情報を乱すことなく移動させるのは簡単ではない。 しかし、それは動かすことができるし、実際、このモジュールでは動かすことになる。 しかし、注意点として、量子情報を大量に移動させる場合、何らかのエラーが発生することが予想されることを覚えておいてほしい。
Qが導入される: 秘密状態は量子ビットQに準備される:
この時点でQは単にアリスの量子ビット(A)に隣接している。 エンタングルメントがないので、3つの量子ビットを合わせた量子状態は次のように書ける:
目標は、Qの情報をアリスの位置からボブの位置に移動させることだ。 現時点では、秘密保持や情報伝達のスピードについて、いかなる主張も要求もしていない。 私たちは単に、情報がアリスからボブに移動する方法を探っているに過ぎない。
情報はQから始まるので、Qは量子ビット数で最も小さい番号に割り当てられると仮定する。リトルエンディアン表記では、Qは以下の数学で最も右の量子ビットになる。
アリスは自分の量子ビットをコントロール、QをターゲットとしてCNOTゲートを操作し、Qにハダマードゲートを適用する。 その演算後の3量子ビットの状態を計算してみよう:
AとQは同じ場所にあるので、量子ビットAとQの測定結果に従って上記の用語をグループ分けしよう:
理解度チェック
3つの量子ビットすべての状態を表す上記の式を踏まえると、量子ビットAとQを測定した際に となる確率はどれくらいか
25%. これを見るには、ボブの状態が正規化されていなければならないことを思い出してほしい。
これで、アリスは量子ビットAとQを測定できるようになった。 量子測定は確率論的なものであるため、彼女はその測定結果の行方を制御することはできない。 したがって、彼女が測定を行うと、4つの結果が考えられ、その4つすべてが等しく起こり得る: 、 、 、および 。なお、それぞれの結果がボブの量子ビットに与える影響は異なることに留意されたい。 例えば、アリスが自分の量子ビットが の状態にあることを確認した場合、これにより3量子ビットの量子状態全体が へと収束することになります。アリスの測定結果がこれと異なる場合、ボブの状態もそれに応じて異なります。 これらは以下の表にまとめられています。
アリスの結果 | ボブの状態 | ボブへの指示 | 結果 |
|---|---|---|---|
| なし | |||
| では |
アリスの量子ビットの全ての可能な測定結果に対して、ボブの量子ビットは、Qに元々あった秘密の状態に曖昧に似た状態で残される。 アリスが (表の最初の行)を測定する場合、ボブの量子ビットはまさに秘密の状態のままである! それ以外のケースでは、何か状態がおかしい。 係数( 's)が入れ替わっているか、"+"記号があるべきところに"-"記号があるか、あるいはその両方である。 ボブの量子ビットを修正し、秘密の状態と正確に等しくするために、アリスはボブに電話をかけ(古典的な通信手段を使う)、ボブの量子ビットに追加操作を行うように伝えなければならない。 例えば、3行目では係数が入れ替わっている。 アリスがボブに電話し、彼の量子ビットに ゲートを適用するよう指示すると、 が に、その逆が に変化し、秘密の状態が出てくる。
この仕組みでは、光速を超えて情報を送信できない理由が、これで明らかになったはずです。 運が良ければ、 という値が測定されるかもしれません。これは、ボブがまさにその秘密の状態を即座に持っていることを意味します。 しかし、私たちがボブに電話して「 を測定したので、あなたは何もしなくて大丈夫です」と伝えるまでは、ボブはそのことを知りません
思考実験では、量子ビットはしばしば物理的に分離され、新しい場所に運ばれる。 IBM® 量子コンピューターは、分離できないチップ上の固体量子ビットを使用する。 そこで、アリスとボブを別の場所に移動させる代わりに、ある量子ビットから別の量子ビットに情報を移動させる、いわゆる "スワップ・ゲート "を使ってチップ自体の情報を分離する。
実験1:基本テレポーテーション
IBM Quantumは、我々が「Qiskitパターン」と呼ぶフレームワークを使って量子コンピューティングの問題に取り組むことを推奨している。 以下のステップで構成される。
- ステップ1:問題を量子回路にマップする
- ステップ2:実際の量子ハードウェア上で動作するように回路を最適化する
- ステップ 3: IBM Quantum のプリミティブを使用して、 IBM の量子コンピュータ上でジョブを実行する
- ステップ4:結果の後処理
ステップ1:問題を量子回路にマッピングする
上記で行った計算はすべて、ステップ1の概要を説明したものだ。 これからQiskitを使って量子回路を作り、実装していく! まず3つの量子ビットで量子回路を作り、アリスとボブの2つの量子ビットをエンタングルする。 これらを量子ビット1と量子ビット2とし、量子ビット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:
これで、アリスの状態をボブにテレポートさせるための作業はすべて完了です。 しかし、量子状態 を測定すると、 または のいずれかが得られることを思い出してください。したがって、結局のところ、ボブは間違いなくアリスの秘密の状態を手にしているのですが、測定だけではこれを容易に確認することはできません。 測定の結果から「この作業が正しく行われた」と判断するためには、ちょっとした工夫が必要だ。 「ユニタリ」を意味する「U」というラベルのついた演算子があり、これを使ってアリスの秘密状態を生成しました。 回路の末端で、Uの逆関数を適用することができます。 もしUがアリスの という状態を に写像するとしたら、Uの逆演算はボブの を に戻すことになる。したがって、単に量子情報を移動させることだけが目的であれば、この最後の工程は必ずしも行われる必要はない。 これは、私たちが自分自身を省みるためだけのものです。
# 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:
したがって、この手順を正しく行っていれば、ボブの量子ビットに対する測定結果は、 の状態となるはずです。 もちろん、これらの測定値は確率的なものです。 したがって、ボブの量子ビットが の状態にあると測定される可能性が、たとえごくわずかであっても、たった1回の測定で という結果になる可能性があります。 という結果が出る確率が十分に高くなるよう、実際には何度も測定を行う必要があります。
ステップ2:量子実行のための問題最適化
このステップでは、私たちが実行したいオペレーションを、特定の量子コンピュータの機能の観点から表現する。 また、我々の問題を量子コンピューターのレイアウトにマッピングすることもできる。
まず、 IBM 量子コンピューターと通信するために必要なパッケージをいくつかロードする。 また、実行するバックエンドも選択しなければならない。 最も忙しくないバックエンドを選ぶか、プロパティがわかっている特定のバックエンドを選ぶことができる。
初回使用時に認証情報を保存するためのコードが以下にあります。 ノートブックを自分の環境に保存した後、必ずこの情報をノートブックから削除してください。そうすれば、ノートブックを共有するときにあなたの認証情報が誤って共有されることはありません。 詳しいガイダンスについては、 IBM Cloud アカウントの設定および信頼できない環境でのサービスの初期化を参照してください。
# Load IBM Quantum Compute Service
from qiskit_ibm_runtime import QiskitRuntimeService
# Load IBM Quantum Compute 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)Output:
ibm_sherbrooke
我々は、測定値に関する論理を明示的に有効にしている。
from qiskit.circuit import IfElseOp
backend.target.add_instruction(IfElseOp, name="if_else")さて、量子回路を "トランスパイル "しなければならない。 これには多くのサブステップがあり、魅力的なトピックである。 サブステップの例を挙げると、すべての量子コンピュータがQiskitのすべての論理ゲートを直接実装できるわけではない。 量子コンピューターが実装できるゲートの観点から、回路のゲートを書かなければならない。 プリセット・パス・マネージャーを使えば、このプロセスやその他のプロセスを実行することができる。 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)「サンプラー」とは、量子回路の結果として生じうる状態をサンプリングし、どのような状態がどの程度の確率で測定されるかに関する統計情報を収集するために設計されたプリミティブである。 ここで、 IBM Quantum サンプラーをインポートします:
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)量子コンピュータのすべての計算が古典コンピュータで合理的にシミュレートできるわけではない。 このような単純なテレポーテーションは確かにあり得るが、古典的にある場所に情報を保存できることはまったく驚くべきことではない。 これらの計算は、実際の IBM 量子コンピュータを使って行うことを強く推奨する。 しかし、毎月の無料使用分を使い果たした場合、あるいは授業中に終わらせなければならないことがあり、キューで待つことができない場合、このモジュールはシミュレーターを使って完了させることができる。 これを行うには、以下のセルを実行し、"Execute "ステップで関連する行のコメントを解除するだけです。
# 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: 実行
サンプラーを使用して、回路を引数としてジョブを実行する。
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:
理解度チェック
上記の状態のうち、どれがテレポーテーションの成功を示しているか、また、どのようにして判断できるか
、 、 、 の各状態は、いずれもテレポーテーションの成功と整合している。 これは、秘密状態の初期準備を元に戻すためのゲートを追加したためです。 もし秘密の状態がボブの量子ビットへ正常にテレポーテーションされたのであれば、その追加のゲートによって、ボブの量子ビットは の状態に戻るはずである。 したがって、ボブの量子ビット(量子ビット0。これは古典レジスタの0番目の成分として測定され、したがって最も高い/右端の位置にある)が 状態にある上記のいずれかの状態であれば、成功を示します。
このプロットは、5,000回の試行(ショット)にわたる、3つの量子ビットのすべての測定結果を示している。 先ほど、アリスは量子ビットAとQのすべての可能な状態を等確率で測定することを指摘した。 回路の0-2量子ビットをQ、A、Bの順に割り当てた。 リトルエンディアン表記では、ボブの量子ビットが最左端/最下位となる。 つまり、左側の4本のバーは、ボブの量子ビットが 、他の2つの量子ビットがほぼ等しい確率ですべての可能な組み合わせにあることに対応している。 測定結果のほぼ全て(通常95%)がボブの量子ビットを 、セットアップが成功したことを意味する! ボブの量子ビットが 。 それは論理的にあり得ないはずだ。 しかし、現代の量子コンピュータはすべて、古典コンピュータよりもはるかに大きなノイズとエラーに悩まされている。 量子エラー訂正はまだ新しい分野だ。
実験2:プロセッサ間でのテレポーテーション
量子テレポーテーションの最も興味深い点は、量子状態を長距離にわたって瞬時にテレポートできることだろう(ただし、余分なゲートの古典的通信は瞬時ではない)。 すでに述べたように、プロセッサーから量子ビットを取り外して移動させることはできない。 しかし、テレポーテーションに関係する量子ビットがプロセッサーの反対側に来るまで、ある量子ビットから別の量子ビットに情報を移動させることができる。 上のステップを繰り返すが、今度はプロセッサーに十分な数の量子ビットを持つ、より大きな回路を作ろう。
ステップ1:問題を量子回路にマッピングする
今度は、アリスとボブに対応する量子ビットが変わる。 だから、1つの量子ビットに "A"、もう1つの量子ビットに "B "という名前はつけない。 そうではなく、量子ビットに番号を付け、アリスとボブに属する量子ビットの情報の現在位置を表す変数を使う。 スワップゲート以外のすべてのステップは、前述の通りである。
# 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:
回路図を見ても、論理的なステップは同じであることがわかるだろう。 唯一の違いは、アリスの量子ビットの状態を、量子ビット6( )から量子ビット1( )、つまりQのすぐ隣に持ってくるためにスワップゲートを使ったことだ。 そして、スワップゲートを使って、ボブの初期状態を量子ビット7( )から量子ビット12( )に下ろした。量子ビット12の状態は、離れた量子ビット0と1の測定が行われるまではQの秘密状態とは無関係であり、条件付き と ゲートが適用されるまでは、量子ビット12の状態は秘密状態と等しくないことに注意してください。
ステップ2: 回路を最適化する
通常、パス・マネージャーを使ってトランスパイルし、回路を最適化する場合、回路を可能な限り効率的にしたいので、 optimization_level = 3 を設定するのは理にかなっている。 この場合、量子ビット6と7から量子ビット1と12に状態を転送する計算上の理由はない。 あれはテレポーテーションを実証するためにやったことなんだ。 パス・マネジャーに回路の最適化を依頼すれば、これらのスワップ・ゲートには論理的な理由がないことに気づき、ゲートを削除して隣接する量子ビットのゲート演算を実行する。 そこで、この特別なケースでは、 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())Output:
105
plot_circuit_layout 、これらの量子ビットが量子プロセッサー上のどの位置にあるかを視覚化することができる。
ステップ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:
ステップ4:古典的な後処理
ここでもまた、アリスの量子ビットの可能な結果の確率はかなり均一であることがわかる。 秘密コードを反転させた後、 、ボブの量子ビットを見つけることに強い優先順位がある。つまり、Qからボブ(量子ビット0から12)へ、プロセッサ全体で秘密状態を正しくテレポートした可能性が高い。 ただし、Bob の場合、 を測定しない可能性が高くなっていることに注意してください。 ゲートの数が多ければ多いほど、特にスワップゲートのような多量子ビットゲートが多ければ多いほど、ノイズやエラーが発生する。
質問
指導者は、このノートがどのように使用されているかについての簡単なアンケートに答えることで、解答と一般的なカリキュラムにおける配置についてのガイダンスが付いたバージョンのノートを要求することができる。
重要な概念
- つまり、ある量子ビットの測定が別の量子ビットの状態に影響を与えたり、あるいはその状態を決定したりする。
- エンタングルメントは古典的な相関とは異なります。例えば、量子ビットAとBは、 のような状態の重ね合わせにある可能性があります。AやBの状態は本質的に不確定であるにもかかわらず、AとBが同じ状態にあることは保証されるのです。
- エンタングルメントと測定の組み合わせによって、ある量子ビットから別の量子ビットに状態(情報を記憶できる)を転送することができる。 これは量子テレポーテーションと呼ばれている。
- 量子テレポーテーションは、確率的な量子測定に依存している。 したがって、テレポートされた状態を微調整するためには、古典的なコミュニケーションが必要になる。 このため、量子テレポーテーションが光よりも速く情報を移動させることはできない。 量子テレポーテーションは相対性理論にも因果関係にも反しない。
- 現代の量子コンピューターは、古典的なコンピューターよりもノイズやエラーの影響を受けやすい。 数パーセントの誤差を見込んでほしい。
- ゲートを順番に増やせば増やすほど(特に2量子ビットゲート)、エラーやノイズが増えることが予想される。
正誤問題
- T/F 量子テレポーテーションは、光よりも速く情報を送るために使うことができる。
- T/F 現代の証拠は、量子状態の崩壊が光よりも速く伝播することを示唆している。
- T/F Qiskitでは、量子ビットは、次のように、一番小さい番号の量子ビットが右側になるように並びます。
MCの質問
- キュービットAとBはエンタングルされ、その後大きな距離( )によって分離される。キュービットAが測定される。 量子ビットBの状態が影響を受ける速度について正しい記述はどれか?
- a. Qubit Bは、これまでに行われた実験では、実験の許容範囲内で即座に影響を受けている。
- b. キュービットBは、時間( )後に影響を受ける。これは、実験的な許容範囲内で、ほぼ光速で量子状態が「崩壊」することを意味する。
- c. キュービットBは、古典的な通信が発生した後にのみ影響を受ける。つまり、 よりも長い時間で通信が発生する。
- d. 上記のいずれでもない
- 測定確率とは、量子状態の振幅と関連していることを思い出してください。 例えば、クビットが当初 という状態にある場合、 という状態が測定される確率は となる。サンプリング回数が有限であるため、すべての測定結果がこれらの確率と完全に一致するわけではない(コインを投げたときに、たまたま2回連続で表が出るのと同じである)。 以下の測定ヒストグラムは、以下のどの量子状態に対応している可能性があるでしょうか? 最適な選択肢を選んでください。
- a.
- b.
- c.
- d.
- e.
- 次のうち、量子ビットAとBがもつれた状態はどれか? 該当するものをすべて選択します。
- a.
- b.
- c.
- d.
- e.
- このモジュールでは、 というエンタングルメント状態を用意しました。しかし、同様のプロトコルには、他にも多くのエンタングルメント状態を利用することができます。 以下の州のうち、どのような州であれば、次のような2キュービットの測定ヒストグラムが得られるでしょうか? 最も適切な答えを選んでください。
- a.
- b.
- c.
- d.
- e.
議論における疑問点:
-
量子テレポーテーションのプロトコルを、最初から最後まで、パートナーやグループに説明する。 何か付け加えることがあるか、質問があるかどうかを確認する。
-
アリスとボブの間の最初のもつれ状態に何かユニークな点はありますか? もしそうなら、何がユニークなのですか? もしそうでなければ、他にどのようなもつれ状態を使うことができただろうか?