実機での実行

実機での実行#

ベル状態を作成し、IBMの量子コンピューターで実行します。

# Qiskitライブラリーを導入
from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit.visualization import plot_histogram
from qiskit_ibm_runtime import QiskitRuntimeService

ベル状態を作成します。

qc = QuantumCircuit(2,2)
qc.h(0) 
qc.cx(0,1) 
qc.measure(0, 0)
qc.measure(1, 1)
qc.draw(output="mpl")
../_images/77fcbf3a26a855d56bfc659aa4d239df2d9480b1e82c058b86abd71348c004a1.png

まずはシミュレーターで実験してみます。

# シミュレーターで実験
backend = AerSimulator()
sampler = Sampler(backend)
job = sampler.run([qc])
result = job.result()

#  測定された回数を表示
counts = result[0].data.c.get_counts()
print(counts)

# ヒストグラムで測定された確率をプロット
plot_histogram( counts )
{'11': 496, '00': 528}
../_images/70e8652f5b5ca787b58f65bf4f8eeb520b106d96eb7293ee017eaf6c7c00734e.png

実機で実行する#

初めて実機で実行するためには、IBM QuantumのAPIトークンを読み込む必要があります。Openアカウント(無償)の場合のコードを以下に記載します。<IBM Quantum API key>の部分に、IBM QuantumプラットフォームからコピーしてきたAPI Tokenを貼り付けてください。

# 初めて実行する場合は、認証情報を保存します:
# https://quantum.ibm.com/ のAPI Tokenをコピーし貼り付けます
QiskitRuntimeService.save_account(channel='ibm_quantum', instance='ibm-q/open/main', token='<IBM Quantum API key>')

service = QiskitRuntimeService()
service.backends()
[<IBMBackend('ibm_kyoto')>,
 <IBMBackend('ibm_nazca')>,
 <IBMBackend('ibm_sherbrooke')>,
 <IBMBackend('ibm_torino')>,
 <IBMBackend('ibm_brisbane')>]

IBM Quantumプラットフォームの右上あたりの「API Token」から四角が二重になったアイコンをクリックするとコピーできます。

image.png

# 以下でデバイスを指定できます。
backend = service.backend('ibm_kyoto')  # 例)ibm_kyotoを使う場合
#一番空いているバックエンドを自動的に選択することもできます
backend = service.least_busy(operational=True)
print("最も空いているバックエンドは: ", backend)
最も空いているバックエンドは:  <IBMBackend('ibm_kyoto')>
# 実機のバックエンドでの実行に最適な回路に変換します
pm = generate_preset_pass_manager(backend=backend, optimization_level=1)
isa_circuit = pm.run(qc)

# Samplerで実行します
sampler = Sampler(backend)
job = sampler.run([isa_circuit])
print("job id:", job.job_id()) # 実行に時間がかかるのでjob_idを表示します
job id: cvfaxqe8w2g0008eg2q0

以下のコマンドでjobのstatus(実行状況)を確認します。

job = service.job(job.job_id()) 

job.status() # ジョブの実行状態を確認します
'DONE'
# 待ち時間が長い時に後から結果を確認する場合
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()  
job= service.job('cvfaxqe8w2g0008eg2q0') # 例です。上に出力された自分のjob_idを入れて実行してください。
job.status() # ジョブの実行状態を確認します
'DONE'

上記のセルを何回か実行して、’DONE’ が表示されたら、実機での実行が終わっているので、以下のセルを実行して結果を確認します。

### 'DONE'になってから実行します ###
result = job.result()
print(result[0].data.c.get_counts())
{'01': 172, '00': 1833, '11': 1797, '10': 294}
plot_histogram(result[0].data.c.get_counts())
../_images/e6810fa2bb63e935312d7ddfcd7bcd0befe71b228ad1344dd373add4a60e29e9.png
# Qiskitバージョンの確認
import qiskit
qiskit.__version__
'1.1.1'