FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages

量子コンピュータ向けのMicrosoftの新言語「Q#」の勉強

参考資料

www.youtube.com

  • Qubit and Quantum Gates

https://www.appi.keio.ac.jp/Itoh_group/abe/pdf/qc1.pdf

Q#、というか、量子コンピュータについて勉強するためには、Microsoft のドキュメントを読むのがよさそうだ。

量子ビットについての章など、基本的なことが書いてあって分かりやすい。ただし、まだ読み進めている最中... どうにかして、本ブログにまとめていきたい...

Qubit (量子ビット)

量子ビット(Quantum Bit)は、行列として表現される。 \begin{bmatrix} \alpha \\ \beta \end{bmatrix} で、  \alpha^{2} + \beta^{2}=1 となるような  \alpha \beta が取られる。

このなかで、  \begin{bmatrix} 0\\ 1\end{bmatrix} \begin{bmatrix} 1\\ 0\end{bmatrix} は特別な意味を持っており、単位ベクトルのような役割を持っている。 これらの2つの状態はそれぞれ通常のビットの0 と 1の役割を示しており、

  0\equiv \begin{bmatrix} 1\\ 0\end{bmatrix}, 1\equiv \begin{bmatrix} 0\\ 1\end{bmatrix}

と定義する。量子ビットを測定して、  \begin{bmatrix} \alpha \\ \beta \end{bmatrix} 出会った場合、0である確率が  \alpha ^2 、1である確率が \beta ^2 となり、 \alpha^{2} + \beta^{2}=1 の条件が付いている。

量子ビットの測定

測定と、量子状態ベクタの符号は無関係ということである。\alpha \rightarrow -\alpha

これは、0と1の測定の確率は、項の絶対値の2乗に依存し、符号が変わってもその確率は変わらないからである。 このような位相は、「絶対位相(global phase)」と呼ばれており、\pm 1 と表記するのではなく、 e^{i\phi} と呼ばれている。

もう一つ重要なこととして、量子ビットを測定しても、すべての状態でその量子ビットの状態が破壊されるわけではないということである。 例えば、0の意味を持っている  \begin{bmatrix} 1\\ 0\end{bmatrix} は、この量子ビットを測定しても量子の状態は変化しない。 同様に、0と1の状態の場合は量子ビットの量子の状態は変化しない。

ブロッホ球を用いた量子ビットの可視化と変換

量子ビットブロッホ球表現を用いて3次元で表現することができる。 ブロッホ球を用いて、量子ビットの状態を表現することができる。

https://docs.microsoft.com/en-us/quantum/media/concepts_bloch.png?view=qsharp-preview

量子を用いた計算は、量子ベクタの回転を行うものであると考えると、直感的に理解できる。 アルゴリズムを設計し、記述するのにこの表現を使うのはなかなか難しい。 Q#は、このような回転を記述するための手法を提供している言語である。

1量子ビットの操作

量子コンピュータの演算は、量子ビットに対して量子ゲートの作用を適用していくことを示している。この中で量子ゲートの適用というのは、具体的には量子状態ベクトルに対して回転を行い、量子の状態を変更するという作用を意味する。

入力ビットの全ての変換処理が、有限長の回路を使って処理することが出来るならば、この記法は伝統的なコンピュータプログラミングと似ている。

量子コンピューティングでは、量子ビットへの適用が許される有効な処理:

  • ユニタリ変換 (unitary transformation)
  • 測定 (measurement)

また、ユニタリ行列を説明するにあたり、「随伴作用(adjoint operation)」および「複素共役転置(complex conjugate transpose)という作用は量子コンピュータにとって非常に重要な演算であるということを覚えておく必要がある。なぜならば、これらの処理は量子の状態を反転するのに必要な操作だからである。(ただし私は情報系の人間なので訳が分からない)。

Q#は、これらの作用をプログラムから自動的に変換するためのコンパイラを用意しており、プログラマが直接量子への作用を記述する必要が無いようにしている。

伝統的なコンピュータとの違い

伝統的なコンピュータでは、ビットからビットへのマッピング操作は4つしか定義されていない(COPY, NOT, AND, OR)。

一方で、量子コンピュータは単一の量子ビットに対してユニタリ変換の数は無限大の数を定義できる (上記のユニタリ変換の制約を満たす行列であれば、どのような行列であっても良い)。

したがって、ゲートと呼ばれる有限集合のプリミティブ量子演算は、量子コンピューティングで許容される無限集合の単位変換を正確に再現することはできない。

これは、伝統的なコンピューティングとは異なり、すべての量子プログラムを、有限個のゲートを使って実装することはできないということを意味する。

従って、量子コンピュータは伝統的なコンピュータと同様にユニバーサル(ここで言う、ユニバーサルの意味が少し分からないが...) であると言うことは出来ない。

結果として、量子コンピューティングにおいてゲートが「ユニバーサルである」というのは、伝統的なコンピュータにおけるその意味よりも弱い。

量子コンピュータは全てのユニタリ行列を有限のエラーと有限のゲート列を使って「近似している」必要がある。

