$$ \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 A1 - Generate state |00⟩ + |01⟩ + |10⟩◇◇


☆問題URL

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

☆問題の概要

2桁の量子状態$\ket{00}$が与えられるので、状態 $$\frac{1}{\sqrt{3}}\left( \ket{00}+\ket{01}+\ket{10} \right)$$ を作れ。

☆解法

解法が3つくらいあって、どれも有用なので自分用のメモも兼ねてすべて書きます。

1. 状態の回転による解法

単一のqubit$\ket{0}$に対して $$R\ket{0}=\left( \frac{\sqrt{2}}{\sqrt{3}}\ket{0}+\frac{1}{\sqrt{3}}\ket{1} \right)$$ となる回転操作$R$が存在するとき、0番目のqubitに$R$を作用させると $$R_0\ket{00}=\left( \frac{\sqrt{2}}{\sqrt{3}}\ket{0}_0+\frac{1}{\sqrt{3}}\ket{1}_0 \right)\otimes\ket{0}_1$$ を得ます。さらに、0番目のqubitが$\ket{0}$のとき1番目のqubitにアダマール・ゲート$H$を作用させる演算を行うと $$\frac{\sqrt{2}}{\sqrt{3}}\ket{0}_0\otimes\frac{1}{\sqrt{2}}\left( \ket{0}_1+\ket{1}_1 \right)+\frac{1}{\sqrt{3}}\ket{1}_0\otimes\ket{0}_1=\frac{1}{\sqrt{3}}\left( \ket{00}+\ket{01}+\ket{10} \right)$$ となり、目的の状態を得ます。

演算$R$について $$\left( \begin{array} {rr} \frac{\sqrt{2}}{\sqrt{3}} \\ \frac{1}{\sqrt{3}} \end{array} \right) = \left( \begin{array} {rr} \cos{\theta} & -\sin{\theta} \\ \sin{\theta} & \cos{\theta} \end{array} \right) \left( \begin{array} {rr} 1 \\ 0 \end{array} \right) = \left( \begin{array} {rr} \cos{\theta} \\ \sin{\theta} \end{array} \right) $$ より、$\theta=\arccos{\frac{\sqrt{2}}{\sqrt{3}}}$となり、これはブロッホ球上でのY軸回りの$2\arccos{\frac{\sqrt{2}}{\sqrt{3}}}$回転に対応します。

2. 測定を使った解法

始状態の2つのqubitにアダマール・ゲートを作用させると全状態の重ね合わせ $$\frac{1}{2}\left( \ket{00}+\ket{01}+\ket{10}+\ket{11} \right)$$ を得ます。ここに新たにqubitをひとつ加えて、0,1番目のqubitを制御bitに、2番目のqubitをターゲットbitにしたCCNOTゲートを作用させると $$\frac{1}{2}\left(\ket{00}+\ket{01}+\ket{10}\right)\otimes\ket{0}+\frac{1}{2}\ket{11}\otimes\ket{1}$$ となります。これはエンタングル状態であって、この状態から2番目のqubitに対してPauli Z演算子を対角とした測定を行うと、75%の確率で固有値1を得ることができて、その場合に残りのqubitは目的の状態になっています。

目的の状態でない状態が得られることもありますが、同じことを何度も繰り返せばいつかは目的の状態が得られます。

3. PrepareUniformSuperposition を使った解法

Q#にはPrepareUniformSuperpositionという演算があり、これは状態$\ket{0\dots 0}$を入力すると、重ね合わせ状態 $$\frac{1}{\sqrt{M}}\sum_{j=0}^{M-1}\ket{j}$$ を作る演算です。

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

☆ソースコード
1. 状態の回転による解法

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

    operation Solve (qs : Qubit[]) : Unit {
        Ry(2.0*ArcCos(Sqrt(2.0)/Sqrt(3.0)),qs[0]);
        (ControlledOnInt(0,H))([qs[0]],qs[1]);
    }
}
                
            

2. 測定を使った解法

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

    operation Solve (qs : Qubit[]) : Unit {
        using(x=Qubit()){
            repeat{
                ApplyToEach(H,qs);
                Controlled X(qs,x);
                let res=MResetZ(x);
            }
            until(res==Zero)
            fixup{
                ResetAll(qs);
            }
        }
    }
}
                
            

3. PrepareUniformSuperposition を使った解法

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

    operation Solve (qs : Qubit[]) : Unit {
        PrepareUniformSuperposition(3,BigEndian(qs));
    }
}
                
            

戻る