$$ \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 C1 - Alternating bits oracle◇◇


☆問題URL

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

☆問題の概要

N桁の量子状態$\ket{x}$とqubit$\ket{y}$が与えられる。$\ket{y}$をオラクルqubitとして、$\ket{x}$が連続するqubit列$\ket{00}$もしくは$\ket{11}$をもたない場合に$f(x)=1$、そうでない場合に$f(x)=0$となるようなオラクルを作成せよ。

☆解法

$\ket{x}$が連続するqubit列$\ket{00}$もしくは$\ket{11}$をもたない場合に$f(x)=1$となるということは、$\ket{x}=\ket{010101\dots}$もしくは$\ket{x}=\ket{101010\dots}$であるような場合のみ$\ket{y}$を反転させると言い換えることができます。

$\ket{x}$の奇数番目のqubitのみにXゲートを作用させると、$\ket{010101\dots}$は$\ket{111111\dots}$に、$\ket{101010\dots}$は$\ket{000000\dots}$にそれぞれ変化します。この2つの状態に対して$f(x)=1$となるオラクルを作成することは容易であって、Controlled Xゲートを使うことで実装できます。

最後に再び奇数番目のqubitにXゲートを作用させることで$\ket{x}$を元の状態に戻すことができます。

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

☆ソースコード

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

    operation Solve (x : Qubit[], y : Qubit) : Unit {
        body (...) {
            for(i in 0..2..Length(x)-1){
                X(x[i]);
            }
            Controlled X(x,y);
            (ControlledOnInt(0,X))(x,y);
            for(i in 0..2..Length(x)-1){
                X(x[i]);
            }
        }
        adjoint auto;
    }
}
                
            

戻る