量子計算機は夢の機械か?

MacUser/Japanの読者の皆さんなら計算機に興味のある方も多いと思う。で、ひょっとしたらどこかで「量子計算機」という言葉を耳にしたことがあるのではないだろうか。それは、すでに限界に近づきつつある計算機の進歩を更に一段階飛躍させるための夢のアーキテクチャーだ。今回のインタラクティブ・サイエンス・コラムでは、この量子計算機について計算機科学者である西野哲朗先生に伺った。

計算機とはつまり、「プログラム可能な機械」ということだろうか?もし、そうならその源流は19世紀の「階差機関」の考案者、バベッジにまで遡ることが出来、また、最初のプログラマーはバイロンの娘、エイダにまで遡れるという。もっとも、バベッジの計算機は機械仕掛けで蒸気機関駆動を想定して作られていた。現在の様な計算機の隆盛を生むアーキテクチャーは基本的に半導体技術の進歩無くしては語れない。非常に初期の電子計算機は真空管で作られていて、ごく簡単な回路を組むのにも部屋一つくらいの面積が必要で、まともな計算機を組み上げようと思ったら、それこそ体育館くらいの大きさの空間が必要だった。このような状況を救ったのが、大規模集積回路技術、LSIである。この技術を使えば、回路をあらかじめ基板の上に描いておくだけで望み通りの回路を組み上げることが出来る。後から配線する手間は一切無いのだ。しかも、絵を描くことさえ出来ればいいのだから、事実上「印刷できる最小の大きさ」で回路を組むことが出来る。最近の計算機の進歩とは突き詰めればいかに小さく回路が作れるか、という絶間ない技術的進歩そのものだったと言っても過言ではない。小さければ小さいほど、安くて高速な計算機が作れるからだ。
しかし、物事には限度というものがある。回路を描くための線をどんどん細くして行けばいずれ、物質を構成している最小単位である「原子」のレベルに到達してしまう。「そんなおおげさな」と言うも知れないが、原子の大きさは、たかだか、1ミリの一千万分の一しかないのだ。回路の中の配線の太さと原子の大きさが同じくらいになる日はもうそこまできている。
実際には限界は、配線の太さが原子の太さになる前にやってくる。計算機の基本である電子回路を司る法則が普通の電気回路の法則から量子力学の法則に移行するからだ。量子力学の世界では配線の中を流れる電子が隣の配線に「にじみ出て」しまう。つまり、配線のどこにどれだけ電気が流れているのか解らなくなってしまうのだ。これでは、回路なんて組めるわけが無い!
だが、よくしたもので人間には「災い転じて福と成す」という能力がある。それなら最初っからそういう前提で回路を組めばいいではないか、というわけだ。結局、計算機というのは足し算・引き算のような四則演算を行っているに過ぎないから、それを「どこに電流が流れているか解らない」という前提の元に実行する回路が作れればいいわけだ。これだけでも、普通の電気回路として動作しないような小さな回路を作ることが出来る、という意味で十分価値があったのだが、更に、すごいことを考えた人がいた。量子力学の原理を使って普通の電気回路の計算を越える演算が出来る回路を作れないか?」と考えた人がいたのだ。
その原理は簡単にいうと「いままでは一度に出来なかった計算を一度にやる」というやり方だ。量子力学の世界では、配線のどの部分に電子がいるのか区別できない。これは、逆にいうと「配線のどこにでも電子がある」ということだ。あるいは、「回路に電気が流れている状態の全てを重ねあわせた状態」と言ってもいい。普通の電気回路では足し算と引き算を同時にすることは出来ない。なぜなら、足し算のときと引き算のときは電気の流れ方が異なるからだ。だが、量子力学の電子回路では「引算の時の電気の流れ方」と「足し算の時の電気の流れ方」を両方同時に計算できる。このやり方を使うと今までとは比較にならないほどの計算を一度に行うことが出来る。この原理を取り入れたのが量子計算機である。
さて、ここまで読んできて賢明なる読者の中にはどこかおかしい、と感じられた方がおられるのではないだろうか。「全ての計算を同時にやったら答えも同時に出てくる。つまり、答えもいろいろな答えの重ねあわせの状態になってしまうのではないか?」1足す1と1引く1を同時ににやったら答えも1足す1の答えの2と1引く1の答えの0との重ねあわせで2と0の混じった回路の状態が出てくるはずだ。これからどうやって1足す1の答えの「2」と1引く1の答えの「0」を分離するのだろうか?実際、これこそが、量子計算機実用化の最大の難点だった。
実は最近、量子計算機が注目されている理由は、現実にこの困難を回避できる素晴らしいアルゴリズムが発見されたことによる。このアルゴリズムを使うと、非常に難しい問題とされていた大きな整数を小さな数の積で表す問題(例えば、1547=13×17×7とか)をごく短い計算時間で行うことが出来るのだ。大きな整数を小さな数の積に簡単に分けられるようになると、これからの計算機+ネットワーク社会で印鑑や鍵の役割を担うと思われている計算機暗号が簡単に破られてしまうのである。
ただ、現実には暗号破りに使えるような高性能の量子計算機は当分出来ないだろうと言われている。様々な技術的な困難があるからだ。この困難を乗り越えるにはまだ何十年もかかるだろうといわれている。しかし、逆にいえばたかが何十年のオーダーである。計算機が生まれてからここまでくるのに半世紀かかっていることを考えれば何十年という長さはそれほど、長い時間ではない。ひょっとすると、木村拓也が高倉健の年になったときに「カーンターンじゃねーか」と言いながらCMでいじくりまわすのは量子計算機かもしれない。



