$$ \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 C1 - Prepare superposition of basis states with 0s◇◇


☆問題URL

https://codeforces.com/contest/1357/problem/C1

☆問題の概要

$N$桁の状態$\ket{0\ldots0}$が与えられるので、$\ket{0}$を一つでも含むようなすべての状態の等しい重みの重ね合わせ状態を作れ。

例として、$N=2$であれば $$\frac1{\sqrt3}\left( \ket{00} + \ket{01} + \ket{10} \right)$$ を作れ。

☆解法

この問題は、課せられている操作の制約も含めてPrepare state |01⟩ + |10⟩ + |11⟩と本質的に全く同じ問題であり、全く同じ手順で解くことができます。$\ket{0}$をひとつも含まない状態は$\ket{1\ldots1}$しかないので、それを取り除けばよいです。桁数が可変になっていますが、ControlledOnInt演算を用いれば問題ありません。

☆ソースコード

                
namespace Solution {
    open Microsoft.Quantum.Measurement;
    open Microsoft.Quantum.Math;
    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Intrinsic;

    operation Solve (qs : Qubit[]) : Unit
    {
        using (q = Qubit())
        {
            repeat
            {
                //|1...1>状態のみqを反転する
                ApplyToEach(H, qs);
                (ControlledOnInt((1 <<< Length(qs)) - 1, X))(qs, q);
                let res = MResetZ(q);
            }
            until(res == Zero)
            fixup
            {
                ResetAll(qs);
            }
        } 
    }
}
                
            

戻る