C1: Generate Uniform Amplitude Superposition State I

実行時間制限:3 秒

メモリ制限:512 MiB

配点:300点

Writer:admin

解説

整数 kk を 「2xL2^x \geq L を満たす最小の整数 xx」 と定義し、kk 番目までの量子ビットにアダマールゲートを適用することを考えます。

このとき、計算基底状態 0, 1, ... L1\ket{0},\ \ket{1},\ ...\ \ket{L-1} の複素振幅の絶対値 ai|a_i| はすべて等しく、次式を満たします。

a0=a1==aL1=12k\begin{equation} |a_0| = |a_1| = \cdots = |a_{L-1}| = \frac{1}{\sqrt{2^k}} \end{equation}

ここで、2k1<L2k2^{k-1} < L \leq 2^k より、観測確率の総和は次の不等式を満たします。

i=0L1ai2=L×(12k)2=L2k>2k12k=0.5\begin{align} \sum_{i=0}^{L-1} |a_i|^2 &= L \times \left(\frac{1}{\sqrt{2^k}}\right)^2 \nonumber\\ &= \frac{L}{2^k} > \frac{2^{k-1}}{2^k} = 0.5\\ \end{align}

なお、「2xL2^x \geq L を満たす最小の整数 xx」は log2(L)\lceil\log_2(L)\rceil と表すことができます。(()\lceil(\cdot)\rceil天井関数 を表します。)

結果として、log2(L)\lceil\log_2(L)\rceil 番目までの量子ビットにアダマールゲートを適用することでこの問題を解くことができます。

L=1L = 1 の場合に生じる実装上のコーナーケースに注意して下さい。

解答例

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

from qiskit import QuantumCircuit
import math
 
 
def solve(n: int, L: int) -> QuantumCircuit:
    qc = QuantumCircuit(n)
 
    if L == 1:
        return qc
 
    k = math.ceil(math.log2(L))
    qc.h(range(k))
 
    return qc

補足