バベッジ、エイダ
この辺の事情について興味のある方は、「誰がどうやってコンピューターを創ったのか?」(星野 力著・共立出版)をお読み下さい。
一千万分の一しかない
かつて計算機が体育館くらいの大きさ(百メートル四方)であったときの性能は現在のポケット電卓(数センチ四方)の性能かそれ以下であったと言われている。体育館時代の計算機は真空管で作られていたから、配線も普通の電線で太さ一ミリくらいだっただろう。ポケット計算機のおおきさになってそれに比例して配線の太さも細くなったとすると、いま、配線の「太さ」は何ミリだろうか?1センチは百メートルの一万分の一であるから、配線も一ミリの一万分の一くらいの太さになっているだろう。原子は一ミリの一千万分の一であったから、既に配線の太さはたかだか原子千個分程度の太さしかない。電子計算機の誕生以来我々が成し遂げた小型化(一万分の一)程度の小型化をこれからさきすることさえ、既に不可能なのだ。
量子力学の世界では配線の中を流れる電子が隣の配線に「にじみ出て」しまう。 電線の中を電気(つまり、電子)が流れるのはどうしてだろうか?それは電線の中の方が電気が流れやすいからだ。あたりまえのことだが、電池に電線をつなぐと電気は電線の中を流れる。別に、電線をつながなくたって、空気中を電気が流れたっていいわけだが、電線の中の方が流れやすいから流れるのだ。実際、空気中を電気が全然流れないわけではなくて、わずかには電気が流れる。だからこそ、「放電」という現象が起きて、使ってもいない電池が弱くなってしまうのだ。「電気は流れやすいところを流れる」という原理は普通は正しいのだが、量子力学の世界では必ずしも正しくなく、本来は絶縁体である空気中を通り抜けて電気が流れることもあるのだ。このため、本来は空気で隔てられているはずの隣り合った二本の配線が一本の線の様になってしまい、「どこに電気が流れているか解らない」という状態が出現する。
量子力学の法則・量子力学の世界
量子力学の世界ではいろいろ奇妙なことが起きるが、そのうちの一つが「トンネル効果」である。さて、あなたは自転車で気持ちよくサイクリングをしている。ふと、気付くと目的地まで行くのに山を越えないといけない(つまり、坂を登って降りる)。現実の世界では「あー、やだな」となるところだが、量子力学の世界ではちょっと違う。まず、坂が近くなったら道路が平らなうちに一生懸命、自転車をこぐ。ここまでは、現実の世界と同じ。現実の世界では、どんなに一生懸命勢いをつけても坂を登りはじめると勢いが衰えて、自転車を漕ぐか降りて押す羽目になる。しかし、量子力学の世界では、非常にわずかな確率ではあるが、「自転車を漕がずに」山を越えることが出来る。別に難しいことではなくて、ただ、自転車に乗ったまま坂に突っ込めばいつの間にか坂を越えてしまうのだ。これが、あたかも山の真ん中にトンネルがあって坂など越えなかったように見えることから「トンネル効果」と呼ばれているのだ。
さて、電気回路の話しに戻ろう。電気回路の中の配線は、電子にとっては峠と峠に挟まれた谷底の道のようなものだ。峠は空気である。電子は空気で隔てられた隣の配線に行くためには峠を越えなくてはいけないので行くことが出来ず、配線の中に留まる。これが平たく言うと「電子(=電気)が配線(=電線)の中を流れる」と言うことの意味だ。ところが、量子力学の世界では、「トンネル効果」のせいで峠を越えずに隣の道(=電線)に行くことができてしまう。(非常に小さな確率で、だが)つまり、「電子が隣の配線に電子がにじみでる」はめになり、どこにどれくらい電気が流れているのかよく解らなくなってしまうのだ。
いつの間にか坂を越えてしまう
物理に詳しい人なら「エネルギー保存則に反する」と言われるかもしれないが、坂を登る前と越えた後は両方とも平地にいるわけだから、坂を登る前後でのエネルギーは同じなので、エネルギー保存則には反しない。では、坂の途中は?途中ではどうなるだろうか?これをちゃんと説明するのは難しい。まあ、今回は止めておこう(本当は僕にも良く解らない)。
四則演算を行っている
別に僕も詳しくないのだが、解る限りのことを説明しよう。演算をするにはまず、数を表現しないといけない。そろばんでは、これを玉の上げ下げで行うわけだが電子計算機ではこれを電気的に行うわけだ。別に、そろばんの玉をそのまま電気的に回路の中に作ってもいいのだが、電子計算機ではもっとも誤差の少ない方法をとり入れている。回路内に電気があるか、ないかで「1」か「0」をわりあてる。回路内にある「1」の数で数を表し(つまり、「1」が10個あれば「10」とか)てもよかったのだが、これでは大きな数を表すのに効率が悪い(1万をあらわそうとすると回路が1万個必要になる)。そこで、計算機では二進法というやり方を使うことにしている。こうすると、1万のような大きな数も10011100010000という「少ない」桁で表現できる(「少なくない」と思うかもしれないが、「1」を1万個ならべるのに比べればは100分の1くらいである。)。

