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

Hello world

パッケージバージョン

このページのコードは、以下の要件を使用して開発されました。 これらのバージョンまたはそれ以降のバージョンの使用を推奨します。

qiskit[all]~=2.3.0
qiskit-ibm-runtime~=0.43.1

この例は2つの部分で構成されています。まず、シンプルな量子プログラムを作成し、量子処理ユニット(QPU)で実行します。実際の量子研究にははるかに堅牢なプログラムが必要なため、第2セクション(多数の量子ビットへのスケール)では、シンプルなプログラムをユーティリティレベルまでスケールアップします。

インストールと認証

  1. まだQiskitをインストールしていない場合は、クイックスタートガイドで手順を確認してください。

    • 量子ハードウェアでジョブを実行するためにQiskit Runtimeをインストールします:

      pip install qiskit-ibm-runtime
    • Jupyterノートブックをローカルで実行するための環境を設定します:

      pip install jupyter
  2. 無料のOpenプランを通じて量子ハードウェアへのアクセスのための認証を設定します。

    (アカウントへの招待メールを受け取った場合は、代わりに招待されたユーザーの手順に従ってください。)

    • IBM Quantum Platformにアクセスして、ログインまたはアカウントを作成します。

      重要

      プロキシサーバー経由で接続する場合は、Qiskit Runtime v0.44.0以降を使用する必要があります。

    • ダッシュボードでAPIキー(APIトークンとも呼ばれます)を生成し、安全な場所にコピーします。

    • インスタンスページにアクセスし、使用したいインスタンスを見つけます。そのCRNにカーソルを合わせてクリックしてコピーします。

    • 次のコードで認証情報をローカルに保存します:

      from qiskit_ibm_runtime import QiskitRuntimeService

      QiskitRuntimeService.save_account(
      token="<your-api-key>", # IBM Quantum Platformホームダッシュボードから作成して保存した44文字のAPI_KEYを使用
      instance="<CRN>", # オプション
      )
  3. これで、Qiskit Runtime Serviceに認証が必要なときはいつでも、このPythonコードを使用できます:

        from qiskit_ibm_runtime import QiskitRuntimeService

    # サービスが必要なときに毎回実行
    service = QiskitRuntimeService()
信頼されたPython環境を使用していませんか?

公共のコンピューターやその他の安全でない環境を使用している場合は、認証情報を安全に保つために、代わりに手動認証手順に従ってください。

シンプルな量子プログラムを作成して実行する

Qiskitパターンを使用して量子プログラムを書くための4つのステップは以下の通りです:

  1. 問題を量子ネイティブ形式にマッピングします。

  2. 回路と演算子を最適化します。

  3. 量子プリミティブ関数を使用して実行します。

  4. 結果を分析します。

ステップ1. 問題を量子ネイティブ形式にマッピングする

量子プログラムでは、量子回路は量子命令を表すネイティブ形式であり、演算子は測定される観測量を表します。回路を作成する際、通常は新しいQuantumCircuitオブジェクトを作成し、順番に命令を追加します。 次のコードセルは、ベル状態を生成する回路を作成します。ベル状態は、2つの量子ビットが完全にもつれ合った状態です。

注: ビット順序

Qiskit SDKは、nthn^{th}桁が値1n1 \ll nまたは2n2^nを持つLSb 0ビット番号付けを使用します。詳細については、Qiskit SDKでのビット順序のトピックを参照してください。

from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit.transpiler import generate_preset_pass_manager
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import EstimatorOptions
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from matplotlib import pyplot as plt
# シミュレーターを使用したい場合は、次の行のコメントを解除してください:
# from qiskit_ibm_runtime.fake_provider import FakeBelemV2

# 2つの量子ビットを持つ新しい回路を作成
qc = QuantumCircuit(2)

# 量子ビット0にアダマールゲートを追加
qc.h(0)

# 量子ビット0で制御される量子ビット1に制御Xゲートを実行
qc.cx(0, 1)

# MatPlotLib("mpl")を使用して回路の図を返します。
# これらのガイドはJupyterノートブックを使用して書かれており、
# 各セルの最後の行の出力が表示されます。
# スクリプトで実行している場合は、`print(qc.draw())`を使用して
# テキスト図を出力してください。
qc.draw("mpl")

