$$ \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 - Warmup A4 - Distinguish I ⊗ X from CNOT◇◇


☆問題URL

https://codeforces.com/contest/1356/problem/A4

☆問題の概要

2 qubitに対する演算$unitary$が与えられ、ここで$unitary$は$I⊗X$ゲートもしくはCNOTゲートである。$unitary$を二度まで呼び出して、$I⊗X$であれば0を、CNOTであれば1を返せ。

☆解法

$I⊗X$ゲートは0番目のqubitには何もせず、1番目のqubitのみを常に反転させる演算であり、$CNOT$ゲートは0番目のqubitが1の場合のみ1番目のqubitを反転させる演算です。 よって、与えられた演算を状態$\ket{00}$に作用させたあとに1番目のqubitに対してPauli Zを対角とした測定を行い、$\ket{0}$が得られればCNOT、$\ket{1}$が得られれば$I⊗X$と判断できます。

☆ソースコード

                
namespace Solution {
    open Microsoft.Quantum.Intrinsic;

    operation Solve (unitary : (Qubit[] => Unit is Adj+Ctl)) : Int {
        mutable res = 0;
        using (qs = Qubit[2])
        {
            //  与えられたoperationを|00>に作用させる
            unitary(qs);

            //  1番目のqubitを測定して、|0>ならCNOT、|1>ならI⊗X
            if (M(qs[1]) == Zero)
            {
                set res = 1;
            }

            ResetAll(qs);
        }
        return res;
    } 
}
                
            

戻る