量子コンピューティング向け言語Q#の問題集 QuantumKatas Superposition Task 15

Superposition Task 15は2日くらい悩んでやっとテストが通った。

Task 15は、次の入力状態からゴール状態を作る問題。

  • 入力状態: N個の量子ビットの状態|0...0> (Nは2の冪乗とは限らない)
  • ゴール状態: W stateという状態、すなわち、 (|10...0> + |010...0> + ... + |0...1>)/sqrt(N)

以下の写真の方針で考えました。

f:id:yabaniyatun:20190403234435j:plain

解答

    // Task 15**. W state on arbitrary number of qubits
    // Input: N qubits in |0...0⟩ state (N is not necessarily a power of 2).
    // Goal: create a W state (https://en.wikipedia.org/wiki/W_state) on these qubits.
    // W state is an equal superposition of all basis states on N qubits of Hamming weight 1.
    // Example: for N = 3, W state is (|100⟩ + |010⟩ + |001⟩) / sqrt(3).
    operation WState_Arbitrary (qs : Qubit[]) : Unit {
      let N = Length(qs);
      Ry(2.0 * ArcCos(Sqrt(ToDouble(N - 1) / ToDouble(N))), qs[0]);
      for (i in 0..N-2) {
        (ControlledOnInt(0, Ry))(qs[0..i], (2.0 * ArcCos(Sqrt(ToDouble(N-i-2)/ToDouble(N-i-1))), qs[i+1]));
      }
    }