Output of the previous code cell

利用可能なすべての操作については、ドキュメントのQuantumCircuitを参照してください。 量子回路を作成する際には、実行後に返されるデータの種類も考慮する必要があります。Qiskitは2つの方法でデータを返します: 測定する量子ビットのセットの確率分布を取得するか、観測量の期待値を取得できます。Qiskitプリミティブ(詳細はステップ3で説明)を使用して、これら2つの方法のいずれかで回路を測定するようにワークロードを準備します。

この例では、qiskit.quantum_infoサブモジュールを使用して期待値を測定します。これは演算子(量子状態を変更するアクションまたはプロセスを表すために使用される数学的オブジェクト)を使用して指定されます。次のコードセルは、6つの2量子ビットパウリ演算子を作成します: IZIXZIXIZZXX

# 6つの異なる観測量を設定します。

observables_labels = ["IZ", "IX", "ZI", "XI", "ZZ", "XX"]
observables = [SparsePauliOp(label) for label in observables_labels]
演算子表記

ここで、ZZ演算子のようなものは、テンソル積ZZZ\otimes Zの省略形であり、量子ビット1のZと量子ビット0のZを一緒に測定し、量子ビット1と量子ビット0の間の相関に関する情報を取得することを意味します。このような期待値は、通常Z1Z0\langle Z_1 Z_0 \rangleとも書かれます。

状態がもつれている場合、Z1Z0\langle Z_1 Z_0 \rangleの測定はI1Z0Z1I0\langle I_1 \otimes Z_0 \rangle \langle Z_1 \otimes I_0 \rangleの測定とは異なるはずです。上記で説明した回路によって作成される特定のもつれ状態の場合、Z1Z0\langle Z_1 Z_0 \rangleの測定は1になり、I1Z0Z1I0\langle I_1 \otimes Z_0 \rangle \langle Z_1 \otimes I_0 \rangleの測定はゼロになるはずです。

ステップ2. 回路と演算子を最適化する

デバイスで回路を実行する場合、回路に含まれる命令のセットを最適化し、回路の全体的な深さ(おおよそ命令の数)を最小限に抑えることが重要です。これにより、エラーとノイズの影響を軽減し、可能な限り最良の結果を得ることができます。さらに、回路の命令はバックエンドデバイスの命令セットアーキテクチャ(ISA)に適合し、デバイスの基底ゲートと量子ビット接続性を考慮する必要があります。

次のコードは、ジョブを送信する実際のデバイスをインスタンス化し、そのバックエンドのISAに一致するように回路と観測量を変換します。これには、すでに認証情報を保存している必要があります。

service = QiskitRuntimeService()

backend = service.least_busy(simulator=False, operational=True)

# ISA回路とレイアウトマッピングされた観測量に変換します。
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(qc)

isa_circuit.draw("mpl", idle_wires=False)

Output of the previous code cell

ステップ3. 量子プリミティブを使用して実行する

量子コンピューターはランダムな結果を生成する可能性があるため、通常、回路を何度も実行して出力のサンプルを収集します。Estimatorクラスを使用して観測量の値を推定できます。Estimatorは2つのプリミティブの1つで、もう1つは量子コンピューターからデータを取得するために使用できるSamplerです。これらのオブジェクトには、プリミティブ統一ブロック(PUB)を使用して、回路、観測量、パラメータ(該当する場合)の選択を実行するrun()メソッドがあります。

# Estimatorインスタンスを構築します。

estimator = Estimator(mode=backend)
estimator.options.resilience_level = 1
estimator.options.default_shots = 5000

mapped_observables = [
observable.apply_layout(isa_circuit.layout) for observable in observables
]

# 1つのpub、5つの異なる観測量に対して実行する1つの回路。
job = estimator.run([(isa_circuit, mapped_observables)])

# 後でジョブデータを取得するためにジョブIDを使用
print(f">>> Job ID: {job.job_id()}")
>>> Job ID: d5k96q4jt3vs73ds5tgg

ジョブが送信された後、現在のPythonインスタンス内でジョブが完了するまで待つか、job_idを使用して後でデータを取得できます。(詳細については、ジョブの取得に関するセクションを参照してください。)

