feature image

2023年3月20日 | ブログ記事

#春から量子コンピュータ

新歓ブログリレー2023 12日目の記事です。

はじめに

23Bの皆さん初めまして。初めてじゃない人も初めまして。22Bのわらびです。

皆さんは春休みをいかがお過ごしですか?突然暇になってやることがない!何か新しい事始めたい!という人は今すぐ量子コンピュータを始めましょう。今すぐです。こういうのは鮮度が命です。

この記事では理論を棚に上げて、とにかく実際の量子コンピュータを触ってみるところから始めます。量子コンピュータを本格的に理解するために必要な知識は膨大なので真面目にやってると入学式が来てしまいます。なので3分クッキングの要領でサクッと始めちゃいましょう。

(理論は後回しにするので「なんで?」とか「これ何?」とか思ってもそのまま先に進んでください)

(僕もまだまだにわかです。プログラムが実行できることは検証済みですが一部説明が間違っていたり、解釈が不完全である可能性があります。間違いに気づいた方はDMとかで教えてください。)

量子コンピュータって何?

未知の世界を探求する人々は、地図を持たない旅行者である
—湯川秀樹

理論を棚に上げるとは言ったものの量子コンピュータについて軽く紹介します。お堅い話は御免だ!と言う人は飛ばしてもらって大丈夫です。

量子コンピュータとは量子力学的な現象を使って計算をする機械です。僕たちが普段使っているコンピュータ(以下古典コンピュータと言います)との最も大きな違いは「データの表現の仕方」です。古典コンピュータは0と1を使ってデータを表現するというのを聞いたことがありますか?この0か1を取りうる情報の最小単位のことを「ビット」と言います。数字も文字もゲームも動画も、ありとあらゆるデータは「ビット」を用いて表現されます。一方の量子コンピュータは、0と1との重ね合わせになっている「量子ビット」と呼ばれるものを使って情報を表現します。これによって0と1の状態を同時に扱えるのでとんでもない並列計算が可能になります。この並列計算こそが量子コンピュータ最大の強みです。

従来のビットと量子ビットの違い

ここまでの話はニュースやネット記事で聞いたことあるって人も多いと思います。でも実際どんな感じで計算するのかピンとこない人も多いと思うので、実際に動かして感覚を掴んでいきましょう!

IBMidの登録

これから「本物の」量子コンピュータを操作していきます。実は、なんともファンタスティックなことにIBMが量子コンピュータをWeb上に公開していて家から気軽に操作できてしまいます。こんな時代に生まれた我々は幸せ者ですね。

IBMの量子コンピュータを使うためにはIBMidの登録をしないといけません。IBMのサイトに移動して「Create an IBMid account.」をクリックしてIBMidを作りましょう。途中で会社名を要求されますが「Other」と入力すれば大丈夫です。また、GoogleアカウントやGithubアカウントを持っていれば紐付けてログインすることもできます。

IBMidを作る

Quantum Composerで量子プログラミングを始める

考えるな、感じろ! それは月を指差すようなものだ。指先にとらわれるな、その先の栄光が得られんぞ!
—ブルース・リー

IDが登録されログインが完了すると次のような画面が出てきます。この画面が量子コンピュータ関連のサービスが詰まったホーム画面になります。

IBM Quantumのホーム画面

この画面からいろんな面白い情報にアクセスできますが今回は手っ取り早く量子コンピュータを使うために青の「Launch Composer」と書かれたボタンをクリックしてComposerを開きましょう。

Quantum Compoerではコードを書いたり、ブロックを組み合わせたりすることで実際に量子コンピュータを操作するための指示(量子プログラム)を作成することができます。画面上にたくさんの機能が並んでいますが主要な部分を軽く説明します。

