社会人のための量子コンピューター超入門 量子コンピューターのよくある誤解を正す編

# 量子コンピューターはよく誤解される
最近（2020年2月）、ハイプカーブの絶頂期に入った量子コンピューターですが、良い記事や書籍が増えてきました。しかし、それでも初期のころは、誤解を招くような記事が散見されたことも事実です。現状でも完全に無くなったとは言い難いところです。
一時期のAIブームの時のAIに対する見え方に似ていて、もうすでにものすごいものが動いているように見えている印象があります。
期待値が上がってくるのは、自称量子コンピューターエンジニアとしては嬉しいことではありますが、一方で過度の期待を招くものでもあり、それはそれで危険でもあります。
現状を正しい理解しておくことはとても大切です。
ここでは、雑談レベルで話しているときに、よく聞かれる内容をダンプしておきたいと思います。

# 量子コンピューターは並列処理ができるので速いらしいじゃん！
## ⇨ 並列処理ではなく、計算のルールの違いを巧みに利用することになって、そこから新しい抜け道を探すことで高速化される可能性があるという言い方の方が正しいです。
この質問の背景は、おそらくHadoopなどの分散並列処理のようなものをイメージされているのかもしれませんが、これは１つの重たい処理を多くのサーバーに分配して、同時に処理することで高速化するという思想であって、根本的に異なる方法です。
量子コンピューターでは確かに、出力する可能性のある全ての答えを重ね合わせにすることができるので、同時に計算しているように見えます。しかし、これは量子ビットによるデータの持ち方のルールがそうなっていることであって、実際に並列に計算しているのは出現しうる答えに付随する測定確率を変えている、というのが量子アプリケーションの思想です。
そのような意味で、量子ビットは古典ビットとは”計算”のルールが異なるので、そのルールを上手く利用すると、**古典コンピューターでは通れない道を通ることができるようになる**ため、それが近道であれば計算ステップを下げられるものが存在するという話になります。


