$$ \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 - Winter 2019 B2 - Not A, not B, not C?◇◇


☆問題URL

https://codeforces.com/contest/1116/problem/B2

☆問題の概要

1桁の量子状態が与えられるので、与えられた状態が

のどれであるか判定し、$\ket{A}$なら1または2を、$\ket{B}$なら0または2を、$\ket{C}$なら0または1を返せ。ただし、$\omega=e^{\frac{2i\pi}{3}}$(1の3乗根)である。

☆解法

問題名にもあるとおり、与えられた状態が$\ket{A},\ket{B},\ket{C}$のうち「どれではない」かを答える問題です。これらの3状態は直交していないので100%判別することはできませんが、確実に$\ket{A}$ではないといえるなら0を、$\ket{B}$ではないといえるなら1を、$\ket{C}$ではないといえるなら2を答えます。

与えられた状態を$\ket{X}$とします。新たなqubitを1つ用意して、与えられた状態にこれを追加して2桁の量子状態$\ket{X0}$とすれば、$4\times4$行列で表される演算子を作用させることができるようになります(以下、状態のベクトル表示では$\ket{00}, \ket{10}, \ket{01}, \ket{00}$の順で基底を表します)。ここで $$U=C\left( \begin{array}{rr} 1 & -1 & ? & ? \\ 1 & -\omega & ? & ? \\ 1 & -\omega^2 & ? & ? \\ 0 & 0 & ? & ? \\ \end{array}\right)$$ という形のユニタリ演算子が存在すると仮定すると、これを$\ket{X0}$に作用させれば $$U\ket{A0}=U\left( \begin{array}{rr} 1\\1\\0\\0 \end{array}\right)=\left( \begin{array}{rr} 0\\1-\omega\\1-\omega^2\\ 0 \end{array}\right)$$ $$U\ket{B0}=U\left( \begin{array}{rr} 1\\\omega\\0\\0 \end{array}\right)=\left( \begin{array}{rr} 1-\omega\\1-\omega^2\\0\\ 0 \end{array}\right)$$ $$U\ket{C0}=U\left( \begin{array}{rr} 1\\\omega^2\\0\\0 \end{array}\right)=\left( \begin{array}{rr} 1-\omega^2\\0\\1-\omega\\ 0 \end{array}\right)$$ となり、測定を行って$\ket{00}$が測定されれば0を、$\ket{01}$が測定されれば1を、$\ket{10}$が測定されれば2を返せばよいことがわかります。入力状態の1桁目は必ず$\ket{0}$であることがわかっているので、$U$の右半分は何でもよいことになります。

$U$として使えるユニタリ演算子を生成する手順のうちのひとつは、以下のようなものです。

$$U=\left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} & 0 \\ 0 & \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}\right) \left( \begin{array}{rr} \frac{1}{\sqrt{3}} & \frac{\sqrt{2}}{\sqrt{3}} & 0 & 0 \\ \frac{\sqrt{2}}{\sqrt{3}} & -\frac{1}{\sqrt{3}} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}\right) \left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & i & 0 \\ 0 & 0 & 0 & i \\ \end{array}\right) \left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} & 0 \\ 0 & \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}\right) \left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & -1 \\ \end{array}\right) $$ これを計算すると $$U=\frac{1}{\sqrt{3}}\left( \begin{array}{rr} 1 & -1 & 1 & 0 \\ 1 & -\omega & \omega^2 & 0 \\ 1 & -\omega^2 & \omega & 0 \\ 0 & 0 & 0 & -\sqrt{3}i \\ \end{array}\right)$$ となり、条件を満たします。

以下、各演算の実装方法について述べます。入力を$\ket{x_0x_1}$と表記します。

