社会人のための量子コンピューター超入門 概要編

# きっかけ
会社で量子コンピューターについての活動が本格的にできそうなので、それに向けた情報整理が発端で、この記事を書いています。書いている人は、学生時代に量子情報理論でも量子論基礎の辺り（と宇宙論、一般相対性理論）を専攻しており、量子コンピューターは直接の専門ではないけれども、同じエリアなので、ゼミでは勉強していたレベルで携わっていました。10年近くぶりの復帰になります。やっぱり物理学は楽しいですね！

# この記事の目的
専門的なことは全然わからないけど、ぼんやりと雰囲気を知りたいという人も多いので、そういった方にどう説明していくとわかりやすいのかを考える意味で、検討するためのアクティビティとして執筆してみようと思います。
さらに、最近は教科書や啓蒙書もたくさん出てきているのですが、本腰入れてやっていないと、なかなか理解できない内容の書き物も多いという印象です。確かに、非常に難しい分野であることは確かです。それでも、物理学の精神は難しいことを限りなくシンプルなことで説明できるようにすることです。その精神に倣って、少しでもわかりやすい説明ができるように心がけます。

しかし、[ビル・ゲイツ氏もわからないと言っている](https://www.businessinsider.jp/post-105234)ので、すぐに理解できなくても諦めなくて大丈夫です！根気強く勉強していきましょう！

# 対象
・専門的なことは全然わからないけど、興味がある社会人
（逆に専門の人には物足りない内容かもしれないし、間違っていたりして怒らせるかもしれないのが怖い）

# 量子コンピューターが台頭してきた背景
量子コンピューター自体は、1980年代に、物理学者によって理論的に、古典コンピューター（=我々が使っている普通のコンピューター）を模倣できるのではないか、という研究から始まりました。その後、1990年代になると、巨大数の素因数分解を現実的な時間で解けるアルゴリズムが発表され一躍注目を浴びました。（「現実的な時間」というのは我々が普段生活していて、すぐに結果を返してくれるぐらいの意味です。今のコンピューターでも、巨大数の因数分解は宇宙の寿命以上の時間をかければ解けます。このあたりは情報理論の範疇なので、これ以上の説明は控えます。）その後もいくつかアルゴリズムは発表され、理論的には古典コンピューターよりも高速で解けることが示されてきました。
また、1998年に別の手法（後述）も日本人研究者によって発表され、すぐにD-wave社というベンチャー企業が実用化してしまいました。
その後、しばらくは研究は続いていましたが、最近ではAIやIoTの普及によるデータ量の爆発と処理量の増大への対応や、デバイスに用いる物質の研究が進んだことなどから、実用化の観点で再び脚光を浴びることになったわけです。

なお、近未来から超未来を舞台にしたSF的アニメやゲームの中では、量子コンピューターが世界を支えるシステム基盤になっていたりすることがあります。本当にそんな未来が近づいているのかと思うとワクワクしますね！

# 量子コンピューターとは？
さてさて、長々しい前置きはさておき、、、量子コンピューターとは何を指すのでしょうか？
実際のところ、明確な定義は、この記事を執筆している現在では確立されていないようです。

すごく広義な意味では、<b>「量子的な性質を利用して計算を行う計算機」</b>を指すことが多いです。この記事でもそういった意味と解釈して話を進めます。

## 量子的な性質
さて、突然「量子的な性質」というよくわからない言葉が出てきました。非常に困惑しちゃいますよね。なるべくシンプルに説明するのでしばらくお付き合いください。

特徴的な量子的性質は、「重ね合わせの状態」、「トンネル効果」、「量子もつれ合い（エンタングルメント）」など、我々の人類の日常感覚からは説明がつかない奇妙な現象でなりたっています。

こういった、従来の（古典）コンピューターには無い性質を利用することで、ある種の計算を高速化することが理論的に示されています。
ここで、ある種と書いたのは、全ての計算を高速化することまでは保証されていないからです。量子コンピューターには、向いている計算（処理）が存在します。
これはどの方式を採用するかにも依存するため、後の説明に譲ります。
なので、量子コンピューターが開発されたからといって、SEのみなさんの仕事が無くなるということはないはずなので、ご安心を！（たぶん）


# 量子コンピューターの最小データの形式と重ね合わせの状態
現在のコンピューターと量子コンピューターでは、データのあり方が異なります。
対比して眺めてみることで、違いを明確にし、理解を助けます。
まずは現在のコンピューターのデータについておさらいしてみましょう。

## ビット（bit）
現在のコンピューターのデータはビットの列で表現されます。ビットとは0もしくは1の値を持ちえます。
一時点でどちらかの値だけを持ち、目的とする結果に向かって、このビットの値を変えていく処理によって計算を行います。


## 量子ビット（qubit）
一方で、1量子ビットは、一時点において、|0>と|1>の重ね合わせの状態で存在しています。このことをすごく乱暴に言うと、<b>「（観測されるまでは）|0>でもあり|1>でもある」</b>と言えます。

「んん？突然何を言っているんだ？頭がおかしくなったんじゃないか？」と思われたかもしれません。確かにそうかもしれませんが、少なくともこの説明については真面目に書いていますw

煙に巻いた感じがするので、重ね合わせの状態をもう少し具体的に説明します。1量子ビットを観測すると|0>と|1>のどちらか一方が確率的に測定されます。数式で表すとこんな感じです。重ね合わされると言うのを和で表現できます。
$$  \alpha |0> + \beta \|1> $$
ここでの$ \alpha $と$ \beta $は確率振幅と呼ばれ、絶対値を取り２乗すると、それらにくっついている状態が測定される確率が求まります。
つまり、$ |\alpha|^2 $ が |0>が観測される確率、$|\beta|^2 $が |1>が観測される確率ということです。 （この辺の踏み込んだ説明は、数学編にでも書こうと思います。）

「ちょっと待った！そうやってデータの値が確率的に結果が変わるのであれば、データを信用することができないじゃないか！我々は何を信じたら良いの？」という疑問を持たれる方もいらっしゃるでしょう。至極真っ当な考え方です。

そこで量子コンピューターでは、必要な結果が（なるべく）確率に依存しなくなるように状態になるまで処理を行うことで、演算を行うようにします。つまり、途中では、重ね合わせの状態によりどちらも同時に存在していますが、最後には１つの結果だけが存在するようことを目指していきます。

次に、「なんで、途中で重ね合わせの状態が必要なの？」という疑問が涌いたことでしょう。本質的で良い疑問です。
重ね合わせることで、測定されうる結果を全て同時に並列的に処理することが可能になります。また、それが確率的になることで、それぞれの結果の確率を操作し、最終的に求める結果だけを得るように処理を行うことになります。
量子コンピューターを使う最大のポイントは、**量子ビットが確率的な状態で表現することができるため、古典コンピューターでは通れなかった近道（アルゴリズム）が存在する場合があり、そこを上手く見つけて、通ることができれば、古典コンピューターよりも高速に解けるかもしれない**、という話に繋がります。
まとめると、計算の概念を抜本的に変えることで、処理の高速化を実現できるということがモチベーションになるわけです。



# 量子コンピューターの方式
現状では、大きく分けるとデジタル型とアナログ型という２種類に分かれます。どちらも量子力学の性質を利用した処理を計算に利用しますが、処理自体が根本的に違います。しばしば、一般向けの情報では、これらの違いを明確にせず語られることがあります。読むときは、どちらを指しているのかを注意して把握する必要があります。

ざっと、まとめると以下のような状態です。（2018年2月時点の情報）
![量子コンピューターの分類と現状.JPG](https://qiita-image-store.s3.amazonaws.com/0/135990/43fc7923-0742-e2ec-c067-210f0ba83f45.jpeg)



これらの内容を少し補足します。

## デジタル型
デジタル型は、汎用型量子コンピューターとも呼ばれています。それは古典コンピューターを模倣し、任意のタイミングで量子ビットを操作する「ゲート」と呼ばれるものを組み合わせることで、計算させる方式のため、コンピューターでできる処理を、量子コンピューターでも再現できるという意味で付けられています。
1980年代に理論が登場してからは、元々の量子コンピューターはこちらを指していました。なので、少し前の教科書ではこちらを説明するものしかありませんでした。

ゲートでの処理は、古典コンピューターの回路がベースにありますが、量子的な性質を使うためのゲートも多数存在しています。それらを組み合わせることで、計算を行います。実際のイメージはIBM QのUIを見るとわかりやすいです。
![ゲート方式のイメージ.JPG](https://qiita-image-store.s3.amazonaws.com/0/135990/36952e88-404b-bfb4-730c-3f8dd6fa3f0b.jpeg)



そのため、ゲートの処理をどう使うかというアルゴリズムが重要なのですが、これがほとんどないというのが現状です。
素因数分解を高速で解く「ショアのアルゴリズム」、目的とする状態を少ないステップ数で求められる「グローヴァーの探索アルゴリズム」、ある関数に対して命題の真偽判定を行う「ドイチュ・ジョサのアルゴリズム」など、ごく限られたものしか見つかっていません。もしかしたら、まだあるかもしれないので、思い切って参入してみる価値はあるもかもしれません。

仮に、アルゴリズムが見つかったとして、今度はそれをゲートを使ってプログラミングする必要があります。（コーディングとは限らない）
実際に利用するとなったときに、ここはすごく大変なところになってくると思います。今はそれほど量子ビット数が多くないのですが、量子ビットはこれから増えるという流れになっています。そうなると、量子回路をプログラムする対象が増えるので、非常に煩雑になることが想像できます。


ゲート方式の使い方は追々記事を書こうとしています。

## アナログ型
こちらは打って変わって、最適化問題を解くことに特化した量子コンピューターと言えます。

現在では、その中でも方式が２つあると言われていますが、物理的に考えるベースはイジングモデル（Ising Model）というものを使って考えます。イメージはこんな感じです。

![](https://news.mynavi.jp/article/20150223-a121/images/011.jpg)

イジングモデルは、物理学とりわけ統計物理学と呼ばれる分野に登場するモデルで、物質の性質を理論的に考えるときに、複数量子ビットが格子状に並んだ形で表現され、利用されます。各量子ビットは、上か下のスピン（矢印）を持っています。$ \sigma _ i $となっている箇所は、上向きだったら1、下向きだった-1となるように値が設定されています。 「え？さっきは量子コンピューターは|0>と|1>の重ね合わせだって言ってたじゃないか！なんで-1が出てくるんだ！詐欺だ！」と思われた方もいるかもしれませんが、ポイントは２つの値のいずれかが取れるということが大切なのです。イジングモデルの計算上は、1と-1として計算する必要がありますが、意味する所は、|0>と|1>であることには変わりないのです。

また、各量子ビット間には、 相互作用と呼ばれる”つながり”のような関連性に相当するものが存在します（$ J _ {ij} $と書かれた部分）。これは手を繋いでいる状態をイメージするとわかりやすいかもしれません。相互作用のイメージは、その手の繋ぎ方をどうするか、手の握る強さをどれくらいにするか決めることに相当します。この相互作用を、解きたい問題に合わせて作ることができれば良いということになります。

ここで、相互作用と最適解との関係を補足します。
物理的には相互作用と各量子ビットの状態から、全体のエネルギーが決まります。量子ビットの状態は徐々に遷移していくと、エネルギーが大きい状態だったり、小さい状態になったりします。物理系としてはエネルギーが小さい状態を自然に目指します。（これは地球上では物が高い所（位置エネルギー高）から低い所（位置エネルギー低）に落ちることと同じ理屈です。）そして、エネルギーが最小になった状態がわかれば、対象とする問題の最適解が求まったことと同じ意味を持ちます。これが最適化問題と言われる所以です。

さて、これで相互作用の方針が決まってしまえば、あとは量子コンピューター（アナログ型）に「相互作用をこんな感じにして計算してください」を教えてあげるだけです。
その相互作用の元で、ガチャガチャとイジングモデルを振り回して（=重ね合わせの状態を作る）、段々振り回す力を弱めていきます（=徐々に状態の選別が行われていくようなイメージ）。そうすると、最終的には全体が最も落ち着いた状態（=目的とするエネルギーが最小値の状態）になるように（勝手に）状態を遷移していきます。
遷移の過程で、山を超えて目的場所に行く必要が出てきます。山を越えるには本来エネルギーが必要です。しかし、量子アニーリングでは、量子的な性質である、トンネル効果を使って、まるで透明人間が壁をすり抜けるように、山の中を突っ切ってしまえば、登る必要ないじゃん！ということを応用しているらしいです。下のようなイメージですね。

![トンネル効果の図.JPG](https://qiita-image-store.s3.amazonaws.com/0/135990/f0049c33-a4fd-bafe-0cf6-3e949626058c.jpeg)



実際に使うときには、現実にある解きたい問題を、相互作用に置き換えていくというプロセスが結構大変みたいです。
もし、こちらに取り組むときには、そういったシステムや業務などのプロセスを抽象化し、モデルへの変換をするような思考回路が必要なのではないかな、と勝手に推測しています。


以下は、量子アニーリング方式と量子ニューラルネットワークの補足です。

### 量子アニーリング方式（Quantum Annealing:QA）
上記のイジングモデルをベースにして、最適化問題を解くことに特化しています。
今は、D-wave社の実機がある分、大手ユーザーがこぞって研究を行っていますね。
ただし、まだ本格実用段階には至っていないようです。これからどこが台頭してくるのか楽しみです。


余談ですが、量子アニーリングは東工大の研究者である、[西森先生が発表した論文がベース](http://www.stat.phys.titech.ac.jp/~nishimori/papers/98PRE5355.pdf)になっています。学生時代に西森先生の授業を受けたことがあるのですが、研究者らしい非常にユーモラスな雰囲気の方で、内容もわかりやすかったです。

### 量子ニューラルネットワーク（Quantum Neural Network:QNN）
基本的な考え方のベースにあるのは、QAと同じです。違いとしては、こちらでは物理的なイジングモデルではなく、光パルスを量子ビットに見立てて、イジングモデルのような状況を作っていることです。
[詳細はQNNの記事はこちらをご覧ください。](https://www.jst.go.jp/pr/announce/20171120/index.html)

ただし、こちらは、日経サイエンス 2018年2月号にも特集が組まれましたが、内容が何とも否定的で、「QNNは量子性を使っているように見えないから、量子コンピューターではないかもしれない」という話も出ています。何も量子コンピューターという定義の枠にはまらなくても、それが価値のあるものなら良いとは思います。
詳細は、[日経サイエンスの記事](http://www.nikkei-science.com/201802_054.html)をご参照ください。

今後の動向を見守りたいと思います。

なお、こちらも日本の研究者や企業が中心になって作り上げてきました。



# どうやって利用するの？
基本的にはプログラミングする必要があります。
[IBM Q](https://quantumexperience.ng.bluemix.net/qx/experience)や[Microsoft社のQ#](https://www.microsoft.com/en-us/quantum/development-kit)などは、クラウドで公開されており、誰でも利用できます。
ただし、今のところUIが提供されているのはIBM Qだけで、それ以外はSDKを使ってコーディングすることで利用する形になります。Q#はVisual Studio 2017を使う必要があります。
IBM Qをコーディングして利用する場合には、Qiskitというライブラリを使って操作することが可能です。
https://github.com/Qiskit/qiskit
チュートリアルも豊富なので、触りながら勉強できます。シミュレーションの仕方から、実機の使っての計算まで、これ1つで量子コンピューターを使い倒すことができます。

[元IBMの量子コンピューターの研究者であるRiggeti氏が立ち上げたベンチャーも、サイトを公開しています。](https://rigetti.com/)利用するにはハードルがあるようですが…。

アニーリングマシンは、自分が使ったことがないので何とも言えないですが、同じようにSDKを使ってコーディングをするようです。

[QNNは国立情報学研究所からクラウド経由](https://qnncloud.com/)で使えるみたいです。近いうちに触ってみます。

# どんな所に使えるの？
この疑問は非常に重要ですね。
上記の向いている処理に合わせて、これからみんなで考えていく必要があると思います。
少なくとも、データの完全性を保障するようなシステムには向かないでしょう。言わば、機械学習や深層学習のように、結果の曖昧さや不正確さをある程度許容できない所には、ほぼ適用できないと考えています。


# 次に向けて
そろそろ長くなってきたので、概要編はここまでとしましょう。
なるべく初心者目線で書いたつもりですが、書いてみると難しいと思わされました。

次は、量子コンピューターで使われる数学のおさらいをすることと、IBM Qを使ったゲートのお話を書く予定です。
数学苦手な人でも読めるような内容に絞ってお届けします。



#参考情報
・[Fixstars社の量子コンピューターサイト](https://quantum.fixstars.com/)
・[Wikipedia - 量子コンピューター](https://ja.wikipedia.org/wiki/%E9%87%8F%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF)