https://codeforces.com/contest/1357/problem/C2
N桁の状態\ket{0\ldots0}と整数parityが与えられるので、立っているbitの数の偶奇がparityと等しい状態のみの重ね合わせ状態を作れ
例として、N=2,\;parity=0であれば \frac1{\sqrt2}\left( \ket{00} + \ket{11} \right) N=2,\;parity=1であれば \frac1{\sqrt2}\left( \ket{01} + \ket{10} \right) を作れ。
この問題も基本的な解法は前問と同じで、重ね合わせ状態を2つに分け、欲しい方の状態が得られるまで測定を繰り返せばよいです。
ここで、状態をparityで分けるにはparityが1の場合のみf(x) = 1となるようなオラクルが存在すればよく、これはすでに実装済です。
これで、この問題が解けました。
namespace Solution {
open Microsoft.Quantum.Measurement;
open Microsoft.Quantum.Canon;
open Microsoft.Quantum.Intrinsic;
operation CheckParity (x : Qubit[], y : Qubit) : Unit
{
for (q in x)
{
CNOT(q, y);
}
}
operation Solve (qs : Qubit[], parity : Int) : Unit
{
using (q = Qubit())
{
repeat
{
//parityが1の状態のみqを反転する
ApplyToEach(H, qs);
CheckParity(qs, q);
let res = MResetZ(q);
}
until(res == (parity == 0 ? Zero | One))
fixup
{
ResetAll(qs);
}
}
}
}