Qubit解説

Github
https://github.com/microsoft/QuantumKatas/blob/49f4e543167be2875ea4c293cd12771383828462/tutorials/Qubit/Qubit.ipynb


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

数学的前提知識の学習が終わっていよいよ量子っぽい話になりました。
Qubitはexerciseがないので解説だけになります。

古典コンピュータではBitが基本的な構成要素となっている。
量子コンピューターにおいてはqubitが基本的な構成要素となる
bitは0と1の二値を持つことができる。

qubitは観測した際にはZero(|0>)もしくはOne(|1>)のどちらかの値が測定できるが、
実際にはsuperposition(量子重ね合わせ)によりより多くの値を持つことができる。
|0>と|1>は単純なスカラではなくそれぞれ下記のベクトルで表現される
\[ |0> = \begin{bmatrix} 1 \\ 0 \end{bmatrix} \] \[ |1> = \begin{bmatrix} 0 \\ 1 \end{bmatrix} \]
この|0>と|1>の状態をcomputational basis, または the canonical basisと呼ぶ

ZeroとOneが読める確率を表現するために確率振幅αとβを用いる。αをZeroのための係数、βをOneのための係数とし、qubitの状態は下記の表現で表せる
\[ \alpha \cdot \begin{bmatrix} 1 \\ 0 \end{bmatrix} + \beta \cdot \begin{bmatrix} 0 \\ 1 \end{bmatrix} = \begin{bmatrix} \alpha \\ 0 \end{bmatrix} + \begin{bmatrix} 0 \\ \beta \end{bmatrix} = \begin{bmatrix} \alpha \\ \beta \end{bmatrix} \] 

このαとβの確率振幅は下記の条件を満たす。
\[|\alpha|^2 + |\beta|^2 = 1\] 

常に|0>が読めるような状態は\[\alpha=1, \beta = 0\] 
常に|1>が読めるような状態は\[\alpha=0, \beta = 1\] 
となる。

なんとなくイメージはわかるが、だからなんなのかよくわからん....
とりあえずそういうものなんだと丸暗記しておく。


Hadamard basis(アダマール基底)というのも先々使いそうなのでとりあえずそういうものだと覚えておく。
\[ \begin{bmatrix} \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} \end{bmatrix} \text{ and } \begin{bmatrix} \frac{1}{\sqrt{2}} \\ -\frac{1}{\sqrt{2}} \end{bmatrix} \]

Dirac Notation(ブラ・ケット記法)
これらのベクトルをより簡易に表現するための記法。
\[ |0\rangle = \begin{bmatrix} 1 \\ 0 \end{bmatrix}  \text{ and }  |1\rangle = \begin{bmatrix} 0 \\ 1 \end{bmatrix} \]

|+>, |->, |i>, |-i>は一般的に下記の意味で用いられる
\[ |+\rangle = \frac{1}{\sqrt{2}}\big(|0\rangle + |1\rangle\big) \] \[ |-\rangle = \frac{1}{\sqrt{2}}\big(|0\rangle - |1\rangle\big) \]
\[ |i\rangle = \frac{1}{\sqrt{2}}\big(|0\rangle + i|1\rangle\big) \] \[ |-i\rangle = \frac{1}{\sqrt{2}}\big(|0\rangle - i|1\rangle\big) \]

Q#でのQubitデータ型

Qubit型

  • Q#でqubitを表すためにQubit型が使われる。
  • 物理的な量子コンピュータではqubitの正確な状態を直接読んだり、直接状態を変更したりすることはできないが、量子ゲートを使用することによりこれらの値を変更したり測定することがことができる。
  • The qubitは通常のデータ型ではないため、使用前に宣言する必要がある
  • 宣言された直後のqubitは|0>であり、そのブロックが終了するまでは|0>であり続ける。

// This statement allocates a qubit, and binds it to the variable q
using (q = Qubit()) {
    // You can work with the qubit here
    // ...
}
// The qubit is no longer allocated outside of the 'using' block

Q#のQubitオペレーション

ここのDemoで使われるオペレーションはこちらで説明されているが、読むだけではよくわからないのでいろいろ動かしてみる。このあたりは古典コンピューターで言うANDとORとかBit Shiftとか基礎中の基礎なのかなと思う。

X ゲート

|0⟩ と |1⟩ の状態を入れ替える
|0>が読める状態なら|1>に、|1>が読める状態なら|0>変換する。
\[ {\sigma_x = \begin{pmatrix} 0 & 1 \\ 1 & 0 \end{pmatrix} } \]
        // This line changes the qubit from state |0⟩ to state |1⟩
        X(q);

Hゲート(アダマール ゲート)

与えられた量子ビットに対してアダマール変換をかけます。
アダマールゲートの使い方として、|0>か|1>が100%観測される状態から、0か1の確率が全く等しい量子ビットを生成する。またHゲートを一度適用した状態からもう一度適用すると元の状態に戻すことができる。
\[ {H = \frac{1}{\sqrt 2} \begin{pmatrix} 1&1 \\ 1&-1 \end{pmatrix} } \]
        // This line changes the qubit to state |-⟩ = (1/sqrt(2))(|0⟩ - |1⟩)
        // That is, this puts the qubit into a superposition
        // 1/sqrt(2) is approximately 0.707107
        H(q);

S (ゲート)

π/2ずつ回転させていく、回転というとよくわからないが、|+>に適用すると |->になる。
順に適用していくと
|+> ⇒ |-> ⇒ |i> ⇒ |-i> ⇒ |+>
という順に状態が変化する。(上記の表の時計回りに状態が遷移)
\[ {S = \begin{pmatrix} 1 & 0 \\ 0 & i \end{pmatrix} } \]
	// This line changes the qubit to state |-i⟩ = (1/sqrt(2))(|0⟩ - i|1⟩)
        S(q);

(執筆時点で)
MSのリファレンスではSゲートは
"Applies the π/4 phase gate to a single qubit."とあるが、 \( i = \ e^{i\pi/2}  \)なので、Sゲートは\( \pi/2 \)ずつ回転の間違い
Tゲートも"Applies the π/8 gate to a single qubit."とあるが \( \pi/8 \)ではなく \( \pi/4 \)の間違いですね。

\( 2 \pi =360\degree \)なので \( \pi/2 \)を4回適用して1周回る感じですね。

ウィキペディア参照

R (ローテーションゲート)

\[ R_x : x軸に与えられた角度を加える。 \] 
\[ R_y : y軸に与えられた角度を加える。 \]
よくわからないが、ブロッホ球の任意の場所にベクトルを向ける際に使うqubit操作なのかなと想像しておく
        // This will put the qubit into an uneven superposition,
        // where the amplitudes of |0⟩ and |1⟩ have different moduli
        Rx(2.0, q);
        Ry(1.0, q);

x,y,zの回転軸の説明はこちらにあります。


icon




これらの関数ももう少し使い込んでみれば、どういうときに有効なのがわかってくると期待している。