$$ \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 A3-Generate superposition of two basis states◇◇


☆問題URL

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

☆問題の概要

$N$桁の量子状態$\ket{0...0}$と、$N$桁の量子状態$\ket{\psi_0},\ket{\psi_1}$を表すbit列$bits0,bits1$が与えられる。$\ket{\psi_0}$と$\ket{\psi_1}$の重ね合わせ状態 $$\ket{S}=\frac{1}{\sqrt{2}}\left( \ket{\psi_0}+\ket{\psi_1} \right)$$ を作れ。

☆解法

2つの手順で解けます。

  1. $bits0$と$bits1$のxorをとったbit列で表される状態$\ket{\psi_{diff}}$と、初期状態$\ket{0...0}$の重ね合わせ状態 $$\ket{S_0}=\frac{1}{\sqrt{2}}\left( \ket{0...0}+\ket{\psi_{diff}} \right)$$ を作ります。作り方は前問の記事を参照してください。この時点での$\ket{\psi_{diff}}$は、$bits0$と$bits1$が異なっているbitのみ$\ket{1}$になっている状態です。
  2. $bits0$を前から見て、$true$に対応するqubitにNOTゲートを作用させて反転させます。この操作によって$\ket{0...0}$は$\ket{\psi_0}$に変化し、同時に$\ket{\psi_{diff}}$は$\ket{\psi_1}$へと変化します。 $$\ket{S}=\frac{1}{\sqrt{2}}\left( \ket{\psi_0}+\ket{\psi_1} \right)$$

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

☆ソースコード

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

    operation Solve (qs : Qubit[], bits0 : Bool[], bits1 : Bool[]) : ()
    {
        body
        {
            //手順1
            mutable idx=-1;
            for(i in 0..Length(qs)-1){
                if(bits0[i]!=bits1[i]){
                    if(idx==-1){
                        H(qs[i]);
                        set idx=i;
                    }
                    else{
                        CNOT(qs[idx],qs[i]);
                    }
                }
            }
            //手順2
            for(i in 0..Length(qs)-1){
                if(bits0[i]){
                    X(qs[i]);
                }
            }
        }
    }
}
                
            

戻る