Quantum Development Kit : コンセプト : 量子ビット (翻訳)

#Quantum Development Kit : コンセプト : 量子ビット (翻訳)

>[Microsoft Quantum Development Kit (QDK)](https://www.microsoft.com/en-us/quantum/development-kit) のドキュメント [Quantum computing concepts : The Qubit](https://docs.microsoft.com/en-us/quantum/quantum-concepts-4-qubit) の翻訳です。

>量子コンピューティングの情報単位である量子ビットとその演算についての基礎概念の説明です。
ここでは最も単純なシングル量子ビットを扱い、ブロッホ球についての説明もあります。
Q# が補完する演算についても言及されています。


**本文**

丁度、古典的なコンピューティングでビットが情報の基礎的なオブジェクトであるように、<font color="red"><b>量子ビット</b> (= quantum bits) は量子コンピューティングの基礎的なオブジェクトです</font>。この対応を理解するために、最も単純な例 : <b>シングル量子ビット</b> (= single qubit) を見てみましょう。

<blockquote>
訳注 : 量子ビットの他にも、キュービット、キュビット、クビット (= qubit)、Qビット (= Qbit) 等とも呼称されます (by Wikipedia) が、ここでは量子ビットで統一します。
</blockquote>


##量子ビットを表わす

ビット、あるいは二値数字、が $0$ か $1$ の値を持つことができる一方で、量子ビットはこれらの値のどちらかまたは $0$ と $1$ の <b>量子的重ね合わせ</b> を取ることができます。シングル量子ビットの状態は単位ノルムの 2 次元列ベクトルで記述されます i.e. その要素の二乗された大きさは合計して $1$ にならなければなりません。<b>量子状態ベクトル</b> と呼ばれるこのベクトルは、ちょうど単一のビットが二値変数の状態を表わすために必要な情報の総てを保持するように、one-量子ビット・量子システムを表わすために必要な総ての情報を保持します。

ノルム $1$ を持つ実数または複素数の任意の 2 次元列ベクトルは、量子ビットにより保持される可能な量子状態を表します。もし $\alpha$ と $\beta$ が $|\alpha|^2 + |\beta|^2 = 1$ を満たす複素数を表わすとすると、 $\begin{bmatrix} \alpha \\  \beta \end{bmatrix}^T$ は量子ビット状態を表します。量子ビットを表わす妥当な量子状態ベクトルの幾つかのサンプルは次のようなものを含みます :

```math
\begin{bmatrix} 1 \\  0 \end{bmatrix}, \begin{bmatrix} 0 \\  1 \end{bmatrix}, \begin{bmatrix} \frac{1}{\sqrt{2}} \\  \frac{1}{\sqrt{2}} \end{bmatrix}, \begin{bmatrix} \frac{1}{\sqrt{2}} \\  \frac{-1}{\sqrt{2}} \end{bmatrix}, \text{ そして }\begin{bmatrix} \frac{1}{\sqrt{2}} \\  \frac{i}{\sqrt{2}} \end{bmatrix}。
```

量子状態ベクトル $\begin{bmatrix} 1 \\  0 \end{bmatrix}^T$ と $\begin{bmatrix} 0 \\  1 \end{bmatrix}^T$ は特別な役割を果たします。<font color="red">これら２つのベクトルは量子ビットの状態を表わすベクトル空間のための基底を形成します</font>。これは任意の量子状態ベクトルはこれらの基底ベクトルの総計として書けることを意味します。特に、ベクトル $\begin{bmatrix} x \\  y \end{bmatrix}^T$ は :

```math
x \begin{bmatrix} 1 \\ 0 \end{bmatrix} + y \begin{bmatrix} 0 \\  1 \end{bmatrix}
```

として書くことができます。これらのベクトルの任意の回転は量子ビットのための完全に妥当な基底として機能するでしょうが、この一つを <b>計算基底</b> と呼ぶことで特別なものとして扱うことを選択します。

古典的なビットの２つの状態、i.e. $0$ と $1$ に対応させるためにこれら２つの量子状態を取ることにします。標準的な規則では次を選択します :

```math
0\equiv \begin{bmatrix} 1 \\  0 \end{bmatrix}\qquad 1 \equiv \begin{bmatrix} 0 \\  1 \end{bmatrix}
```

反対の選択でも同値に上手く取ることができるでしょうけれども。このように、シングル量子ビットの可能な量子状態ベクトルの無限の数から、２つだけが古典的なビットの状態に対応します; 他の総ての量子状態はそうではありません。


##量子ビットを測定する

量子ビットをどのように表わすかを知りましたので、<b>測定</b> (= measurement) の概念を議論することによってこれらの状態が何を表わすのか、何某かの直感を得ることができるでしょう。測定は量子ビットを "見る (観測する)" ことの形式ばらないアイデアに対応していて、これは量子状態を２つの古典的な状態 $\begin{bmatrix} 1 \\  0 \end{bmatrix}^T$ または $\begin{bmatrix} 0 \\  1 \end{bmatrix}^T$ の一つに直ちに崩壊 (= collapse) させます。量子状態ベクトル $\begin{bmatrix} \alpha \\  \beta \end{bmatrix}^T$ で与えられる量子ビットが <font color="red">測定されるとき、確率 $|\alpha|^2$ で結果 $0$ を、確率 $|\beta|^2$ で結果 $1$ を得ます</font>。結果 $0$ では、量子ビットの新しい状態は $\begin{bmatrix} 1 \\  0 \end{bmatrix}^T$ です; 結果 $1$ ではその状態は $\begin{bmatrix} 0 \\  1 \end{bmatrix}^T$ です。<font color="red">正規化条件 $|\alpha|^2 + |\beta|^2 = 1$ によりこれらの確率は合計すると $1$ になることに注意してください</font>。

測定の特性はまた量子状態ベクトルの符号系は無関係であることも意味しています。ベクトルの反転は $\alpha \rightarrow -\alpha$ と $\beta \rightarrow -\beta$ と同値です。$0$ と $1$ を測定する確率は項の二乗の大きさに依存しますから、そのような符号の挿入はどのようなものであれ確率を変えません。そのような位相は一般的には "グローバル位相  (= global phases) or 絶対位相" と呼ばれ、より一般的には単なる $\pm 1$ よりも寧ろ $e^{i \phi}$ の形式を取ります。

測定の最後の重要な特性はそれは総ての量子状態ベクトルを必ずしも損なうわけではないことです。もし、古典的な状態 $0$ に相当する、状態 $\begin{bmatrix} 1 \\  0 \end{bmatrix}^T$ の量子ビットから始めるとき、この状態を測定することは常に結果 $0$ を生成して量子状態を変えません。この意味で、古典的なビット (i.e. 量子ビットは $\begin{bmatrix}1 \\  0 \end{bmatrix}^T$ または $\begin{bmatrix}0 \\  1 \end{bmatrix}^T$ のいずれか) のみを持つ場合には、測定はシステムを損ないません。このことは、古典的なデータを <b>複製して</b> 量子コンピュータ上でそれを (古典的なコンピュータ上で行なうように) 操作できることを意味しています。けれども、両者の状態について同時に情報をストアする機能は古典的に可能なものを超えて量子コンピューティングを高みに上げて (= elevate)、そして更に量子データを無差別にコピーする能力を奪い去ります。後者については <a href="https://ja.wikipedia.org/wiki/%E9%87%8F%E5%AD%90%E8%A4%87%E8%A3%BD%E4%B8%8D%E5%8F%AF%E8%83%BD%E5%AE%9A%E7%90%86" target="_blank">量子複製不可能定理</a> (<a href="https://en.wikipedia.org/wiki/No-cloning_theorem" target="_blank">no-cloning theorem</a>) もまた参照すべきです。


##ブロッホ球を使用して量子ビットと変換を可視化する

量子ビットはまたブロッホ球 (= Bloch sphere) 表現を使用して 3D で描写できます。ブロッホ球はシングル量子ビット量子状態 (これは 2 次元複素ベクトルです) を 3  次元実数値のベクトルとして記述する方法を与えます。これは重要です、何故ならばそれはシングル量子ビット状態を可視化してそしてそれによってマルチ量子ビット状態 (そこでは悲しいことにブロッホ球表現は失敗します) を理解する際に貴重となる推論を行なうことを可能にします。ブロッホ球は次のように可視化できます :

<img src="https://qiita-image-store.s3.amazonaws.com/0/203151/857beee5-edf8-7868-6cb7-c74cb69749d5.png" width="720"/>

このダイアグラムの矢印は量子状態ベクトルが指し示す方向を示し、矢印の各変換は基軸の一つについての回転として考えることができます。量子計算を回転のシークエンスとして考えることはパワフルな直感である一方で、この直感をアルゴリズムを設計して記述するために使用することは挑戦的です。<font color="mediumblue">Q# はそのような回転を記述するための言語を提供することによりこの問題を緩和します</font>。


##シングル量子ビットの演算

量子コンピュータは、量子状態ベクトルの任意の回転をエミュレートできる量子ゲートのユニバーサル・セットを適用することによってデータを処理します。普遍性の概念は伝統的な (i.e. 古典的な) コンピューティングのための普遍性の概念と同様です。そこではもし入力ビットの総ての変換が有限長回路 (= finite length circuit) を使用して遂行されるのであればゲートセットは普遍的と考えられます。(訳注 : 要するに、任意の演算を遂行するために必要なゲートセットを普遍的であると定義しています。)

量子コンピューティングでは、量子ビット上で遂行することが許されている妥当な変換はユニタリ変換と測定です。随伴演算 (= adjoint operation) あるいは複素共役転置 (complex conjugate transpose) は量子コンピューティングに対して決定的に重要です、何故ならばそれは量子変換を逆にするために必要だからです。<font color="mediumblue">Q# はゲート・シークエンスをそれらの随伴 (= adjoint) に自動的にコンパイルするメソッドを提供することによってこれを反映しています。これは多くの場合にプログラマーを随伴を手書きしなければならないことから救います</font>。

古典的なコンピュータ上では一つのビットを一つのビットにマップする４つの関数だけがあります。(訳注: ビット演算子 - NOT, AND, OR, XOR。)  対照的に、量子コンピュータ上のシングル量子ビット上には無数のユニタリ変換があります。それ故に、ゲートと呼ばれるプリミティブな量子演算の有限ではないセットは量子コンピューティングで許されるユニタリ変換の無限のセットを正確に複製できます。これは、古典的なコンピューティングとは違い、量子コンピュータはゲートの有限個を使用して総ての可能な量子プログラムを正確に実装することは不可能であることを意味します。このように量子コンピュータは古典的なコンピュータと同じ意味では普遍的ではありえません。結果として、ゲートのセットが量子コンピュータにとって普遍的であると言う時には、実際には古典的なコンピューティングで意味するものよりも少し弱い何かを意味します。普遍性について、量子コンピュータは有限長のゲート・シークエンスを使用して有限個のエラー内で総てのユニタリ行列を近似することだけを私達は要求します。換言すれば、<font color="red">もし任意のユニタリ変換がこのセットからのゲートの積として近似的に書けるのであればゲートのセットは普遍的なゲートセット</font>です。(私達が要求するのは) 任意の規定されたエラーバウンドに対して、ゲートセットから次のようなゲート $G_{1}, G_{2},\ldots, G_N$ が存在することです :

```math
G_N G_{N-1} \cdots G_2 G_1 \approx U.
```

行列乗算のための約束は右から左へと乗算しますので、このシークエンスの最初のゲート演算、$G_N$ は実際には量子状態ベクトルに適用される最後の一つであることに注意してください。<font color="red">より形式的には、総ての (任意の) エラー耐性  $\epsilon>0$ に対して $G_N\ldots G_1$ と $U$ 間の距離がたかだか $\epsilon$ であるような $G_1,\ldots, G_N$ が存在する場合、そのようなゲートセットを普遍的と言います</font>。(訳注: $\epsilon$-$\delta$ 的に表現されています。) 理想的には、この $\epsilon$ の距離に達するために必要な $N$ の値は $1/\epsilon$ で多重対数関数的に (= poly-logarithmically) スケールされるべきです。

そのようなユニバーサル・ゲートセットを実際には何に見えるのでしょう。シングル量子ビットゲートのためのそのようなユニバーサル・ゲートセットは２つのゲートだけから成ります: Hadamard (アダマール) ゲート $H$ といわゆる $T$-ゲート $(\pi/8$ ゲートとしても知られます) です :

```math
H=\frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\  1 &-1  \end{bmatrix},\qquad T=\begin{bmatrix} 1 & 0 \\  0 & e^{i\pi/4} \end{bmatrix}.
```

けれども、量子誤り訂正に関連する実際的な理由のためにより大きなゲートセットを考える方がより便利です、つまり $H$ と $T$ を使用して生成できる一つです。私達は量子ゲートを２つのカテゴリーに分類できます : Clifford ゲートと $T$-ゲートです。この細分は有用です、何故ならば多くの量子誤り訂正スキームにおいていわゆる Clifford ゲートは実装が簡単です、つまりフォールトトレランスを実装するために演算と量子ビットの視点からそれらは非常に少ないリソースを必要とします。その一方でフォールトトレランスを必要とするとき non-Clifford ゲートは非常にコスト高です。<font color="mediumblue"><a href="https://docs.microsoft.com/en-us/quantum/libraries/prelude" target="_blank">Q# にデフォルトで含まれる</a>、シングル量子ビット Clifford ゲートの標準セットは以下を含みます</font> :

```math
H=\frac{1}{\sqrt{2}}\begin{bmatrix} 1 & 1 \\  1 &-1  \end{bmatrix} ,\qquad S =\begin{bmatrix} 1 & 0 \\  0 & i \end{bmatrix}= T^2,\qquad X=\begin{bmatrix} 0 &1 \\  1& 0 \end{bmatrix}= HT^4H,
```
```math
Y = \begin{bmatrix} 0 & -i \\  i & 0 \end{bmatrix}=T^2HT^4  HT^6, \qquad Z=\begin{bmatrix}1&0\\ 0&-1 \end{bmatrix}=T^4.
```

ここで演算 $X$, $Y$ と $Z$ は特に頻繁に使用されてそして作成者 Wolfgang Pauli にちなんで <b>Pauli 演算子</b> と命名されています。non-Clifford ゲート ($T$-ゲート) と一緒に、これらの演算はシングル量子ビット上の任意のユニタリ変換を近似するために構成可能です。

これらのプリミティブからユニタリ変換がどのように構築されるかの例として、上のブロッホ球で図示された３つの変換はゲートシークエンス $\begin{bmatrix} 1 \\  0 \end{bmatrix}^T \mapsto HZH \begin{bmatrix} 1 \\  0 \end{bmatrix}^T = \begin{bmatrix} 0 \\  1 \end{bmatrix}^T$ に対応します。

先のものがスタックの論理レベルで演算を記述するために最も一般的なプリミティブ・ゲートを構成する一方で (論理レベルは量子アルゴリズムのレベルとして考えてください)、アルゴリズムのレベルでより少ない基本的な演算を考えることはしばしば便利です、例えば関数記述レベルに近い演算です。<font color="mediumblue">幸いなことに、Q# はより高いレベルのユニタリを実装するために利用可能なメソッドもまた持ちます、これは総てを Clifford と $T$-ゲートに明示的に分解することなしに高位アルゴリズムが実装されることを可能にします</font>。

最も単純なそのようなプリミティブはシングル量子ビット回転です。典型的には３つのシングル量子ビット回転が考えられます : $R_x$, $R_y$ と $R_z$ です。回転 $R_x(\theta)$ のアクションを可視化するためには、例えば、右手の親指をブロッホ球の $x$-軸の方向に沿って指すことを想像してください、そして $\theta/2$ ラジアンの角度を通して貴方の手でベクトルを回転させます。この２つの混乱の要因は直交ベクトルはブロッホ球でプロットされる時には $180^\circ$ 離れていますが、実際には幾何学的に $90^\circ$ 度離れているという事実に起因します。対応するユニタリ行列は :

```math
R_z(\theta) = \begin{bmatrix} e^{-i\theta/2} & 0\\  0& e^{i\theta/2} \end{bmatrix},\qquad R_x(\theta) = H R_z(\theta) H, \qquad R_y(\theta) = SHR_z(\theta)HS^\dagger
```

です。(訳注 : 短剣符 $\dagger$ は、演算子 A とエルミート共役となる演算子。) 

丁度、３つの次元で任意の回転を遂行するために任意の３つの回転が一緒に結合可能であるように、任意のユニタリ行列が３つの回転として書けることがまたブロッホ球表現から見て取れます。特に、総てのユニタリ行列 $U$ に対して $U= e^{i\alpha} R_x(\beta)R_z(\gamma)R_x(\delta)$ となるような $\alpha,\beta,\gamma,\delta$ が存在します。このように $R_z(\theta)$ と $H$ はまたユニバーサル・ゲートセットを形成しますが、けれどもそれは離散集合 (= discrete set) ではありません、何故ならば $\theta$ は任意の値を取れるからです。この理由で、そして量子シミュレーションのアプリケーションのために、そのような連続的なゲートは量子計算に対して重要です、特に量子アルゴリズム・デザインレベルで。究極的には、フォールトトレラントなハードウェア実装を達成するためには、それらは最終的にはこれらの回転を密接に近似する離散ゲート・シークエンスにコンパイルされるでしょう。


**以上**