# 量子コンピューターは、高速で処理できるので、今のコンピューターは量子コンピューターに置き換わるんでしょ？
## ⇨ ほぼそうならないと考えています。
おそらく、[Googleが出している1億倍速くなるといった内容](https://wired.jp/2015/12/11/google-quantum-computing/)や、[量子超越性を達成し、数千年かかる処理を3分まで縮めたというセンセーショナルな記事](https://www.qmedia.jp/google-supremacy-1/)がそういった印象を与えたものと思います。これには裏事情があります。
高速化したとされるのは、処理に使った内容が古典コンピューターでは時間がかかるけど、量子コンピューターには有利とされた問題だったと言われています。もっと言えば、その処理の内容は実社会に応用できるような問題とは全く関係なく設定されているとのことです。

現在皆さんが使っているコンピューター（古典コンピューター）と、量子コンピューターは役割が完全に違います。
量子コンピューターは、あくまで古典コンピューターで解こうとすると、膨大な時間（指数時間以上）がかかる計算に対して、指数関数的に速くする（「指数時間かかる処理を多項式時間まで落とせる」等）ということが期待されています。あくまでそういった量子アルゴリズムがあることが前提で、実問題をその量子アルゴリズムが使えるようにマッピングするという話が必要になります。

あとは、あらゆる古典アルゴリズムの計算量を凌駕する、量子アルゴリズムが見つかれば、置き換わりもあるかもしれません。
PCとかはそのままだとは思います。

# 量子コンピューターは小さな世界に存在する量子を使っているので、腕時計くらいまで小さくして使えるんでしょ？
## ⇨ 現実的にはほぼ無理でしょう。
残念ながら、今の超電導量子コンピューターは、絶対零度付近まで温度を下げる必要があり、そういった装置はかなり大掛かりです。
量子コンピューターは、本来は不安定な量子性を人間が意図した通りの操作をするために、かなり極限的な状況を実現する装置が必要になるはずです。イオントラップや、StrawberryFieldsのような連続光量子コンピューターも現実的には、技術的課題をクリアするために、大型の装置が必要と理解しています。
なので、小型化するにしても、腕時計までは今のところ厳しいとは思います。（将来的にはどうなるかわかりませんが）

# 量子コンピューターはちゃんと計算させれば最後には正しい計算結果だけを返してくれるんでしょ？
## ⇨ 計算途中のノイズがあるので、最後の計算結果が異なる可能性があります。今はそれを受け入れて実用化に進んでいます。
古典でも量子でもですが、計算するデバイスにはノイズが乗ります。なので、そのままにすると計算結果は目的のものからズレる事になります。
古典に限れば、ノイズによってビットの状態が変わってもそれを察知して復元する仕組みがハードウェアというかファームウェア？レベルで実現できているものを我々が使っているので、意識しにくいですが、ノイズ自体は存在しています。
要因は違えど、量子の世界でも同じ問題があります。それを正す仕組みは存在してはいますが、それを実装しようとすると量子ビットの数を増やす必要があり、それがその時点の技術的限界をゆうに越えるため、量子誤り訂正を完全な意味で実現した量子コンピューターの開発はまだまだ先とされています。
なので、今の所はノイズがあってもしょうがないという割り切りのもとで、それでもある程度期待する計算結果が出そうなアルゴリズムを使うというのが、直近の社会実装で考えられていることです。通称[NISQ](https://dojo.qulacs.org/ja/latest/notebooks/2.1_NISQ_and_long_term.html)と呼ばれる概念です。あまり多くない量子ビットで、誤り訂正が弱い（もしくはしない）ことを前提としたデバイスとアルゴリズムを想定しています。
注意点として、量子アルゴリズムには、NISQでも動くものと完全な量子誤り訂正を実現したハードウェア上で動くものを想定したアルゴリズムは分けて考えておくのが、業界の通例になっています。

# インターネットの通信で使われている暗号が解読されちゃうんでしょ？ヤバいじゃん！
## ⇨ まだできてませんので、ご安心ください。後、最近は量子コンピューターでも解読に時間がかかるとされる格子暗号が実用化されてきています。
RSA暗号がいとも簡単に解かれてしまうことを心配してのことかと思います。話にインパクトがあり、イメージしやすいので、よく例に取り上げられるのですが、これには色々前提があります。
まず、完全な量子誤り訂正を実現したデバイスが存在し、現在実用化されているデバイスよりも計算に利用可能な量子ビット（論理量子ビット）がずっとずっと多く必要になります。
これらはいづれ技術的限界を超えて到達はするかもしれませんが、相当に時間がかかると見込んでおくと良いでしょう。なので、今ある量子コンピューターではRSA暗号を破ることはできません。
細かいことを話すと、RSAは古典コンピューター上では素因数分解に膨大な時間がかかるということを逆手に取っています。一方で、ショアのアルゴリズムが量子コンピューターを使うと素因数分解を高速化することができるということで、その話が出ています。

余談ですが、量子コンピューターの実用化を見据えて、格子暗号という理論が構築され、実際にはある商用メインフレームではすでに実装されていると聞きます。どう使うかはわかりませんが、将来的にはそれに置き換わることもあると思います。

# 量子コンピューターは以前からすごくビット数が多いマシンがあって、すでに実用化できているって聞いたけど？
## ⇨ 「すごくビット数が多い」がどのサイズかによりますが、数百以上ということであれば量子アニーラーのことを指しています。最近では量子コンピューターと量子アニーラーは名称を明確に区別して紹介されるようになってきています。
2018年ぐらいまでは、量子コンピューターと呼ばれるものの中に、実際には量子アニーラーも含まれて、明確に区別されないまま記事がありました。例えば、2015年の[Googleが出している1億倍速くなるといった内容](https://wired.jp/2015/12/11/google-quantum-computing/)では、量子アニーラーを量子コンピューターという言葉で紹介しています。
最近の業界では、量子コンピューターと量子アニーラーは名称レベルでもきちんと区別して、話をすることが浸透してきました。
どちらも広義の意味では、重ね合わせの原理などの量子性を積極的に使って計算を進めるという点では共通していましたが、量子計算機という言葉にしても良さそうですが、内部の構造が決定的に異なる上に、量子アニーラーは組合せ最適化問題を解くために使う特化型という点でも強みが違います。
最近では、量子コンピューターはデジタル回路を模倣したゲート型を指す方が一般的です。2020年２月現在では、ゲート型は50数量子ビット程度が実現できているとされ、100量子ビットはもう少し先という状況です。
もし、これらの違いを明確にしていない記事があれば、それは正確な理解がなされていない記事のため、信用度に関わるという点で、情報の精度を見抜く1つの材料になるのではないでしょうか。

# 世の中には、色々な量子コンピューターの処理をコーディング可能なフレームワークがあるけど、その分だけ量子コンピューターが実現できているんじゃないの？
## ⇨ それらの中には、古典コンピューター上で動かすシミュレーターのみのものと、シミュレーター+実機へのリクエストができるものの２種類があります。
量子コンピューターの実機の開発は技術的難易度が高いため、現時点で我々のような庶民が気軽に触れるものは片手で数えるほどしかありません。しかし、それではいざ実機が出てきて、本当に動かそうとしたときにどうやってコーディングするのかわかりません。また、量子コンピューターを実際に動かす処理で課金されるなどした場合、高額であると怖いのですよね。それを防ぐために、まず古典コンピューター上で量子コンピューターの動きを模倣するシミュレーターを使って確かめて置くことができる方式が普通です。
一見するとどれがそうかはわかりませんが、そもそも量子コンピューターの実機が存在しない場合もあるので、ご注意ください。
量子コンピューターの計算処理自体はベクトルと行列の演算、すなわち大学一年で習う線型代数で表現することができます。実は、これってDeep Learningの内部の計算と同じなので、古典コンピューターで計算することができます。ただし、計算したいサイズが大きくなると、CPUでは辛くなってくるので、GPUで高速化することも可能です。
高速化が目的なのであれば、必ずしも量子コンピューターでなくても良いかもしれません。GPUで目的を達成できるのであれば、シミュレーターを使うというのも1つの選択肢になるということは言えると思います。


# この後も他にあれば、順々に書き足していきます