$$ \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 A2-Generate superposition of zero state and a basis state◇◇


☆問題URL

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

☆問題の概要

$N$桁の量子状態$\ket{0...0}$と、$N$桁の量子状態$\ket{\psi}$を表すbit列$bits$が与えられる。$\ket{0...0}$と$\ket{\psi}$の重ね合わせ状態 $$\ket{S}=\frac{1}{\sqrt{2}}\left( \ket{0...0}+\ket{\psi} \right)$$ を作れ。ただし、$bits[0]=true$である。

☆解法

$\ket{\psi}$の0bitめが$\ket{1}$であることは保証されているので、 $$\ket{S}=\frac{1}{\sqrt{2}}\left( \ket{00...0}+\ket{1?...?} \right)$$ と表せます。始状態$\ket{0...0}$の0bitめにアダマール・ゲートを作用させると、重ね合わせ状態 $$H_0\ket{00...0}=\frac{1}{\sqrt{2}}\left( \ket{00...0}+\ket{10...0} \right)$$ を作ることができるので、あとは1bitめから順番に、$\ket{1}$にしたいqubitをC-NOTゲートを使って反転させればよいです。

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

また、$bits[0]=true$が保証されていない場合でも、$bits$を前から順にみて最初にtrueが現れる場所でアダマール・ゲートを作用させればこの問題を解くことができます。

☆ソースコード

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

    operation Solve (qs : Qubit[], bits : Bool[]) : ()
    {
        body
        {
            H(qs[0]);
            for(i in 1..Length(qs)-1){
                if(bits[i]){
                    CNOT(qs[0],qs[i]);
                }
            }
        }
    }
}
                
            

戻る