$$ \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 U3 - Block unitary◇◇


☆問題URL

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

☆問題の概要

$N$桁の量子状態に対して、以下のようなパターンで表されるユニタリ演算を定義せよ。

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

☆解法

構成したい演算は、$N=3$の場合には $$\left( \begin{array}{rr} . & . & . & X & . & . & . & . \\ . & . & X & . & . & . & . & . \\ . & X & . & . & . & . & . & . \\ X & . & . & . & . & . & . & . \\ . & . & . & . & X & X & X & X \\ . & . & . & . & X & X & X & X \\ . & . & . & . & X & X & X & X \\ . & . & . & . & X & X & X & X \end{array} \right)$$ のように表せます。

一般の$N$について、左上の反対角行列を$A$、右下の$X$で埋まっている行列を$B$とすると、構成したい演算は $$\left( \begin{array}{rr} A & O \\ O & B \end{array} \right)$$ の形で表すことができて、これは、$N-1$番目のqubitが$\ket{0}$の場合には$0$から$N-2$番目のqubitに演算$A$を、$N-1$番目のqubitが$\ket{1}$の場合には$0$から$N-2$番目のqubitに演算$B$を作用させる演算であることを意味しています。この操作はControlled functorを利用して実現できます。

演算$A$は問題U1と同一であり、同じ操作で実現できます。

演算$B$に関しては、すべてのqubitにアダマール・ゲート$H$を作用させる演算がこの形を満たします(問題U2と似ています)。

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

☆ソースコード

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

    operation Solve (qs : Qubit[]) : Unit {
        for(i in 0..Length(qs)-2){
            Controlled H([qs[Length(qs)-1]],qs[i]);
            (ControlledOnInt(0,X))([qs[Length(qs)-1]],qs[i]);
        }
    }
}
                
            

戻る