IBMの量子コンピュータを使ってみた

jp.techcrunch.com

5月にIBMが誰にでも使える量子コンピュータを公開したことがニュースになってました.興味はありつつも5qubitしかないし大したことできそうにないなーと思って今まで触ってなかったんですが簡単な量子アルゴリズムを動かしてみるだけならできるんじゃないかと思って実際に登録して触ってみました.

まずはアカウントを登録

結構SignUp画面がどこにあるのか分かりにくくて苦労しました……

http://www.research.ibm.com/quantum/www.research.ibm.com

上のページが実際にIBMが公開している量子コンピュータの紹介ページです.

この量子コンピュータを使うためにはアカウントを取得する必要があります.

既にアカウントを持っているという人は右上のloginから自分のアカウントでログインしてもらえれば使えます.

アカウントを持っていない人はこちらからアカウントを作成してください.

これ使って何したいのとか色々聞かれますが適当に答えても多分大丈夫です.

無事アカウントが登録できたらチュートリアルをやってみましょう.

チュートリアル

幾つかの章から成っていてそれぞれの章は主に次のような内容になってます.

IBMのページなので全て英語で書かれているので興味があるところは頑張って読んでみてください.

この記事では実際に量子コンピュータを使ってみた話をするので量子アルゴリズムのうち「Deutsch-Jozsa algorithm」を実行した時のことについて解説していきます.

Deutsch-Jozsa algorithm

Deutsch-Jozsa algorithmの概要

Deutsch-Jozsa algorithmは初めて量子アルゴリズムの有用性を示したアルゴリズムでもあります.

Deutsch-Jozsa algorithmが対象とする問題は次のように定義される問題です.

 xをn-bitで表される入力として, f(x) xを入力として受け取り0or1を出力する関数であるとします.ここで f(x)は定数関数かバランス関数のどちらかであるとします.定数関数はどの入力に対しても同じ値 c(0or1)を出力する関数,バランス関数は全ての入力のうちちょうど半分の入力に対して0を,残りの半分の入力に対して1を出力する関数です.この関数に対していくつかの入力を与え出力を得ることで,この関数が定数関数かバランス関数かを判別することがこの問題の目的です.

古典計算では,最悪のケースだと 2^{n-1}+1の入力を与える必要があります.ところがDeutsch-Jozsa algorithmにおいては,関数を一度評価するだけで問題の解答を得ることが出来ます.量子計算の世界では関数 fは,オラクル U_fとして表されます.

では実際にDeutsch-Jozsa algorithmはどのような手順をふむアルゴリズムなのかその手順を以下に述べます.

  • n-bitを全て0の状態で初期化
  • 全てのbitにHゲートを適用
  •  U_fを適用
  • 全てのbitにHゲートを適用
  • 全てのbitを測定し,全て0であれば fは定数関数,そうでなければバランス関数

この手順で正しい結果が得られる理論的な理由はチュートリアルのアルゴリズムのページに書かれているので理由が知りたい方は読んでみてください.

実際にやってみた

では実際にIBM量子コンピュータを使ってこのアルゴリズムを動かしてみましょう.実は n=3の時のサンプルのコードと結果を見るだけならチュートリアルのページの下の方に乗っているのでそちらをどうぞ.

今回は自分で組んでみるということで n=4でやってみます.まずはcomposerをクリックしてコードを記述する準備をしましょう.既にこれまでにページの下にあったコードをcomposerで開いていた場合は前に開いたコードが出てきているかもしれないのでその場合はNewをクリックしてください.

すると新しくファイルを作成する画面が出てきますので名前を適当に付けましょう.Ideal Quantum ProcessorとReal Quantum Processorとありますが,理論的に正確な動きが見たいならIdeal Quantum Processorを,デバイス的なエラー込みの動きが見たいならReal Quantum Processorを選んでください(どちらでもやり方は一緒で結果が少し変わってきます).

