量子コンピューティングへの第一歩
- 難易度:初級
- QPU使用時間:11秒
ワークショップへようこそ!この入門ハンズオンの主な目的は、量子の旅の準備を整えることです。具体的には、1) Qiskitのインストール方法のガイド、2) IBMクラウドアカウントの作成と実際の量子コンピューターを使用するためのapi_keyおよびcrnの準備、3) 最初の量子Circuit の作成、4) 量子状態クイズの解答、5) 実際の量子コンピューターでのCircuit の実行と結果のプロットです。
1. まずは基本から:Qiskit
Qiskitとは
Qiskit SDK は、開発者や研究者がユーティリティスケール以上で量子コンピューターの能力を最大限に活用できるよう支援するために構築された高性能ソフトウェアスタックです。その中核にあるのはQiskit SDKであり、拡張量子Circuit のレベルで量子コンピューターを扱うためのオープンソースのソフトウェア開発キットです。演算子とプリミティブを含みます。Qiskit SDKは、誰でも自分の好みのコンピューティング環境を使用して実際の量子コンピューターから最適なパフォーマンスを得られるようにします。
SDKを超えて、Qiskitはエラー軽減を管理するプリミティブを使用してクラウド経由でIBM量子コンピューターでの最適化された計算を可能にするQiskit Runtime Serviceなど、高性能ツールとサービスのスイートも含んでいます。Qiskit Transpilerサービスは、一般的な量子Circuit 最適化タスクのパフォーマンスを向上させる最先端のヒューリスティックおよびAI搭載の手法を提供します。
Qiskit functionsは、ワークロードの最適化を容易にし、産業ユースケースにQiskitを活用できるIBMおよびサードパーティのサービスカタログです 。量子ソフトウェア開発者、量子実験者、計算科学者、または始めたばかりの方であっても、Qiskitのモジュラーで柔軟なフレームワークは、ニーズに最も適した抽象化レベルで作業できるようにしてくれます。
Qiskitは拡張性とカスタマイズ性のために設計されており、業界トップレベルのパフォーマンスを引き出し、新しい種類の問題に取り組むことができます。高性能コードベースにより、Qiskit SDKはこれまでより速く動作し、メモリの使用量も少なく、より優れた結果を提供します。また、Qiskitは皆さんを迎え入れ、質問に答えることに熱心なユーザーや開発者の大きなコミュニティにも繋げてくれます。2019年に初めて開始されたQiskit アドボケートプログラムは、世界中から量子コンピューティングの専門家や愛好家を集めるグローバルなコミュニティ中心のイニシアチブです。長年にわたり、アドボケートたちは量子コミュニティで認められたリーダーとして活躍するようになりました。次の量子リーダーになりたいですか?ぜひ申し込んでみてください - こちら
Qiskitのインストール
まず、お使いの環境のPythonのバージョンがpython>=3.10であることを確認してください。これにより、使用する最新バージョンのQiskitとの互換性が保証 されます。
from platform import python_version
print(python_version())
そうでない場合は、お好みのツールを使用してアップグレードしてください。方法がわからない場合は、以下のオプションが推奨されます:
- MacOS:Homebrew
- Linux:
sudo apt-get update
OSに応じたPythonのアップグレード方法の詳細なガイドはこちら:Pythonのアップデート方法
詳細については、QGSS(Qiskit Global Summer School)2025のwikiを参照してください:https://github.com/qiskit-community/qgss-2025/wiki/Jupyter-Notebook-Environment-(Local-and-Online)
以下のセルを実行してインストールを確認できます。正しくインストールされていれば、qiskitのバージョンが返されます。
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit
%pip install 'qiskit[visualization]'
%pip install qiskit-ibm-runtime
%pip install qiskit-aer
import qiskit
print(f"Qiskit version: {qiskit.__version__}")
トラブルシューティング
前のセルでエラーが発生した場合は、仮想環境にQiskitをイン ストールすることを選択できます(以下に2つの推奨方法を示します)。エラーがなければ、このセルを無視して次に進んでください。
ここでは、Qiskitをインストールするための仮想環境をセットアップする2つの異なる方法を提案します。
- Qiskitインストールガイドで説明されているvenvを使用する方法。
- Coding with Qiskitのこの動画で説明されているcondaを使用する方法。
2. IBMクラウドアカウントのセットアップ
実際の量子コンピューターを使用するには、クラウドへのメインの入場チケットであるapi keyと、アカウントを設定することでリソースを提供するトークンであるcrnが必要です。
以下の手順でアカウントをセットアップしてください:
- IBM Quantum® Platformにアクセスします。
- 右上隅(上の画像に示されているように)に移動し、APIトークンを作成して安全な場所にコピーします。
- 次のセルで、
deleteThisAndPasteYourAPIKeyHereをあなたのAPIキーに置き換えます。 - 左下隅(上の画像に示されているように)に移動してインスタンスを作成します。オープンプランを選択してください。
- インスタンスが作成されたら、関連するCRNコードをコピーします。インスタンスを確認するにはページを更新する必要があるかもしれません。
- 以下のセルで、
deleteThisAndPasteYourCRNHereをあなたのCRNコードに置き換えます。
IBMクラウド®アカウントのセットアップ方法の詳細については、こちらのガイドを参照してください。
⚠️ 注意: APIキーは安全なパスワードと同様に取り扱ってください。安全な環境と信頼できない環境の両方でAPIキーを使用する方法については、クラウドセットアップガイドを参照してください。
また、IBM パートナーネットワーク大学のメンバーである場合は、パートナー特典を受け取るために、IBM ID に機関のメールアドレスを使用してください。
from qiskit_ibm_runtime import QiskitRuntimeService
# Save your API key and crn and have access to the quantum computers
your_api_key = "deleteThisAndPasteYourAPIKeyHere"
your_crn = "deleteThisAndPasteYourCRNHere"
QiskitRuntimeService.save_account(
channel="ibm_cloud",
token=your_api_key,
instance=your_crn,
overwrite=True
)
# Check that the account has been saved properly
service = QiskitRuntimeService()
service.saved_accounts()
# See backends you can use
service.backends()
3. 最初の量子Circuit
量子Circuit
Qiskitの基本単位は量子Circuitであり、量子コンピューターが量子ビット(Qubitとも呼ばれます)の情報を扱うために使用できる一連の命令です。これらのQubitは特殊な性質を持ち、量子コンピューターがあなたのラップトップやiPhoneとは異なるアプローチで問題に取り組めるようにします。Qiskitは急速に進化している技術です。今でも手動で量子Circuit を設計し、どのように実行するかを決定することができます(そうする十分な理由もあります)が、IBM Quantumはプロセスを簡単にするツールも提供しています。学習のために、非常にシンプルなCircuit を設計してシミュレーター上で実行します。
正直に言うと、量子情報と計算の基礎を説明するだけで何時間もかかってしまうため、ここでは概要を手短に進めます。実際、IBM Quantumはすでにこれを行っており、このトピックに特化した書かれたコースとビデオ講義シリーズを制作しています。復習が必要な場合はぜひ参照してください!
from qiskit import QuantumCircuit
from qiskit.quantum_info import Statevector
from qiskit.visualization import plot_state_qsphere
from qiskit_aer import AerSimulator
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit.transpiler import generate_preset_pass_manager
from qiskit.visualization import array_to_latex
from qiskit.visualization import plot_distribution
import numpy as np
from numpy import sqrt
QubitとMeasurementの基本操作
単一Qubit状態の記述
単一Qubitを見ることから始めましょう。0と1の値のみを取ることができる古典的なビットとの主な違いは、量子ビット(Qubit)が状態、、およびこれら2つの状態の線形結合でいられることです。この特徴は重ね合わせと呼ばれ、Qubitの最も一般的な状態を次のように書けます:
このQubitの状態を測定すると、確率で結果が得られ、確率で結果が得られます。見てわかるように、全確率はであり、またはのどちらかを測定することになります。他の結果は存在しません。
に加えて、上記で別のパラメーターに気づかれたかもしれません。変数は2つの状態との間の相対量子位相を示しています。後で分かるように、この相対位相は非常に重要です。今のところ、量子位相が量子状態間の干渉を可能にし、特定のタスクを解くための量子アルゴリズムを書く能力につながることを注記しておけば十分です。
量子状態の可視化
このエクサイズを通じて、qsphereとして知られているものを使用して量子状態を可視化します。状態とのそれぞれについてのqsphereの外観を示します。球体の最上部が状態を表し、最下部がを表すことに注意してください。
#visualize |0>
sv=Statevector([1, 0])
plot_state_qsphere(sv)
量子Circuit を使用して、まったく同じQSphereを作成できます。ここで使用するStateVectorは状態からのものです。Qiskitでは、Qubitは状態で初期化されます。以下のCircuit を実行して、同じQSphereが得られるか確認してみてください。
qc1 = QuantumCircuit(1)
sv=Statevector(qc1)
plot_state_qsphere(sv)
次に状態を可視化しましょう。
量子位相で確率(0と1の両方を測定する確率が等しいことを意味します)の重ね合わせ状態が、qsphere上に2つの点で表示されることは驚くべきことではありません。ただし、2つの点の円の大きさが、単にとだった場合より小さいことにも注意してください。これは円の大きさがそれぞれを測定する確率に比例しているためであり、今では確率が半分に減っています。
#visualize 1/sqrt(2)|0> + 1/sqrt(2)|1>
sv=Statevector([1/sqrt(2), 1/sqrt(2)])
plot_state_qsphere(sv)
重ね合わせ状態の場合、量子位相がゼロでないとき、qsphereは各ブロブの色を変えることでその位相を可視化できます。例えば、(度)で確率の状態は以下のqsphereに示されています。
sv=Statevector([1/sqrt(2), 1/sqrt(2)*1j])
plot_state_qsphere(sv)
Qubitの操作
Qubitは量子Gate を適用することで操作されます。以下の演習で考慮するさまざまなGate の概要を見ていきましょう。
まず、一般的な量子状態のの値をどのように変えられるかを説明します。そのために、2つのGate を使用します:
-
-gate:このGate は2つの状態との間を反転させます。この操作は古典的なNOTゲートと同じです。そのため、-gateはビットフリップまたはNOTゲートとも呼ばれることがあります。数学的には、ゲートはをに変化させるため、特に0から1へ、その逆も然りです。
-
-gate:このGate により、状態から状態へと移行することができます。この状態はとも呼ばれます。数学的には、からへの移行を意味します。Qubitの最終状態がとの重ね合わせであるため、アダマールゲートは真の量子演算を表します。
両方のGate がp\phi$は変化していないことに注意してください。幸いなことに、これらのGate の作用は以下の図を見ることで非常に簡単に可視化できます。
状態になったら、他のいくつかのGate を適用することで量子位相を変化させることができます。例えば、ゲートは(90度)の位相を加え、ゲートはの位相を加えます。
Gate 、、、、、を使って実験し、さまざまな操作とそれらがQubitの状態にどのような影響を与えるかを習得することができます。そのためには、Circuit ComposerにアクセスしてCircuitウィジェットを起動してください。Circuit Composerにアクセスした後、Qubitに適用するGate を選択し、次にQubit(最初の例では選択できるQubitはQubit 0のみ)を選択します。各Gateとともに対応する状態がどのように変化するか、そしてその状態の説明を確認してください。Qiskitで対応する量子Circuit を作成するコードも提供されます。
量子状態、パウリ演算子、およびその他の単一QubitのGate についてさらに学びたい場合は、John WatrousによるBasics of Quantum Informationコースの単一システムのQuantum Informationを参照してください。
練習問題:単一Qubit Gateを使った量子Circuit
以下は、qsphere上でさまざまな状態を達成するための4つの小さな練習問題です。Circuit Composerを使用して解いてコードをコピーアンドペーストして各セルに貼り付けて量子Circuit を作成することもできますし、以下のコード行の組み合わせをプログラムに直接挿入して異なるGate を適用することもできます:
qc.x(0) # bit flip qc.y(0) # bit and phase flip qc.z(0) # phase flip qc.h(0) # superpostion qc.s(0) # quantum phase rotation by pi/2 (90 degrees) qc.sdg(0) # quantum phase rotation by -pi/2 (90 degrees)
「(0)」は、このGate を「q0」というQubitに適用することを示しています。これは最初の(この場合は唯一の)Qubitです。
以下の各演習で、qsphere上に与えられた状態を達成してみてください。
i) まずはビットフリップを実行しましょう。目標は、状態から始めて状態に到達することです。
def create_circuit():
qc = QuantumCircuit(1)
#
#
# FILL YOUR CODE IN HERE
#
#
return qc
# check solution
qc2 = create_circuit()
state = Statevector(qc2)
plot_state_qsphere(state, show_state_labels=True, show_state_phases = True, use_degrees = True)
ii) 次に、重ね合わせを作成しましょう。目標は、状態に到達することです。
def create_circuit2():
qc = QuantumCircuit(1)
#
#
# FILL YOUR CODE IN HERE
#
#
return qc
qc3 = create_circuit2()
state = Statevector(qc3)
plot_state_qsphere(state, show_state_labels=True, show_state_phases = True, use_degrees = True)
iii) 上記の2つを組み合わせましょう。目標は、状態に到達することです。
上記の2つのタスクを組み合わせて解決策を考え出すことはできますか?
def create_circuit3():
qc = QuantumCircuit(1)
#
#
# FILL YOUR CODE IN HERE
#
#
return qc
qc4 = create_circuit3()
state = Statevector(qc4)
plot_state_qsphere(state, show_state_labels=True, show_state_phases = True, use_degrees = True)
iv) 最後に、複素数に移ります。目標は、状態に到達することです。
def create_circuit4():
qc = QuantumCircuit(1)
#
#
# FILL YOUR CODE IN HERE
#
#
return qc
qc5 = create_circuit4()
state = Statevector(qc5)
plot_state_qsphere(state, show_state_labels=True, show_state_phases = True, use_degrees = True)
4. マルチ Qubit Gate を使った量子クイズ
お疲れ様です!単一 Qubit Gate を理解できたところで、複数の Qubit に作用する Gate を見てみましょう。ここでは、単一 Qubit Gate とマルチ Qubit Gate を組み合わせて、4 つの量子状態クイズを解いてみましょう。2 Qubit 上の基本的な Gate は次のとおりです。
qc.cx(c,t) # controlled-X (= CNOT) gate with control qubit c and target qubit t qc.cz(c,t) # controlled-Z gate with control qubit c and target qubit t qc.swap(a,b) # SWAP gate that swaps the states of qubit a and qubit b
さまざまなマルチ Qubit Gate とその関係についてさらに詳しく知りたい方は、John の Basics of Quantum Information コースの Quantum Information of multiple systems を参照してください。
2 Qubit の場合、一般的な状態は の形をしており、、、、 はそれぞれの状態が測定される確率を絶対値の 2 乗で与える複素数です。例えば、 は両 Qubit で '0' の状態が得られる確率になります。これにより、qsphere 上に最大 4 つの点を持てるようになります。
まず、代表的な 2 Qubit Gate である controlled-NOT(CNOT または CX)Gate から始めます。制御型 2 Qubit Gate では共通の原則として、一方の Qubit が「制御(control)」として、もう一方が「タ ーゲット(target)」として指定されます。制御 Qubit が状態 の場合、ターゲットには恒等演算子 Gate が適用されます。つまり、何も操作は行われません。一方、制御 Qubit が状態 の場合、ターゲット Qubit に X Gate が適用されます。したがって、両 Qubit が古典的な状態 または のいずれかにある場合、CNOT Gate は古典的な演算に限定されます。
制御 Qubit にまず Hadamard Gate を適用して重ね合わせ状態 にすると、状況は劇的に変わります。この古典的でない入力に対する CNOT Gate の作用は、制御 Qubit とターゲット Qubit の間に高度に絡み合った状態を生み出す可能性があります。ターゲット Qubit が最初に 状態にある場合、結果として得られる状態は と表され、いわゆる Bell 状態 の一つです。
i) Bell 状態 を構成してください。
この状態では、"00" を測定する確率が 、"11" を測定する確率が となります。つまり、両 Qubit の測定結果は完全に相関しています。
def create_circuit5():
qc = QuantumCircuit(2)
#
#
# FILL YOUR CODE IN HERE
#
#
return qc
qc6 = create_circuit5()
state = Statevector(qc6) # determine final state after running the circuit
display(array_to_latex(state))
display(plot_state_qsphere(state, show_state_labels=True, show_state_phases = True, use_degrees = True))
qc6.draw(output='mpl') # we draw the circuit
次に、完全に反相関した Qubit の状態を作成してみましょう。ここでのマイナス符号は、2 つの状態間の相対位相を示しています。
ii) Bell 状態 を構成してください。
def create_circuit6():
qc = QuantumCircuit(2)
#
#
# FILL YOUR CODE IN HERE
#
#
return qc
qc7 = create_circuit6()
state = Statevector(qc7) # determine final state after running the circuit
display(array_to_latex(state))
display(plot_state_qsphere(state, show_state_labels=True, show_state_phases = True, use_degrees = True))
qc7.draw(output='mpl') # we draw the circuit
iii) 以下の関数で記述された量子 Circuit が与えられています。1 番目と 2 番目の Qubit の状態を入れ替えて、この QSphere を作成してください。
def create_circuit7():
qc = QuantumCircuit(2)
qc.rx(np.pi/3,0)
qc.x(1)
return qc
qc8 = create_circuit7()
#
#
# FILL YOUR CODE IN HERE
#
#
state = Statevector(qc8) # determine final state after running the circuit
display(array_to_latex(state))
display(plot_state_qsphere(state, show_state_labels=True, show_state_phases = True, use_degrees = True))
qc8.draw(output='mpl') # we draw the circuit
iv) GHZ 状態(3 Qubit 上) を作成するプログラムをゼロから書いてください。
def create_circuit8():
#
#
# FILL YOUR CODE IN HERE
#
#
#
return qc
qc9 = create_circuit8()
pub4 = (qc9)
state = Statevector(qc9) # determine final state after running the circuit
display(array_to_latex(state))
display(plot_state_qsphere(state, show_state_labels=True, show_state_phases = True, use_degrees = True))
qc9.draw(output='mpl') # we draw the circuit
5. Circuit を実行して、実際の量子コンピューターで測定結果を確認する
Qubit の状態ベクトルを操作するための量子 Circuit の構築方法がわかりました。さあ、最もエキサイティングなパートに入りましょう:実際に実行して出力を確認します!ここでは、Qiskit を使って Circuit を実行するモダンで効果的な方法を学びます。
Qiskit パターンは、ドメイン固有の問題を分解し、必要な機能をステージごとに整理するための汎用フレームワークです。これにより、IBM Quantum の研究者(およびその他の方々)が開発した新しい機能をシームレスに組み合わせることができ、量子コンピューティングのタスクが強力なヘテロジニアス(CPU/GPU/QPU)コンピューティングインフラストラクチャによって実行される未来を可能にします。
Qiskit パターンの 4 つのステップは以下のとおりです:
- Map:問題を量子 Circuit と演算子にマッピングする
- Optimize:対象ハードウェア向けに最適化する
- Execute:対象ハードウェア上で実行する
- Post-process:結果を後処理する
目的の量子状態を生成するための量子 Circuit を構築することで、Step 1: Mapping が完了しました。次に、残りのステップを順に進めて結果を確認しましょう。
Optimize
ここでは Circuit を実行するバックエンドを設定します。アクセス可能な QPU グループの中から least busy な QPU を選択するか、GPU 時間が十分でない場合はシミュレーターを選ぶことができます。バックエンドを選択すると、pass_manager が Circuit を選択したバックエンドのネイティブ Gate セットに transpile(トランスパイル)し、より良い結果が得られるよう最適化します。generate_preset_pass_manager を使い、optimization_level(数値が大きいほど最適化ステップが多い)を設定することで、簡単に pass_manager を宣言できます。
次のステップは exciting です。Qiskit Runtime を使って量子 Circuit を実行します!
2 つの Qiskit primitives を使用します:
- Sampler は 1 つ以上の量子 Circuit の実行から出力レジスタをサンプリングします。出力はショットごとの測定カウントです。
- Estimator は量子 Circuit が生成する状態に関して、1 つ以上のオブザーバブルの期待値を計算します。出力は標準誤差とともに期待値で構成されます。
ここでは Sampler を使って Circuit を実行します。以下のコー ドセルでは、まずバックエンドとその pass_manager を定義し、その後すべての Circuit に measurement(測定)を追加して、Sampler に渡す量子 Circuit の配列(pub)を作成します。
backend=service.least_busy()
#backend=AerSimulator()
pm = generate_preset_pass_manager(optimization_level=3, backend=backend)
sampler = Sampler(mode=backend)
pub = []
for qc in circ:
qc.measure_all()
pub.append(pm.run(qc))
Execute
Circuit を実行しましょう。クラウド上の待機キューが多い場合に備えて、job_id を出力・保存し、後で使用できるようにしておき、ジョブのステータスを確認してください。ジョブのステータスが Done に変わったら、ジョブの結果を取得します。
job = sampler.run(pub)
job_id = job.job_id()
print(job_id)
job.status()
job_retrived = service.job(job_id)
result = job.result()
Post-process
最終ステップは、可視化の解釈によって作成した量子状態を理解することです。複数のグラフを描画する前に、すべての Circuit からカウントを取得しましょう。次に、Circuit をカテゴリ分けして 4 つのグラフを作成します。
result = job.result()
counts_all = [result[k].data.meas.get_counts() for k in range(9)]
The Single Qubit States
plot_distribution([counts_all[0], counts_all[1]], legend =['qc1', 'qc2'])
The Superpositioned One Qubit States
plot_distribution([counts_all[2], counts_all[3], counts_all[4]], legend =['qc3', 'qc4', 'qc5'])
Two Qubit States
plot_distribution([counts_all[5], counts_all[6], counts_all[7]],legend =['qc6', 'qc7', 'qc8'] )
Three Qubit States
plot_distribution(counts_all[8], legend=['qc9'])
さらなる挑戦
実際のバックエンドの実験結果にノイズが見られましたか?Qubit ノイズの除去は現在も活発に研究されている分野の一つです。Qiskit Runtime のさまざまなエラー軽減・抑制オプションを試して、実行結果のノイズがどのように変化するか確認してみてください!(注)これらのオプションはより多くの QPU 時間を使用します。
Additional Info
import qiskit, qiskit_ibm_runtime
print("Qiskit version:", qiskit.version.get_version_info())
print("Qiskit Runtime version:", qiskit_ibm_runtime.__version__)
Qiskit version: 2.1.1
Qiskit Runtime version: 0.40.1
Created by: Sophy Shin
Reviewed by: Nate Earnest-Noble
© IBM Corp., 2025
This is licensed under the Apache License, Version 2.0. You may obtain a copy of this license in the LICENSE file in the root directory of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
Any modifications or derivative works of this must retain this copyright notice, and modified files need to carry a notice indicating that they have been altered from the originals.