B6: Quantum Arithmetic II

実行時間制限:3 秒

メモリ制限:512 MiB

配点:200点

Writer:PSL

解説

この問題は 問題 B5 のオラクルを利用して、量子位相推定 1 と呼ばれる量子アルゴリズムを適用することで解くことができます。

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

以下、先頭の nn 量子ビットをレジスタ ∣x⟩n\ket{x}_n、続く mm 量子ビットをレジスタ ∣y⟩m\ket{y}_m と表記し、∣y⟩m\ket{y}_m の状態遷移をみていきます。

はじめにレジスタ ∣y⟩m=∣0⟩\ket{y}_m = \ket{0} の各量子ビットにアダマールゲートを作用させ、一様重ね合わせ状態を生成します。

∣0⟩m→H⊗m12m∑k=02m−1∣k⟩m=12m(∣0⟩+∣1⟩)⊗(∣0⟩+∣1⟩)⊗⋯⊗(∣0⟩+∣1⟩)\begin{align} \ket{0}_m &\xrightarrow{H^{\otimes m}} \frac{1}{\sqrt{2^m}} \sum_{k=0}^{2^m-1} \ket{k}_m \nonumber\\ &= \frac{1}{\sqrt{2^m}} (\ket{0} + \ket{1}) \otimes (\ket{0} + \ket{1}) \otimes \cdots \otimes (\ket{0} + \ket{1}) \end{align}

ここで、問題 B5 では次の遷移を実現するオラクルを実装しました。

∣x⟩→Oexp⁡(2πif(x)2m)∣x⟩\begin{equation} \ket{x} \xrightarrow{O} \exp{\left(\frac{2\pi i f(x)}{2^m}\right)}\ket{x} \end{equation}

ここで、このオラクルの位相に 2j2^j をかけたようなオラクルを PS2jP_{S}^{2^j} として定義します。

∣x⟩→PS2jexp⁡(2πif(x)2m⋅2j)∣x⟩\begin{equation} \ket{x} \xrightarrow{P_{S}^{2^j}} \exp{\left(\frac{2\pi i f(x)}{2^m} \cdot 2^j\right)}\ket{x} \end{equation}

次に、生成した一様重ね合わせ状態に対して、レジスタ ∣y⟩m\ket{y}_m の j+1j+1 番目(0≤j<m0 \leq j < m)の量子ビットを制御ビットとしたオラクル PS2jP_{S}^{2^j} をそれぞれ ∣x⟩\ket{x} に対して作用させます。

12m(∣0⟩+∣1⟩)⊗(∣0⟩+∣1⟩)⊗⋯⊗(∣0⟩+∣1⟩)→PS20,PS21,⋯ ,PS2m−112m(∣0⟩+e2πif(x)⋅202m∣1⟩)⊗(∣0⟩+e2πif(x)⋅212m∣1⟩)⊗⋯⊗(∣0⟩+e2πif(x)⋅2m−12m∣1⟩)=12m∑k=02m−1e2πif(x)k2m∣k⟩m\begin{align} &\frac{1}{\sqrt{2^m}} (\ket{0} + \ket{1}) \otimes (\ket{0} + \ket{1}) \otimes \cdots \otimes (\ket{0} + \ket{1}) \nonumber \\ \xrightarrow{P_S^{2^0}, P_S^{2^1}, \cdots, P_S^{2^{m-1}}} &\frac{1}{\sqrt{2^m}} (\ket{0} + e^{\frac{2\pi i f(x)\cdot 2^0}{2^m}}\ket{1}) \otimes (\ket{0} + e^{\frac{2\pi i f(x)\cdot 2^1}{2^m}}\ket{1}) \otimes \cdots \otimes (\ket{0} + e^{\frac{2\pi i f(x)\cdot 2^{m-1}}{2^m}}\ket{1}) \nonumber\\ = &\frac{1}{\sqrt{2^m}} \sum_{k=0}^{2^m-1} e^{\frac{2\pi i f(x)k}{2^m}} \ket{k}_m \end{align}

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

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

(5) 式の遷移は、次式で表される量子フーリエ変換の定義から明らかです。

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

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

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

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

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)
 
    qc.h(y)
 
    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

Footnotes

  1. 量子位相推定については加藤 拓己さんの「世界一分かりやすい量子位相推定」を参照してください。 ↩