$$ \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 U1 - Anti-diagonal unitary◇◇


☆問題URL

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

☆問題の概要

$N$桁の量子状態に対して、反対角行列で表されるユニタリ演算を定義せよ。

例として、$N=2$のとき $$\left( \begin{array}{rr} . & . & . & X \\ . & . & X & . \\ . & X & . & . \\ X & . & . & . \end{array} \right)$$ の形で表される演算であり、'.'は絶対値の二乗が$10^{-5}$以下の複素数、'$X$'は絶対値の二乗が$10^{-5}$よりも大きい複素数を表す。また、基底状態の順番にはリトル・エンディアンを採用する。

☆解法

「ユニタリ演算を定義せよ」とあるので、$X$は絶対値が1であるような複素数でなければならず、簡単のため、すべて1であるとしてよいです。'.'についても0としてよく、以上のことから$N=2$の場合について $$U=\left( \begin{array}{rr} 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \end{array} \right)$$ としてよいです。状態$\ket{00}=\ket{0},\ket{10}=\ket{1},\ket{01}=\ket{2},\ket{11}=\ket{3}$(リトル・エンディアンなのでこの順になります)を基底に取ると、$\ket{00}$から$\ket{11}$への変化は $$\left( \begin{array}{rr} 0 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \\ 0 & 1 & 0 & 0 \\ 1 & 0 & 0 & 0 \end{array} \right) \left( \begin{array}{rr} 1 \\ 0 \\ 0 \\ 0 \end{array} \right) = \left( \begin{array}{rr} 0 \\ 0 \\ 0 \\ 1 \end{array} \right) $$ と表せます。

$N$桁の量子状態$\ket{x}$にこの演算を作用させると、状態は$\ket{2^N-x-1}$へと変化しますが、二進数で$2^N-x-1$は$x$の全bitを反転させたものになっている($\left(2^N-1\right)$から$x$を引く際に繰り下がりが発生しないため)ことから、この演算は$\ket{x}$の全qubitを反転させる演算であることがわかります。

よって、入力の全qubitに対してXゲートを作用させることでこの演算を実装できます。

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

☆ソースコード

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

    operation Solve (qs : Qubit[]) : Unit {
        ApplyToEach(X,qs);
    }
}
                
            

戻る