$$ \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}} $$

◇◇Microsoft Q# Coding Contest – Summer 2020 C2 - Prepare superposition of basis states with the same parity◇◇


☆問題URL

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);
            }
        } 
    }
}
                
            

戻る