解説
以下、 のように整数 の 番目のビットを と表すこととします。
はじめに、オラクルの対象となる整数の集合 を次のように分解します。
すなわち、 は 番目のビットが より小さく、 から 番目までのビットがすべて と等しいような集合 のインデックス に関する和集合と言い換えることができます。なお、 は と等価です。
例として の場合を考えます。
- のとき、
- のとき、
- のとき、
よって、 と計算でき、無事 未満の状態を列挙できます。
このような分解を元に、インデックス それぞれの集合に対して ゲートを作用させることでオラクルを実現できます。
各インデックスにおいて 2 つの条件 と は量子ゲートを用いて次のように表現できます。
- :
- の場合には何もしない(ゲートを作用させずにスキップする)
- :
- から ビット目までのインデックス に対して、 ならば 番目の量子ビットに ゲートを作用させる。
- 番目の量子ビットに ゲートを作用させる。( の場合に をかけるため)
- 複数制御 ゲートを から ビット目までを制御ビット、 ビット目を標的ビットとして作用させる。
-
- と 1. の逆操作を行う。
解答例
解答例は以下の通りです。
from qiskit import QuantumCircuit
from qiskit.circuit.library import ZGate
def solve(n: int, L: int) -> QuantumCircuit:
qc = QuantumCircuit(n)
for i in range(n):
if not (L >> i) & 1:
continue
for j in range(i + 1, n):
if not (L >> j) & 1:
qc.x(j)
qc.x(i)
if i == n - 1:
qc.z(i)
else:
qc.append(ZGate().control(n - i - 1), range(i, n))
qc.x(i)
for j in range(i + 1, n):
if not (L >> j) & 1:
qc.x(j)
return qc
補足
- 問題 B3 では、オラクルの対象となるすべての状態にそれぞれ対応した量子ゲートを作用させる実装が想定解法となっていますが、これは貪欲法であり非効率的です。量子アルゴリズムが古典アルゴリズムに対して計算量の観点で優位性を発揮するには、回路の深さの浅い効率的なオラクルを実装する必要があります。
- より効率的なオラクルの実装法が文献 [1] にて提案されています。
References
- [1] J. Sanchez-Rivero et al., “Automatic generation of an efficient less-than oracle for quantum amplitude amplification,” in 2023 IEEE/ACM 4th International Workshop on Quantum Software Engineering (Q-SE), May 2023, pp. 26–33. (https://arxiv.org/abs/2303.07120)