言い換えれば、任意のユニタリ変換を、ゲートの集合の連続した列として厳密に表現することが出来るのならば、そのゲート集合は「ユニバーサルである」と言うことができる。

所定のエラー限界において、G_1,G2,...,G_Nが存在し、以下を満たすゲート列が存在することが必要とされる(xxx?)

G_NG_{N-1}\cdots G_2G_1\approx U

行列積は、右側から左側へと適用される。このため、G_N は量子状態ベクタに対して最後に適用される操作である。

より正式には、全てのG_1,\cdots,G_Nに対してエラー体制が\epsilon > 0G_N \cdots G_1 および  U が最大でも \epsilon であるならば、 このようなゲートの集合はユニバーサルであるということが出来る。

理想的には、\epsilon の距離に到達する必要のあるN の値は 1/\epsilonの多対数的(Poly-Logarithmically)でスケールする必要がある (xxxここも意味不明)

実際には、ユニバーサルなゲート処理の集合とはどのようなものだろう?

1つの量子ビットゲートでの最も簡潔なゲート処理は、2つのゲート処理のみである: Hadamardゲート H と、一般的に T ゲート(もしくは \pi/8 ゲート)と呼ばれるものである。

$$H=\dfrac{1}{\sqrt{2}} \begin{bmatrix}1&&1\\1&&-1\end{bmatrix}, T=\begin{bmatrix}1&&0\\0&&e^{i\pi/4}\end{bmatrix}$$

しかし、量子エラー訂正に関連して、より多くの便利なゲート集合を考えておいたほうが良い。これらは H Tを使って定義する。

量子ゲートを2つのカテゴリに分類する。

  • Cliffordゲート
  • T-ゲート

Cliffordゲートは量子エラーの訂正のための構造を作るのに簡単に実装をすることができ、フォールトトレラントを実現するために必要な演算や量子ビットのリソースが少なくて済む。

一方で、Cliffordゲートではないものは、フォールトトレラントを実現するのには非常にコストがかかる。

1つの量子ビットのCliffordゲートは、Q#にもデフォルトで含まれており、以下である (はてなブログの数式が正しく表示してくれない...)

$$H=\dfrac{1}{\sqrt{2}}\begin{bmatrix}1&&1\\1&&-1\end{bmatrix},\hspace{15pt}S=\begin{bmatrix}1&&0\\0&&i\end{bmatrix},\hspace{15pt}X=\begin{bmatrix}0&&1\\1&&0\end{bmatrix}=HT^{4}H,\hspace{15pt}$$ $$Y=\begin{bmatrix}0&&-i\\i&&0\end{bmatrix}=T^{2}HT^{4}HT^{6},\hspace{15pt}Z=\begin{bmatrix}1&&0\\0&&-1\end{bmatrix}=T^{4}$$

演算X, Y, Zは、この演算を発明したWolfgang Pauliにちなんで"パウリ演算子"と呼ばれている。

これらの演算子を用いてどのようにしてユニタリ変換を実現するか1つ例を示す。

上記ブロッホ球を用いて示した3つの変換は以下のゲート列に相当する。

 \begin{bmatrix}1\\0\end{bmatrix} \mapsto HZH\begin{bmatrix}1\\0\end{bmatrix} = \begin{bmatrix}0\\1\end{bmatrix} (これはゲートの反転を示している?)

スタックの論理レベル(論理レベルとは、量子アルゴリズムのレベルと考える)での操作を記述する場合には、最も一般的なプリミティブゲートを構成していたが、アルゴリズムレベルでより基本的ではない操作を考慮すると便利である。

幸いなことに、全ての高レベルのアルゴリズムを全てCliffordゲートとTゲートを用いてブレークダウンする必要は無く、Q#は高レベルのユニタリを実装する手法を持っている。

量子ビットの回転

最も基本的なプリミティブは、1量子ビットの回転である。

典型的には、3つの量子ビットの回転が考えられる: R_x, R_y, R_z である。

対応するユニタリ行列は、

$$R_z(\theta) = \begin{bmatrix}e^{-i\theta/2}&&0\\0&&e^{i\theta/2}\end{bmatrix}$$ $$R_x(\theta) = HR_z(\theta)H$$ $$R_y(\theta)=SHRZs(\theta)HS$$

となる。

3次元での回転を表現するために、これらの操作を組み合わせるだけである。

任意のブロッホ球の表現から、ユニタリ行列によって3つの回転を同じように表現できるようになった。

特に、全てのユニタリ行列Uは変数\alpha, \beta, \gamma, \zeta を用いて  U=e^{ia}R_x(\beta)R_z(\gamma)R_x(\theta) と表現することが出来る。

従って、 R_z(\theta) とHは同様にユニバーサルゲート集合を構成するが、\theta が任意の値を取るのでそれぞれが個別の集合ではない(xxx?)。

このような理由、および量子シミュレーションアプリケーションにより、このような連続ゲートは量子コンピューティング、特に、量子アルゴリズムのデザインレベルにおいては必須である。

究極的には、フォールトトレラントなハードウェア実装を実現するためには、これらの回転を近似する個別のゲートシーケンスにコンパイルして落とし込まなければならない。

関連記事