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}} $$
問題
\( \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