A3: Cyclic Shift Oracle I

実行時間制限:3 秒

メモリ制限:512 MiB

配点:200点

Writer:fortoobye

解説

問題 A2 にて実装したスワップゲートを利用することで、この問題を解くことができます。

以下の 33 量子ビットの例を確認してみましょう。

まず、22 番目と 33 番目の量子ビットをスワップします。

x0x1x2CX(1,2)CX(2,1)CX(1,2)x0x2x1\begin{equation} \ket{x_0x_1x_2} \xrightarrow{CX(1,2)} \xrightarrow{CX(2,1)} \xrightarrow{CX(1,2)} \ket{x_0x_2x_1} \end{equation}

次に、11 番目と 22 番目の量子ビットをスワップします。

x0x2x1CX(0,1)CX(1,0)CX(0,1)x2x0x1\begin{equation} \ket{x_0x_2x_1} \xrightarrow{CX(0,1)} \xrightarrow{CX(1,0)} \xrightarrow{CX(0,1)} \ket{x_2x_0x_1} \end{equation}

したがって、22 回のスワップで量子状態 x2x0x1\ket{x_2x_0x_1} を得ることができました。

以上の操作を一般化すると、n1n-1 回のスワップによって目的の量子状態 xn1x0x1xn2\ket{x_{n-1} x_0 x_1 \cdots x_{n-2}} を生成できます。 さらに、各スワップは深さ 33 の量子回路で実装できるため、全体の量子回路の深さは 3(n1)3(n-1) となり、結果としてこの問題を解くことができます。

解答例

解答例は以下の通りです。

from qiskit import QuantumCircuit
 
 
def solve(n: int) -> QuantumCircuit:
    def swap(n: int, qubit1: int, qubit2: int) -> QuantumCircuit:
        qc = QuantumCircuit(n)
 
        qc.cx(qubit1, qubit2)
        qc.cx(qubit2, qubit1)
        qc.cx(qubit1, qubit2)
 
        return qc
 
    qc = QuantumCircuit(n)
 
    for i in reversed(range(n - 1)):
        qc.compose(swap(n, i, i + 1), inplace=True)
 
    return qc

探求

コンテスト後、hiryuN さんによって回路深さ 3log2n3 \lceil \log_2 n \rceil の解法が 発見 されました。 このアルゴリズムは、A4: Cyclic Shift Oracle の x(x+1)modn\ket{x}\rightarrow \ket{(x+1) \bmod n} のアルゴリズムを、ii ビット目で (i+1)modn(i+1) \bmod n ビット目を置き換える操作に言い換えると導かれます。