QuantumKatas Superposition Task 14

    // And関数を使うためにimport
    open Microsoft.Quantum.Extensions.Bitwise;

    // Task 14**. W state on 2ᵏ qubits
    // Input: N = 2ᵏ qubits in |0...0⟩ state.
    // 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 = 4, W state is (|1000⟩ + |0100⟩ + |0010⟩ + |0001⟩) / 2.
    operation WState_PowerOfTwo (qs : Qubit[]) : Unit {
        // Hint: you can use Controlled modifier to perform arbitrary controlled gates.
        let N = Length(qs);
        let k = Floor(Lg(ToDouble(N)));

        using (qk = Qubit[k]) {
          ApplyToEach(H, qk);

          for (i in 0..N-1) {
            (ControlledOnInt(i, X))(qk, qs[i]);
          }

          for (i in 0..N-1) {
            for (j in 0..k-1) {
              if (And(i, Floor(PowD(2.0, ToDouble(j)))) > 0) {
                (ControlledOnInt(1, X))([qs[i]], qk[j]);
              }
            }
          }
        }
    }