解説
量子フーリエ変換 () は次のように定義されます:
以上 未満の任意の整数 に対して、次式を満たす 量子ビットオラクル
よって、 と問題B2の操作(制御位相シフト)、逆量子フーリエ変換 () を組み合わせることでこの問題を解くことができます。
と は必ずしも制御ゲートとする必要はありません。回路の深さは です。
解答例
解答例は以下の通りです。
import math
from qiskit import 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
# B2
def crot(n: int, a: int) -> QuantumCircuit:
qc = QuantumCircuit(n + 1)
for i in range(n):
theta = 2 * math.pi * a * 2**i / 2**n
qc.cp(theta, n, i)
return qc
def solve(n: int, a: int) -> QuantumCircuit:
k, c = QuantumRegister(n), QuantumRegister(1)
qc = QuantumCircuit(k, c)
qc.compose(qft(n), qubits=k, inplace=True)
qc.compose(crot(n, a), qubits=[*k, *c], inplace=True)
qc.compose(qft(n).inverse(), qubits=k, inplace=True)
return qc