解説
この問題は特定の計算基底状態の確率振幅を増幅する問題であり、グローバーのアルゴリズムの使用を想定しています。
量子状態 ∣ψ⟩ を次式で定義します。
∣ψ⟩=2n1i=0∑2n−1∣i⟩
グローバーのアルゴリズムとは以下のようなアルゴリズムです。
- 量子状態 ∣ψ⟩ を用意する。
- Grover iterationと呼ばれる次の操作を繰り返す。
- 増幅したい計算基底状態のみの符号を反転させる操作を適用する。
- 演算子 2∣ψ⟩⟨ψ∣−I で表される操作を適用する。
全ての量子ビットに H ゲートを作用させることで、量子状態 ∣ψ⟩ を用意できます。
また、この問題において、増幅したい計算基底状態のみの符号を反転させる操作はオラクル O そのものです。
そして、演算子 2∣ψ⟩⟨ψ∣−I で表される操作は、B5で実装した操作です。
上記を踏まえて、Grover iterationを 1 回のみ行った場合の量子状態を計算してみましょう。
まず、 量子状態 ∣ψ⟩ と ∣L⟩ の内積について
⟨ψ∣L⟩=⟨L∣ψ⟩=1/2n
が成立するため、オラクル O が I−2∣L⟩⟨L∣ と表せることに注目し、∣ψ⟩ にオラクル O を作用させると、以下のようになります。
O∣ψ⟩=(I−2∣L⟩⟨L∣)∣ψ⟩=∣ψ⟩−2∣L⟩⟨L∣ψ⟩=∣ψ⟩−2n2∣L⟩
次に、2∣ψ⟩⟨ψ∣−I と表現される演算子を作用させると、以下のようになります。
(2∣ψ⟩⟨ψ∣−I)(∣ψ⟩−2n2∣L⟩)=2∣ψ⟩⟨ψ∣ψ⟩−∣ψ⟩−2n4∣ψ⟩⟨ψ∣L⟩+2n2∣L⟩=2∣ψ⟩−∣ψ⟩−2n4∣ψ⟩+2n2∣L⟩=2n2n−4∣ψ⟩+2n2∣L⟩
操作を行った後の aL は以下のようになります。
aL=2n2n2n−4+2n2
したがって、制約の n≥3 のもとで、 ∣aL∣2>4/2n が成立します。
よって、Grover iterationの回数を 1 回としてグローバーのアルゴリズムを行えば、この問題を解くことができます。
n=3 の場合の回路図は、以下の通りです。回路図内のReflect_B4
は、B4の回路を示しています。
解答例
解答例は以下の通りです。
from qiskit import QuantumCircuit
from qiskit.circuit.library import ZGate
def reflect(n: int) -> QuantumCircuit:
qc = QuantumCircuit(n)
qc.x(range(n))
qc.append(ZGate().control(n - 1), range(n))
qc.x(range(n))
return qc
def solve(n: int, o: QuantumCircuit) -> QuantumCircuit:
qc = QuantumCircuit(n)
qc.h(range(n))
qc.compose(o, inplace=True)
qc.h(range(n))
qc.compose(reflect(n), inplace=True)
qc.h(range(n))
return qc