B7: Quantum Arithmetic III

実行時間制限:3 秒

メモリ制限:512 MiB

配点:200点

Writer:PSL

解説

この問題は、問題 B6 の解法である量子位相推定において、はじめに作用させるアダマールゲートを量子フーリエ変換に置き換えることで解くことができます。

n=2, m=2n = 2,\ m = 2 の場合の量子回路図は次のように表されます。

以下、計算基底状態 ∣x⟩n∣y⟩m\ket{x}_n \ket{y}_m の状態遷移をみていきます。

はじめにレジスタ ∣y⟩m\ket{y}_m に量子フーリエ変換を作用させます。

∣y⟩m→QFT12m∑k=02m−1exp⁡(2πiyk2m)∣k⟩m\begin{equation} \ket{y}_m \xrightarrow{\mathrm{QFT}} \sqrt{\frac{1}{2^m}} \sum_{k=0}^{2^m-1} \exp{\left(\frac{2\pi i y k}{2^m}\right)} \ket{k}_m \end{equation}

次に、問題 B6 の解説で定義したオラクル PS2jP_{S}^{2^j} を、∣y⟩m\ket{y}_m の j+1j+1 番目の量子ビットを制御ビットとして、それぞれ作用させます(0≤j<m0 \leq j < m)。

12m∑k=02m−1exp⁡(2πiyk2m)∣k⟩m→PS20,PS21,⋯ ,PS2m−112m∑k=02m−1e2πi(y+f(x))k2m∣k⟩m\begin{equation} \sqrt{\frac{1}{2^m}} \sum_{k=0}^{2^m-1} \exp{\left(\frac{2\pi i y k}{2^m}\right)} \ket{k}_m \xrightarrow{P_S^{2^0}, P_S^{2^1}, \cdots, P_S^{2^{m-1}}} \frac{1}{\sqrt{2^m}} \sum_{k=0}^{2^m-1} e^{\frac{2\pi i (y + f(x))k}{2^m}} \ket{k}_m \end{equation}

最後に、逆量子フーリエ変換を作用させることでレジスタ ∣y⟩m\ket{y}_m を目的の状態に遷移させることができます。

12m∑k=02m−1e2πi(y+f(x))k2m∣k⟩m→IQFT∣(y+f(x)) mod 2m⟩m\begin{align} \frac{1}{\sqrt{2^m}} \sum_{k=0}^{2^m-1} e^{\frac{2\pi i (y + f(x))k}{2^m}} \ket{k}_m \xrightarrow{\mathrm{IQFT}} \ket{(y + f(x))\ \mathrm{mod}\ 2^m}_m \end{align}

以上の操作により、次の状態遷移を実現する量子回路を実装できます。

∣x⟩n∣y⟩m→qc∣x⟩n∣(y+f(x)) mod 2m⟩m\begin{equation} \ket{x}_{n}\ket{y}_{m} \xrightarrow{\mathrm{qc}} \ket{x}_{n}\ket{(y + f(x))\ \mathrm{mod}\ 2^m}_m \end{equation}

量子回路の深さは 4m+max(n,m)4m + \mathrm{max}(n, m) です。

writer 解説

解答例

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

import math
 
from qiskit import QuantumCircuit, QuantumRegister
 
 
def qft(n: int) -> QuantumCircuit:
    qc = QuantumCircuit(n)
 
    for i in reversed(range(n)):
        qc.h(i)
        for j in reversed(range(i)):
            qc.cp(math.pi / 2 ** (i - j), j, i)
 
    for i in range(n // 2):
        qc.swap(i, n - i - 1)
 
    return qc
 
 
def solve(n: int, m: int, S: list[int]) -> QuantumCircuit:
    x, y = QuantumRegister(n), QuantumRegister(m)
    qc = QuantumCircuit(x, y)
    qft_m = qft(m)
 
    qc.compose(qft_m, y, inplace=True)
 
    for j in range(m):
        for i in range(n):
            theta = (2 * math.pi * S[i] / 2**m) * 2**j
            qc.cp(theta, x[i], y[j])
 
    qc.compose(qft_m.inverse(), y, inplace=True)
 
    return qc