$$ \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 - Warmup G1 - AND oracle◇◇


☆問題URL

https://codeforces.com/contest/1115/problem/G1

☆問題の概要

$N$桁の量子状態$\ket{x}$とqubit$y$が与えられる。$\ket{y}$をオラクルqubitとして $$f\left( \vec{x} \right)=x_0 \land x_1 \land \cdots \land x_{N-1}$$ で定義されるオラクルを作成せよ。

☆解法

この問題で作成するオラクルは、C-NOTゲートやCC-NOTゲートを制御bitの個数について一般化したものです。

Q#においては、Controlled functorをサポートしている演算に対してControlledを指定すると、制御qubit列$\ket{x}$の各桁のandが1の場合のみ作用する演算として扱うことができます。演算XはControlled functorをサポートしているので、Controlled Xを使えば求められている操作を実現できます。

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

☆ソースコード

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

    operation Solve (x : Qubit[], y : Qubit) : Unit {
        body (...) {
            Controlled X(x,y);
        }
        adjoint auto;
    }
}
                
            

戻る