Composerの各種機能
  1. Operations catalog : 量子ビットに対する操作がブロックとして並んでいます。このブロックを②の回路エディターにドラッグ&ドロップすることで簡単に量子プログラミングができます。
  2. Graphical circuit editor : 量子ビットに対する操作を視覚的に表現しています。五線譜のように線が並んでいますがこれらひとつひとつが量子ビットを表しています。ただし、一番下の二重線は従来のビットを表しています。この線上にブロックを置くことでその量子ビットへの操作を指定できます。これまた五線譜のように、処理は左から順番に実行されます。
  3. Visualizations : 量子ビットの状態を視覚化してくれます。左側は出力される値の確率、右側はブロッホ球と呼ばれる量子ビットの状態の表現の一種を表しています。具体的な説明はまた後で。
  4. Code editor : 量子プログラミング言語などを使ってコーディングができます。まずはブロックを使ってプログラムすることをお勧めしますが、ドラッグ&ドロップが面倒なのでコードでもできるようになると便利です(僕はできません)

プログラムの作成

あまりに単純なものから、人間が手に負えないほど複雑なものが作られる
—ジョン・アッシュベリー

何はともあれ実際にプログラミングをしてみましょう。今回作成するプログラムは「0か1をランダムに出力するプログラム」です。「え?それだけ?」と思われたそこのあなた!ちょっと待ってください!実はこのプログラム、古典コンピュータにはできないことを実現しています。「ランダムに出力」と言いましたが、ここで言うランダムとは量子力学的に完全なランダムであり、古典コンピュータでこのレベルの完全なランダムを実現することはかなり難しいです。つまりこのプログラムは量子コンピュータにしかできない芸当を実現しています。

そんな素晴らしいプログラムを作るのにどれだけ大量のブロックが必要なんだろうと思いましたか?実はこのプログラムに必要なブロックは2つだけです!

今回作る量子プログラムの全容

次の手順で画像のようにブロックを設置してください。

  1. まず量子ビットの数を調整します。初期画面だと「q[数字]」のように書かれた線が4本と「c4」と書かれた二重線が1本あると思います。それぞれ文字の部分をクリックすると消したり追加したりできるので本数を調節してください。二重線の方は文字をクリックすると「ー」と言う選択肢が出てきて選択すると数を減らせるので表示が「c1」になるまで減らしてください。
  2. ブロックを設置していきます。はじめに赤色で「H」と書かれたブロックをq[0]上の一番左に置いてください。このブロックは「アダマールゲート」と言う操作を表しています。
  3. 次にメーターのような絵が書いてあるブロックをアダマールゲートのすぐ右隣に置いてください。このブロックは「測定」を表していて量子ビットを実際に測定して値を決定します。ブロックから矢印が出ていますがこれは測定の結果をメモリに保存することを表しています。

プログラムの意味は後で説明します。とにかく実行してみましょう!

プログラムを実行

物事は初めはきまって少数の人によって、ときにはただ一人で始められるものである
—マハトマ・ガンジー

Quantum Composerではプログラムを簡単に実行できます。右上にある青い「Setup and run」と書かれたボタンをクリックしましょう。すると次のような表示が出てくるはずです。

「Choose a system or simulator」と書かれてところには選択できる量子コンピュータの実機やシミュレーターが並んでいます。「simularor」と書かれていないものはすべて実機です。それぞれの実機についていろいろな情報が書かれていますが今回注目すべきは「Total pending jobs」の部分です。ここには現在保留されているプログラムの数が書かれています。上の画像では「44」と書かれているので44個のプログラムが実行されるのを待っているということです。なのでなるべく数値が低いものを選びましょう。

システムを選んだら右側にある「Shots」の数値を変えて実行回数を調整しましょう。量子コンピュータの出力は確率的です。なので何回も実行して出力される値の分布を見るのが一般的です。今回はShotsの値を「2000」にして2000回実行するようにしましょう。コインを2000回振るようなものです。

ここまできたら「Run on ibmq_〇〇」で実行しましょう!場合によってはかなり時間がかかりますが、これは量子コンピュータが遅いのではなく、みんなが大量のプログラムを送っているせいで順番待ちをさせられているだけですので量子コンピュータのことを嫌いにならないでください。(あまりに時間がかかりすぎる!という人は「simulator」と書かれているものを選択してもう一度実行してみましょう。シミュレーターなので実機ではありませんが…)

