--- layout: page title: はじめに description: プログラマ向け実践量子プログラミング --- {% capture margin_note_preskill %} John Preskill, Quantum computing 40 years later (2021) {% endcapture %}
1980 年代初頭に量子コンピュータのアイディアは生まれました{% include margin_note.html content=margin_note_preskill %}。 かの大物理学者ファインマンの「自然をシミュレーションしたければ、量子力学の原理でコンピュータを作らなくてはならない」という言葉が有名です。 従来のコンピュータ (ノートパソコンやスマホから最新のゲーム機、世界最速のスパコンまで) はその内部構造が古典物理学、より正確には電磁気学で説明できます。 情報の単位であるビットは、従来のコンピュータではコンデンサとして実装されており、そのハードウェアは量子力学以前の古い物理学に基づいて設計されているからです。 一方でファインマンの言う量子コンピュータは量子力学をベースとしており、原子や電子といった量子をビットとして使い、その不思議な振舞いを利用して膨大な量子力学シミュレーション計算を高速化できる夢のコンピュータです。
ファインマンのアイデアをきっかけに、量子コンピュータに適したアルゴリズム探しが始まりました。 そして 1990 年代には、量子探索と量子因数分解という最も有望な量子コンピュータアルゴリズムの 2 つが開発されました。
量子探索の威力を理解するために、昔ながらの電話帳で特定の電話番号に一致する名前を検索することを考えてみましょう。電話帳の登録件数が
1 万件だとすると、平均してその半分の
5,000 件には目を通さなければ目的の名前にはたどり着きません。
一方、量子探索アルゴリズムでは、たった 100 回の検索で十分です。
もし量子コンピュータが量子探索で 5,000 回の推測をしたならば、2,500
万件の電話帳を検索できます。
量子因数分解アルゴリズムは、セキュリティに対して脅威 (株価の下落を含む) をもたらすものです。というのも、インターネット・セキュリティの最も一般的な方式である公開鍵暗号は、特定の数学問題(長さ数百桁の数の因数分解など)を事実上解くことが不可能であることに依存しているためです。 量子アルゴリズムは、最もよく知られた古典的なアルゴリズムよりも指数関数的に速くこのタスクを実行できるため、現代の暗号のいくつかの形式は、暗号解読者を阻止できません。
一方で、こうしたアルゴリズムを実行するための量子コンピュータに関しては、正確な現状が知られていません。 派手な量子関連の投資ニュースに便乗してか、量子探索や量子因数分解が現在の量子コンピュータですぐにでも実行できる、と誤解させるような記事も少なくありません。 それどころか「量子重ね合わせ」「量子もつれ」といったキャッチーなキーワードを濫用した怪しいビジネスもちらほら見かけます。
量子コンピュータの正しい知識が広まらない原因の 1 つは、量子コンピュータの敷居が高すぎることにあります。 クラウド越しに本物の量子コンピュータを使える現在でさえ、量子コンピュータの初級〜中級者向けコンテンツは不足しています。 量子コンピュータを勉強しようとうっかり量子力学の教科書や大学の講義スライドに手を出してしまい、そこにぎっしり詰まった高度な物理学や数学を前に挫折してしまった方も多いでしょう。
Python や JavaScript などのプログラミング解説書には数式はひとつも出てきません。 ならば、量子コンピュータにも、もっとそんなスタイルのガイドブックやチュートリアルがあってもいいのではないのでしょうか。
実際に、量子コンピュータプログラミングを学ぶのに複雑な数学を理解する必要はありません。 今までやってきたプログラミング学習と同様に、量子コンピュータの命令やアルゴリズムがどのように動作するかの感覚をつかむだけでよいのです。 基本的な命令とアルゴリズムを理解したら、必要に応じて、次のレベルに進むための数学をちょっとずつ勉強すればいいのです。 このことを念頭に置いて、本チュートリアルでは、必要な場合以外は数学的な専門用語を避け、実用的な観点から量子コンピュータプログラミングを紹介します。
このチュートリアルは、量子コンピュータプログラミングの実践的入門です。特徴として、我々の開発している量子コンピュータシミューレータ Qni (キューニ) をそこかしこで使っています。Qni を使うと、シミュレータを通してあれこれ実験を重ねることで、量子コンピュータを使うための直感的感覚を養うことができます。Qni は、量子プログラムをエレガントに記述するためのグラフィカルなユーザインタフェースを提供しています。操作結果はリアルタイムに表示されるので、実機を使った演習よりもずっと便利であり教育的でもあります。 より高度な量子コンピュータ (量子情報) を勉強する際にも、Qni は電卓がわりにちょっとした計算にも役立つので、あなたの道具箱に加えていただければと思います。
このチュートリアルは Qni と同様に GitHub でオープンに執筆しており、読者からのフィードバックを歓迎しています。ささいな typo の修正でも、ぜひ GitHub でフィードバックをおねがいします。また、著者に加わりたい方も、ぜひ Pull Request を送ってください。アップデートを続けていくことで、将来的には新しいトピックにも対応しつつ、初心者にも優しいチュートリアルを充実させていきたいと思っています。