社会人のための量子コンピューター超入門　基本数学編

#量子コンピューターを理解するために
量子コンピューターの動きを理解しようとする場合、数学の助けが必要になります。
概念を知るだけであれば、前回記事の[概要編](https://qiita.com/Ayumu_walker/items/1796242551d1a686aa6c)だけで十分とは思うのですが、エンジニアとして量子コンピューターを操作するときに数学を使わないと何が正しいのかがわからなくなることがあります。
今回は、量子コンピューターの理解に最低限必要となる（と思われる）、複素数、ベクトル、行列の考え方と演算方法、および量子コンピューター世界との対応関係を説明していきます。

基本的には、高校数学で習う範囲ですが、理系コースに入っていないと習っていない内容ばかりなので、バリバリの文系出身者の方には最初は辛いかもしれません。しかし、量子コンピューターとは限らず、最も単純な例を使いながら説明するので、安心して付いて来れる内容を目指します。

これをいったん読めば、専門書まではすぐに読めないにしても、数式が突然出てきてもビックリしない耐性を身に着けることができればと思います。

なお、今回説明するベクトルと行列は、機械学習や深層学習の演算でも使われている内容になりますので、勉強しておいて損はしないです。（もっと言うと本当は微分なども含まれていますが）


#対象
・数学とか時の彼方に忘れてきてしまった人


# 複素数
複素数を語り出す前に、最初に虚数という概念を導入します。

##虚数
まずは、中学１年生のときの数学を思い出してみましょう。
同じ数を２回かけることを２乗と言いましたね。２乗すると、どんな数字でも0以上の数字になります。つまり、負の値になることは無い、と習ったと思います。
例えば、-3の２乗は、$(-3)^2 = (-3)×(-3) = 9$と計算できますよね。負の数を２乗したって正の数になります。

ここで、数学者という人たちはおかしなことを考え始めました。
 
「２乗して、負の数になるものを考える必要が出てきた。これを使ってみたら、そこからどんなことがわかるだろうか」

数学が発展する過程で虚数が必要だったのは確かですが、こんな単なる知的好奇心が、現代テクノロジーを支えることになるのですから、世の中面白いものです。

さて、「２乗したら-1になる数字」というものを考えてみます。そんな数字はこれまでの生活でも勉強でも知らなかったわけですが、ここに意味付けはできました。そこで”その数字”を便宜的に$i$と表記することにしましょう。そしてその名前を、虚数と呼ぶことにします。
虚数の定義を、ちゃんと数式で表現すると以下のようになります。
$$ i^2 = -1 $$
計算する時に、$i$が２回かかったら、-1に書き換えるというルールがあるだけです。とっても簡単ですね。


##複素数の計算ルール
複素数は虚数を使って以下のような表記をします。
$$ a + bi $$

文字で表現されるとわかりません、というご意見もあるでしょう。
例えば、 $a=3$、$b=4$と、それぞれに実数を入れて考えれば良いです。この場合は、$3+4i$となります。

次に２つの複素数を足し引きするような場合はどうするべきか。簡単です。中学１年生の時にならった文字式の計算ルールを適用するだけです。
例えば、２つの複素数$z_1$と$z_2$があり、それぞれ$z_1=2+5i$、$z_2=-3+2i$としましょう。
それぞれ足し算と引き算は次のように計算できます。


```math
\begin{align}
z_1 + z_2 &= (2+5i) + (-3+2i) \\
&= (2-3) + (5i +2i) \\
&= -1 + 7i 
\end{align}
```

```math
\begin{align}
z_1 -z_2 & = (2+5i) -(-3+2i) \\ &= 2+5i +3 -2i \\ &= (2+3) + (5i-2i) \\ &= 5+3i
\end{align}
```


簡単ですね。$i$が付いているものと付いていないものは住んでいる世界が違うので、足したり引いたりはできないですが、同じ世界に住んでいる人同士は足したり引いたりして良いのです。こんな感じに計算します。

さて、次の２つの複素数の掛け算はどうなるか。中学１年生で習ったことをやるだけです。先ほどと同じ複素数を使って説明しましょう。やっていることは分配法則だけです。

```math
\begin{align}
z_1 × z_2 &= (2+5i)×(-3+2i) \\ 
&= 2×(-3) + 2×(2i) + (5i)×(-3) + (5i)×(2i)\\  
&= -6 +4i -15i + 10i^2 \\
&= -6 + 4i -15i + 10×(-1)   \\&= -16 -11i

\end{align}
```
という結果になります。ここで、$i^2=-1$というルールを思い出しましょう。一番最後の箇所にそれがあったので、適用して計算しました。

割り算は、すぐに使わないので、いったん割愛します。（いつか書きます）

## 共役の複素数
ある複素数があったとして、それに対する共役となるものを考えることがあります。
何やら専門用語が出てきてビビりそうですが、話はとても単純で、虚数$i$が付いている部分の符号を反転させるだけです。
例えば、$z_1$の共役、$z_1^* = 2-5i$となります。これだけです。

さて、なんでこんなものを考えるのさ？という疑問は湧きますが、数学的には結構便利な用途が多いため、そういうものが存在しているのです。

簡単に共役を利用する例として、複素数の大きさの二乗を計算するときにはこの共役を使うことがあります。こんな感じです。$z=a+bi$としてみましょう。

$$ |z|^2= z^*z =(a-bi)(a+bi) = a^2-b^2i^2 = a^2-b^2×(-1) = a^2+b^2 $$

こうすると、虚数部もしっかり消えてくれるので、便利なのですね。

なんでこんなことするのさ？と思うかもしれませんが、あとでベクトルの状態のところで少し意味があるので、ご容赦ください。


#ベクトル（vector）
ベクトルと言う言葉は日常用語でも使うことがあると思います。特に「方向」の意味合いで使うことがあるのではないでしょうか。直感的な意味合いとしては正しいです。ベクトルを端的に表現すると、「向きと大きさを持った量」と表現されます。いまいちわからんですね。図で表現すると、以下のような矢印で表現できます。
![ベクトル座標無し.JPG](https://qiita-image-store.s3.amazonaws.com/0/135990/9d46c921-02b6-2304-c75a-77c3a7a2b7b4.jpeg)


う〜む、やっぱりわからない。
そりゃそうです。矢印書いただけでは意味がわかりません。これが計算できるようにするにはどうしたら良いか。それは便宜的にでも座標を設定してしまうことです。こんな感じに。![ベクトル座標あり.JPG](https://qiita-image-store.s3.amazonaws.com/0/135990/5fd99d57-8392-45cb-6961-b688791981e1.jpeg)



こう見ると、中心点から右に3、上に4進むと、ベクトルの先っぽに到達しますね。

これがわかると、上のベクトルを次のように表現してみることができます。


```math
\vec{v}=
\begin{pmatrix}
横成分  \\
縦成分  
\end{pmatrix}
=
\begin{pmatrix}
3  \\
4  
\end{pmatrix}

```


## ベクトルの計算ルール

###足し算引き算
ベクトルは足し算と引き算はもちろん可能です。ただし、同じ構造であることが前提になります。
ここで、$w$というベクトルを追加します。例えば、以下のようなベクトルにしましょう。

```math
\vec{w}=
\begin{pmatrix}
2  \\
-3  
\end{pmatrix}
```


$v$と$w$は同じ構造なので、足し算ができます。実際に足してみましょう。同じ成分同士で足すだけです。

```math
v+w=
\begin{pmatrix}
3  \\
4  
\end{pmatrix}
+
\begin{pmatrix}
2  \\
-3  
\end{pmatrix}
=
\begin{pmatrix}
3+2  \\
4-3  
\end{pmatrix}
=
\begin{pmatrix}
5  \\
1  
\end{pmatrix}
```

引き算も同様です。

```math
v-w=
\begin{pmatrix}
3  \\
4  
\end{pmatrix}
-
\begin{pmatrix}
2  \\
-3  
\end{pmatrix}
=
\begin{pmatrix}
3-2  \\
4-(-3)  
\end{pmatrix}
=
\begin{pmatrix}
1  \\
7  
\end{pmatrix}
```

はい、簡単ですね。さっきの矢印を使って図にすると、こんな感じになります。



###ベクトルに定数倍を掛ける
ベクトルに何らかの数字を掛けることもできます。
例えば、$v$に2を掛けてみましょう。単純に全ての成分を２倍するだけです。

```math
2v= 2×
\begin{pmatrix}
3  \\
4  
\end{pmatrix}
=
\begin{pmatrix}
2×3  \\
2×4  
\end{pmatrix}
=
\begin{pmatrix}
6  \\
8  
\end{pmatrix}
```
意味も簡単です。元のベクトルを２倍に引き伸ばすことに相当します。


###内積
ベクトルというのにも、掛け算に相当する概念はありますが、我々が知っている掛け算とは少し勝手が異なります。ここでは内積と言う計算を説明します。
とはいえ、計算のルールは単純です。特に、今回は成分表示したケースだけであれば、小学生でも計算できますので、ご安心ください。
やることは、同じ成分同士をそれぞれ掛け算し、最後に全部足し合わせるだけです。
便宜的に以下のように表現してみましょう。

```math
\begin{align}
v*w &=
\begin{pmatrix}
3  \\
4  
\end{pmatrix}
*
\begin{pmatrix}
2  \\
-3  
\end{pmatrix}  \\
&= 3×2 + 4×(-3)  \\
&= 6-12  \\
&= -6 
\end{align}
```

内積の意味を計算する意味はあるのでしょうか？
すごく乱暴に言うと、２つのベクトルがどれくらい同じ方向を向いているか、を表現していると言えます。

ここで超重要なこととして、直行するベクトル同士の内積は0になるという性質があります。
直交するベクトルのすごく簡単な例を紹介しましょう。


```math
x=
\begin{pmatrix}
1  \\
0  
\end{pmatrix}
、
y=
\begin{pmatrix}
0  \\
1  

\end{pmatrix}
```
$a$と$b$の内積を計算すれば0になるのはすぐにわかりますし、矢印で書いても、直交しているのがすぐにわかりますね。

![ベクトル直行.JPG](https://qiita-image-store.s3.amazonaws.com/0/135990/db0c535f-c21d-cd10-261a-4ef10e80b2b9.jpeg)

###ベクトルの長さの求め方
内積を使ってもう一つわかることがあります。
同じベクトルの内積は、そのベクトルの長さの２乗になります。
例えば、先ほどの$v$の長さは、以下のように計算できます。そして、その長さを　$|v|$と表現しましょう。

$$ |v|^2 = v*v = 3^2 + 4^2 = 9+16=25 = 5^2 $$
つまり$|v|=5$ということになりますね。


##量子状態とベクトルの関係
さて、ここまででベクトルの説明をしてきまいたが、量子コンピューターのリの字も出てこないじゃないか、とお思いかと思います。
概要編でも少しだけ説明していたのですが、量子状態はベクトルとして表現されます。また、そのベクトルは、重ね合わせられています。そのルールとして、ベクトルの長さは１になるように数字が調整されています。（これを規格化と表現されます）これは、確率は全ての可能性を足しあげると1になるという性質に相当します。

なぜ、ベクトルで表現できるか説明します。
ベクトルは複数の成分を持ちます。それは、つまり複数の状態を同時に１つのベクトルという形で持ち合わせることができます。
これが重ね合わせの原理と対応しているのです。

それを数学的に見通しよく表現するために、次の表記を導入します。



###ブラケット表記
量子力学や量子コンピューターの世界では、量子状態を慣例としてブラケット表記というものを用いて、簡略に表現することが多いです。
$|0>$は、量子ビットが0である状態、同様に$|1>$は、量子ビットが1である状態と意味付けをします。
|と>という記号で数字を挟んだこの表記を、ケット表記とかケットベクトルなんて言い方をします。
挟む数字や文字には、特にルールや制約はありません。あくまで計算に出てきたときに意味がわかるように表現してれば良いです。なので、好き勝手表現してもらって大丈夫です。

天下り的になりますが、１量子ビットの$|0>$と$|1>$は具体的には、以下のようなベクトルと考えることができます。（厳密には、成分の数字の組み合わせは無限に存在しますが、最も単純で計算しやすいもの、という意味で）

```math
|0>=
\begin{pmatrix}
1  \\
0  
\end{pmatrix}
、
|1>=
\begin{pmatrix}
0  \\
1  
\end{pmatrix}
```


ケットベクトルに合わせて、簡単にブラベクトルを作ることができます。
簡単です、ベクトルを横に倒して、各成分を複素共役にするだけです。
上記のケットベクトルは実数なので、複素共役にしても何も影響がないですが、 実際に書いてみるとこんな感じです。

```math
<0|=
\begin{pmatrix}
1 & 0 
\end{pmatrix}
,
<0|=
\begin{pmatrix}
0 & 1 
\end{pmatrix}
```

本当にただ、横に倒しただけですね。この操作を数学の世界では転置と言います。


# 行列（matrix）

まず、最も単純な行列はこんな形をしています。

```math
\begin{pmatrix}
a & b \\
c & d 
\end{pmatrix}

```

「あれ？ベクトルのときと同じような書き方しているな？」と思った方はなかなか鋭いです。そうです、ベクトルは行列の特別な場合に相当します。上の行列は、２行２列の行列と呼びます。上記のベクトルは、２行１列の行列という言い方もできます。行列の行数と列数は必ずしも同じである必要はありませんし、必要に応じて設定することになります。
一般的な表記としては、以下のようになります。m行n列の行列として、表記します。

```math
\begin{pmatrix}
a_{11} & ‥ & a_{1n}  \\
： & ： & ： \\
a_{m1} & ‥ & a_{mn}
\end{pmatrix}

```

なんかもう訳わかんないですよねw
といっても、これはただの見かけ倒しで、縦にm個、横にn個、格子状に数字がはめこまれているだけなのです。
「mとかnとか文字で説明されてもわかんないんだけど・・・」と思いますが、それも何らかの数字が入っているので、上記のような具体的な形で考えてみれば、大したことはないです。
なた、少なくとも量子コンピューターの世界においては、行数と列数が等しい行列（正方行列）だけを意識しておいてもらえば、そんなに困ることはないはずです。



##行列の計算ルール

さて、ベクトルが行列の特殊系ということから、計算における基本的な性質として、ベクトルの時と準拠するものが多いです。
計算を確かめるにあたって、以下の行列$A$と$B$を用意しましょう。

```math

A=
\begin{pmatrix}
1 & 5 \\
-2 & 3 
\end{pmatrix}

,

B=
\begin{pmatrix}
3 & -1 \\
0 & 4 
\end{pmatrix}

```


###行列の足し算引き算
足し算引き算は、同じ配置の数字同士で足したり引いたりすれば良いです。

```math
A+B=
\begin{pmatrix}
1 & 5 \\
-2 & 3 
\end{pmatrix}
+
\begin{pmatrix}
3 & -1 \\
0 & 4 
\end{pmatrix}

=
\begin{pmatrix}
1+3 & 5-1 \\
-2+0 & 3+4 
\end{pmatrix}

=
\begin{pmatrix}
4 & 4 \\
-2 & 7 
\end{pmatrix}

```

```math
A-B=
\begin{pmatrix}
1 & 5 \\
-2 & 3 
\end{pmatrix}
-
\begin{pmatrix}
3 & -1 \\
0 & 4 
\end{pmatrix}

=
\begin{pmatrix}
1-3 & 5-(-1) \\
-2-0 & 3-4 
\end{pmatrix}

=
\begin{pmatrix}
-2 & 6 \\
-2 & -1 
\end{pmatrix}

```



###行列の掛け算
行列の掛け算は、やり方がありますので、それを理解すれば、恐ることはありません。


#### 行列とベクトルの掛け算
行列同士の掛け算を説明する前に、まずはベクトルと行列の掛け算を説明すると、後々の見通しがよくなります。
ここでは、$A$と$v$で計算してみましょう！

じゃあ、どう計算するの？ということなのですが、図で見ると見通しが良くなります。自分がそのセンスが無いのですが、非常にわかりやすくまとまっている記事がありますので、こちらを見ていただくのが良いです。[【プログラマーのための数学】行列](https://qiita.com/Esfahan/items/afd4acf9ed264bb71f78)

こちらを参考に、ベクトルと行列の計算をしてみましょう。

```math

Av=
\begin{pmatrix}
1 & 5 \\
-2 & 3 
\end{pmatrix}
\begin{pmatrix}
3 \\
4  
\end{pmatrix}
=
\begin{pmatrix}
1*3+5*4 \\
-2*3+3*4  
\end{pmatrix}
=
\begin{pmatrix}
3+20 \\
-6+12  
\end{pmatrix}
=
\begin{pmatrix}
23 \\
6  
\end{pmatrix}

```


####行列同士の掛け算



####行列の掛け算は行列を入れ替えて計算すると、結果が異なることが普通
行列同士の掛け算で注意しないといけないことがあります。
行列の掛け算は、順番を入れ替えてみて計算してみると、異なる結果になることがあります。（言い換えると、一般に行列の積は入れ替えると等しくならない）
適当に作った行列で、いくつか試せばすぐに確かめることができますので、練習がてら好きな数字を当てはめて計算してみてください。

さて、これが量子コンピューターの世界において、何を意味するかはあとで説明しますね。


##量子コンピューターと行列の関係
量子コンピューター世界におけ量子状態（ベクトル）に影響を与えるような処理や物理量は、数学として計算するときには行列が対応します。
例えば、ゲート方式の場合は、ゲートが量子状態を変更するような処理なので、それを理論的な計算上は行列とみなすことができます。
「行列であることはわかったけど、実際にどんな数字が入っているの？」という疑問が湧くでしょう。ここまでは具体例が無いのだから当然ですね。
その回答については、目的とする処理に応じていろいろある、ということになります。
このあたりの具体例は、ゲート編で詳しく書いてみたいと思います。

さて、先ほどは残しておいた、行列の掛け算は入れ替えると値が異なる、という点について補足しておきましょう。
ある量子状態に対して、複数の異なる演算を行うような処理をすることを想像します。
そうすると、処理を行う順番によって、最終的に出てくる状態が異なる、ということを示唆しています。




#次に向けて
さて、やっぱり長くなってしまいましたが、これでゲート編に進むための最低限の準備ができました。
実際にIBM Qを使って、量子コンピューターを動かしてみるということをして、理解を深めていきましょう。