B8: Quantum Arithmetic IV

実行時間制限:3 秒

メモリ制限:512 MiB

配点:200点

Writer:PSL

解説

この問題は、問題 B2 と B6 の解答を利用して解くことができます。

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

ただし、回路図中の B6 と B2 はそれぞれ問題 B2 と B6 の解答となる量子回路を表し、B6_dg の _dg は逆操作を表します。

以下、状態遷移をみていきます。

はじめに問題 B6 の解答である量子位相推定回路を作用させます。

xn0mB6xnf(x) mod 2mm\begin{equation} \ket{x}_{n}\ket{0}_{m} \xrightarrow{B6} \ket{x}_{n}\ket{f(x)\ \mathrm{mod}\ 2^m}_{m} \end{equation}

次に、問題 B2 の解答であるオラクルを作用させます。

xnf(x) mod 2mmB2{eiθxnf(x) mod 2mmf(x)=L (mod 2m)eiθxnf(x) mod 2mmf(x)L (mod 2m)\begin{equation} \ket{x}_{n}\ket{f(x)\ \mathrm{mod}\ 2^m}_{m} \xrightarrow{B2} \begin{cases} e^{i\theta} \ket{x}_{n}\ket{f(x)\ \mathrm{mod}\ 2^m}_{m} & f(x) = L\ (\mathrm{mod}\ 2^m )\\ \phantom{e^{i\theta}} \ket{x}_{n}\ket{f(x)\ \mathrm{mod}\ 2^m}_{m} & f(x) \neq L \ (\mathrm{mod}\ 2^m) \end{cases} \end{equation}

最後に問題 B6 の解答である量子位相推定回路の逆操作を作用させます。

{eiθxnf(x) mod 2mmf(x)=L (mod 2m)eiθxnf(x) mod 2mmf(x)L (mod 2m)B6{eiθxn0mf(x)=L (mod 2m)eiθxn0mf(x)L (mod 2m)\begin{equation} \begin{cases} e^{i\theta} \ket{x}_{n}\ket{f(x)\ \mathrm{mod}\ 2^m}_{m} & f(x) = L\ (\mathrm{mod}\ 2^m )\\ \phantom{e^{i\theta}} \ket{x}_{n}\ket{f(x)\ \mathrm{mod}\ 2^m}_{m} & f(x) \neq L \ (\mathrm{mod}\ 2^m) \end{cases} \xrightarrow{{B6}^\dagger} \begin{cases} e^{i\theta} \ket{x}_{n}\ket{0}_{m} & f(x) = L\ (\mathrm{mod}\ 2^m )\\ \phantom{e^{i\theta}} \ket{x}_{n}\ket{0}_{m} & f(x) \neq L \ (\mathrm{mod}\ 2^m) \end{cases} \end{equation}

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

解答例

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

import math
 
from qiskit import QuantumCircuit, QuantumRegister
 
 
def phase_estimation(n: int, m: int, S: list[int]) -> QuantumCircuit:
    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
 
    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
 
 
def rotation_L(n: int, L: int, theta: float) -> QuantumCircuit:
    qc = QuantumCircuit(n)
 
    for i in range(n):
        if not (1 << i) & L:
            qc.x(i)
 
    if n == 1:
        qc.p(theta, n - 1)
    else:
        qc.mcp(theta, list(range(n - 1)), n - 1)
 
    for i in range(n):
        if not (1 << i) & L:
            qc.x(i)
 
    return qc
 
 
def solve(n: int, m: int, L: int, S: list[int], theta: float) -> QuantumCircuit:
    x, y = QuantumRegister(n), QuantumRegister(m)
    qc = QuantumCircuit(x, y)
 
    oracle = phase_estimation(n, m, S)
 
    qc.compose(oracle, inplace=True)
    qc.compose(rotation_L(m, L, theta), y, inplace=True)
    qc.compose(oracle.inverse(), inplace=True)
 
    return qc