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

Qiskitハンズオン:Hello World - Qiskit Patterns

このノートブックではQiskit Patternsのワークフローを歩んで、QiskitのSampler primitiveを使用します。

このチュートリアルは、IBM Quantum Documentation: Hello Worldのコンテンツを一部取り上げています。

有用なリンク:

  1. IBM Cloudアカウントを作成して、IBM Quantum Platformにアクセスしてください。
  2. コーディング環境の構築にクラウドベースプラットフォームを使用します。QBraidまたはGoogle Colabを使用できます。
  3. このノートブックの後、Quantum Teleportationプロトコルを学びます。

その他のリンク — Qiskitコミュニティと学習リソース:

Qiskitのインストール

オンラインのjupyter lab環境(ガイド参照:Online lab environments)を使用するか、ローカルにQiskitをインストールすることもできます。

QiskitインストールガイドInstall the Qiskit SDK and the Qiskit Runtime clientに従って、以下の手順を完了させてください:

  • 視覚化パッケージを含むQiskitをインストールする:pip install qiskit[visualization]

  • qiskit-ibm-runtimeをインストールする:pip install qiskit-ibm-runtime

  • jupyterをインストールする:pip install jupyter 使用するPythonのバージョンがpython>=3.10であることを確認して、最新のQiskitバージョンとの互換性を保護してください:

# Added by doQumentation — required packages for this notebook
!pip install -q IPython
from platform import python_version

print(python_version())
3.13.7

Pythonのアップグレードが必要で方法がわからない場合は、OSごとのPythonアップグレード方法に関するガイドを参照してください:How to update Python

%pip install qiskit[visualization]
%pip install qiskit-ibm-runtime
%pip install
%pip install qiskit-aer
zsh:1: no matches found: qiskit[visualization]
Note: you may need to restart the kernel to use updated packages.
Requirement already satisfied: qiskit-ibm-runtime in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (0.43.0)
Requirement already satisfied: requests>=2.19 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.32.5)
Requirement already satisfied: requests-ntlm>=1.1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (1.3.0)
Requirement already satisfied: numpy>=1.13 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.3.3)
Requirement already satisfied: urllib3>=1.21.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.5.0)
Requirement already satisfied: python-dateutil>=2.8.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.9.0.post0)
Requirement already satisfied: ibm-platform-services>=0.22.6 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (0.69.0)
Requirement already satisfied: pydantic>=2.5.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.12.2)
Requirement already satisfied: qiskit>=1.4.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (2.2.1)
Requirement already satisfied: packaging in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-ibm-runtime) (25.0)
Requirement already satisfied: ibm_cloud_sdk_core<4.0.0,>=3.24.2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from ibm-platform-services>=0.22.6->qiskit-ibm-runtime) (3.24.2)
Requirement already satisfied: PyJWT<3.0.0,>=2.10.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from ibm_cloud_sdk_core<4.0.0,>=3.24.2->ibm-platform-services>=0.22.6->qiskit-ibm-runtime) (2.10.1)
Requirement already satisfied: six>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from python-dateutil>=2.8.0->qiskit-ibm-runtime) (1.17.0)
Requirement already satisfied: charset_normalizer<4,>=2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (3.4.4)
Requirement already satisfied: idna<4,>=2.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (3.11)
Requirement already satisfied: certifi>=2017.4.17 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests>=2.19->qiskit-ibm-runtime) (2025.10.5)
Requirement already satisfied: annotated-types>=0.6.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (0.7.0)
Requirement already satisfied: pydantic-core==2.41.4 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (2.41.4)
Requirement already satisfied: typing-extensions>=4.14.1 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (4.15.0)
Requirement already satisfied: typing-inspection>=0.4.2 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from pydantic>=2.5.0->qiskit-ibm-runtime) (0.4.2)
Requirement already satisfied: rustworkx>=0.15.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (0.17.1)
Requirement already satisfied: scipy>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (1.16.2)
Requirement already satisfied: dill>=0.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (0.4.0)
Requirement already satisfied: stevedore>=3.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.4.1->qiskit-ibm-runtime) (5.5.0)
Requirement already satisfied: cryptography>=1.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests-ntlm>=1.1.0->qiskit-ibm-runtime) (46.0.2)
Requirement already satisfied: pyspnego>=0.4.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from requests-ntlm>=1.1.0->qiskit-ibm-runtime) (0.12.0)
Requirement already satisfied: cffi>=2.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (2.0.0)
Requirement already satisfied: pycparser in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from cffi>=2.0.0->cryptography>=1.3->requests-ntlm>=1.1.0->qiskit-ibm-runtime) (2.23)
Note: you may need to restart the kernel to use updated packages.
ERROR: You must give at least one requirement to install (see "pip help install")
Note: you may need to restart the kernel to use updated packages.
Requirement already satisfied: qiskit-aer in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (0.17.2)
Requirement already satisfied: qiskit>=1.1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.2.1)
Requirement already satisfied: numpy>=1.16.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.3.3)
Requirement already satisfied: scipy>=1.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (1.16.2)
Requirement already satisfied: psutil>=5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (7.1.0)
Requirement already satisfied: python-dateutil>=2.8.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit-aer) (2.9.0.post0)
Requirement already satisfied: six>=1.5 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from python-dateutil>=2.8.0->qiskit-aer) (1.17.0)
Requirement already satisfied: rustworkx>=0.15.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (0.17.1)
Requirement already satisfied: dill>=0.3 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (0.4.0)
Requirement already satisfied: stevedore>=3.0.0 in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (5.5.0)
Requirement already satisfied: typing-extensions in /Users/astricornish/miniforge3/envs/um-qiskit/lib/python3.13/site-packages (from qiskit>=1.1.0->qiskit-aer) (4.15.0)
Note: you may need to restart the kernel to use updated packages.

