$$ \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 2018 A4-Generate W state◇◇


☆問題URL

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

☆問題の概要

$2^k$桁の量子状態$\ket{0...0}$が与えられる。W状態 $$\ket{W_N}=\frac{1}{\sqrt{N}}\left(\ket{100...0}+\ket{010...0}+...+\ket{00...01} \right)$$ を作れ。

☆解法

$2^n$桁のW状態から$2^{n+1}$桁のW状態を作る手順があれば、$2^0$桁のW状態$\ket{100...0}$を始状態として再帰的に$2^k$桁のW状態を構成することができるので、以下ではそのような手順を考えます。

問題によって$2^k$桁のqubitが与えられているので、以下、「$2^n$桁のW状態」とは、$2^k$桁のqubitのうち、最初の$2^n$桁がW状態を構成しているような状態を指します。例えば、$k=3,\;n=2$であれば $$\ket{W_{2^2}}=\frac{1}{\sqrt{2^2}}\left( \ket{1000}+\ket{0100}+\ket{0010}+\ket{0001} \right)\otimes\ket{0000}$$ です。

$2^n$桁のW状態が与えられたとき、$2^{n+1}$桁のW状態を構成することは、Fredkinゲート(Controlled Swapゲート)を使えば実現できます。Frendkinゲートは1つの制御bitと2つのターゲットbitをもつゲートで、制御bitが1であるとき2つのターゲットbitを入れ替えます。

以下、例として$k=3$において$2^1$桁のW状態から$2^{2}$桁のW状態を構成することを考えます。$2^1$桁のW状態 $$\ket{W_{2^1}}=\frac{1}{\sqrt{2^1}}\left( \ket{10}+\ket{01} \right)\otimes\ket{000000}$$ に対して、新しいqubit$\ket{+}$を用意し、末尾にくっつけます。 \begin{align*} \ket{W_{2^1}}\otimes\ket{+}&=\frac{1}{\sqrt{2^1}}\left( \ket{10}+\ket{01} \right)\otimes\ket{000000}\otimes\ket{+}\\ &=\frac{1}{\sqrt{2^2}}\left( \ket{10000000}\otimes\ket{0}+\ket{01000000}\otimes\ket{0}+\ket{10000000}\otimes\ket{1}+\ket{01000000}\otimes\ket{1} \right) \end{align*} 次に、くっつけた桁($2^k$桁め)を制御bitとして、$0$桁めから$2^n-1$桁めまでのqubitを$2^n$桁めから$2^{n+1}-1$桁めまでとそれぞれペアにしてFredkinゲートを作用させます。すると、$2^k$めが$\ket{1}$である状態のみ、W状態が$2^n$桁だけ後ろにずれたような状態になります。 $$F^{\otimes 2^n}\ket{W_{2^1}}\otimes\ket{+}=\frac{1}{\sqrt{2^2}}\left( \ket{10000000}\otimes\ket{0}+\ket{01000000}\otimes\ket{0}+\ket{00100000}\otimes\ket{1}+\ket{00010000}\otimes\ket{1} \right)$$ ここで、自分でくっつけた桁以外の部分はすでに$2^{n+1}$桁のW状態になっていますが、末尾がその他のqubitとエンタングルしているため、そのまま取り出して捨ててしまうことはできません。エンタングル状態を解除するために、C-NOTゲートを利用します。末尾が$\ket{1}$である状態は$2^n$桁め以降に$\ket{1}$を1つだけもつので、$2^n$桁め以降を制御bitとしてC-NOTゲートを作用させてあげればよいです。 \begin{align*} G^{\otimes 2^n}F^{\otimes 2^n}\ket{W_{2^1}}\otimes\ket{+} &=\frac{1}{\sqrt{2^2}}\left( \ket{10000000}\otimes\ket{0}+\ket{01000000}\otimes\ket{0}+\ket{00100000}\otimes\ket{0}+\ket{00010000}\otimes\ket{0} \right)\\ &=\frac{1}{\sqrt{2^2}}\left( \ket{1000}+\ket{0100}+\ket{0010}+\ket{0001}\right)\otimes\ket{0000}\otimes\ket{0}\\ &=\ket{W_{2^2}}\otimes\ket{0} \end{align*}

以上の手順で、$2^n$桁のW状態から$2^{n+1}$桁のW状態を作ることができて、$2^0$桁のW状態は簡単に作ることができる$(\ket{W_{2^0}}=\ket{100...0})$ので、これを繰り返せば求める状態を作り出すことができます。

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

☆ソースコード

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

    operation Solve (qs : Qubit[]) : ()
    {
        body
        {
            let N=Length(qs);
            //qsが2^0桁のとき、|10...0>をつくる
            if(N==1){
                X(qs[0]);
            }
            else{
                let K=N/2;
                //N/2桁のW状態を得る
                Solve(qs[0..K-1]);
                using(q=Qubit[1]){
                    H(q[0]);
                    //Fredkinゲートを作用させる
                    for(i in 0..K-1){
                        (Controlled SWAP)([q[0]],(qs[i],qs[i+K]));
                    }
                    //C-NOTゲートでエンタングルを解く
                    for(i in K..N-1){
                        CNOT(qs[i],q[0]);
                    }
                    ResetAll(q);
                }
            }
        }
    }
}
                
            

戻る