ジョブが完了したら、ジョブのresult()属性を通じて出力を確認します。

# これは送信全体の結果です。1つのPubを送信したので、
# 1つの内部結果(およびそれ自体のメタデータ)が含まれています。
job_result = job.result()

# これは単一のpubからの結果で、6つの観測量があったため、
# すべての6つに関する情報が含まれています。
pub_result = job.result()[0]
# 6つの観測量があることを確認します。
# そうでない場合は、前のセルのコメントを編集してこのテストを更新してください。
assert len(pub_result.data.evs) == 6
代替: シミュレーターを使用して例を実行する

量子プログラムを実際のデバイスで実行する場合、ワークロードは実行前にキューで待機する必要があります。時間を節約するために、代わりに次のコードを使用して、Qiskit Runtimeローカルテストモードでfake_providerでこの小さなワークロードを実行できます。これは小さな回路でのみ可能であることに注意してください。次のセクションでスケールアップする場合、実際のデバイスを使用する必要があります。


# シミュレーターで実行したい場合は、代わりに次のコードを使用してください:

from qiskit_ibm_runtime.fake_provider import FakeBelemV2
backend = FakeBelemV2()
estimator = Estimator(backend)

# ISA回路とレイアウトマッピングされた観測量に変換します。

pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(qc)
mapped_observables = [
observable.apply_layout(isa_circuit.layout) for observable in observables
]

job = estimator.run([(isa_circuit, mapped_observables)])
result = job.result()

# これは送信全体の結果です。1つのPubを送信したので、
# 1つの内部結果(およびそれ自体のメタデータ)が含まれています。

job_result = job.result()

# これは単一のpubからの結果で、5つの観測量があったため、
# すべての5つに関する情報が含まれています。

pub_result = job.result()[0]

ステップ4. 結果を分析する

分析ステップは、通常、測定エラー軽減やゼロノイズ外挿(ZNE)などを使用して結果を後処理する場所です。これらの結果をさらなる分析のために別のワークフローにフィードしたり、主要な値とデータのプロットを準備したりすることもできます。一般に、このステップは問題に固有のものです。この例では、回路に対して測定された各期待値をプロットします。

Estimatorに指定した観測量の期待値と標準偏差は、ジョブ結果のPubResult.data.evsおよびPubResult.data.stds属性を通じてアクセスされます。Samplerから結果を取得するには、PubResult.data.meas.get_counts()関数を使用します。これは、ビット文字列をキーとし、カウントを対応する値として測定のdictを返します。詳細については、Samplerを使ってみるを参照してください。

# 結果をプロット

values = pub_result.data.evs

errors = pub_result.data.stds

# グラフをプロット
plt.plot(observables_labels, values, "-o")
plt.xlabel("Observables")
plt.ylabel("Values")
plt.show()

Output of the previous code cell

量子ビット0と1について、XとZの両方の独立した期待値は0であり、相関(XXZZ)は1であることに注意してください。これは量子もつれの特徴です。

# 前のマークダウンセルの主張に結果が従うことを確認します。
# これは、デバイスが時々奇妙な動作をする場合に発生する可能性があります。このセルが
# 失敗した場合は、ノートブックを再度実行する必要があるかもしれません。

_results = {obs: val for obs, val in zip(observables_labels, values)}
for _label in ["IZ", "IX", "ZI", "XI"]:
assert abs(_results[_label]) < 0.2
for _label in ["XX", "ZZ"]:
assert _results[_label] > 0.8

多数の量子ビットへのスケール

量子コンピューティングにおいて、ユーティリティスケールの作業は、この分野で進歩を遂げるために重要です。このような作業には、はるかに大規模な計算が必要です。100個を超える量子ビットと1000個を超えるゲートを使用する回路での作業が必要です。この例では、100量子ビットのGHZ状態を作成および分析することで、IBM® QPUでユーティリティスケールの作業を実現する方法を示します。Qiskitパターンワークフローを使用し、各量子ビットに対して期待値Z0Zi\langle Z_0 Z_i \rangle を測定して終了します。

ステップ1. 問題をマッピングする