まず $$ \left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ \end{array}\right) \left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & \frac{1}{\sqrt{2}} & 0 & \frac{1}{\sqrt{2}} \\ 0 & 0 & 1 & 0 \\ 0 & \frac{1}{\sqrt{2}} & 0 & -\frac{1}{\sqrt{2}} \\ \end{array}\right) \left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ \end{array}\right) = \left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} & 0 \\ 0 & \frac{1}{\sqrt{2}} & -\frac{1}{\sqrt{2}} & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}\right) $$ であって $ \left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ \end{array}\right) $ は$\ket{x_1}$を制御ビット、$\ket{x_0}$をターゲットビットとしたCNOT演算であり、 $ \left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & \frac{1}{\sqrt{2}} & 0 & \frac{1}{\sqrt{2}} \\ 0 & 0 & 1 & 0 \\ 0 & \frac{1}{\sqrt{2}} & 0 & -\frac{1}{\sqrt{2}} \\ \end{array}\right) $ は$\ket{x_0}$を制御ビット、$\ket{x_1}$をターゲットビットとしたアダマール・ゲート(Controlled H演算)です (基底の順番に注意してください)。

次に $$ \left( \begin{array}{rr} 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}\right) \left( \begin{array}{rr} \frac{\sqrt{2}}{\sqrt{3}} & -\frac{1}{\sqrt{3}} & 0 & 0 \\ \frac{1}{\sqrt{3}} & \frac{\sqrt{2}}{\sqrt{3}} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}\right) = \left( \begin{array}{rr} \frac{1}{\sqrt{3}} & \frac{\sqrt{2}}{\sqrt{3}} & 0 & 0 \\ \frac{\sqrt{2}}{\sqrt{3}} & -\frac{1}{\sqrt{3}} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}\right) $$ であって $ \left( \begin{array}{rr} 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}\right) $ は$\ket{x_1}=\ket{0}$の場合のみ$\ket{x_0}$を反転する演算であり、 $ \left( \begin{array}{rr} \frac{\sqrt{2}}{\sqrt{3}} & -\frac{1}{\sqrt{3}} & 0 & 0 \\ \frac{1}{\sqrt{3}} & \frac{\sqrt{2}}{\sqrt{3}} & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{array}\right) $ は、$\ket{x_1}=\ket{0}$の場合のみ$\ket{x_0}$をブロッホ球上でY軸まわりに$2\arccos{\frac{\sqrt{2}}{\sqrt{3}}}$回転させる操作を表します。

その他の演算について、 $ \left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & i & 0 \\ 0 & 0 & 0 & i \\ \end{array}\right) $ は、$\pi/4$Phase shiftゲート $ S=\left( \begin{array}{rr} 1 & 0 \\ 0 & i \\ \end{array}\right) $ と恒等演算子との直積$(S\otimes I)$であり、$\ket{x_1}$に対するSゲートに対応します。 $ \left( \begin{array}{rr} 1 & 0 & 0 & 0 \\ 0 & -1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & -1 \\ \end{array}\right) $ は、恒等演算子とZゲートの直積$(I\otimes Z)$であり、$\ket{x_0}$に対するZゲートに対応します。

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

☆ソースコード

                
namespace Solution {
    open Microsoft.Quantum.Primitive;
    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Extensions.Math;

    operation Solve (q : Qubit) : Int {
        mutable ret=0;
        using(a=Qubit()){

            //(I⊗Z)
            Z(q);

            //diag(1,H,1)
            CNOT(a,q);
            Controlled H([q],a);
            CNOT(a,q);

            //(S⊗I)
            S(a);

            //R
            (ControlledOnInt(0,Ry))([a],(2.0*ArcCos(Sqrt(2.0/3.0)),q));
            (ControlledOnInt(0,X))([a],q);

            //diag(1,H,1)
            CNOT(a,q);
            Controlled H([q],a);
            CNOT(a,q);

            //測定
            let res0=M(q);
            let res1=MResetZ(a);

            if(res0==Zero && res1==Zero){
                set ret=0;
            }
            elif(res0==Zero && res1==One){
                set ret=1;
            }
            elif(res0==One && res1==Zero){
                set ret=2;
            }
            else{
                set ret=3;
            }
        }
        return ret;
    }
}
                
            

戻る