プログラマのための量子アルゴリズム入門　第1回. 1量子ビットの世界

この文章は「[プログラマのための量子アルゴリズム入門](https://note.mu/snuffkin/n/n8affc7eabf45)」の一部です。
全体の目次・記載方針を確認する場合は、次の画像をクリックしてください。

[![title.png](https://qiita-image-store.s3.amazonaws.com/0/13107/1d34511a-d79b-7dac-8ed8-4f315f4d1771.png)](https://note.mu/snuffkin/n/n8affc7eabf45)


# **今回の内容**
まずは、量子アルコリズムを学ぶ上で基本となる量子ビット、量子状態、測定、ユニタリ発展に関する説明を1量子ビットの世界で説明します。

# **イントロダクション**
古典コンピュータで表現可能な情報の最小単位は**ビット**(bit)です。量子コンピュータのビットと区別のため、古典ビットともいいます。
1ビットの情報には0または1で表される、2種類の状態があります。2ビットであれば $00, 01, 10, 11$ の4通りの状態があります。このようにして、nビットの情報は $2^n$ 通りの状態があります。
また、このようなビットの状態はいつでも測定することができ、同じ操作を行えば毎回同じ結果を得ることができます。

この古典ビットの性質と比べると、量子コンピュータで使われる量子ビットは不思議な性質を持っています。
まず、量子力学の法則である**重ね合わせの原理**(principle of superposition)により、複数のビットが重なり合った状態となっています。
また、量子ビットの状態は測定するとき、返ってくる結果は確率的に決定されます。そのため、同じ操作をしても結果が異なることがあります。 例えば、同じ計算をしても0が返ってきたり、1が返ってきたりすることがあります。

この章では、量子力学のこの事実を前提に、それをどのように量子ビットとして表現するか説明します。
それでは、1量子ビットの世界を見てみましょう。

# **量子ビット、量子状態**

まず、古典ビットに対応する量子ビットや量子状態について説明します。

> **定義**  
> $\mathbb{C}^2$ の単位ベクトルを**量子状態**(quantum state)といい、量子状態の集合を $Q$ と書く。  
>
> ```math
\begin{align}
Q := \left\{ \left(
  \begin{array}{c}
    a \\
    b
  \end{array}
\right)
\in \mathbb{C}^2 \ \middle| \ |a|^2 + |b|^2 = 1 \right\}
\end{align}
```

古典ビットの0, 1に対応する**量子ビット**(quantum bit, qubit)を $\mid0\rangle, \mid1\rangle$ と記します。
$Q$ の要素としては、次のものに対応します。

```math
\begin{align}
\mid0\rangle :=
\left(
  \begin{array}{c}
    1 \\
    0
  \end{array}
\right) \\
\mid1\rangle :=
\left(
  \begin{array}{c}
    0 \\
    1
  \end{array}
\right)
\end{align}
```
$\mid0\rangle$ はゼロベクトルでないことに、注意が必要です。

```math
\begin{align}
\mid0\rangle \neq
\left(
  \begin{array}{c}
    0 \\
    0
  \end{array}
\right)
\end{align}
```
この記法を利用することで、

```math
\begin{align}
\left(
  \begin{array}{c}
    a \\
    b
  \end{array}
\right) = 
a\left(
  \begin{array}{c}
    1 \\
    0
  \end{array}
\right) + 
b\left(
  \begin{array}{c}
    0 \\
    1
  \end{array}
\right) = 
a \mid 0 \rangle + b \mid 1 \rangle 
\end{align}
```
となります。そのため、$Q$ を次のように書くことができます。

```math
Q = \left\{ a \mid 0 \rangle + b \mid 1 \rangle \ \middle| \ a,b \in \mathbb{C} で |a|^2 + |b|^2 = 1 を満たす\right\}
```

扱いに便利であるため、$Q$の要素は $\mid0\rangle$ と $\mid1\rangle$ を使った記法で書くことが多いです。
例えば、次のようなものは量子状態です。

```math
\begin{align}
\mid0\rangle, \quad \mid1\rangle, \quad \frac{1}{\sqrt{5}}\mid0\rangle + \frac{2}{\sqrt{5}}\mid1\rangle, \quad  -\frac{1}{\sqrt{3}}\mid0\rangle + \frac{1+i}{\sqrt{3}}\mid1\rangle
\end{align}
```

逆に、次のものは量子状態では**ありません**。

```math
\mid 0 \rangle + \mid 1 \rangle \quad (1^2+1^2 = 2 \neq 1となるため)
```

$Q$ の要素を文字で表すとき、$\varphi$ ではなく、$\mid\varphi\rangle$ という書き方をすることが多いです。量子力学では列ベクトルを表すときにこの記法を使用するため、それに従っています。

量子状態は、内積と呼ばれる演算を使用して表すこともできます。  
$\mathbb{C}^2$ の要素

```math
\begin{align}
\mid\varphi\rangle =
\left(
  \begin{array}{c}
    a_1 \\
    b_1
  \end{array}
\right) , \quad
\mid\psi\rangle =
\left(
  \begin{array}{c}
    a_2 \\
    b_2
  \end{array}
\right)
\in \mathbb{C}^2
\end{align}
```

に対し、内積 $\langle\varphi\mid\psi\rangle$ を次のように定義します。

```math
\begin{align}
\langle\varphi\mid\psi\rangle := \varphi^*\psi = 
\left(
  \begin{array}{cc}
    \overline{a_1} & \overline{b_1}
  \end{array}
\right)
\left(
  \begin{array}{c}
    a_2 \\
    b_2
  \end{array}
\right)
= \overline{a_1}a_2 + \overline{b_1}b_2
\end{align}
```

$\varphi^*$ は $\varphi$ の随伴行列、$\overline{a_1}$ は $a_1$ の複素共役を表します。
これを利用して、$\varphi$ と $\varphi$ の内積を計算すると、

```math
\begin{align}
\langle\varphi\mid\varphi\rangle = \overline{a_1}a_1 + \overline{b_1}b_1 = |a_1|^2 + |b_1|^2
\end{align}
```
となります。これにより、次のように $Q$ を表すことができます。

```math
\begin{align}
Q = \left\{ \mid\varphi\rangle \in \mathbb{C}^2 \ \middle| \ \langle\varphi\mid\varphi\rangle = 1 \right\}
\end{align}
```

量子状態 $Q$ を表す方法はいくつかあるため、そのときどきで扱いやすい方法を使います。

# **測定**
量子力学の世界には不確定性原理というものがあり、量子の状態は測定するまで分かりません。これは、量子コンピュータの世界でも同じであり、量子状態を測定するまでは計算結果がどうなったのか分かりません。  
ここでは、量子コンピュータにおける測定について説明します。

> **定義**  
> 量子状態を**測定**(measurement)することにより、$\mid0\rangle$または$\mid1\rangle$を得ることできる。
> このことを「測定値0を得る」とか「量子ビット0を得る」という。
> ただし、$a\mid0\rangle + b\mid1\rangle \in Q$ を観測したときに、測定値0を得る確率は $|a|^2$ であり、測定値1を得る確率は $|b|
^2$ である。
> また、量子状態は測定結果に合わせて、$\mid0\rangle$または$\mid1\rangle$ に変化する。

測定により得られる結果が確率的であることは、量子コンピュータが現在のコンピュータと大きく異なる点です。例えば、

$$
\begin{align}
\mid\varphi\rangle = \frac{1}{\sqrt{5}}\mid0\rangle + \frac{2}{\sqrt{5}}\mid1\rangle
\end{align}
$$

として $\mid\varphi\rangle$ を測定するとき、量子ビット0を得る確率は $\left|\frac{1}{\sqrt{5}}\right|^2 = \frac{1}{5}$ となり、量子ビット1を得る確率は $\left|\frac{2}{\sqrt{5}}\right|^2 = \frac{4}{5}$ となります。  

また、

$$
\begin{align}
\mid\psi\rangle = \frac{i}{\sqrt{5}}\mid0\rangle + \frac{2}{\sqrt{5}}\mid1\rangle
\end{align}
$$

とし、$\mid\psi\rangle$ を測定するとき、量子ビット0を得る確率は $\left|\frac{i}{\sqrt{5}}\right|^2 = \frac{1}{5}$ となり、量子ビット1を得る確率は $\left|\frac{2}{\sqrt{5}}\right|^2 = \frac{4}{5}$ となります。そのため、$\mid\varphi\rangle$ と $\mid\psi\rangle$ は異なる量子状態ですが、単純に測定するだけでは区別できません。
もう少し一般的な説明で言い換えると次のようになります。
複素数 $w, z$ が $|w|=1, |z|=1$ を満たすとします。2つの量子状態

$$
\begin{align}
  & a\mid0\rangle + b\mid1\rangle, 
  & aw\mid0\rangle + bz\mid1\rangle
\end{align}
$$

を測定するとき、どちらの量子状態も量子ビット0を得る確率は $|a|^2$、量子ビット1を得る確率は $|b|^2$ となります。そのため、これらは区別できません。  

確率的にしか測定できないし、異なる量子状態でも区別がつかないケースがあるため、使いづらそうと感じるかしれません。
その一方で、量子状態は2つの量子ビットが重なり合った状態を表すことができ、これは古典ビットにはなかった特長です。量子アルゴリズムでは、この特長を有効に活用して古典ビットでは実現できなかったことを実現します。

# **ユニタリ発展**
量子ビットの状態について説明し、それを測定できることも分かりました。  
しかし、これだけでは計算することができません。古典コンピュータでは、ビット演算を行う素子(AND, OR, XOR, NOT等)を使い、ビットの状態を変化させることで計算を行います。  
古典コンピュータの演算回路に相当するものが、量子コンピュータのユニタリ発展です。  

> **定義**  
> 量子状態 $\mid\varphi\rangle$ は、$2\times2$ ユニタリ行列 $U$ を使って $U\mid\varphi\rangle$ という量子状態に写ることができる。
> このような量子状態の変化を**ユニタリ発展**(unitary evolution)という。

量子コンピュータでは、ユニタリ発展を行う回路を実装することで量子ビットの状態を変化させ、計算することができます。
ユニタリ発展については、いくつか説明します。  

## 1. 量子状態をユニタリ発展させたものは、量子状態になるのか
ユニタリ発展したもの $U\mid\varphi\rangle$ が量子状態にならないと、この定義は意味がありません。
$U\mid\varphi\rangle$ が量子状態になることを、実際に確認してみましょう。

```math
\begin{align}
\varphi =
\left(
  \begin{array}{c}
    a \\
    b
  \end{array}
\right) \in Q
\end{align}
```
とし、$U$ をユニタリ行列とすると、

```math
\begin{align}
\langle U\varphi \mid U\varphi\rangle = (U\varphi)^*(U\varphi) = \varphi^* U^* U \varphi = \varphi^* \varphi
= 
\left(
  \begin{array}{cc}
    \overline{a} & \overline{b}
  \end{array}
\right)
\left(
  \begin{array}{c}
    a \\
    b
  \end{array}
\right)
= \overline{a}a + \overline{b}b = |a|^2 + |b|^2 = 1 
\end{align}
```
となります。そのため、$U \mid \varphi\rangle \in Q$ です。
また、これにより、ユニタリ行列を $Q$ から $Q$ への関数 $U:Q \rightarrow Q$ と見ることができます。
(これは、全単射です。また、数学用語で「ユニタリ群 $U(2)$ が $Q$ に作用している」といいます)

## 2. どうしてユニタリ行列なのか
量子状態の発展の仕方は量子力学に登場するシュレーディンガー方程式を解くことで分かり、実際にシュレーディンガー方程式を解くとユニタリ行列をかけることにより発展することが分かるそうです。
ここでは、そのことを認め、詳細には立ち入りません。

## 3. 任意のユニタリ発展は、ハード実装可能なのか
代表的なユニタリ発展についてはハード実装できているようですが、任意のユニタリ発展をハード実装できている訳ではないと思います。
この文章では、ハード実装できると仮定して、量子アルゴリズムについて説明することがあります。

## 4. ユニタリ発展の可逆性
ユニタリ行列は必ず逆行列を持ちます。そのため、$U \mid \varphi \rangle$ を $U^{-1}$ でユニタリ発展させると、

$$
\begin{align}
U^{-1}U \mid \varphi \rangle = \mid \varphi \rangle 
\end{align}
$$

となり、$\mid \varphi \rangle$ に戻ります。そのため、任意のユニタリ発展は可逆です。

# **次回の内容**
さて、今回は量子ビット、量子状態、測定、ユニタリ発展について、1量子ビットの世界で説明しました。
が、正直言って、「これで何ができるか分からない」という感じだと思います。
次回は1量子ビットの量子回路について説明し、もう少し手触りを感じられるようにしたいと思います。

それではまた、次回もよろしくお願いします。