必要なインポート

このチュートリアルに必要なインポートを行います。

from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister
import qiskit_ibm_runtime
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit.quantum_info import SparsePauliOp
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_bloch_multivector, plot_state_qsphere
from IPython.display import display, Latex

IBM Quantum Platformアカウントのセットアップ

実際のハードウェアで量子Circuit を実行するには、IBM Cloudアカウントが必要です。

このガイド Set up your IBM Cloud account の指示に従って、以下の手順を完了してください。

  1. IBM Cloudアカウントをお持ちでない場合は、作成してください。
  2. IBMidを使用して IBM Quantum Platform アカウントにログインするか、新規作成してください。
  3. IBM Quantum Platformダッシュボードにアクセスし、APIトークンを作成して、安全な場所にコピーしてください。(下記の最初の参考画像を参照してください。)
  4. 参考画像の後にあるコードセルで、deleteThisAndPasteYourAPIKeyHere をAPIキーに置き換えてください。
  5. ☰ メインメニューの「インスタンス」ページに移動し、インスタンスを作成してください。Networkの機関に所属していない場合は、オープンプランを選択してください。(下記の2番目の参考画像を参照してください。)
  6. インスタンスが作成されたら、関連するCRNコードをコピーしてください。(CRNは Cloud Resource Names の略です。)インスタンスを確認するために更新が必要な場合があります。
  7. 参考画像の後にあるコードセルで、deleteThisAndPasteYourCRNHere をCRNコードに置き換えてください。

注意: APIキーは安全なパスワードと同様に扱ってください。APIキーを安全な環境および信頼できない環境で使用する方法の詳細については、Set up your IBM Cloud account ガイドを参照してください。

#@title personals
your_api_key = "YOUR_API_KEY"
your_crn = "YOUR_CRN"
from qiskit_ibm_runtime import QiskitRuntimeService
# Save your API key to access real devices

your_api_key = your_api_key
your_crn = your_crn

QiskitRuntimeService.save_account(
channel="ibm_cloud",
token=your_api_key,
instance=your_crn,
set_as_default=True,
overwrite=True,
)

Qiskit パターンフレームワークを使用したシンプルな量子アルゴリズムの作成と実行

