チュートリアル Multi-Qubit Gates解説および解答例
Githubhttps://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); }