A4: Generate One-hot Superposition State I

実行時間制限:3 秒

メモリ制限:512 MiB

配点:200点

Writer:ST12

解説

はじめに、ゼロ状態 0000...0\ket{0000...0} の1ビット目に XX ゲートを作用させます。

0000...0X(0)1000...0\begin{equation} \ket{0000...0} \xrightarrow{X(0)} \ket{1000...0} \end{equation}

次に、この量子状態 1000...0\ket{1000...0} に対して、制御 RyR_y ゲートを作用させ、1000...0\ket{1000...0}1100...0\ket{1100...0} の重ね合わせ状態を生成します。 1000...0\ket{1000...0} の振幅を完成形の振幅 1/n1/\sqrt{n} にすることを考えると、回転角 θ1\theta_1 は以下の連立方程式を解くことで求めることができます。

{cos(θ12)=1nsin(θ12)=n1n\begin{equation} \left\{ \, \begin{aligned} & \cos\left(\frac{\theta_1}{2}\right) = \frac{1}{\sqrt{n}} \\ & \sin\left(\frac{\theta_1}{2}\right) = \sqrt{\frac{n-1}{n}} \end{aligned} \right. \end{equation}

この方程式を解くと、0θ12π0 \leq \theta_1 \leq 2\pi の範囲で次の解が得られます。

θ1=2arctan(n1)\begin{equation} \theta_1 = 2 \arctan{(\sqrt{n-1})} \end{equation}

よって、量子状態 1000...0\ket{1000...0} に対して1ビット目を制御ビット、2ビット目を標的ビットとした回転角 θ1\theta_1 の制御 RyR_y ゲートを作用させます。

1000...0CRy(θ1,0,1)1n1000...0+n1n1100...0\begin{equation} \ket{1000...0} \xrightarrow{CRy(\theta_1,0,1)} \frac{1}{\sqrt{n}} \ket{1000...0} + \sqrt{\frac{n-1}{n}} \ket{1100...0} \end{equation}

そして、2ビット目を制御ビット、1ビット目を標的ビットとして制御 XX ゲートを作用させます。

1n1000...0+n1n1100...0CX(1,0)1n1000...0+n1n0100...0\begin{equation} \frac{1}{\sqrt{n}} \ket{1000...0} + \sqrt{\frac{n-1}{n}} \ket{1100...0} \xrightarrow{CX(1,0)} \frac{1}{\sqrt{n}} \ket{1000...0} + \sqrt{\frac{n-1}{n}} \ket{0100...0} \end{equation}

このような操作(制御 RyR_y ゲートと制御 XX ゲートを順に作用させること)を計 nn 回繰り返すことで、この問題を解くことができます。

0000...0X(0)1000...0CRy(θ1,0,1)1n1000...0+n1n1100...0CX(1,0)1n1000...0+n1n0100...0CRy(θ2,1,2)1n(1000...0+0100...0)+n2n10110...0CX(2,1)1n(1000...0+0100...0)+n2n10010...0CX(n,n1)1n(1000...0+0100...0++0000...1)\begin{align} \ket{0000...0} &\xrightarrow{X(0)} \ket{1000...0} \nonumber \\ &\xrightarrow{CRy(\theta_1, 0, 1)} \frac{1}{\sqrt{n}} \ket{1000...0} + \sqrt{\frac{n-1}{n}} \ket{1100...0} \nonumber\\ &\xrightarrow{CX(1, 0)} \frac{1}{\sqrt{n}} \ket{1000...0} + \sqrt{\frac{n-1}{n}} \ket{0100...0} \nonumber\\ &\xrightarrow{CRy(\theta_2, 1, 2)} \frac{1}{\sqrt{n}} (\ket{1000...0} + \ket{0100...0}) + \sqrt{\frac{n-2}{n-1}} \ket{0110...0} \nonumber\\ &\xrightarrow{CX(2, 1)} \frac{1}{\sqrt{n}} (\ket{1000...0} + \ket{0100...0}) + \sqrt{\frac{n-2}{n-1}} \ket{0010...0} \nonumber\\ &\qquad \qquad \qquad \qquad \qquad \qquad \vdots \nonumber\\ &\xrightarrow{CX(n, n-1)} \frac{1}{\sqrt{n}} (\ket{1000...0} + \ket{0100...0} + \cdots + \ket{0000...1}) \end{align}

解答例

解答例は以下の通りです。

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