$$ \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 B1 - Distinguish three-qubit states◇◇


☆問題URL

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

☆問題の概要

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

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

☆解法

$U\ket{\psi_0}=\ket{000}$となるユニタリ演算$U$が存在すると仮定すると、 \begin{align*} \braket{000}{U\psi_1}&=\braket{U\psi_0}{U\psi_1}\\ &=\bra{\psi_0}U^{\dagger}U\ket{\psi_1}\\ &=\braket{\psi_0}{\psi_1}\\ &=\left( \bra{100} + \omega^2\bra{010} + \omega\bra{001} \right)\left( \ket{100} + \omega^2\ket{010} + \omega\ket{001} \right)\\ &=\braket{100}{100}+\omega^4\braket{010}{010}+\omega^2\braket{001}{001}\\ &=1+\omega+\omega^2\\ &=0 \end{align*} より、状態$\ket{000}$と状態$U\ket{\psi_1}$の内積が0となるので、$U\ket{\psi_1}$には$\ket{000}$成分が存在しない(係数が0である)ことがわかります。

よって、与えられた状態に演算$U$を作用させたあとすべてのqubitに対してPauli Z演算子を対角とする測定を行い、状態$\ket{000}$が測定されれば$\ket{\psi_0}$、測定されなければ$\ket{\psi_1}$と判断すればよいです。

ここで演算$U$について考えます。演算$U$は、定義より状態$\ket{000}$を$\ket{\psi_0}$に変化させる演算の逆演算(Adjoint)であることがわかります。以下、$\ket{000}$を$\ket{\psi_0}$に変化させる演算$U^{\dagger}$を構成します。

始状態$\ket{000}$に対して、A1と同様に、0番目のqubitをブロッホ球上でY軸まわりに$2\arccos{\frac{\sqrt{2}}{\sqrt{3}}}$だけ回転させると $$\frac{\sqrt{2}}{\sqrt{3}}\ket{000} + \frac{1}{\sqrt{3}}\ket{100}$$ となり、ここで、0番目のqubitが0の場合のみ1番目のqubitにアダマール・ゲートを作用させる演算を行うと $$\frac{1}{\sqrt{3}}\left( \ket{000} + \ket{010} + \ket{100} \right)$$ を得ます。さらに、0番目、1番目のqubitがともに0である場合のみ2番目のqubitにNOTゲートを作用させると、状態 $$\frac{1}{\sqrt{3}}\left( \ket{100} + \ket{010} + \ket{001} \right)$$ を作ることができました。これは3桁のW状態であり、$\ket{\psi_0}, \ket{\psi_1}$とは各項の位相のみが異なる状態です。

重ね合わせの位相を変化させるために、Phase shiftゲートを利用します。Phase shiftゲートは $$R_\phi=\ket{0}\bra{0}+e^{i\phi}\ket{1}\bra{1}$$ で表される演算であって、ブロッホ球上でのZ軸まわりの回転に対応する演算です。3桁のW状態に対して、1番目のqubitに$R_{\frac{2\pi}{3}}$、2番目のqubitに$R_{\frac{4\pi}{3}}$を作用させると、目的の状態 $$\ket{\psi_0}=\frac{1}{3}\left( \ket{100} + \omega\ket{010} + \omega^2\ket{001} \right)$$ となり、以上の一連の操作が演算$U^{\dagger}$となります。

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

☆ソースコード

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

    operation U_Adj (qs : Qubit[]) : Unit { //|000⟩を|ψ_0⟩にする演算
        body(...){
            Ry(2.0*ArcCos(Sqrt(2.0)/Sqrt(3.0)),qs[0]);
            (ControlledOnInt(0,H))([qs[0]],qs[1]);
            (ControlledOnInt(0,X))(qs[0..1],qs[2]); //ここまででW状態

            R1(2.0*PI()/3.0,qs[1]);
            R1(4.0*PI()/3.0,qs[2]);
        }

        adjoint auto;
        controlled auto;
        controlled adjoint auto;
    }

    operation Solve (qs : Qubit[]) : Int {

        Adjoint U_Adj(qs);  //qsにUを作用させる

        return MeasureInteger(LittleEndian(qs))==0?0|1; //|000⟩が測定されれば0, そうでなければ1を返す。
    }
}
                
            

戻る