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


☆問題URL

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

☆問題の概要

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

☆解法

$N$桁のqubit$\ket{x}$とbit列$b$が与えられるので、それらの内積のようなものを使ってオラクルを作れという問題です。$b_k$が0であれば$b_kx_k$は必ず0になるので、実装としては前から順に$b$を見て、$b_k$が1であれば$\ket{y}$に対してC-NOTゲートを使って$x_k$をxor演算してあげればよいです。

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

☆ソースコード

                
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]==1){
                    CNOT(x[i],y);
                }
            }
        }
    }
}
                
            

戻る