らんだむな記憶

blogというものを体験してみようか!的なー

Qiskit (9)

書籍 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}$ 以外に指定できることに注意して先へと進みたい。