解説
はじめに、ゼロ状態 ∣0000...0⟩ の1ビット目に X ゲートを作用させます。
∣0000...0⟩X(0)∣1000...0⟩
次に、この量子状態 ∣1000...0⟩ に対して、制御 Ry ゲートを作用させ、∣1000...0⟩ と ∣1100...0⟩ の重ね合わせ状態を生成します。
∣1000...0⟩ の振幅を完成形の振幅 1/n にすることを考えると、回転角 θ1 は以下の連立方程式を解くことで求めることができます。
⎩⎨⎧cos(2θ1)=n1sin(2θ1)=nn−1
この方程式を解くと、0≤θ1≤2π の範囲で次の解が得られます。
θ1=2arctan(n−1)
よって、量子状態 ∣1000...0⟩ に対して1ビット目を制御ビット、2ビット目を標的ビットとした回転角 θ1 の制御 Ry ゲートを作用させます。
∣1000...0⟩CRy(θ1,0,1)n1∣1000...0⟩+nn−1∣1100...0⟩
そして、2ビット目を制御ビット、1ビット目を標的ビットとして制御 X ゲートを作用させます。
n1∣1000...0⟩+nn−1∣1100...0⟩CX(1,0)n1∣1000...0⟩+nn−1∣0100...0⟩
このような操作(制御 Ry ゲートと制御 X ゲートを順に作用させること)を計 n 回繰り返すことで、この問題を解くことができます。
∣0000...0⟩X(0)∣1000...0⟩CRy(θ1,0,1)n1∣1000...0⟩+nn−1∣1100...0⟩CX(1,0)n1∣1000...0⟩+nn−1∣0100...0⟩CRy(θ2,1,2)n1(∣1000...0⟩+∣0100...0⟩)+n−1n−2∣0110...0⟩CX(2,1)n1(∣1000...0⟩+∣0100...0⟩)+n−1n−2∣0010...0⟩⋮CX(n,n−1)n1(∣1000...0⟩+∣0100...0⟩+⋯+∣0000...1⟩)
解答例
解答例は以下の通りです。
import math
from qiskit import QuantumCircuit
def solve(n: int) -> QuantumCircuit:
qc = QuantumCircuit(n)
theta = [2 * math.atan(math.sqrt(i)) for i in range(n - 1, 0, -1)]
qc.x(0)
for i in range(n - 1):
qc.cry(theta[i], i, i + 1)
qc.cx(i + 1, i)
return qc