$$ \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 D2-Oracle for f(x) = b * x + (1 - b) * (1 - x) mod 2◇◇


☆問題URL

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

☆問題の概要

$N$桁の量子状態$\ket{x}$と1桁のqubit$\ket{y}$,$N$桁のbit列$b$が与えられる。$\ket{x}$および$b$の$k$桁めを$x_k, b_k$とするとき、$\ket{y}$をオラクルqubitとして$f(x)=\left(\vec{b}\cdot\vec{x}+\left( \vec{1}-\vec{b}\right)\cdot\left( \vec{1}-\vec{x} \right) \right)\; {\rm mod}\;2=\sum^{N-1}_{k=0}\left(b_kx_k+\left( 1-b_k \right)\cdot\left( 1-x_k \right)\right)\; {\rm mod}\;2$で定義されるオラクルを作成せよ。

☆解法

前問と似ています。とはいっても、前問の操作に加えて$b_k$が0であっても$(1-x_k)$を$\ket{y}$に対してxor演算してあげるだけで良いです。

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

なお、与えられた状態$\ket{x}$を破壊するとWAが出るので、NOTゲートを作用させたあとはもとに戻しておく必要があります。

☆ソースコード

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

    operation Solve (x : Qubit[], y : Qubit, b : Int[]) : ()
    {
        body
        {
            for(i in 0..Length(x)-1){
                if(b[i]==0){
                    X(x[i]);
                }
                CNOT(x[i],y);
                if(b[i]==0){
                    X(x[i]);
                }
            }
        }
    }
}
                
            

戻る