$$ \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 A4 - Distinguish Rz from R1◇◇


☆問題URL

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

☆問題の概要

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

☆解法

$R_z$と$R_1$は、それぞれ $$R_z(\theta) = e^{-i\theta/2}\ket{0}\bra{0} + e^{i\theta/2}\ket{1}\bra{1}$$ $$R_1(\theta) = \ket{0}\bra{0} + e^{i\theta}\ket{1}\bra{1]}$$ で表される演算であり、この問題では$\theta$を任意の値に設定することができます。

ここで、$\theta = 2\pi$としたとき \begin{align*} R_z(2\pi) &= -\ket{0}\bra{0} - \ket{1}\bra{1} \\ &= -I \end{align*} \begin{align*} R_1(2\pi) &= \ket{0}\bra{0} + \ket{1}\bra{1} \\ &= I \end{align*} となり、この識別はDistinguish Z from -Zと同様の方法で可能であることがわかります。

具体的には \begin{align*} [Controlled\;I]\ket{+0} &= \frac1{\sqrt2}\left( \ket{00} + \ket{10} \right) \\ &= \ket{+0} \end{align*} \begin{align*} [Controlled\;-I]\ket{+0} &= \frac1{\sqrt2}\left( \ket{00} - \ket{10} \right) \\ &= \ket{-0} \end{align*} より、状態$\ket{+0}$に対して作用させて0番目のqubitに対してPauli Xを対角とする測定を行うことで判別できます。

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

☆ソースコード

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

    operation Solve (unitary : ((Double, Qubit) => Unit is Adj+Ctl)) : Int
    {
        //theta = 2π のとき、Rz = -I, R1 = Iとなる
        using (qs = Qubit[2])
        {
            H(qs[0]);
            (Controlled unitary)(qs[0..0], (2.0 * PI(), qs[1]));
            return MResetX(qs[0]) == Zero ? 1 | 0;
        }
    }
}
                
            

戻る