$$ \def\bra#1{\mathinner{\left\langle{#1}\right|}} \def\ket#1{\mathinner{\left|{#1}\right\rangle}} \def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}} $$

Q# 入門していく(2)

$$ \def\bra#1{\mathinner{\left\langle{#1}\right|}} \def\ket#1{\mathinner{\left|{#1}\right\rangle}} \def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}} $$

問題

Problem - A2 - Codeforces

\( \ket{0\cdots 0} \)と\( \ket{\psi} \)の状態を等確率にしたい。

解法

\( \ket{\psi} \)として与えられる bit が 0 のときは、その qubit は常に\( \ket{0} \)なのでそのままでよい。

 

bit が 1 のときは、その qubit において\( \ket{0} \)と\( \ket{1} \)の状態を等確率にしたい。最初に出てくるこのような qubit をアダマールゲートに通し、つぎからは CNOT ゲートに通す。これは最初の qubit とほかのすべての qubit ()が観測された結果と同じ状態になってほしいから。個々にアダマールゲートを通すと間違い。

コード

namespace Solution {
open Microsoft.Quantum.Primitive;
open Microsoft.Quantum.Canon;

operation Solve(qs : Qubit, bits : Bool) : () {
  body {
    let N = Length(qs);
    H(qs[0]);
    for (index in 1..(N - 1)) {
      if (bits[index]) {
        CNOT(qs[0], qs[index]);
      }
    }
  }
}
} // namespace Solution