Qiskit パターンの概念的フレームワークは、量子アルゴリズムの構造として考えることができます。

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

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

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

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

  4. 結果を分析します。

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

量子プログラムでは、量子Circuit が量子命令を表すネイティブ形式であり、オペレーター は測定する観測量を表します。Circuit を作成する際は、通常新しい QuantumCircuit オブジェクトを作成し、順番に命令を追加します。

デモンストレーション:Qiskit での基本的な量子Circuit の構築

Qiskit を使用して、いくつかのシンプルなCircuit を構築してみましょう。

# Simple quantum circuit with two qubits and two classical bits

# Create quantum circuit with 2 qubits and 2 classical bits
qc = QuantumCircuit(2)

# Add gates to your circuit
qc.x(0)
qc.s(1)

# Draw the output using MatPlotLib
qc.draw(output='mpl')

Quantum circuit diagram

# Quantum circuit with a Quantum Register named 'qr' that has two qubits, and a Classical Register named 'cr' with two classical bits

# Create a quantum register with 2 qubits, register label is 'qr'
qreg = QuantumRegister(2)

# Create a classical register with 2 qubits, register label is 'cr'
creg = ClassicalRegister(2)

# Create a quantum circuit with registers qreg and creg
qc = QuantumCircuit(qreg, creg)

# Add gates to your registers
qc.x(qreg[0])

# Draw the quantum circuit
qc.draw(output='mpl')

Quantum circuit diagram

演習:Qiskit での基本的な量子Circuit の構築

ベル状態 00+112\frac{|00\rangle + |11\rangle}{\sqrt{2}} のCircuit を作成してください。

# Create a new circuit with two qubits
qc = QuantumCircuit(2)

# Add a Hadamard gate to qubit 0
qc.h(0)

# Perform a controlled-X gate on qubit 1, controlled by qubit 0
qc.cx(0,1)

# Return a drawing of the circuit using MatPlotLib ("mpl").
qc.draw('mpl')

Quantum circuit diagram

量子Circuit の初期状態は 00\ket{00} 状態です。

最終状態は:

# Use Statevector to fetch the statevector of the circuit
sv = Statevector(qc)
sv.draw(output='latex')

2200+2211\frac{\sqrt{2}}{2} |00\rangle+\frac{\sqrt{2}}{2} |11\rangle

Qiskit でのビット番号付けに関する注記

Qiskit では、文字列内のビットを右から左に番号付けします。Qiskit SDK は LSb 0 ビット番号付けを使用します。nn ビット(またはQubit)のリストを文字列として表示または解釈する場合、ビット n1n−1 が最左ビットであり、ビット 00 が最右ビットです。これは、通常、最上位桁を左に書くためであり、Qiskit ではビット n1n−1 が最上位ビットとして解釈されます。詳細については、Qiskit SDK でのビット順序 のトピックを参照してください。

#LSB ordering example
qc2 = QuantumCircuit(2)
qc2.x(1)

qc2.draw("mpl")

Quantum circuit diagram

sv2 = Statevector(qc2)
sv2.draw(output='latex')

10 |10\rangle

測定Gate は必要ですか?

量子Circuit を作成する際は、実行後に返すデータの種類についても考慮する必要があります。Qiskit はデータを返す2つの方法を提供します:観測量の期待値を取得するか、測定したいQubit セットの確率分布を取得することができます。Qiskit プリミティブ を使用して、これら2つの方法のいずれかで Circuit を測定するためにワークロードを準備してください。

  • Sampler プリミティブ - 測定するQubit セットの確率分布を返します。例:
  • Estimator プリミティブ - 観測量の期待値を返します。例:

本日は Sampler を使用しますので、Circuit に測定Gate を追加する必要があります。

# Use measure_all, which adds a barrier, applies measurement gates on all qubits, creates a classical register called `meas`
qc.measure_all()
qc.draw('mpl')

Quantum circuit diagram

ステップ2. ターゲットハードウェアに向けたCircuit の最適化

