HELLO CYBERNETICS

深層学習、機械学習、強化学習、信号処理、制御工学、量子計算などをテーマに扱っていきます

量子計算に必要な基本的な式の整理

 

 

follow us in feedly

https://cdn.blog.st-hatena.com/images/theme/og-image-1500.png

はじめに

$$ \def\bra#1{\mathinner{\left\langle{#1}\right|}} \def\ket#1{\mathinner{\left|{#1}\right\rangle}} \def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}} $$ テンソル解析うんちゃらかんちゃらが全くわからない私ですが、量子計算について頑張って勉強しています。 以下の記事で紹介している書籍のまえがきにある

 

「量子情報・量子計算は非常に新しい研究分野であり、若い人がすぐに最前線に立って活躍できる」

 

 という言葉を信じ、研究の最前線で戦うつもりはありませんが、来る自体に備えようと思っている次第でございます。

 

s0sem0y.hatenablog.com

 

 

Twitterにはかなり博学な方も沢山いらっしゃるので、いろんな方の力を借りながら少しずつ勉強しています。特に以下のブログの「量子系さんのためのテンソル積入門」や量子計算の記事は非常に参考になっています。

 

enakai00.hatenablog.com

 

とりあえず、本記事では基本的な数式をまとめて頭の整理しておこうという次第です。

 

慣習的な書き方

ベクトル

2次元の縦ベクトルは$\ket a$と表す。

$$ \ket a \equiv \left( \begin{array}{c} \alpha \\ \beta \end{array} \right) $$

$\ket a$の複素共役を取ったものを$\bra a$と表す。

$$ \bra a \equiv (\alpha^*, \beta^*) $$

ここで$\alpha^*$は$\alpha$の複素共役数である。 (量子計算では通常、複素数を扱います)

 

内積

2つのベクトル$\ket a, \ket b$の内積を$\braket {a}{b}$で表し、

$$ \ket b = \left( \begin{array}{c} \gamma \\ \delta \end{array} \right) $$

とすると、$\ket a$と$\ket b$の内積$\braket {a}{b}$は

$$ \braket{a}{b} = (\alpha^*, \beta^*) \left( \begin{array}{c} \gamma \\ \delta \end{array} \right) = \alpha^* \gamma + \beta^* \delta $$

と表すことになる。特に、同じベクトル$\ket a$同士の内積は

$$ \braket{a}{a}=(\alpha^*, \beta^*) \left( \begin{array}{c} \alpha \\ \beta \end{array} \right) =\alpha^* \alpha + \beta^* \beta =|\alpha|^2 + |\beta|^2 $$

となって、ベクトル$\ket a$の2乗である。  

ここまでは要するに普通に知っているベクトルの表記を変えただけの話である。

 

演算子と行列

ここで、$\ket a \bra b$は演算子(具体的には行列)になる。 具体的に書き下すと以下の形になっている。

$$ {\ket a} {\bra b} = \left( \begin{array}{c} \alpha \\ \beta \end{array} \right) (\gamma^*, \delta^*)= \left( \begin{array}{cc} \alpha \gamma^* & \alpha \delta^* \\ \beta \gamma^* & \beta \delta^* \end{array} \right) $$

行列はベクトルを変換するものであったと何となく思い出せば、${\ket a} {\bra b} $という形のものは演算子なんだと考えることができる。 そして、ベクトル$\ket x$に作用したがっているように見えてくる。

 

概ね、$\ket x$のような形のものは左から何かが掛かりそうな雰囲気がしているし、$\ket {a}\bra {b}$のようなものは右側に作用したがっているように見える。 そんな雰囲気が掴めるようになってきたら、このブラケット表記に慣れてきたようなものだと思います(私はまだ慣れてないかも)。

 

一方で$\braket{a}{b}$みたいなのは何か閉じてしまっているように見える。これは実際内積であって既にスカラーの値になってしまっている。 まるで「$|$」が開いている側で今にも何かがくっつきそうという雰囲気だ。

 

たとえば $$ \ket{a}\braket{b}{x} $$ なんかはベクトル$\ket x$を$\ket{a}\bra{b}$で変換しているということになる。ついつい右側に目が言ってしまい、$\braket{b}{x}$という内積を見てしまいがちだが、 イメージとしてはやはり行列が作用していると見られると良い。だが、勿論右側の内積を計算してから、そのスカラー値を左側のベクトルに掛けても実際一緒だ。だから概念的には左側の行列と右側のベクトルと見て、 実際の計算は、右側の内積を計算してから左側のベクトルに掛けてやればいい。

 

射影演算子

ここで、より重要な話をする。$\ket a \bra b$が行列のようなものであり、何らかの変換であると思えるようになったら、ブラケット表記を使っていろいろな変換を簡単に記述できる。 それを見るために $$\braket{\psi_i}{\psi_i}=1$$

であり、 同様に $$\braket{\psi_j}{\psi_j}=1$$

であり、 そして、 $$\braket{\psi_i}{\psi_j}=0$$

となっているような。$\ket {\psi_i}$と$\ket {\psi_j}$を考えてみる。 これはすなわち、それぞれ長さが$1$で$\ket {\psi_i}$と$\ket {\psi_j}$は直交しているということである。 直交している上にそれぞれ長さが$1$なのだから、この2つのベクトルは2次元の正規直交基底になる。 例えば一番手っ取り早いのは、

$$ \begin{align} \ket {\psi_i} & = \left( \begin{array}{c} 1 \\ 0 \end{array} \right) \\ \ket {\psi_j} & = \left( \begin{array}{c} 0 \\ 1 \end{array} \right) \end{align} $$

というものである。こいつらを使えば、さっきまでの$\ket a$を

$$ \ket a = \left( \begin{array}{c} \alpha \\ \beta \end{array} \right) = \alpha \ket {\psi_i} + \beta \ket {\psi_j} $$

と表すことができる。ん、なんだか普通のベクトルの話に戻ってきてしまっているように見える。 けど、大丈夫、進んでいる。例えば上記で表される$\ket a$に$\ket{\psi_i}\bra{\psi_i}$という演算子を作用させてみよう。 概念的には行列のような演算子を掛けるのだが、実際の計算は右側の内積をとってからただの掛け算をするだけだ。

$$ \ket{\psi_i}\braket{\psi_i}{a} = \alpha \ket{\psi_i}\braket {\psi_i}{\psi_i} + \beta \ket{\psi_i}\braket {\psi_i}{\psi_j} = \alpha \ket{\psi_i} $$

$\ket {\psi_i}$と$\ket {\psi_j}$は正規直交基底だったので、内積計算は$0$か$1$だ。同じ基底同士の内積のときだけ$1$となる。 今、$\ket a$に$\ket{\psi_i}\bra{\psi_i}$という演算子を作用させてみたら、$\alpha \ket{\psi_i}$だけが出てきた。$\ket {\psi_i}$方向のベクトルだけを取り出したのだ。

 

これは使えるぞ。今勝手に基底を使ってやってみたが、本当は何でも良い。$\ket z$方向のベクトルだけを$\ket a$から取り出したければ、 $$ \ket{z} \braket{z}{a} $$ を計算してやればいい。$\ket z \bra z$を射影演算子とかいうらしい。

 

仮に、$\ket z$方向と$\ket w$方向をそれぞれ取り出して和を取りたければ、 $$ \ket{z} \braket{z}{a} + \ket{w} \braket{w}{a} $$ としてやればいい。おっと、ちなみに、こんな計算にどんな意味があるのかは私は知らない。適当に計算しただけだ。 だけどとてもおもしろいことができる。ベクトル$\ket a$でくくってやろう。さっきの式は $$ (\ket{z} \bra{z} + \ket{w} \bra{w})\ket{a} $$ とも書ける。演算子の足し算みたいなのが出てきた!気持ち悪い!!

 

私はそう思ったし、今でも未だ慣れていないところがある。けど、この演算子は行列みたいなもんだったんだと思うと、足し算なんかできて当たり前な気がしてくる。 (本当は演算子と行列は全く同じというわけではないけど、量子計算ではとりあえず大丈夫そう)

  射影演算子の足し算を考えれば、好きな空間への射影ができる。例えば以下、 $$ \sum_i \ket {\psi_i} \bra{\psi_i} $$ は射影演算子$\ket {\psi_i} \bra{\psi_i}$の和である。 これが$\ket {\psi_i}$の1つ1つが長さ1のベクトルであり、例えば$\ket {\psi_1}$と$\ket {\psi_2}$は直交している。すなわち正規直交基底であるとする。 すると、上記で見せたシグマの式は、正規直交基底${\ket {\psi_i} }_i$で張られる空間への射影演算子を表している。

 

覚えておくべきテンソル積

まず冒頭でも述べた以下の記事がとても基本的で参考になる。 全部を完璧に理解する必要は無いが、計算くらいはできるようにしたい。

 

enakai00.hatenablog.com

 

とりあえずテンソル積が「新たなベクトルを創り出す操作」くらいの感覚で受け入れるとしよう。 $\ket a$と$\ket b$のテンソル積は

$$ \ket a \otimes \ket b $$

と書き表すのであったが、これによって新たなベクトルが作られる。その新たなベクトルを$\ket c$とすると

$$ \ket c = \ket a \otimes \ket b $$

として、今後$\ket c$を計算に使っていく。それで全て事が上手く運べるならそれでいいし、実際は上手くいく方法はあるだろう。 しかし、実際には、$\ket c$がどのようなベクトルのテンソル積で作られていたのかを覚えておいた方が良いこともある。つまり、

$$ \ket c = \ket a \otimes \ket b $$

の右辺の方を今後の式でごちゃごちゃ使っていった方が便利だったりすることがあるのだ。 それは、テンソル積に関する以下の式が使えるからだ。

 

まずは、スカラーが掛かったベクトル同士のテンソル積について

$$ (\alpha \ket a) \otimes (\beta \ket b) = (ab)(\ket a \otimes \ket b) $$

このようにスカラーを追い出すことができる。

また、テンソル積によって新たに作られたベクトル同士の内積は、

$$ (\ket a \otimes \ket b) (\ket c \otimes \ket d) = \braket{a}{c} \braket{b}{d} $$

と計算できる。テンソル積を計算してベクトルを作り上げることを、それぞれ左右行ってから内積を取るように、 内積を2つとってから、単に掛け算するほうが簡単そうだ。しかも、テンソル積$\otimes$で仕切られた右と左をそれぞれ計算するだけという、極めて覚えやすい形になっている。

さらに、演算子$A$と$B$があるとしよう。これらのテンソル積$A\otimes B$も演算子になる。この演算子を$\ket a \otimes \ket b$という新たなベクトルに作用させる式は

$$ (A \otimes B) (\ket a \otimes \ket b) = (A\ket{a})\otimes (B\ket{b}) $$

となる。おわかりだろうか。演算子同士のテンソル積というのは結構めんどくさい。そいつを計算してから、更にベクトル同士のテンソル積をとって最後に、新しい演算子を新しいベクトルに作用させるのは甚だ面倒だ。 ところが、テンソル積の性質を使うと、$\otimes$で仕切られた左側と右側をそれぞれ計算して、テンソル積は1回だけ計算するので済む。 まあハッキリってそれが計算量的に得なのかは知らないが、量子計算では$\odot$は頻繁に出てくる。計算済の新しいベクトル(あるいはテンソル)をすぐさま想像する必要はない。 そういう計算によって新たなテンソルを生むのは事実だが、そこを置いておいたままでも効率よく式を整理することができるのだ。

 

もう怖気づかないで済みそう。

 

何より、これらの性質を覚えるのはそれ程難しくない。単にテンソル積は元々のベクトル、あるいは演算子を区切っている仕切りくらいの感覚でもまず大丈夫そうだ。