らんだむな記憶

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

Qiskit (8)

本が少し分かりにくいので Qiskit の公式ドキュメントも併用する。

計算の原子

反転したビットは、量子ビット7に由来し、文字列の左端にあります。これは、Qiskitが文字列のビットに右から左に番号を付けるためです。この慣習に違和感を覚えたなら、心配しないでください。文字列のビットにどういう順番で番号を付けるかは好みが分かれるところで、他の教科書だと違う順番に番号を付けている場合もあるでしょう。

とあるが、これは
回路の基本 — Qiskit 0.34.1 ドキュメント

例えば、量子ビットゼロが0、量子ビット1が0、量子ビット2が1のとき、Qiskitはこの状態を $\ket{100}$ と表現します。一方で、多くの物理の教科書はこの状態を $\ket{001}$ と表現します。

としても書かれている。

1 量子ビットの時の観測

from qiskit import QuantumCircuit, assemble, Aer

qc = QuantumCircuit(1, 1)
qc.measure(0, 0)

sim = Aer.get_backend('aer_simulator')
qobj = assemble(qc, shots=1024)
result = sim.run(qobj).result()
counts = result.get_counts()
print(counts)

をすると {'0': 1024} を得る。2 量子ビットの場合

qc = QuantumCircuit(2, 2)
qc.measure(0, 0)
qc.measure(1, 1)

{'00': 1024} となる。計算の原子

量子ビットは常に出力が 0となるよう初期化されます。

とあるので、それぞれの量子ビットには $\ket{0}$ が与えられていることになる。
これを見るために以下のような回路を考える:

f:id:derwind:20220110225103p:plain

で 1 量子ビット目を X ゲートで反転させるようにして、1 量子ビット目を制御量子ビットとする CNOT ゲートを作用させると、

qc.x(0)
qc.cx(0, 1)
qc.measure(0, 0)
qc.measure(1, 1)

{'11': 1024} となる。式で書くと次の通りである:

\begin{align*}
\mathrm{CNOT} (X\ket{0} \otimes \ket{0}) &= \mathrm{CNOT}\left( \ket{1} \otimes \ket{0} \right) \\
&= \left( \ket{0}\braket{0 | 1} \otimes \ket{0} + \ket{1}\braket{1 | 1} \otimes X\ket{0} \right) \\
& = \left( 0 + \ket{1} \otimes \ket{1} \right) = \ket{11}
\end{align*}