実行結果は左側のツールバーから確認できます。「Results」の項目にヒストグラムが表示されていると思いますがこれが実行結果です。「00001」や「00000」は出力されて値の2進数表記で、それぞれの値がどれだけ出力されたかを表しています。今回は2000回実行したので1と0がおおよそ1000回ずつ出力されているはずです。このヒストグラムどこかでみた記憶がありませんか?実はComposerの左下で「Probabilities」と書かれていた部分のヒストグラムはこの実行結果を表していたのです!

実行結果がちゃんと出た!という人は「#春から量子コンピュータ」でツイートしてみましょう!僕がいいねしにいきます!(スクショは個人情報が入らないように気をつけてください)

プログラムの解説

困難は分割せよ
—ルネ・デカルト

今回作成したプログラムのすべてはこの図に詰まっています。

まず「q[0]」とは量子ビット。「c1」とは古典ビット(従来のビット)を表しているということを確認しておきましょう。「q[0]」は初期状態で「100%の確率で0」の状態にあります。なので「H」(アダマールゲートと言いました)がなければ必ず0を出力するプログラムになります。

続いて「q[0]」にアダマールゲートが作用しています。アダマールゲートはざっくり言うと「0と1を重ね合わせる」操作です。重ね合わせることで「50%で0、50%で1」の状態になります。これで0と1とランダムに出力する状態ができました。

最後に測定を行うことで結果を確定させます。確定した結果は古典的なビットと同等なので古典ビットに入力できます。

このプログラムはコイン投げに例えられます。0と裏、1と表を対応づけることとします。コインを投げ上げて回転している状態がプログラムでは重ね合わせの状態に対応します。コインが落ちてきて表か裏かが確定した状態がプログラムでは観測にあたります。

量子コンピュータを理解したいあなたへ

難しいからやろうとしないのではない。やろうとしないから、難しくなるのだ。
—ルキウス・アンナエウス・セネカ

量子コンピュータについて理解することは簡単なことではないですし、道のりは長いです。しかし、いかなる旅もどこかから始まります。ここからはこれから量子コンピュータの勉強を本格的に始めたいと思っている人へ向けて「旅のしおり」となるようなことを書いていこうと思います。ここから話が冗長になるので興味ない人は「さいごに」まで飛んでください。

まず量子コンピュータのプログラムを理解する上でコアとなる要素を2つ挙げます。それは「振幅」と「位相」です。どちらも言葉自体は物理とかで聞いたことがあると思いますが何を指して言っているのかわからないと思うので説明します。この記事では量子ビットについてかなり雑に紹介してしまいましたが、量子ビットを数学的に表現すると次のようになります。

ごちゃごちゃ書いてありますが、つまり0と1を重ね合わせ(線型結合)ている様子を数式で表現しただけです。ただ、重ね合わせる時に係数が複素数になっていることに注目です。(なぜ複素数かというと量子力学の世界がヒルベルト空間で表現されるからです)複素数といえば極座標表示が使えました。ざっくり言えば、この極座標表示における大きさが「振幅」、偏角が「位相」にあたります。

また、複素数の大きさの2乗が観測される確率になることも大切です。どういうことかというと上の図で言えば「αの2乗が0が観測される確率になる」ということです。単に重ね合わせと言っても、このαやβの値を変えることで「1が強めの重ね合わせ」や「0が強めな重ね合わせ」が可能だということです。このことこそが量子コンピュータの強さの源となります。

じゃあ「位相」は何に関わってくるのさ?となりますよね。位相については説明が難しいのですが、雰囲気だけ説明します。そもそも量子コンピュータの強みは強力な並列計算でした。でも単に0と1の重ね合わせを並べただけだとどうでしょう。量子ビットを4つ並べただけで16通りの出力が考えられます。

量子コンピュータはすべての場合を並列して計算していきます。つまり「1を足す」という指示を出したら基本的にはすべての場合について1が足されます。ですがこのままではせっかく並列で計算しているのにどの結果が出てくるのかわかりません。そこで、位相を使ってそれぞれの場合を区別してあげるのです。例えば「0000の場合は位相が180°、そのほかはすべて0°」みたいな感じです。実は、この位相の差を振幅に変換する「振幅増幅」と呼ばれる手法があります。これを使えば先ほどの例では「0000」の場合だけ振幅を一気に増幅させることができます。位相の凄さ伝わりましたか?

