A4: Cyclic Shift Oracle II

実行時間制限:3 秒

メモリ制限:512 MiB

配点:200点

Writer:fortoobye

解説

問題 A2 にて実装したスワップゲートの意味を考えましょう。

解法1

はじめに、22 量子ビットのスワップについて考えます。 11 番目の量子ビットと 22 番目の量子ビットをスワップする操作は、制御 XX ゲートを用いることで実現でき、状態遷移は以下のようになります。

{00CX(0,1)CX(1,0)CX(0,1)0010CX(0,1)CX(1,0)CX(0,1)0101CX(0,1)CX(1,0)CX(0,1)1011CX(0,1)CX(1,0)CX(0,1)11\begin{equation} \begin{cases} \ket {00} \xrightarrow{CX(0, 1)} \xrightarrow{CX(1, 0)} \xrightarrow{CX(0, 1)} \ket{00} \\ \ket {10} \xrightarrow{CX(0, 1)} \xrightarrow{CX(1, 0)} \xrightarrow{CX(0, 1)} \ket{01} \\ \ket {01} \xrightarrow{CX(0, 1)} \xrightarrow{CX(1, 0)} \xrightarrow{CX(0, 1)} \ket{10} \\ \ket {11} \xrightarrow{CX(0, 1)} \xrightarrow{CX(1, 0)} \xrightarrow{CX(0, 1)} \ket{11} \end{cases} \end{equation}

ここで、22 番目の量子ビットが 00 である時、すなわち 00,10\ket{00}, \ket{10} となる時の状態遷移に注目します。

{00CX(0,1)CX(1,0)00CX(0,1)0010CX(0,1)CX(1,0)01CX(0,1)01\begin{equation} \begin{cases} \ket {00} \xrightarrow{CX(0, 1)} \xrightarrow{CX(1, 0)} \ket{00} \xrightarrow{CX(0, 1)} \ket{00} \\ \ket {10} \xrightarrow{CX(0, 1)} \xrightarrow{CX(1, 0)} \ket{01} \xrightarrow{CX(0, 1)} \ket{01} \end{cases} \end{equation}

上記の (2)(2) 式のように、はじめの「11 番目の量子ビットを制御ビット、22 番目の量子ビットを標的ビットとする制御 XX ゲート」と、次の「22番目の量子ビットを制御ビット、11 番目の量子ビットを標的ビットとする制御 XX ゲート」によって 22 量子ビットのスワップが実現されていることがわかります。 これを上手く利用することで、この問題を解くことができます。

まず、xn1=0x_{n-1} = 0 であることから xn2,xn1x_{n-2}, x_{n-1}22 ステップで交換でき、以下の状態遷移が成り立ちます。

x0x1xn4xn3xn2xn1CX(n2,n1)CX(n1,n2)x0x1xn4xn3xn1xn2\begin{equation} \ket{x_0x_1 \cdots x_{n-4} x_{n-3} x_{n-2} x_{n-1}} \xrightarrow{CX(n-2,n-1)} \xrightarrow{CX(n-1,n-2)} \ket{x_0x_1 \cdots x_{n-4} x_{n-3} x_{n-1} x_{n-2}} \end{equation}

同様に、xn1=0x_{n-1} = 0 であることから xn3,xn1x_{n-3}, x_{n-1}22 ステップで交換でき、以下の状態遷移が成り立ちます。

x0x1xn4xn3xn1xn2CX(n3,n2)CX(n2,n3)x0x1xn4xn1xn3xn2\begin{equation} \ket{x_0x_1 \cdots x_{n-4} x_{n-3} x_{n-1} x_{n-2}} \xrightarrow{CX(n-3,n-2)} \xrightarrow{CX(n-2,n-3)} \ket{x_0x_1 \cdots x_{n-4} x_{n-1} x_{n-3} x_{n-2}} \end{equation}

同様の操作を全部で n1n-1 回行うことで、目的の量子状態 xn1x0x1xn2\ket{x_{n-1} x_0 x_1 \cdots x_{n-2}} を深さ 2(n1)2(n-1) で生成することができます。

n=3n = 3 の場合の回路図は、以下の通りです。

解法2

A2 の解説で述べたように、3ステップで 22 変数 x,yx, y をスワップする古典アルゴリズムとして、XOR swap が知られています。 特に y=0y=0 のとき 33 ステップ目の「yyx+y(mod2)x + y \pmod 2 で置き換える操作」を省略できるため、「yyx+y(mod2)x + y \pmod 2 で置き換える操作」と「 xxx+y(mod2)x + y \pmod 2 で置き換える操作」の 22 ステップでXOR swapを実現することができます。 これを利用することで、以下解法で解くこともできます。

まず、制御 XX ゲートを用いて yyx+y(mod2)x + y \pmod 2 で置き換える操作を 1,2,,n11, 2, \ldots, n-1 ビット目に対して行います。

for i in reversed(range(n - 1)):
    qc.cx(i, i + 1)  

次に、制御 XX ゲートを用いて xxx+y(mod2)x + y \pmod 2 で置き換える操作を 1,2,,n11, 2, \ldots, n-1 ビット目に対して行います。

for i in reversed(range(n - 1)):
    qc.cx(i + 1, i)  

これによって解法1と同様に、目的の量子状態 xn1x0x1xn2\ket{x_{n-1} x_0 x_1 \cdots x_{n-2}} を深さ 2(n1)2(n-1) で生成することができます。

n=3n = 3 の場合の回路図は、以下の通りです。

解答例

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

解法1

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

解法2

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