チュートリアル Multi-Qubit Gates解説および解答例

Github
https://github.com/microsoft/QuantumKatas/tree/master/tutorials/MultiQubitGates

(いきなりこのページに飛んできた人で最初から勉強されたい方はこちらをご参照ください)

いよいよ基礎的な学習は最終回です。今回はMulti-Qubit Gatesということで、複数のQubitに対するオペレーションを学習していきます。

Exercise 1: Compound Gate

3Qubitに対するオペレーションを作成します。 8x8の行列で3つのQubitに対する操作を表していますが、これを3つのSingle Qubitに対する操作に分割します。

まず
- 右上のquadrant(4x4)と左下のquadrant(4x4)がゼロになっていること
- 左上のquadrant(4x4)と右下のquadrant(4x4)がiをかけた関係になっていること
に着目し
\[ Q = \begin{bmatrix} 1 & 0 \\ 0 & i \end{bmatrix} \otimes \begin{bmatrix} 0 & -i & 0 & 0 \\ i & 0 & 0 & 0 \\ 0 & 0 & 0 & -i \\ 0 & 0 & i & 0 \end{bmatrix} \]
を導き出します。さらに
- 右上のquadrant(2x2)と左下のquadrant(4x4)がゼロになっていること
- 左上のquadrant(2x2)と右下のquadrant(4x4)が同じになっていること
から
\[ Q = \begin{bmatrix} 1 & 0 \\ 0 & i \end{bmatrix} \otimes \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} \otimes \begin{bmatrix} 0 & -i \\ i & 0 \end{bmatrix} = S \otimes I \otimes Y \]
3つのSingle Bitのオペレーションに分解することができました。

%kata T1_CompoundGate_Test

operation CompoundGate (qs : Qubit[]) : Unit is Adj {
    S(qs[0]);
    I(qs[1]);
    Y(qs[2]);
}
(参考)テンソル積の簡単なイメージ \[ \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} \otimes \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} = \begin{bmatrix} 1 \cdot \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} & 2 \cdot \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} \\ 3 \cdot \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} & 4 \cdot \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} \end{bmatrix} \] 

Exercise 2: Preparing a Bell state

CNOTゲートの使い方に関する学習です。CNOTゲートは2Qubitゲートで、最初のビットの状態が\(|1\rangle\)であれば、2Qubit目を反転させます。

解説にあるようにCNOTゲートは量子もつれ状態を作るのに有効です。
\[ \big(\alpha|0\rangle + \beta|1\rangle\big) \otimes |0\rangle = \alpha|00\rangle + \beta|10\rangle \] この状態にCNOTをかけると
\[ \alpha|00\rangle + \beta|11\rangle \] ができます。

ここではBell Stateを作り出すことが目的ですが、Bell Steteは不可分な量子もつれ状態ですので、1Qubitずつの操作に分解することはできません。
\[ \Phi^+ = \frac{1}{\sqrt{2}}\big(|00\rangle + |11\rangle\big) = \frac{1}{\sqrt{2}}\begin{bmatrix} 1 \\ 0 \\ 0 \\ 1
\end{bmatrix} \]

この問題では
\[ \frac{1}{\sqrt{2}}\big(|00\rangle + |10\rangle\big) = \frac{1}{\sqrt{2}}\big(|0\rangle + |1\rangle\big) \otimes |0\rangle \] という状態を作り出しCNOTゲートを適用させます。
\( \frac{1}{\sqrt{2}}\big(|0\rangle + |1\rangle\big) \)はHゲートで作り出すことができますので、HゲートとCNOTゲートで対応できます。
%kata T2_BellState_Test

operation BellState (qs : Qubit[]) : Unit is Adj {
    H(qs[0]);
    CNOT(qs[0],qs[1]);
}

Exercise 3: Swapping two qubits

SWAPゲートも2Qubitに対する同時操作です。仕様もシンプルでチュートリアルの解答はすぐにわかりますが、使用用途がまだよくわかりません。
%kata T3_QubitSwap_Test

operation QubitSwap (qs : Qubit[], index1 : Int, index2 : Int) : Unit is Adj {
    SWAP(qs[index1], qs[index2]);
}

Exercise 4: Controlled Rotation

Controlledは指定した制御ビットの状態を見て、ターゲットビットに操作を加えるオペレーションです。オペレーションはSingle Bitのオペレーションも使用できますしSWAPのような2ビットオペレーションも使用できます。
// Apply X gate to target bit
Controlled
X([control], target);
// Apply SWAP to targets
Controlled
SWAP([control], (q1, q2));
第一引数の制御ビットを[]でくくらないといけないというのにはまりました。制御ビットは配列で複数指定できるのでそのようになっているようです。

%kata T4_ControlledRotation_Test

operation ControlledRotation (qs : Qubit[], theta : Double) : Unit is Adj {
    Controlled Rx([qs[0]], (theta, qs[1]));
}

Exercise 5: Arbitrary controls

ControlledOnBitStringは複数の制御ビットに対して任意(True or False)の判定を行い、条件が一致する場合指定されたオペレーションを実行します。
Q#の文法の説明が少なくてよくわからないですね。
%kata T5_MultiControls_Test

operation MultiControls (controls : Qubit[], target : Qubit, controlBits : Bool[]) : Unit is Adj {
     (ControlledOnBitString(controlBits, X))(controls, target);
}