解説
この問題は、問題 B2 と B6 の解答を利用して解くことができます。
の場合の回路図は次のように表されます。

ただし、回路図中の B6 と B2 はそれぞれ問題 B2 と B6 の解答となる量子回路を表し、B6_dg の _dg は逆操作を表します。
以下、状態遷移をみていきます。
はじめに問題 B6 の解答である量子位相推定回路を作用させます。
次に、問題 B2 の解答であるオラクルを作用させます。
最後に問題 B6 の解答である量子位相推定回路の逆操作を作用させます。
回路の深さは です。
解答例
解答例は以下の通りです。
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