量子コンピュータの計算手順をざっくりまとめると次の図のようになります。

この図がいわば「旅のしおり」です。これが頭にあると数多ある量子アルゴリズムがどのように計算を行なっているのか整理しやすくなります。プログラムのどの部分がこの図のどこにあたるのか考えながら勉強を進めてみてください。

教材およびブックガイド

もしも量子力学を理解できたと思ったならば...それは量子力学を理解できていない証拠だ
—リチャード・P・ファインマン

量子力学はとても難しいことで有名ですが、実は量子力学を学ばなくても量子コンピュータの勉強をすることは可能です。もちろん知識としてあるに越したことはないですが、今回みたいにプログラミングをするだけならそこまで量子力学の知識を必要としません。

まずはネット上で簡単に見つかる教材として

Qiskitのtextbook

IBMによる解説

Microsoftによる解説

日本のベンチャー企業QunaSysによる解説

東京大学の講義資料

などがあります。Qiskitのtextbookの中には日本語に対応しているものもありますし、最後の3つは日本語で書かれているので読みやすいです。英語のものもありますがDeepLなどを使えば読める感じなのでどれもおすすめです。

また、Youtubeに慶應義塾大学が公開している講座があったり、東北大学の大関真之先生が公開されているQC4Uという公開講義の動画があったりします。

慶應義塾大学での講義

QC4U

これはどちらもとてもわかりやすいのでおすすめです。

本でしっかり勉強したいという人もいると思います。フランクな感じで初学者におすすめなのは

動かして学ぶ量子コンピュータプログラミング

です。僕はこの本のおかげで理解が一気に深まりました。量子アルゴリズムを構成する基本的なプログラムの説明から、最終的には素因数分解(ショアのアルゴリズム)や量子機械学習まで学べます。

かなり本格的な本として最も有名なのは

量子コンピュータと量子通信I -量子力学とコンピュータ科学-

です。著者の名前から「ニールセン・チャン」と呼ばれたりします(ニールセンちゃんじゃないです)。この本を読むためには線形代数や基本的な微積分の知識が必要になるので、大学1年生レベルの数学が理解できないと読むのは厳しいです。加えて、この本とんでもなく高いのでまずは図書館で借りて読むことをお勧めします。(3巻まであってそれぞれ5000円くらいします)

さいごに

ここまで読んでる人がどれだけいるのかわかりませんが、読んでいただけたのであればとても嬉しいです。

この記事では新入生を対象に高校までの知識を前提としながら量子コンピュータの使い方について解説しました。所々、高校で学んだ知識が出てきませんでしたか?複素数の極座標表示とか。皆さんが学んできたことはしっかりと最前線の研究で使われています。それに、これから大学1年生で学ぶ線形代数や量子化学なども量子コンピュータに直結する非常に大切な分野です。これまで数学や物理が何に役立つのかよくわからなかったという人も、大学で勉強していくにつれてその大切さが実感できるようになるはずです。

これまでのような「大学に受かるための勉強」や「テストで高得点を取るための勉強」とはまた違った勉強が待っています。自由に学べるのは大学生の特権だと思うので、皆さんもぜひ自分の好きな分野を思うがままに学んでみてください。きっと、とっても楽しいはずです!

明日はかろさんとたけくんの記事です。お楽しみに!

inu_warabi icon
この記事を書いた人
inu_warabi

22B あさくひろくやってます

この記事をシェア

このエントリーをはてなブックマークに追加
共有

関連する記事

2023年4月17日
ポケモンを飼いたい夢を叶える
tqk icon tqk
2023年4月25日
【驚愕】作曲4年目だった男が大学3年間ゲームサウンドに関わった末路...【ゲームサウンドのお仕事について】
tenya icon tenya
2023年3月20日
traPグラフィック班の活動紹介(Ver.2023)
NABE icon NABE
2023年4月27日
Vulkanのデバイスドライバを自作してみた
kegra icon kegra
2023年4月25日
15時間でゲームを作った #Oxygenator
Komichi icon Komichi
2023年3月13日
GoでWebSocketのテスト書く
Ras icon Ras
記事一覧 タグ一覧 Google アナリティクスについて 特定商取引法に基づく表記