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: {'11': 487, '00': 513}
        ┌───┐     ┌─┐   
q_0: |0>┤ H ├──■──┤M├───
        └───┘┌─┴─┐└╥┘┌─┐
q_1: |0>─────┤ X ├─╫─┤M├
             └───┘ ║ └╥┘
 c_0: 0 ═══════════╩══╬═
                      ║ 
 c_1: 0 ══════════════╩═
                        
# 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: |0>┤ H ├──■──┤M├───
        └───┘┌─┴─┐└╥┘┌─┐
q_1: |0>─────┤ X ├─╫─┤M├
             └───┘ ║ └╥┘
 c_0: 0 ═══════════╩══╬═
                      ║ 
 c_1: 0 ══════════════╩═
                        

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

The default backend for QuantumCircuit.draw() or qiskit.visualization.circuit_drawer() is the text backend. However, depending on your local environment you may want to change these defaults to something better suited for your use case. This is done with the user config file. By default the user config file should be located in ~/.qiskit/settings.conf and is a .ini file.

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

[default]
circuit_drawer = mpl

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

実験のシミュレーション

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

If you have issues installing Aer, you can alternatively use the Basic Aer provider by replacing Aer with BasicAer. Basic Aer is included in 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: {'11': 509, '00': 491}

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

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

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

Qiskit provides many visualizations,

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

plot_histogram(counts)
_images/getting_started_4_0.png

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

注釈

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

次の手順

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