量子計算でデータを扱う手法


こんにちは｜こんばんは。カエルのアイコンで活動しております @kyamaz \:frog: です。

本稿は、[量子コンピュータ Advent Calendar 2021](https://qiita.com/advent-calendar/2021/quantum) の17日目（2021年12月17日）の記事エントリーです。

##　はじめに

デジタルデータを量子コンピュータに処理させようとすると、データを量子コンピュータ上でどのように表わして操作できるようにするかが重要になります。現在知られている手法には次の３種類があります。

1. 基底エンコーディング
2. 振幅エンコーディング
3. ハミルトニアンエンコーディング

本稿では、参考書籍[^1]『量子コンピューティング 基本アルゴリズムから量子機械学習まで』の「2.6 量子コンピュータにデータを入力する」の節をまとめる形で解説していきます。

さて、エンコーディングの解説に入る前に、先ずは量子情報の単位について、基本を確認しておきましょう。
量子コンピュータで扱う量子状態は、量子ビットを基本単位としています。量子ビット$\lvert 0 \rangle$を古典ビットの$ 0 $に、量子ビット$\lvert 1 \rangle$は古典ビットの$ 1 $と対応づけて、１つの量子状態は、$\\{ \alpha_{0}\lvert 0 \rangle+\alpha_{1}\lvert 1 \rangle \mid
 |\alpha_{0}|^2+|\alpha_{1}|^2=1 , \alpha_{0},\alpha_{1} \in \mathbb{C} \\}$　で表される情報単位です。
一般形式として$m$量子ビットは、
$$\displaystyle \\{ \sum_{n=0}^{2^m-1} \alpha_{n} \lvert n \rangle \mid \sum_{n=0}^{2^m-1} |\alpha_{n}|^2 =1 , \alpha_{0},\dots, \alpha_{2^m-1} \in \mathbb{C} \\}　$$
のような情報として表されます。
すぐ後に出てきますが、この量子ビットの一般形式の$\lvert n \rangle $の部分を「基底」と呼び、その係数 $\alpha_{n}$ の部分を「振幅」と呼びます。

##　古典データの量子エンコーディング

### 基底エンコーディング

正の整数の数値データを量子ビットで表すのには$\lvert n \rangle $の部分をそのまま使えばよいということが、量子ビットの一般形式を見ると容易に想像できると思います。基底の部分に情報を当てる（埋め込む）方式ですので、これを「基底エンコーディング」と呼びます。古典ビットの素直な拡張と捉えられますので、負の整数の数値データをエンコーディングする場合は、負の数を2進法（2進数）で表す際に用いられる方法である「２の補数」を利用すればよいでしょう。
さらに、実数（小数点を含む数）を表すことも古典拡張として IEEE754 を参考にして定義することもできるでしょう。ただし、量子ビットで実数を表す際には、作りやすさや利用しやすさを優先して純粋な古典拡張ではない方が扱いやすいという考えもあります。この辺りの「実数を基底エンコーディングで表す手法」は、2021年現在では未だ定まっていないとしておいた方がよい時期だと思います。

### 振幅エンコーディング

次に、量子ビットの一般形式の振幅の部分にデータを埋め込むアイディアを考えてみましょう。$2^m$個の振幅の集合 $\\{ \alpha_{0},\dots, \alpha_{2^m-1} \\}$ を規格化[^2]されたベクトル $ \bf{a} $ とみると、任意の規格化されたベクトルは、この一般形式の振幅として捉えることができます。この手法を「振幅エンコーディング」と呼びます。
規格化された１つのベクトルをエンコーディングするだけではなく、規格化された　$ m \times n $ 次の行列でも、$n$階のテンソルでも、そのサイズに応じた量子ビットを取れば、振幅エンコーディングできます。

### ハミルトニアンエンコーディング

上記の「基底エンコーディング」「振幅エンコーディング」は、量子ビットの定義から古典データとして捉える部分を変えてエンコーディングを考えましたが、「ハミルトニアンエンコーディング」は、量子計算の特徴を使った任意の行列を埋め込む手法です。
ここで量子計算の基本を確認します。量子計算は、量子ビットにユニタリ演算を行うことで計算がされます。形式的に表記すると、
$$ U_{n}\cdot \dots \cdot U_{1}\cdot U_{0} \lvert \varphi_{0} \rangle = \lvert \varphi_{n} \rangle
$$
となります。この記述は、ユニタリ演算子 $ U_{0}, U_{1},\dots,U_{n} $を順番に初期の量子状態を表す量子ビット $\lvert \varphi_{0} \rangle$ に作用させていく（掛けていく）と、最終的な量子状態が $\lvert \varphi_{n} \rangle$ となるという意味です。
この任意のユニタリ演算子（演算子は行列で表されるためユニタリ行列ともいう）を古典データとして捉えるのが「ハミルトニアンエンコーディング」です。ハミルトニアンという命名は、量子力学のエネルギーを表すハミルトニアンに由来しています。本稿をご覧の方であれば、量子計算は、量子力学のシュレーディンガー方程式の解法に関連しているということはご存知かと思います。このデータを埋め込むユニタリ行列が、ハミルトニアンの部分と対応しています。

ここで、エンコードしたいデータを、任意の $n \times n $次の正方行列 $ A $ としましょう。しかしながら、上の方法でエンコードできるユニタリ行列は $U^{\dagger}U = I $ という特性のある行列で、任意の行列を考える上では限定的すぎます。もう少し制約を緩めるために、エルミート行列という種類の行列 $ H $ を考えます。エルミート行列は $ H^{\dagger} = H $ という特徴をもつ行列です。エルミート行列 $ H $ を使った行列 $ e^{iH} $ はユニタリ行列になり、エルミート行列→ユニタリ行列の変換できます。更に、エンコードしたい任意の $n \times n $次の正方行列 $ A $を次の式のように $2n \times 2n $次の正方行列を作ると、これがエルミート行列になります。
$$
\begin{pmatrix}
0 & A \\\
A^{\dagger} & 0
\end{pmatrix} = H
$$
この形式が任意の正方行列→エルミート行列の変換になります。
ここまでの変換の順を追うと、

```
[任意の正方行列 A] →（次元を上げて）→ [エルミート行列 H] →（指数形式にして）→　[ユニタリ行列 U]
```
という変換をすることで、任意の正方行列をエンコードできることになります。


##　おわりに

我々が扱っている古典データを量子計算に使うためには、このように幾つかのエンコーディングの手法が提案されております。それぞれのエンコーディングはその目的に応じて、向き・不向きがあります。また、理論上はエンコーディングの手法は簡単に見えますが、いざ現実の量子コンピュータでエンコーディングしようとすると、様々な課題があります。エンコーディングのためのハードウェア・ソフトウェアが整備がされていないため実現できないというギャップがあります。
更に技術が進歩して実装がされるのを期待して、本稿の解説を終わりたいと思います。

---

（●）（●）
/""　＿＿""＼ @kyamazは、オープンソース・コミュニティ[^99]を通じて、皆さんと共に量子情報・量子コンピューティングの分野で挑戦していきたいと考えております。今後とも引き続き、どうぞ宜しくお願い致します。

May your Christmas wishes come true!
May happy Quantum Computer world has come!


##### 参考資料

- [Quantum circuits for floating-point arithmetic](https://arxiv.org/abs/1807.02023)

[^1]: 『[量子コンピューティング 基本アルゴリズムから量子機械学習まで](https://www.ohmsha.co.jp/book/9784274226212/)』（嶋田 義皓 著、オーム社）

[^2]: 規格化されたベクトルとは、ベクトルの大きさが $1$ となるベクトルです。

[^99]: OpenQLプロジェクトは、量子コンピューターを扱うための様々なライブラリを開発するためのオープンソースプロジェクトです。量子情報、量子コンピューターに興味がある人たちが集うコミュニティを運営しております。詳しくは[connpassのサイト](https://openql.connpass.com/)をご覧ください。