$$ \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 A3 - Distinguish H from X◇◇


☆問題URL

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

☆問題の概要

1 qubitに対する演算$unitary$が与えられ、ここで$unitary$は$H$または$X$である。$unitary$を二度まで呼び出して、それが$H$ならば0、 $X$ならば1を返せ。

☆解法

$H,\;X$がともに自身を逆演算にもつ演算であることに注目します。また、$X\ket{+} = \ket{+}$であることから \begin{align*} HXH\ket{0} &= HX\ket{+} \\ &= H\ket{+} \\ &= \ket{0} \end{align*} \begin{align*} XXX\ket{0} &= X\ket{0} \\ &= \ket{1} \end{align*} となります。

よって、$UXU\ket{0}$に対してPauli Zを対角とする測定を行い、$\ket{0}$が得られれば$U = H$、$\ket{1}$が得られれば$U = X$であると判断できます($U$は与えられた演算)

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

☆ソースコード

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

    operation Solve (unitary : (Qubit => Unit is Adj+Ctl)) : Int
    {
        //UXU|0>を測定して|0>ならH, |1>ならX
        using (q = Qubit())
        {
            unitary(q);
            X(q);
            unitary(q);
            return MResetZ(q) == Zero ? 0 | 1;
        }
    }
}
                
            

戻る