$$ \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 A2 - Distinguish I, CNOTs and SWAP◇◇


☆問題URL

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

☆問題の概要

2 qubitに対する演算$unitary$が与えられ、ここで$unitary$は$I\otimes I$、${\rm CNOT_{12}}$、${\rm CNOT_{21}}$、${\rm SWAP}$のうちのどれかである。$unitary$を二度まで呼び出して、それが$I\otimes I$ならば0、 ${\rm CNOT_{12}}$ならば1、 ${\rm CNOT_{21}}$ならば2、 ${\rm SWAP}$ならば3を返せ。

☆解法

この問題では与えられた演算を2回まで呼び出すことができるので、与えられた演算を$\ket{01}, \ket{10}$の2つの状態に作用させると $$I\otimes I\ket{01} = \ket{01},\; I\otimes I\ket{10} = \ket{10}$$ $${\rm CNOT_{12}}\ket{01} = \ket{01},\; {\rm CNOT_{12}}\ket{10} = \ket{11}$$ $${\rm CNOT_{21}}\ket{01} = \ket{11},\; {\rm CNOT_{21}}\ket{10} = \ket{10}$$ $${\rm SWAP}\ket{01} = \ket{10},\; {\rm SWAP}\ket{10} = \ket{01}$$ となり、演算を作用させたあとの状態を測定することで4つの演算をすべて識別することができます。

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

☆ソースコード

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

    operation ToString (register : LittleEndian) : String
    {
        //与えられたQubit[]の各桁を測定して、対応する文字列を返す
        mutable res = "";
        let qs = register!;
        for (idx in 0..Length(qs) - 1)
        {
            set res += M(qs[idx]) == Zero ? "0" | "1";
        }
        return res;
    }

    operation Solve (unitary : (Qubit[] => Unit is Adj+Ctl)) : Int
    {
        mutable str = "";
        using (qs = Qubit[4])
        {
            //|01>, |10>にunitaryを作用させる
            ApplyToEach(X, qs[1..2]);
            ApplyToEach(unitary, [qs[0..1], qs[2..3]]);

            //測定する
            set str = ToString(LittleEndian(qs));

            ResetAll(qs);
        }

        //測定結果に対応する整数を返す
        for (idx in 0..3)
        {
            if(str == ["0110", "0111", "1110", "1001"][idx])
            {
                return idx;
            }
        }
        return -1;
    }
}
                
            

戻る