デバイス上でCircuit を実行する際には、Circuit に含まれる命令セットを最適化し、Circuit の全体的な深さ(おおよそ命令数)を最小化することが重要です。これにより、エラーやノイズの影響を軽減して最良の結果を得ることができます。また、Circuit の命令はBackend デバイスの 命令セットアーキテクチャ(ISA) に準拠し、デバイスの基底Gate と Qubit 接続性を考慮する必要があります。

以下のコードは、ジョブを送信するシミュレーターをインスタンス化し、Circuit と観測量をそのBackend の ISA に合わせて変換します。なお、後で実際のデバイスを使用します。

# option:
from qiskit_ibm_runtime.fake_provider import FakeTorino
backend = FakeTorino()
print(
f"Name: {backend.name}\n"
f"Version: {backend.version}\n"
f"Native gate set: {backend.operation_names}\n"
)

#to view other properties you can use properties()
# refer to https://docs.quantum.ibm.com/guides/get-qpu-information
Name: fake_torino
Version: 2
Native gate set: ['for_loop', 'delay', 'cz', 'id', 'sx', 'measure', 'reset', 'switch_case', 'if_else', 'rz', 'x']
# Convert to an ISA circuit
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)

isa_circuit_sampler = pm.run(qc)

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

Quantum circuit diagram

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

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

# Create a sampler instance using the selected backend
sampler = Sampler(backend)

# Run the sampler primitive on ISA circuit for specified number of shots (1024)

job_sampler = sampler.run([isa_circuit_sampler], shots=1024)

# Save the result of the job

result_sampler = job_sampler.result()

ステップ4. 結果の後処理

このステップでは結果の後処理を行います。これらの結果を別のワークフローにフィードして詳細な分析を行ったり、主要な値やデータのグラフを準備したりすることができます。一般的に、このステップは問題に固有のものです。

  • Sampler の場合、plot_histogram を使用して、指定したショット数だけ量子Circuit をサンプリングすることで得られた確率分布をプロットします。
from qiskit.visualization import plot_histogram

counts = result_sampler[0].data.meas.get_counts()
# Note: meas is the default name of the classical register when using measure_all().
# If you specify a classical register, then use the name you assign

# Plot the result
plot_histogram(counts)

Code output

実際のデバイスでプログラムを実行する

実際のデバイスでこのコードを実行したい場合は、以下のコードを使用できます。

from qiskit_ibm_runtime import QiskitRuntimeService

# View the list of backends you have access to

service = QiskitRuntimeService()

service.backends()
management.get:WARNING:2025-11-03 14:24:36,838: Loading default saved account
[<IBMBackend('ibm_fez')>,
<IBMBackend('ibm_brisbane')>,
<IBMBackend('ibm_torino')>,
<IBMBackend('ibm_marrakesh')>]
# Get backend
backend_real = service.least_busy(simulator=False, operational=True)

#backend_real = service.backend(name="insert_backend_name") # use this if you want to choose a specific backend

sampler = Sampler(backend_real)

pm = generate_preset_pass_manager(backend=backend_real, optimization_level=3)
isa_circuit = pm.run(qc)

job = sampler.run([isa_circuit], shots=1024)
print(job.job_id)
<bound method BasePrimitiveJob.job_id of <RuntimeJobV2('d444lcg7i53s73e4n6tg', 'sampler')>>
result = job.result()
print(
f"Name: {backend_real.name}\n"
f"Version: {backend_real.version}\n"
f"Native gate set: {backend_real.operation_names}\n"
)
Name: ibm_fez
Version: 2
Native gate set: ['delay', 'cz', 'id', 'sx', 'measure', 'reset', 'if_else', 'rz', 'x']
counts = result[0].data.meas.get_counts()

plot_histogram(counts)

Code output

完了したジョブからの結果の取得

以下のセルは、完了したジョブから結果を取得する方法を示しています。

service = QiskitRuntimeService()
retrieved_job = service.job('d40mquhsg33c73dhhs00')
result = retrieved_job.result()
counts = result[0].data.meas.get_counts()
plot_histogram(counts)
management.get:WARNING:2025-11-03 14:24:55,135: Loading default saved account

Code output