二進法
10進法は全ての数をゼロから9迄の数で表現する。2進法は全ての数をゼロと1で表現する。11が十進法で11と表されるのは左の1が10を表し、右の1が1を表し、10+1だからである。同じ様に二進法で11は左の1が2を表し、右の1が1を表すので1+1=3になる。だから2進法で100は4である。まあ、これくらいにしておこう。とにかく、ゼロと1だけで全ての数を表すことが出来る計算機向きの数の表記方法が二進法である。
「量子力学の原理を使って普通の電気回路の計算を越える演算が出来る回路を作れないか?」
さて、通常の計算機では回路に「電気があるかないか」で、「1」と「0」を表現した。電気回路に流れている電流はもともと連続な量だから、整数のように離散的な量を表すのには不適切に出来ている。だが、量子力学は最初っから不連続な量を表現するのに適しているのだ。量子力学では、いちいち電気を流さなくても最初から、
離散的なマークがついている。このマークの内の2つを持ってきて、片一方をゼロ、片一方を1としてやれば簡単に二進法の表示につかうことができる。例えて言うなら、量子力学の世界には最初っから「そろばんの玉」が仕込まれていて、天然の計算機のような仕組みがあるのだ。

>離散的なマーク
日常の世界では何でも好きなことが出来る。だが、量子力学の世界では、好き勝手なことが出来ない。例えて言うなら、日常の世界では高速道路を好きな速度で走ることが出来るが、量子力学の世界では時速10km、20km、30km、.....など「離散的な」値でしか走ることが出来ない。そこで、時速10kmの状態で走っていれば「0」、時速20kmの状態で走っていれば「1」の状態と決めておけば面倒なことをしなくても簡単に二進法で数を表現するのに使うことが出来るのだ。そういう意味では量子力学の世界は最初からコンピュータ向きの構造をもっているわけだ。

