B2: Phase Shift Oracle

実行時間制限:3 秒

メモリ制限:512 MiB

配点:200点

Writer:PSL

解説

計算基底状態 L\ket{L} のみに位相シフトゲート P(θ)P(\theta) を作用させる量子回路を実装する問題です。

では、重ね合わせ状態の中の特定の計算基底状態 L\ket{L} にのみ位相シフトゲート P(θ)P(\theta) を作用させるにはどうすればよいでしょうか?

これは次のように実現できます。

  1. L=L0L1L2...Ln1\ket{L} = \ket{L_0 L_1 L_2 ... L_{n-1}} のうち、Li=0L_i = 0 であるようなインデックス ii に対して、XX ゲートを作用させる。こうして、L\ket{L}2n1=1...1\ket{2^n - 1} = \ket{1...1} に変換する。
  2. n1n - 1 ビットを制御ビット、残りの 11 ビットを標的ビットとする複数制御位相シフトゲートを作用させる。このとき、位相シフトゲートは重ね合わせ状態の中の計算基底状態 L\ket{L} にのみ作用します。
    1. の逆操作を行い、2n1\ket{2^n - 1}L\ket{L} に戻す。

この操作を実装することでこの問題を解くことができます。

n=3, L=1n = 3,\ L = 1 の場合の量子回路は次のように表されます。

回路の深さは 33 です。

解答例

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

from qiskit import QuantumCircuit
 
 
def solve(n: int, L: int, theta: float) -> QuantumCircuit:
    qc = QuantumCircuit(n)
 
    for i in range(n):
        if not (1 << i) & L:
            qc.x(i)
 
    if n == 1:
        qc.p(theta, n - 1)
    else:
        qc.mcp(theta, list(range(n - 1)), n - 1)
 
    for i in range(n):
        if not (1 << i) & L:
            qc.x(i)
 
    return qc