$$ \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 A1 - Figure out direction of CNOT◇◇


☆問題URL

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

☆問題の概要

2 qubitに対する演算$unitary$が与えられ、ここで$unitary$は${\rm CNOT_{12}}$または${\rm CNOT_{21}}$である。$unitary$を一度だけ呼び出して、それが${\rm CNOT_{12}}$ならば0を、${\rm CNOT_{21}}$ならば1を返せ。

☆解法

${\rm CNOT_{12}}$と${\rm CNOT_{21}}$はどちらも${\rm CNOT}$ゲートですが、制御bitとターゲットbitが入れ替わっており、これらを識別するためには与えられた演算を状態$\ket{11}$に作用させればよく、

$${\rm CNOT_{12}}\ket{11} = \ket{10}$$ $${\rm CNOT_{21}}\ket{11} = \ket{01}$$ より、どちらのqubitを測定しても演算を識別することができます。

これで、この問題が解けました。

☆ソースコード

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

    operation Solve (unitary : (Qubit[] => Unit is Adj+Ctl)) : Int
    {
        //|11>を入力して、|10>になれば0, |01>になれば1
        mutable res = 0;
        using (qs = Qubit[2])
        {
            ApplyToEach(X, qs);
            unitary(qs);
            if (M(qs[0]) == Zero)
            {
                set res = 1;
            }

            ResetAll(qs);
        }
        return res;
    }
}
                
            

戻る