コンピュータ向きの構造
まあ、正確には量子計算機は「回路」を使うわけではない。原子をたくさん持ってきて、原子が量子的にとる状態の内の2つを持ってきて「0」状態と「1」状態の代わりに使う。この世の物質は全て原子で出来ているから、そのままで、「量子計算機」になっているわけだ。まあ、色々問題はあるのだけれど。
両方同時に計算できる
量子の世界では「どこに電気が流れているか解らない」と言ったが、実は解らないのは場所だけでなくて、どのくらい電流が流れているかも良く解らない。うまく状態を作ってやれば「流れている状態」と「流れていない状態」の中間の状態を作ることが出来る。つまり、流れている状態(「1」状態)と流れていない状態(「0」の状態)の「中間状態」を作れる。つまり、これは計算の規則で言うと違う2つの数の中間の状態をつくれるということだ。(例えば、
「2」と「3」の中間の状態、とか)この中間状態の足し算を行うと一度に複数の計算をすることが出来る。 例えば、「2」と「3」の中間状態と「5」と「6」の中間状態を「足す」と答えは「2+5=7」と「3+6=9」で「7」と「9」の中間状態を作ることが出来る。つまり、2回分の計算を「一回で」することができるわけだ。これはいくらでも拡張できる「1」から「100」までの状態全ての中間状態を「1001」から「1100」までの状態全ての中間状態に加えると、たった一回の足し算で100回分の足し算をたった一回の足し算で出来ることが出来る。これが、「量子計算機は今までの計算機が出来ないほどのたくさんの計算を一度に出来る理由」である。理論的には「量子計算機はいくらでも早くなる驚異の計算機」というわけだ。
「2」と「3」の中間の状態
「2と3の中間状態なら2.5だろう?」と思うかもしれないが、量子計算機の中では「0」や「1」を表すのに離散的なマークを用いたことを思い出して欲しい。中間の状態は無いのだ。にも関らず、無理矢理中間の状態を作ろうとすると、「0」と「1」の「中間状態」が出来るしかないのだ。 まだ、解らないって?
まだ、解らないって?
「0」と「1」の中間状態とは何だろうか?実は量子力学でも本当のところは良く解らない。ただ、「中間状態」は本当は「0」か「1」になっているわけだ。「本当は」というのは実際に良く見ると「0」か「1」だ、ということだ。ボーッと眺めているともやもやしていてどっちだか解らないが目を凝らしてみるとちゃんとどっちかになっている。ただ、実際にどっちになっているかは完全に確率の問題で、実際によく見てみるまで解らない。つまり、「見るまでは中間状態、見てしまえば「0」か「1」」という状態なのだ。まだ、解らないって?
まだ、解らないって?
うーん、段々説明がややこしくなっていく。「0」か「1」の状態だが良く見ると「0」か「1」、だって?。じゃあ、よく見てみたら「0」だったとして、「1」だった分はどこへ行ったのか?これこそ、誰にも答えられない難しい問いだ。答えは一応「この宇宙には平行世界があり、この世界では「0」が選ばれたが、別の平行宇宙では「1」が選ばれた」と言うことになっている。何だか、SFまがいだが、 一応、こういうことになっている。嘘臭いって?僕もそう思います。ハイ。
安くて高速な計算機
基本的に印刷なのだから小さいほうが安いのは言うまでもないだろう。これは計算の中心となる演算チップとメモリーについてあてはまることだ。更に、速い計算機を作るには、足し算・引き算などをすばやく行わなくてはならない。素早く行う=一回の演算当たりの周期が短い=周波数が大きい=高周波を使わなくてはならない。どんな回路でも回路に電流を流せば、高い周波数ほどたくさん電力を消費する。消費された電力は結局はみんな熱になってしまう。発生した熱は冷やさないと回路が壊れてしまうし、消費電力が大きければそれだけ電源などの周辺部分も値段の高いものを使うことになる。周波数が高くても消費電力が少なくなるようにするには流れる電流を少なく押さえることができればいい。少ない電流で済ますには回路内の配線の総長が短ければいい=回路全体が小さければいい、ということになる。だから、とにかく回路を小さくする、それが「安くて速い計算機」を作るための至上命令なのだ。
ごく短い計算時間で行うことが出来る
西野先生はこのアルゴリズム発明のきっかけになったDaniel Simon氏のレクチャー・ノートに沿って説明してくださった(ただ、僕にも難しくてちゃんと解っているわけではない。ごめんなさい)。ここの説明はかなり難しい。解りにくくても勘弁していただきたい。さて、大きな数を小さな数の積に分けるにはいろいろなやり方があるが本質的に「全ての数で割ってみる」というやり方(例えば、8を1、2、3、4、5、6、7で割ってみて、4と2で割り切れるから8=4×2だ、と解るというやり方)よりも効率の良いやり方は無い、と信じられている。大きな数、例えば、20桁とか40桁の数になると、こういう単純な計算をするのにもあまりにも計算量が膨大すぎて計算しきれなくなる。
これを量子計算機でやるには次の様にする(といっても、あくまでも比喩的な説明にすぎない。実際にこういうことをするわけではないが)。まず、分解したい大きな数より小さい全ての数の「中間状態」をつくる。(例えば、1547を分解したければ、1、2、3、.......1546の全ての状態を重ねあわせた中間状態を作る。)そして、1547をこの「中間状態」で割り算して「余り」を求める。すると、たった一回の割り算で1547を1547未満の全ての数で割った「余り」の重ねあわせの「中間状態」を得ることが出来る。つまり、分解したい数が20桁だろうが40桁だろうが、たった一回の割り算で全ての「余り」を求めることが出来るという魔法の計算機が量子計算機というわけだ!この「余り」が「ゼロ」になっている数だけを集めてくれば一回で分解が完了する!なんてすごいんだ!
だが、問題が一個だけある。「どの数のあまりがゼロになっているか」をどうやって調べるのか?一個一個の数について調べていたら結局、大きな数の大きさ回だけ(1547なら1547回)演算をしなくてはいけなくなるので結局、ちっとも速くならない。答えが求まっていても「読みだし操作」に時間がかかってしまう。これでは何の意味もない。
これを回避するには、余りがゼロになった数だけを切り出す方法が必要だが、量子力学の原理で動いている量子計算機ではこれをうまくやることが出来る。この方法を用いて求めた答えは、50%の確率で正しい。「なんだ、50%か」と思うかもしれないが、例え、50%の確率でも10回も繰り返せば、10回全て外れる確率は0.5の10乗で大体1000分の一くらいになる。1000分の一でも駄目な確率があるのか、と思うかもしれないが、20乗でも100乗でも何回でも繰り返せば、いつか「回路のハード的なエラー率」より小さくなる。量子計算機といえども、ある「装置」の上の「プログラム」に過ぎない。ハードの正確さ以上に正確なプログラムは必要ないというわけだ。量子力学の原理を用いることにより、データの読みだしをせずに余りが「ゼロ」になっている数だけをある確率精度で導き出すことに成功したことが、量子計算機の成功の秘密だった。
Daniel Simon
1992年にトロント大学にてPh.D.取得。モントリオール大学にて1992年から1994年まで博士研究員を勤め、量子コンピュータ・アルゴリズムの画期的な研究を行なった。現在は米MicroSoft社でコンピュータ用の暗号開発に従事。
量子計算機ではこれをうまくやることが出来る
量子力学の世界では、「負の確率」(のようなもの)を導入できる。負の確率と正の確率のものがあれば打ち消しあって、消えてしまう。割り算の「余り」は同じ値を取りうる。1547であれば、10で割っても20で割っても余り7が出る。だから、中間状態を使った余りを求める計算の答えには複数の「余り7状態」が含まれている。このうち、半分が負の確率になるようにうまく調整すると、打ち消しあって消えてしまう。「余りゼロ」の状態だけ残るようにうまく操作してやれば、いちいち、余りゼロの数はどれかを調べることなく全ての余りゼロの数を求めることが出来、従って、大きな数を小さな数の積で表現できる。もっと詳しく知りたい人は、近く書かれる西野先生の詳しい解説を読んでいただきたい。
技術的な困難
量子計算機はノイズに弱い。回路に非常にわずかな電波や光が飛び込んだだけで、回路がちょっと振動しただけで、量子計算機の計算はめちゃくちゃになってしまう。この困難を回避できるほど安定した量子計算機を作れる様になるのはまだだいぶ先の話しなのだ。