Ex: Reverse and Shift

実行時間制限:3 秒

メモリ制限:512 MiB

配点:600点

問題文

nn を正の整数とする。長さが 2n2^n のリスト [p0,p1,...,p2n1][p_0, p_1, ... , p_{2^n-1}] に対し、以下の 22 種類の操作を考える。

  • 操作 1 : 先頭の項を末尾に移動させる
[p0,p1,...,p2n1][p1,...,p2n1,p0][p_0, p_1, ... , p_{2^n-1}] \rightarrow [p_1, ... , p_{2^n-1}, p_0]
  • 操作 2 : 全体をひっくり返す
[p0,p1,...,p2n1][p2n1,...,p1,p0][p_0, p_1, ... , p_{2^n-1}] \rightarrow [p_{2^n - 1}, ... , p_1, p_0]

加えて、操作 g(m,k)g(m, k) を「操作 1 を kk 回、続けて操作 2 を mm 回行う操作」として定義する。

整数 nn, mbeforem_{\text{before}}, kbeforek_{\text{before}}, mafterm_{\text{after}}, kafterk_{\text{after}} が入力として与えられるので、次の条件を満たすオラクル OO を、n+1n+1 量子ビットをもつ量子回路 qc\mathrm{qc} 上に実装せよ。

0m<20 \leq m < 20k<2n0 \leq k < 2^{n} を満たす任意の整数の組 (m,k)(m,k) に対して

mknOmkn\ket{m}\ket{k}_n \xrightarrow{O} \ket{m'}\ket{k'}_n

ただし、0m<20 \leq m' < 20k<2n0 \leq k' < 2^{n} は以下を満たす必要がある。

  • 操作 g(m,k)g(m', k') は、「g(mbefore,kbefore)g(m,k)g(mafter,kafter)g(m_{\text{before}}, k_{\text{before}}) \rightarrow g(m, k) \rightarrow g(m_{\text{after}}, k_{\text{after}}) を順に行う操作」である。

制約

  • 2n102 \leq n \leq 10
  • 0mbefore<20 \leq m_{\text{before}} < 2
  • 0kbefore<2n0 \leq k_{\text{before}} < 2^n
  • 0mafter<20 \leq m_{\text{after}} < 2
  • 0kafter<2n0 \leq k_{\text{after}} < 2^n
  • 量子回路の 深さ300300 を超えてはならない。
  • 整数は リトルエンディアン にしたがってエンコードすること
  • グローバル位相 は問わない。
  • 提出されるコードは次のフォーマットにしたがうこと
from qiskit import QuantumCircuit
 
 
def solve(n: int, m_before: int, k_before: int, m_after: int, k_after: int) -> QuantumCircuit:
    qc = QuantumCircuit(n + 1)
    # Write your code here:
 
    return qc

解答を提出するにはログインしてください。