🌓

Qiskitを使って簡単な量子コンピューティングをするためのメモ(Python)

2024/03/16に公開

こんな感じのことを始めるための環境構築についての雑書き(2024年3月時点)
Google Colaboratoryで動く(はず)なのでやってみてね。

必要パッケージのインストール

!pip install qiskit
!pip install pylatexenc
# シミュレーション用
!pip install qiskit-aer
# 実機計算用
!pip install qiskit_ibm_runtime

シミュレーションを動かす

10ビットの量子回路でGHZ状態を作る。

from qiskit import QuantumCircuit, transpile
from qiskit_aer import Aer, AerSimulator
from qiskit.visualization import plot_histogram

# 量子ビットの数を指定
n_qubits = 10

# 量子回路を作成
ghz_circuit = QuantumCircuit(n_qubits)

# GHZ状態を作る
ghz_circuit.h(0)  # 0番目の量子ビットにアダマールゲートをかけて重ね合わせ状態を作る
for qubit in range(1, n_qubits):
    # 1番目以降の量子ビットに対して、1つ前の量子ビットともつれ合いの状態にするという処理を行う
    ghz_circuit.cx(qubit-1, qubit)  

# 全ての量子ビットを測定
ghz_circuit.measure_all()

# 回路シミュレーション
simulator = AerSimulator()
compiled_circuit = transpile(ghz_circuit, simulator)
result = simulator.run(compiled_circuit).result()

# 結果のヒストグラムを表示
counts = result.get_counts()
plot_histogram(counts)

実行するとこんなヒストグラムが出た。最初の量子ビットが0なら以降も全て0、1なら全て1になるはずなので合ってそう。

回路を可視化する時は以下を実行。Hがアダマールゲート、+がNOTゲート、繋がってるところはもつれ合い。

ghz_circuit.draw(output='mpl')

実機で動かす

10ビットでGHZ状態を作る。
ただし、10ビットだと時間がかかるので最初は4ビットとかにした方が良い!
あらかじめIBM Quantumでアカウントを作成してAPI Tokenを取得しておく。

from qiskit import QuantumCircuit, transpile
from qiskit_ibm_runtime import QiskitRuntimeService
from qiskit.visualization import plot_histogram

# アカウント情報を保存
QiskitRuntimeService.save_account(channel="ibm_quantum", token="YOUR_API_TOKEN", overwrite=True)

# 量子ビットの数を指定
n_qubits = 10

# 量子回路を作成
ghz_circuit = QuantumCircuit(n_qubits)

# GHZ状態を作る
ghz_circuit.h(0)  # 0番目の量子ビットにアダマールゲートをかけて重ね合わせ状態を作る
for qubit in range(1, n_qubits):
    # 1番目以降の量子ビットに対して、1つ前の量子ビットともつれ合いの状態にするという処理を行う
    ghz_circuit.cx(qubit-1, qubit)

# 全ての量子ビットを測定
ghz_circuit.measure_all()

# IBM Quantum
provider = QiskitRuntimeService(channel="ibm_quantum")

# 動かすバックエンド(実機)を指定
backend = provider.get_backend('ibm_kyoto')  # kyotoとかosakaとかある

# 回路のトランスパイル
compiled_circuit = transpile(ghz_circuit, backend)

# 実機上で実行
job = backend.run(compiled_circuit)

# 結果の取得
result = job.result()

# 結果のヒストグラムを表示
counts = result.get_counts()
plot_histogram(counts)

実行するとこんな表が出てくる。多分成功?
シミュレーションだと0000000000と1111111111のみ出てくるところが、実機ではその間(0000000001~1111111110)もそれなりに出ている。これは実機の計算エラーによるものだと思われる。量子状態は非常に壊れやすく、ノイズにとても弱いらしい。ちなみにバックエンドはIBM_KYOTOで実行したが、このときのELPG(Error per layered gate)表示は3.6%だった。
横軸の数値が密すぎて波形みたいになってる。


以上!

Discussion