ここからゲートを配置することでアルゴリズムを実装していきます.今回は n=4の場合をやってみるので上から4つのbit( Q_3まで)を使用し,一番下のbitは無視します.

まず最初のステップの全てを0で初期化は最初の状態で既にそうなっているので何もしないで大丈夫です.

次に全てのbitにHゲートを適用します.各bitが並んでいる部分の下に色々なゲートが置かれている部分があるので,そこからHゲートを Q_0,\dots,Q_3のbitに適用しましょう.画面の左から右に向かって順番にゲートが適用されていくので,今回配置するHゲートは各bitの左の方に配置するようにしましょう.

次にオラクルを適用させる部分ですが,今回はオラクルが与えられていないのでオラクルも自分たちで作ることになります.一番手っ取り早くバランス関数のオラクルを実装しようと思ったら適当に1つbitを選びそのbitにZゲートを適用させます.そうするとその選んだbitが0の時は何もせず,1の時には位相を-にするので選んだbitが1の時に出力が1となる関数のオラクルとなります.選んだbitが0になる入力と1になる入力は丁度半々なのでこれはバランス関数のオラクルとなっています.実際にゲートを配置するときには先程配置したHゲートより右側に配置するように気をつけましょう.

更にもう一度全てのbitにHゲートを適用します.これまでに配置したゲートよりも右側に配置すること以外は今までやってきたことと同様に配置できます.

最後にbitの測定を行います.測定を行う部品はピンクの部品のうち,半弧と矢印が書かれており,小さくzと書かれている部品です.これを Q_0,\dots,Q_3のbitにそれぞれ配置します.今まで配置してきたゲートよりも右側に配置してください.ここまでの配置のサンプルが次の図になります. f:id:kadora:20160910223322j:plain

ここまで終わればアルゴリズムの実装は終わりです.いよいよアルゴリズムを実行してみましょう.ゲートの部品より下の方にあるRunボタンを押してみましょう.

確率的な結果が得られるため,何度試行を行うかの選択が出ますから適当なものを選びましょう.1回だけの試行も選択出来ますが1回のものでは当然確率のバラつきは分かりません.

試行回数を選ぶと過去に同じ回路で同じ試行回数を試した人がいた場合にはResult from Cacheの項があります.こちらの項を選ぶと過去に同じ回路を同じ試行回数で実行した時の結果が閲覧出来ます.もし過去に同じ回路を同じ試行回数で実行した人がいなければNew Executionの項だけが表示されるのでNew Executionを実行しましょう.そうするとしばらくした後にもう一度Runをクリックし同じ設定で進んでいくとResult from Cacheの項が追加されているので先ほど実行した結果が閲覧できるようになっています(結果が閲覧できるようになるとアカウント作成時に登録したアドレスにメールが来るみたいです).

結果の画面ですがデフォルトだと最初に回路を実行した後の測定前のBloch Sphereでの表現があり,次に実行した量子回路,そしてその下に量子回路をコードで表したものが表示されます.このままだと確率が分かりにくいので表示を変更しましょう.結果画面の上の方にあるShowBarsをクリックすると最終的なbitの測定結果とその測定結果が得られる確率がグラフで表されたものが見れます.結果を見るとバランス関数なので確かに全部0が得られる確率は誤差でしかないことが分かります. f:id:kadora:20160910223325j:plain

バランス関数ではなく定数関数の場合の結果が見たい場合はオラクルを実現するためにZゲートを配置したところで何も配置しないでおけば全ての入力に対して0を返す定数関数のオラクルとなるので興味のある人は試してみてください.

感想

5bitしかない簡単なものですけど実際に量子コンピュータを実行した結果が見られるというのは中々面白いものでした.まぁ5bitくらいならまだ古典コンピュータでもシミュレーションできなくも無いレベルですけどね.今後IBMがもっと多いbit数でも使えるようなものを提供してくれれば更に複雑なアルゴリズムでも実装出来る様になるので今後に期待ですね.他のアルゴリズムについても解説してほしい等の要望があれば次回以降やってみるかもしれません.