書籍 p.69 の
from qiskit import QuantumCircuit from qiskit import Aer, execute qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) backend = Aer.get_backend('statevector_simulator') results = execute(qc, backend=backend).result() state_vec = results.get_statevector(qc) print(state_vec)
は少し分かりにくく感じた。Statevector([0.70710678+0.j, 0. +0.j, 0. +0.j, 0.70710678+0.j], dims=(2, 2))
が得られている。これは 量子ビット状態を表現する の真ん中ら辺の話を読むと分かる。$0.70710678 = \frac{1}{\sqrt{2}}$ に注意すると、$(\frac{1}{\sqrt{2}}, 0, 0, \frac{1}{\sqrt{2}})^T$ というベクトルがえられたということである。Kronecker 積に注意して $\ket{00} + \ket{11} = (1,0) \otimes (1,0) + (0,1) \otimes (0,1) = (1,0,0,0) + (0,0,0,1) = (1,0,0,1)$ であることを踏まえると、上記の状態ベクトルは $\frac{1}{\sqrt{2}}(\ket{00} + \ket{11})$ つまり、Bell 状態が得られていることを意味している。
この回路の可視化と理論上の計算値は Qiskit (7) - らんだむな記憶 で触れた。
同じことを aer_simulator
で行うと、
qc = QuantumCircuit(2, 2) qc.h(0) qc.cx(0, 1) qc.measure(0, 0) qc.measure(1, 1) sim = Aer.get_backend('aer_simulator') qobj = assemble(qc, shots=1024) result = sim.run(qobj).result() counts = result.get_counts() print(counts)
で {'00': 517, '11': 507}
のような結果を得る。$\ket{00}$ と $\ket{11}$ が半々で得られるので振幅を正規化して $\frac{1}{\sqrt{2}}\ket{00} + \frac{1}{\sqrt{2}}\ket{11}$ が得られるので、上記と同じことであることが分かる。結果を $\C^4$ の成分表示で見るか、計算基底状態の観測回数で見るかの違いである。
この辺の話はこれくらいにして、
initial_state = [1/sqrt(2), complex(0,1/sqrt(2))] qc.initialize(initial_state, 0)
で状態の初期値を $\ket{0}$ 以外に指定できることに注意して先へと進みたい。