らんだむな記憶

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

<QT> 回路の等価性

<QT> Single Qubit Gates - らんだむな記憶 で既に見たが、$HXH = Z$ と $HZH = X$ が成立する。よって、物理的なノイズの増大はさておき、論理的には、X ゲートから Z ゲートを実装できる。同様に $CZ_{0,1} = H CX_{0,1} H$ と実装できる。
簡単な証明としては:

$$
\begin{align*}
\ket{j0} \xrightarrow{H_1 CX_{0,1} H_1} \ket{j0}
\end{align*}
$$

$$
\begin{align*}
\ket{j1} \xrightarrow{H_1 CX_{0,1} H_1} (-1)^j \ket{j1}
\end{align*}
$$

が計算で分かるので、これは $CZ_{0,1}$ である。

また、$SWAP = CX_{0,1} CX_{1,0} CX_{0,1}$ である。${00}$ ではどのゲートも何もせず、$\ket{01}$, $\ket{10}$, $\ket{11}$ の場合はどれかのゲートが動作しない形で情報が交換される。

Find a different circuit that swaps qubits in the states $\ket{+}$ and $\ket{-}$, and show that this is equivalent to the circuit shown above.

に取り組んでみる。$\ket{+}$, $\ket{-}$ と $\ket{0}$, $\ket{1}$ の世界を行ったり来たりすることで実現してみる。$\ket{+} \leftrightarrow \ket{0}$, $\ket{-} \leftrightarrow \ket{1}$ を可能にするゲートは $H$ ゲートである。$\ket{+} \leftrightarrow \ket{-}$ を可能にするゲートは $Z$ ゲートである。これを踏まえて制御量子ビットに一旦アダマールゲートを適用して X-基底を Z-基底の世界に持ってくる。制御量子ビットが $\ket{-}$ の時にターゲット量子ビットの側では “NOT” が適用されるように $Z$ ゲートを適用する形とし、textbook の SWAP ゲートの分解を参考に以下のような回路を考える:

def swap(q0, q1):
    qc = QuantumCircuit(2)
    if q0:
        qc.x(0)
    if q1:
        qc.x(1)
    qc.cx(0, 1)
    qc.cx(1, 0)
    qc.cx(0, 1)
    return qc

def another_swap(q0, q1, superposition=False):
    def subgate(qc, i, j):
        qc.h(i)
        qc.cz(i, j)
        qc.h(i)
    
    qc = QuantumCircuit(2)
    if q0:
        qc.x(0)
    if q1:
        qc.x(1)
    if superposition:
        qc.h(0)
        qc.h(1)

    subgate(qc, 0, 1)
    subgate(qc, 1, 0)
    subgate(qc, 0, 1)
    return qc

のような実装をして

usim = Aer.get_backend('aer_simulator')
qc = swap(0, 0)
qc.save_unitary()
qobj = assemble(qc)
results = svsim.run(qobj).result()
unitary = results.get_unitary()
array_to_latex(unitary)

usim = Aer.get_backend('aer_simulator')
qc = another_swap(0, 0)
qc.save_unitary()
qobj = assemble(qc)
results = svsim.run(qobj).result()
unitary = results.get_unitary()
array_to_latex(unitary)

の結果がともに

$$
\begin{align*}
\begin{bmatrix}
1 & 0 & 0& 0 \\
0 & 0 & 1& 0 \\
0 & 1 & 0& 0 \\
0 & 0 & 0& 1
\end{bmatrix}
\end{align*}
$$

になることで回路の等価性は確認できる。

qc = another_swap(0, 0, True)
qc.draw('mpl')

で回路を可視化すると以下のようになる: