量子プログラミングを知ろう その1
こんにちは
麻婆豆腐は痘痕顔の婆さんが作った料理だと家庭科教師が言っていました
ところで量子プログラミング、知りたいですよね
ということで早速解説していきます
量子コンピュータとは?
そもそも量子コンピュータ(quantum computer)とは何なのでしょうか
quantumはそのまま「量子」や「量」という意味ですね
quantityと同語根だと言えばわかりやすいでしょう
ではその対義語ともいえるqualityはqualumになるのかというとそうでもないようですね
ラテン語で「バスケット」らしいです
ちなみにqualmは「不安」「気のとがめ」「良心の呵責」だそうです
こんな単語も収録してしまっている自作の異質な小辞典を配信中です(ダイマ) 500円で販売してますが上のリンクからなら無料で入手できます
だいぶ話が逸れましたね
「量子」とは『物理学において用いられる、様々な物理現象における物理量の最小単位である。主に巨視的な物理を取り扱う古典力学では、物理量は実数で表される連続量だが、量子力学では、量子を数え上げたものとして扱われる。たとえば電気量は、電気素量の整数倍の値となる。
また、量子力学では微視的物質は粒子と波動の二重性を持つと仮定する。このとき、量子力学が適応されうる粒子を指して量子力学的粒子、または量子と呼ぶ例も存在する。』らしいです(Wikipedia)
なんだか難しいことばかり書いてあってよくわかりませんね
ただ皆さんも「量子もつれ」という言葉は聞いたことがあるはずです
私は生物屋なので詳し言ことは語れませんが、量子もつれとは複数の粒子間に量子力学的な相関がある状態のことを指すようです
量子もつれ状態にある2つの粒子では、片方の状態が決まるともう一方の状態もそれに応じて決まり、その関係は粒子間の距離に依存しないのだとか
まあこの説明はまたそのうちすると思います
今回は量子ビットと量子コンピュータについて話します
量子ビットにできること
従来の1ビットは0と1の2つの状態を取ることができ、2ビットなら00、01、10、11の4つの値を表せ、演算の結果は毎回同じ(01+01は10で常に一定)ですよね
しかし、1量子ビットは|0⟩と|1⟩の2つの状態、2量子ビットは|00⟩、|01⟩、|10⟩、|11⟩の4つの値を表す点は従来と同じですが、演算の結果が一意に定まらない(|00⟩+|01⟩は|01⟩かもしれないし|10⟩かもしれない)という性質をもつわけです
つまり、nビットは2^n種類の値を表すことができるが同時に持てる情報は1つだけなのに対して、n量子ビットは2^n種類の値を表すことができ、そしてそれらの情報を同時に持つことができるのです
有名な思考実験にシュレディンガーの猫というものがありますが、あれも量子力学に関連する話で、猫が生きている状態と死んでいる状態が重ね合わさっているというものですね
このように、より少ない値でより多くの情報を持つことができるというのが量子ビットの性質ですが、だからといって既存のプログラムを全て量子ビットで記述しなおそう、とはなりませんね
その理由として、「量子ビットだから全ての計算が早くなるわけではない」ということが挙げられます
量子ビット用に最適化されたプログラムであれば従来のプログラムより複雑な計算を早く行うことができるというのは事実ですが、未だ発展途上の分野なので量子コンピュータは実用的であるとは言えません
何故今量子プログラミングをするのか
先述の通り、量子コンピュータとは「『未だ』発展途上」であるだけで、もし高性能な量子コンピュータが実用化されれば従来の高性能PCやスパコンなんかとは比べ物にならないほどの性能を誇るでしょう
そんな新時代についていけるように...と言いたいところですが、まあそんなのは正直どうでもいいんです
何というか、「量子コンピュータ」って凄そうじゃないですか
「趣味は量子プログラミングです」とか言ったらそれだけですごく頭良さそうじゃないですか
そんな適当な動機で学び始めても、量子プログラミングのコンテストに参加して参加賞でも貰えたらラッキーじゃないですか
そういう感じです(?)
まあ知っておいて損はないと思いますしね
基本的な用語の説明
今後は量子コンピュータ(quantum computer)、量子ビット(quantum bit、qubit)という概念について紹介していきます
それに対して従来のコンピュータを古典コンピュータ(classical computer)と呼び、従来のビットを古典ビット(classical bit)と呼ぶことにします
レトロニムですね
以降、1bitと書いたら古典ビットを、1qubitと書いたら量子ビットを指します
他にも色々ありますが、それらは追って説明します
量子プログラミングの基本計算
数学よりは簡単だと思います
1つの量子ビットの任意の状態|ψ⟩
$ |ψ⟩ = a_0 |0⟩ + a_1 |1⟩
1qubitは$ |0⟩と$ |1⟩のどちらかを一定の確率で表します
この$ a_0と$ a_1は「複素振幅」と呼ばれる複素数です
ここで$ |ψ⟩は$ |a_0|^2の確率で$ |0⟩を、$ |a_1|^2の確率で$ |1⟩を表し、$ |a_0|^2 + |a_1|^2 = 1となります
必ずそのどちらかを表すため確率の和が1になるんですね
このような状態を量子状態と呼びます
また、$ |0⟩ = \begin{pmatrix} 1 \\ 0 \end{pmatrix}、$ |1⟩ = \begin{pmatrix} 0 \\ 1 \end{pmatrix}のようにベクトルで表す場合、
$ |ψ⟩ = a_0 |0⟩ + a_1 |1⟩ = \begin{pmatrix} a_0 \\ a_1 \end{pmatrix}という式が成り立ちます
このような表記を量子状態の状態ベクトルと呼びます
nqubitでも同様にして$ |ψ⟩ = a_0 |0...0⟩_n + a_1 |0...1⟩_n + ... + a_{2^n-1} |1...1⟩_n = \begin{pmatrix} a_0 \\ ⋮ \\ a_{2^n-1} \end{pmatrix}となります
ここでもやはり$ |a_0|^2 + |a_1|^2 + ... + |a_{2^n-1}|^2 = 1ですね
2qubitであれば、$ |00⟩、$ \frac{1}{\sqrt 2}(|00⟩ + |01⟩)のような量子状態があるわけです
また、$ |ψ⟩ = \frac{1}{\sqrt 4}(|00⟩ + |01⟩ + |10⟩ + |11⟩)は$ |00⟩、|01⟩、|10⟩、|11⟩の一様な重ね合わせ状態です
ちなみに$ |00⟩、|01⟩、|10⟩、|11⟩のような状態を2qubitの計算基底状態といいます
ということで今回はこの辺で
ではまた