$$ \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 2020 - Warmup C - Prepare state |01⟩ + |10⟩ + |11⟩◇◇


☆問題URL

https://codeforces.com/contest/1356/problem/C

☆問題の概要

2桁の状態$\ket{00}$が与えられるので、状態 $$\frac1{\sqrt3}\left( \ket{01} + \ket{10} + \ket{11} \right)$$ を作れ。

☆解法

この問題はGenerate state |00⟩ + |01⟩ + |10⟩と本質的に同じ問題ですが、Pauliゲート($X, Y, Z$)、アダマール・ゲートとそれらのControlled派生しか用いてはいけないという制限がかかっています。

よって、当該問題の記事にある2つめの方法を用いることができます。すなわち

  1. 状態$\ket{00}$の各qubitにアダマール・ゲートを作用させ、全状態の重ね合わせ $$\frac12\left( \ket{00} + \ket{01} + \ket{10} + \ket{11} \right)$$を得る。
  2. qubitを1つ加えて、Controlled Xゲートを用いて与えられたqubitが$\ket{00}$の場合のみ加えたqubitを反転させることで、状態$$\frac12\left(\ket{01} + \ket{10} + \ket{11} \right)\otimes\ket{0} + \frac12\ket{00}\otimes\ket{1}$$ を得る。
  3. 加えたqubitに対してPauli Zを対角とする測定を行い、状態$\ket{0}$が得られれば、与えられたqubitが目的の状態になっている。目的の状態が得られなかった場合は、リセットしてやり直す。

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

☆ソースコード

                
namespace Solution {
    open Microsoft.Quantum.Measurement;
    open Microsoft.Quantum.Canon;
    open Microsoft.Quantum.Intrinsic;

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

戻る