nn量子ビットのGHZ状態(基本的に拡張ベル状態)を準備するQuantumCircuitを返す関数を書き、その関数を使用して100量子ビットのGHZ状態を準備し、測定する観測量を収集します。

def get_qc_for_n_qubit_GHZ_state(n: int) -> QuantumCircuit:
"""この関数は、n量子ビットのGHZ状態のためのqiskit.QuantumCircuit(qc)を作成します。

Args:
n (int): n量子ビットGHZ状態の量子ビット数

Returns:
QuantumCircuit: すべての量子ビットが0状態から始まると仮定して、n量子ビットGHZ状態を生成する量子回路
"""
if isinstance(n, int) and n >= 2:
qc = QuantumCircuit(n)
qc.h(0)
for i in range(n - 1):
qc.cx(i, i + 1)
else:
raise Exception("n is not a valid input")
return qc

# 2つの量子ビット(最初の引数)と2つの古典
# ビット(2番目の引数)を持つ新しい回路を作成
n = 100
qc = get_qc_for_n_qubit_GHZ_state(n)

次に、関心のある演算子にマッピングします。この例では、量子ビット間のZZ演算子を使用して、距離が離れるにつれての振る舞いを調べます。遠くの量子ビット間の期待値がますます不正確(破損)になることで、存在するノイズのレベルが明らかになります。

# ZZII...II, ZIZI...II, ... , ZIII...IZ
operator_strings = [
"Z" + "I" * i + "Z" + "I" * (n - 2 - i) for i in range(n - 1)
]
print(operator_strings)
print(len(operator_strings))

operators = [SparsePauliOp(operator) for operator in operator_strings]
['ZZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZIII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZII', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZI', 'ZIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIZ']
99

ステップ2. 量子ハードウェアでの実行のために問題を最適化する

次のコードは、バックエンドのISAに一致するように回路と観測量を変換します。これには、すでに認証情報を保存している必要があります。

service = QiskitRuntimeService()

backend = service.least_busy(
simulator=False, operational=True, min_num_qubits=100
)
pm = generate_preset_pass_manager(optimization_level=1, backend=backend)

isa_circuit = pm.run(qc)
isa_operators_list = [op.apply_layout(isa_circuit.layout) for op in operators]

ステップ3. ハードウェアで実行する

ジョブを送信し、エラーを減らす技術である動的デカップリングを使用してエラー抑制を有効にします。レジリエンスレベルは、エラーに対してどれだけのレジリエンスを構築するかを指定します。レベルが高いほど、処理時間が長くなる代わりに、より正確な結果が生成されます。次のコードで設定されているオプションの詳細な説明については、Qiskit Runtimeのエラー軽減の設定を参照してください。

options = EstimatorOptions()
options.resilience_level = 1
options.dynamical_decoupling.enable = True
options.dynamical_decoupling.sequence_type = "XY4"

# Estimatorオブジェクトを作成
estimator = Estimator(backend, options=options)
# 回路をEstimatorに送信
job = estimator.run([(isa_circuit, isa_operators_list)])
job_id = job.job_id()
print(job_id)
d5k9mmqvcahs73a1ni3g

ステップ4. 結果を後処理する

ジョブが完了したら、結果をプロットすると、Z0Zi\langle Z_0 Z_i \rangleiiの増加とともに減少することに注意してください。理想的なシミュレーションでは、すべてのZ0Zi\langle Z_0 Z_i \rangleは1になるはずです。

# データ
data = list(range(1, len(operators) + 1)) # Z演算子間の距離
result = job.result()[0]
values = result.data.evs # 各Z演算子での期待値。
values = [
v / values[0] for v in values
] # 期待値を正規化して、距離によってどのように減衰するかを評価します。

# グラフをプロット
plt.plot(data, values, marker="o", label="100-qubit GHZ state")
plt.xlabel("Distance between qubits $i$")
plt.ylabel(r"$\langle Z_i Z_0 \rangle / \langle Z_1 Z_0 \rangle $")
plt.legend()
plt.show()

Output of the previous code cell

前のプロットは、量子ビット間の距離が増加するにつれて、ノイズの存在によって信号が減衰することを示しています。

次のステップ

推奨事項