Qiskit 入門

Qiskit を使用する流れには大きく3つの手順があります。

  • ビルド: 検討している問題を表現する量子回路をデザインします。

  • 実行: 異なるバックエンド (これにはシステムとシミュレーターの両方が含まれます) で実験を実行します。

  • 分析: 要約統計量を計算し、実験の結果を可視化します。

ワークフロー全体の例を挙げます。各手順は以下のセクションで詳しく説明します。

import numpy as np
from qiskit import(
  QuantumCircuit,
  execute,
  Aer)
from qiskit.visualization import plot_histogram

# Use Aer's qasm_simulator
simulator = Aer.get_backend('qasm_simulator')

# Create a Quantum Circuit acting on the q register
circuit = QuantumCircuit(2, 2)

# Add a H gate on qubit 0
circuit.h(0)

# Add a CX (CNOT) gate on control qubit 0 and target qubit 1
circuit.cx(0, 1)

# Map the quantum measurement to the classical bits
circuit.measure([0,1], [0,1])

# Execute the circuit on the qasm simulator
job = execute(circuit, simulator, shots=1000)

# Grab results from the job
result = job.result()

# Returns counts
counts = result.get_counts(circuit)
print("\nTotal count for 00 and 11 are:",counts)

# Draw the circuit
circuit.draw()

Total count for 00 and 11 are: {'00': 491, '11': 509}
     ┌───┐     ┌─┐   
q_0: ┤ H ├──■──┤M├───
     └───┘┌─┴─┐└╥┘┌─┐
q_1: ─────┤ X ├─╫─┤M├
          └───┘ ║ └╥┘
c: 2/═══════════╩══╩═
                0  1 
# Plot a histogram
plot_histogram(counts)
_images/getting_started_1_0.png

ワークフローの手順

上のプログラムは6つの手順に分解できます。

  1. パッケージのインポート

  2. 変数の初期化

  3. ゲートの追加

  4. 回路の可視化

  5. 実験のシミュレーション

  6. 結果の可視化

手順1 : パッケージのインポート

プログラムに必要な基本的要素は以下のようにインポートされます。

import numpy as np
from qiskit import(
  QuantumCircuit,
  execute,
  Aer)
from qiskit.visualization import plot_histogram

インポートされるものの詳細は以下の通りです。

  • QuantumCircuit: 量子コンピューターシステムにおける動作命令を示し、全ての量子演算をつかさどっています。

  • execute: 回路や実験を実行する

  • Aer: シミュレーターのバックエンドを管理する

  • plot_histogram: ヒストグラムを作成する

手順2:変数の初期化

次のコードを考えてみます。

circuit = QuantumCircuit(2, 2)

ここでは、二つの量子ビットをゼロの状態に、二つの古典ビットをゼロに初期化し、量子回路 circuit に代入しています。

構文:

  • QuantumCircuit(int, int)

手順3:ゲートの追加

ゲート(演算子) を追加することで、回路のレジスターを操作します。

次の3行のコードを考えてみます。

circuit.h(0)
circuit.cx(0, 1)
circuit.measure([0,1], [0,1])

ゲートが一つづつ回路に追加され、Bell状態が形成されます。

\[|\psi\rangle = \left(|00\rangle+|11\rangle\right)/\sqrt{2}.\]

上記コードは以下のゲートが適用されています。

  • QuantumCircuit.h(0): 量子ビット0に対するアダマール・ゲート \(H\) 。量子ビット0を 重ね合わせ状態 にします。

  • QuantumCircuit.cx(0, 1): 量子ビット0をコントロール・ビット、量子ビット1をターゲット・ビットとした制御NOTゲート(\(C_{X}\))。量子ビットを 量子もつれ状態 にします。

  • QuantumCircuit.measure([0,1], [0,1]): 全ての量子レジスターと古典レジスターを measure に送ると、i番目の量子ビットの結果がi番目の古典ビットに保存されます。

手順4:回路の可視化

QuantumCircuit.draw() を使って、作成した回路を可視化することができます。いろいろな教科書や研究論文で使われている 様々な形式 を利用することができます。

circuit.draw()
     ┌───┐     ┌─┐   
q_0: ┤ H ├──■──┤M├───
     └───┘┌─┴─┐└╥┘┌─┐
q_1: ─────┤ X ├─╫─┤M├
          └───┘ ║ └╥┘
c: 2/═══════════╩══╩═
                0  1 

この回路では、量子ビットは量子ビット0が上、量子ビット1が下に記述されています。回路は左から右に読み、左に表示されているゲートから順に適用されます。

QuantumCircuit.draw() 又は``qiskit.visualization.circuit_drawer()`` のデフォルトのバックエンドは text backendです。ローカルの環境によっては、より適切なデフォルトの設定を行う必要があるかもしれません。その場合はuser configファイルの設定を行うことで対応できます。user configファイルは通常 ~/.qiskit/settings.conf 下の .ini ファイルになります。

例えば, Matplotlib drawer を設定するための settings.conf ファイルは:

[default]
circuit_drawer = mpl

このconfigには、有効な circuit drawer バックエンドであればどれでも指定することができます。これらには text, mpl, latex, そして latex_source が含まれます。

実験のシミュレーション

Qiskit Aerは、量子回路の高パフォーマンス・シミュレーター・フレームワークです。様々なシミュレーションの目的を達成するために、いくつかのバックエンド を提供します。

Aerのインストールに問題がある場合は、AerBasicAer で置き換えることで、代わりにBasic Aerプロバイダーを利用することができます。Basic AerはQiskit Terraに含まれます。

import numpy as np
from qiskit import(
  QuantumCircuit,
  execute,
  BasicAer)
...

回路のシミュレートには、qasm_simulator を使用します。回路の実行毎にビット文字列00もしくは11を生成します。

simulator = Aer.get_backend('qasm_simulator')
job = execute(circuit, simulator, shots=1000)
result = job.result()
counts = result.get_counts(circuit)
print("\nTotal count for 00 and 11 are:",counts)

Total count for 00 and 11 are: {'00': 524, '11': 476}

期待通りにビット文字列の出力が00になるのはおおよそ50%です。回路の実行回数は execute メソッドの shots 引数で指定できます。このシミュレーションの実行回数は1000(デフォルトは1024) に設定されています。

result オブジェクトを取得できたら、get_counts(circuit) メソッドを使用して回数を取得することができます。これにより、実行した実験の総計を得ることができます。

ステップ6:結果の可視化

Qiskitは 多くのビジュアライゼーション を提供します。

その中には結果を表示するための plot_histogram という関数も含まれます。

plot_histogram(counts)
_images/getting_started_4_0.png

観測された確率 \(Pr(00)\)\(Pr(11)\) は、対応する事象が観測された回数を全実行回数で割った数値です。

注釈

execute メソッドの shots 引数を変更して、推定される確率がどのように変化するか見てみましょう。

次の手順

基礎の学習が終わりました。ここから先は、以下の学習リソースでの継続的な学習をおすすめします。