A4: Generate State 12(∣0⟩−∣2n−1⟩)\frac{1}{\sqrt{2}}\lparen\ket{0}-\ket{2^{n}-1}\rparen II

実行時間制限:3 秒

メモリ制限:512 MiB

配点:100点

Writer:ST12

解説

問題 A3 の想定解法では量子回路の深さが n+1n+1 となり、この問題を解くことができません。 では、どのような量子回路を設計すれば良いのでしょうか?

まず、量子回路の深さを小さくするためには、なるべく連続して同じ量子ビットに対して量子ゲートを作用させるのを避ける必要があります。

以下の 44 量子ビットの例をみてみましょう。

問題 A3 解説の量子回路との違いは、最も右側の制御 XX ゲートの制御ビットが 11 番目から 22 番目に変わっていることです。

このとき、最も右側の制御ゲートは 22 番目と 44 番目の量子ビットに対する操作であり、1つ左側の制御ゲートは 11 番目と 33 番目の量子ビットに対する操作であるため、この2つの操作は同時に行うことができ、量子回路の深さを1つ縮めることができます。

量子状態の遷移をみていきます。 2つ目の制御 XX ゲートを作用させるまでは、問題 A3 の想定解法と同じです。

∣0000⟩→H(0)→CX(0,1)→CX(0,2)12(∣0000⟩+∣1110⟩)\begin{equation} \ket{0000} \xrightarrow{H(0)} \xrightarrow{CX(0,1)}\xrightarrow{CX(0,2)} \frac{1}{\sqrt{2}} \lparen \ket{0000} + \ket{1110} \rparen \end{equation}

次に、22 番目の量子ビットを制御ビット、44 番目の量子ビットを標的ビットとして制御 XX ゲートを作用させます。

12(∣0000⟩+∣1110⟩)→CX(1,3)12(∣0000⟩+∣1111⟩)\begin{equation} \frac{1}{\sqrt{2}} \lparen \ket{0000} + \ket{1110} \rparen \xrightarrow{CX(1,3)} \frac{1}{\sqrt{2}} \lparen \ket{0000} + \ket{1111} \rparen \end{equation}

最後に ZZ ゲートを作用させることで ∣11⋯11⟩\ket{11 \cdots 11} の位相を反転させます。

12(∣0...0⟩+∣1...1⟩)→Z(0)12(∣0...0⟩−∣1...1⟩)\begin{equation} \frac{1}{\sqrt{2}} \lparen \ket{0...0} + \ket{1...1} \rparen \xrightarrow{Z(0)} \frac{1}{\sqrt{2}} \lparen \ket{0...0} - \ket{1...1} \rparen \end{equation}

この発想を一般の nn 量子ビットの量子回路に対して一般化すると、まず 11 番目にアダマールゲートを作用させ、11 番目を制御ビット、22 番目を標的ビットとして制御 XX ゲートを作用させます。その後、i=1,2,…i = 1, 2, \ldots に対して、標的ビットが nn 番目を超えない範囲で以下の操作を繰り返します。

  • 11 番目の量子ビットを制御ビット、2i+12i + 1 番目の量子ビットを標的ビットとして制御 XX ゲートを作用させます。
  • 22 番目の量子ビットを制御ビット、2i+22i + 2 番目の量子ビットを標的ビットとして制御 XX ゲートを作用させます。

例えば、n=7n = 7 の場合は以下のような量子回路が構成できます。

以上の操作によって量子回路の深さは ⌊n/2⌋+3\lfloor n/2 \rfloor + 3 以下になり、この問題を解くことができます。

解答例

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

from qiskit import QuantumCircuit
 
 
def solve(n: int) -> QuantumCircuit:
    qc = QuantumCircuit(n)
 
    qc.h(0)
    qc.cx(0, 1)
 
    for i in range(2, n - 1, 2):
        qc.cx(0, i)
        qc.cx(1, i + 1)
 
    if n % 2 != 0:
        qc.cx(0, n - 1)
 
    qc.z(0)
 
    return qc