はじめに
任意の状態を作成する回路を簡単に作りたい!と思うことはありませんか?
例えば...
\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自体が日々進化していますからね.