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

最初の量子プログラムを構築して実行する

はじめに

以下の動画では、Olivia Lanes がこのレッスンの内容を説明しています。別ウィンドウで開きたい場合は、YouTube 動画をご利用ください。

今日から量子コンピューターを使う へようこそ!このコースの目標は、事前知識なしにできるだけ短い時間で実際の量子コンピューター上でコードを実行することです。さっそく始めましょう。

この最初のレッスンは、好奇心旺盛な初心者から多忙なリーダーまで幅広い方に対応した、やさしいハンズオン形式の量子コンピューティング入門です。量子Circuit について学び、エンタングルメントを生成する小さな量子プログラムを作成して、実際の IBM® 量子コンピューター上で実行します。実際の量子コンピューターでの実行をスキップしたい場合は、同じプログラムをシミュレーターで実行することもできます。

このノートブックは、新しい Google Colab ランタイムで上から下まで実行することも、ローカルで実行することもできます。

セットアップ

このノートブックを Google Colab で実行するには、ブラウザーでノートブックを開いてセルを実行できる Google アカウントが必要です。

実際の IBM 量子コンピューターで実行するには、(無料の)IBM Quantum® Platform アカウントも必要です。Open Plan を使用してインスタンスを開くと、28 日間のローリングウィンドウあたり 10 分の量子プロセッサーユニット(QPU)時間を取得できます。これは実際にはかなりの量です!アカウントに問題がある場合は、サポートページをご覧ください。

また、IBM Quantum Platform の手順に従って Qiskit をインストールした後、このノートブックをローカルで実行することもできます。

インストールとインポート

Colab では、全員が同じツールを使用できるよう、ノートブック内に依存関係をインストールします。次のセルでは、ビジュアライゼーション・モジュールAer(高速シミュレーター)および IBM Runtime クライアント(量子コンピューター実行用)という 2 つのアドオンを含む Qiskit をインストールします。

次に、いくつかのインポートがあります。QuantumCircuit クラスは、量子ビット(Qubit)を定義し、それらの Qubit に対する操作を定義する場所です。これが最初の量子用語です。Qubit は量子計算の基本的な構成要素であり、ビットが古典計算の構成要素であるのと同様です。Circuit を作成しながら、Qubit の特別な性質についてさらに学んでいきます。次に、plot_histogram は量子Circuit の結果を視覚化するために使用されます。AerSimulator は、古典コンピューター上で量子Circuit をシミュレートすることを可能にします。ただし、シミュレーターは実際の量子コンピューターと同じ規模で量子Circuit を実行することはできません。だからこそ、実際の量子コンピューターが必要なのです。シミュレーターはテスト、デバッグ、教育目的、または QPU の無料 10 分を使い切った場合に役立ちます。preset_passmanagers はハードウェア上で効率的に実行するよう Circuit を最適化するのに役立ちます。Circuit が複雑になるほど、これは非常に重要になります。SamplerQiskitRuntimeService は実際に量子コンピューター上で Circuit を実行するために必要です。詳細は後述します。

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
!pip install 'qiskit[visualization]' qiskit-ibm-runtime qiskit-aer
# Core Qiskit imports
from qiskit import QuantumCircuit
from qiskit.visualization import plot_histogram
from qiskit_aer import AerSimulator
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager

# IBM Runtime specific imports
from qiskit_ibm_runtime import SamplerV2 as Sampler, QiskitRuntimeService

次に、簡単な環境チェックを行います。バージョンを確認し、インポートを確認します。

ここで何か失敗した場合は、通常、依存関係のインストールに問題があります。今すぐ修正することで、後で紛らわしいエラーが発生するのを防ぐことができます。

import sys

import qiskit
import qiskit_aer
import qiskit_ibm_runtime

print("Python:", sys.version.split()[0])
print("qiskit:", qiskit.__version__)
print("qiskit-aer:", qiskit_aer.__version__)
print("qiskit-ibm-runtime:", qiskit_ibm_runtime.__version__)
Python: 3.12.2
qiskit: 2.2.3
qiskit-aer: 0.17.2
qiskit-ibm-runtime: 0.41.1

少し寄り道:Composer を使ってみる

コードを書く前に、Circuit を視覚的に確認することが役立ちます。IBM Quantum Composer を使えば、Gate をワイヤーにドラッグして Circuit を構築できます。構文に気を取られることなく、Circuit が何をしているかを学ぶのに最適な方法です。

Composer はこちらから開いてください。

読み込まれたら、メニューからガイド付きチュートリアルを起動してください:Help | Build your first circuit。自分のペースで進めてください。進めながら、各 Gate が測定の期待値をどのように変化させるかに注意してください。

