Qiskit: 任意の状態を作成する回路が作りたい!!


はじめに

任意の状態を作成する回路を簡単に作りたい!と思うことはありませんか?
例えば...

\frac{|0>+|1>}{\sqrt{2}}

まあ,これは簡単ですね.以下の回路で作成できます.

しかし,Hadamard gateを知らなくてもこの状態を作成することができるツールがあるのです!
それが,StateVectorCircuitです.

StateVectorCircuit

先ほどの状態を作る回路をStateVectorCircuitを用いて作成してみましょう.

まずは,使用するパッケージをimportします.

import numpy as np
from qiskit.aqua.circuits import StateVectorCircuit
from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, execute
from qiskit import BasicAer
from qiskit.visualization import plot_histogram

次に今回作りたい状態を定義

state = [1 / np.sqrt(2), 1 / np.sqrt(2)]

これをStateVectorCircuitに入力します.

svc = StateVectorCircuit(state)

ここには二つの値が格納されています.

print(svc._num_qubits)
# 1
print(svc._state_vector)
# [0.70710678 0.70710678]

ここではまだ回路は作成されていないので,construct_circuitを行います.

qc = svc.construct_circuit()

作成された回路がこれ

では実際に実行して結果を見てみましょう.

cr = ClassicalRegister(1)
qc.add_register(cr)
qc.measure([0], [0])
num_shots = 10000
backend = BasicAer.get_backend('qasm_simulator')
results = execute(qc, backend, shots=num_shots).result()
counts = results.get_counts(qc)
plot_histogram(counts1)

ふむ.良い感じですね.

ちなみに,勝手にnormalizeしてくれるので例えば

state = [100, 100]

とかでも対応してくれます.
もちろん複数qubitsでも大丈夫なのです.

まとめ

今回は何かと便利そうなStateVectorCircuitを紹介しました.
ちなみに使用しているQiskitのバージョンが古いとerrorを吐くかもしれません.qiskit自体が日々進化していますからね.