B2: Controlled Phase Shift

実行時間制限:3 秒

メモリ制限:512 MiB

配点:200点

Writer:PSL

解説

ヒントの解説

ヒント: まずは cc を除いた次のオラクルを考えてみましょう。

knOexp(2πiak2n)kn\begin{equation} \ket{k}_n \xrightarrow{O} \exp\left(\frac{2\pi i a k}{2^n}\right) \ket{k}_n \end{equation}

はじめに kk を二進展開します。

k=k0+2k1++2n1kn1(k0,k1,,kn1{0,1})k = k_0 + 2k_1 + \cdots + 2^{n-1}k_{n-1} \quad (k_0, k_1, \ldots, k_{n-1} \in \{0, 1\})

このとき各計算基底状態の位相変化は各量子ビットごとに分解することができます:

exp(2πiak2n)kn=exp(2πia(k0+2k1++2n1kn1)2n)k0k1kn1=exp(2πiak02n)k0exp(2πia2k12n)k1exp(2πia2n1kn12n)kn1\begin{align} \exp\left(\frac{2\pi i a k}{2^n}\right) \ket{k}_n &= \exp\left(\frac{2\pi i a (k_0 + 2k_1 + \cdots + 2^{n-1}k_{n-1})}{2^n}\right) \ket{k_0} \ket{k_1} \cdots \ket{k_{n-1}} \nonumber\\ &= \exp\left(\frac{2\pi i a k_0}{2^n}\right) \ket{k_0} \exp\left(\frac{2\pi i a 2 k_1}{2^n}\right) \ket{k_1} \cdots \exp\left(\frac{2\pi i a 2^{n-1}k_{n-1}}{2^n}\right) \ket{k_{n-1}} \end{align}

よって、各量子ビットに対して θ=2πa2i/2n\theta = 2\pi a 2^i / 2^n の 位相ゲート P(θ)P(\theta) を適用することでオラクルを実装することができます。

問題の解説

本問もヒントと同様に各計算基底状態の位相変化は各量子ビットごとに分解することができます:

exp(2πiakc2n)knc1=exp(2πia(k0+2k1++2n1kn1)c2n)k0k1kn1c=exp(2πiak0c2n)k0exp(2πia2n1kn1c2n)kn1c\begin{align} \exp\left(\frac{2\pi i a k c}{2^n}\right) \ket{k}_{n} \ket{c}_1 &= \exp\left(\frac{2\pi i a (k_0 + 2k_1 + \cdots + 2^{n-1}k_{n-1})c}{2^n}\right) \ket{k_0} \ket{k_1} \cdots \ket{k_{n-1}} \ket{c} \nonumber\\ &= \exp\left(\frac{2\pi i a k_0 c}{2^n}\right) \ket{k_0} \cdots \exp\left(\frac{2\pi i a 2^{n-1}k_{n-1} c}{2^n}\right) \ket{k_{n-1}} \ket{c} \end{align}

量子ビット c\ket{c} は制御ビットと解釈することができるため、c\ket{c}を制御ビットとする θ=2πa2i/2n\theta = 2 \pi a 2^i / 2^n の制御位相ゲート CP(θ)CP(\theta)を適用することでこの問題を解くことができます。

解答例

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

import math
 
from qiskit import QuantumCircuit
 
 
def solve(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