チュートリアルでは「Hello World」Circuit の構築を順を追って説明しています。これは Circuit ダイアグラムとして視覚化されており、Qubit は水平線で表され、それらの Qubit に作用する Gate は線上のボックスやその他のシンボルで表されます。この Circuit は Qubit と量子コンピューターのいくつかの重要な特徴を紹介しています。

まず、「H」と書かれた赤いボックスはアダマール Gate であり、Qubit 0 の重ね合わせ状態を作成します。ビットが 1 または 0 の状態にしかなれないのとは異なり、Qubit の状態は両方の可能性を同時に、それぞれに特定の重み(振幅と呼ばれる)を付けて含むことができます。重ね合わせは、1 回の測定で両方の結果が見えるという意味ではありません。測定したときにいずれかの結果が起こりうるように状態が設定されているということです。

次に、2 つの Qubit をつなぐ円と垂直線は CNOT Gate であり、2 つの Qubit 間にエンタングルメントを生成します。エンタングルメントは Qubit 間の特別なつながりです。Qubit がエンタングルしていると、測定の結果が通常の独立したコイン投げから期待されるもの、または純粋に古典的な相関からは説明できない方法で強く相関することがあります。2 つの Qubit がエンタングルしているとき、一方を測定すると瞬時に他方の測定結果がわかります。

チュートリアルで見るもう一つの重要な概念はショット数です。測定は Qubit が量子状態として振る舞うのをやめて古典的な読み出し値を与える瞬間であるため、重ね合わせ状態は測定されると確率的に 0 または 1 に崩壊します。そのため、その重ね合わせについて学ぶには、同じ Circuit を何度も実行して統計を蓄積することで多数回の測定を行う必要があります。これをショットと呼びます。

理解度チェック

以下の各質問について考えてから、クリックして答えを確認してください。

1 回の測定で重ね合わせを直接見ることができますか?

Answer

いいえ。1 回の測定は常に古典的な値(0 または 1)を返します。「混合」のアイデアは、多数回の実行(ショットとも呼ばれる)の後に見られる統計にのみ現れます。

平易な言葉で、エンタングルメントは何をもたらしますか?

Answer

連動した結果をもたらします。一方の Qubit を測定すると、もう一方について何かがわかります。このつながりは独立したランダム性よりも強く、純粋に古典的な相関や共有されたランダム性では説明できないほど強いものです。

Qubit が重ね合わせにある場合、1 回の測定で何が見え、なぜ多くのショットが必要なのですか?

Answer

1 回の測定では古典的な結果(0 または 1)のどちらか一方しか見えません。「重ね合わせ」は確率分布として現れ、繰り返しの実行による統計を収集することによってのみ推定できるため、多くのショットが必要です。

Composer での Hello World Circuit の測定ヒストグラムを見てください。何が見えますか?これがエンタングルメントの特徴である理由は何ですか?

Answer

状態 00|00\rangle になる確率が 50%、状態 11|11\rangle になる確率が 50% であることが示されています。つまり、一方を測定して 0 が出れば、もう一方も 0 となり、一方が 1 であれば、もう一方も 1 となります。これはエンタングルメントによって説明できる 2 つの Qubit 間の相関です。

Qiskit を使った量子プログラムの作成と実行

では、コーディングに戻りましょう。Composer で行ったのと同じエンタングル状態(Φ+\Phi^+(ファイ・プラス)Bell 状態と呼ばれる)を生成しますが、今回はコードを手で記述します。より多くの Qubit やより複雑な Circuit に拡張する際には Composer では対応できなくなるため、このスキルを身につける必要があります。

Bell 状態 Circuit を構築するには、HH(アダマール)Gate を使って最初の Qubit を等しい重ね合わせに置きます。次に CXCX(制御 NOT)Gate を適用し、2 つの状態をエンタングルさせます。これにより 2 つの Qubit は古典的な等価物が存在しない方法で相関します。

# --- Build the Bell circuit (phi-plus) ---
bell = QuantumCircuit(2)
bell.h(0)
bell.cx(0, 1)
bell.measure_all() # creates a classical register named "meas"

bell.draw("mpl")

Output of the previous code cell

Circuit 実行のためのヘルパー関数

次に、量子Circuit の実行と測定結果の取得プロセスを処理するヘルパー関数を定義しましょう。この関数は、Backend の命令セットに合わせて Circuit をトランスパイルし、Sampler プリミティブを通じて実行し、結果からカウントを抽出する処理を担当します。

def run_circuit_and_get_counts(circuit, backend, shots=1000):
"""
Runs a quantum circuit on a specified backend and returns the measurement counts.

Args:
circuit (QuantumCircuit): The quantum circuit to run.
backend: The Qiskit backend (real device or simulator).
shots (int): The number of shots to run the circuit.

Returns:
dict: A dictionary of measurement counts.
"""
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(circuit)

sampler = Sampler(mode=backend)

job = sampler.run([isa_circuit], shots=shots)
result = job.result()

return result[0].data.meas.get_counts()

QPU での実行と結果の視覚化

最後に、クラウド上の IBM 量子処理ユニット(QPU)で 1000 ショットの Circuit を実行し、結果をプロットします。IBM QPU は物理システムであるため、ノイズが入ることがあります。そのため Gate はわずかに不完全であり、測定が間違うことがあり、デバイスのキャリブレーションは時間とともにずれていきます。

実際の量子コンピューターでの実行には、実際的な考慮事項も伴います。多くの人が同じデバイスを使用している可能性があるため、ジョブがキューに並ぶことがあります。また、統計的な考慮事項(ショット数が多いほど信号対ノイズ比が高くなる)と時間・コストの制約のバランスをとったショット数を選択する必要があります。

次のセルのコードコメントの指示に従ってください。セルを実行すると、ノイズによる 0101 または 1010 のいくつかの発生を伴いながら、00001111 のビット列に対してほぼ等しいカウントを示すヒストグラムが表示されるはずです。このノートブックの次のセルでは、QPU での実行をスキップしたい場合に、同じ Circuit をシミュレーターで実行します。

# Syntax for first saving your token.  Delete these lines after saving your credentials.
QiskitRuntimeService.save_account(
channel="ibm_quantum_platform",
token="YOUR_TOKEN_HERE",
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_fez".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_fez")
print(backend.name)
ibm_pittsburgh
counts = run_circuit_and_get_counts(bell, backend, shots=1000)
plot_histogram(counts)

Output of the previous code cell

シミュレーターでの実行と結果の視覚化

シミュレーターは量子コンピューティングの「完全な世界」バージョンです。ここでは 1000 ショットのシミュレーターで Circuit を実行し、結果をプロットします。Bell 状態の完全な相関の特徴として、0101 または 1010 の発生はなく、00001111 の状態に対してほぼ等しいカウントが見られるはずです。

backend = AerSimulator()
counts = run_circuit_and_get_counts(bell, backend, shots=1000)

plot_histogram(counts)

Output of the previous code cell

理解度チェック

ここで Bell 状態を作成する 2 つの Gate は何ですか?

Answer

Qubit 0 への H Gate、続いて Qubit 0 を制御、Qubit 1 をターゲットとする CX Gate です。

理想的なシミュレーターでは、ヒストグラムでどの 2 つのビット列が支配的になるべきですか?

Answer

00 と 11 が支配的になるべきです。

完全なシミュレーターが常に 00 のカウントと 11 のカウントがまったく同じになるとは限らないのはなぜですか?

Answer

シミュレーターは「完全」であり、完全な Bell 状態につながりますが、本質的にランダムなプロセスをシミュレートしているため、統計的な変動は依然として発生します。コインを 1000 回投げるのと同じです。コインが表または裏になる確率がちょうど 50-50 であっても、常に表が 500 回、裏が 500 回になるとは限りません。

シミュレーターでは出なかったのに、実際の量子コンピューターでは 01 または 10 の結果が出ることがあるのはなぜですか?

Answer

実際のデバイスにはノイズがあるためです。Gate と測定は完全ではなく、それが偶発的なエラーを引き起こすことがあります。

ノイズ以外に、シミュレーターと実際の量子コンピューターの間の実際的な違いは何ですか?

Answer

量子コンピューターには、Circuit の実行に影響するキュー時間、限られた可用性、デバイス固有の制約が伴うことがあります。

まとめ

まず、多くの実際のノートブックワークフローが始まるのと同じように、新しい Colab 環境で Qiskit をセットアップしました。次に Composer を使って量子コンピューティングの世界を探求しました。その後、Φ+\Phi^+ Bell 状態を生成するシンプルな 2 Qubit Circuit を構築し、繰り返しサンプリングを使用して、Qubit の測定ヒストグラムの相関としてエンタングルメントを視覚化しました。また、実際の量子コンピューターがどのようにノイズやエラーをもたらすかも確認しました。

学習目標

Φ+\Phi^+ Bell 状態の作成方法を学んだので、コードを編集して他の 3 つの Bell 状態のいずれかを作成できるか試してみてください。特に、Ψ\Psi^- 状態は今後のレッスンで使用されますので、作成方法を習得しておくと有利です。

This translation based on the English version of 2026年5月7日