誰か教えて!! 量子コンピュータ(ショアのアルゴリズム)でRSA暗号は破られるのか?

# はじめに
今回の投稿は、誰かに何かを解説しようとするものではありません。

量子コンピュータ、量子力学の **素人** である私が、これを見た誰かが回答やヒントを教えて下さる事を期待して、現在の自分の知識・理解の範囲で思っている**疑問を素直に記したもの**です。

量子コンピュータの勉強を始めてから最初にショアのアルゴリズムのサンプル回路を見たときに、位相回転ゲートに見えないほど小さく書かれたπ/2^n的な表現に気づいて **「えっ?こんなので実際にRSA2048の解読とか無理じゃない?」** と思った疑問が未だに解けていないので整理したいと思います。

記載内容には勉強不足、理解不足、誤解、不適切な表現、計算ミスなど多々あると思います。どのような些細なことでも結構ですので、遠慮なくご意見、ご指摘、ご指導をコメントしていただけると幸いです。

# 量子コンピュータでRSA暗号は破られるのか?
## RSA暗号の安全性
RSA暗号の安全性は、現在のスーパーコンピュータをもってしても大きな素数の積(2048bitとか)の **因数分解** が現実的な時間でできないことに依拠しています。

なので将来、エラー訂正機能を持った量子コンピュータが完成すると、ショアのアルゴリズムを用いて解読が可能になると言われています。

## ショアのアルゴリズム
非常に大雑把に言うと、**量子コンピュータ** で(逆)量子フーリエ変換を用いて **高速に因数分解** をすることができるアルゴリズムと言えます。ショアのアルゴリズムで2048bitの因数分解を行えるようになれば、RSA2048が解けてしまうことになります。

残念ながら、 **現在** の量子コンピュータは **量子ビットの数** も少なく、 **不安定な量子ビット** に生じるエラーを訂正する機能を持たないためにショアのアルゴリズムやグローバーアルゴリズムをまともに **実行することができません** 。

このアルゴリズムを実際の量子コンピュータで実行するには、エラー訂正機能が前提となります。

## 量子ビットのエラー訂正
訂正元となる量子状態にエラー訂正に必要な符号化が施せる前提で、デコヒーレンスやノイズにより発生する量子ビットのエラーを訂正するアルゴリズムとの理解です。|0>⇆|1>、|+>⇆|->、|i>⇆|-i>といった反転エラーを検出し補正することで計算結果を測定した時に正しい結果を得ることができるようになるようです。

エラー訂正についてはアルゴリズムの研究により前提となる物理量子ビットのエラー率が数%にまで引き上げられ、他方で物理量子ビットのエラー率も数%にまで引き下げられていて、実現の可能性が見えてきたと感じています。

## (逆)量子フーリエ変換(=QFT†)
エラー訂正ができて安定的な量子ビットが使える前提のもと、ショアのアルゴリズムで **2048bitの因数分解** を実行するには、その(逆)量子フーリエ変換において **$π/2^{2048}$の位相操作** が必要になります。

## 量子ビットの位相操作に必要な分解能
$π/2^{2048}$の位相操作ということは、位相操作について半周期πに対して **$2^{2048}$レベルの分解能**が必要ということになります。言い換えると 約$10^{616}$のオーダーでの分解能の制御が必要ということです。

例えば、超伝導量子ビットの制御には電磁波のパルスが用いられるようです。(πパルスとか)
この制御パルスに必要な分解能について、単純に時間や長さに置き換えた場合の **スケール感** を考えてみます。

### 時間のオーダーで考えると
・宇宙の年齢
　　137億年(1年は$3×10^7$秒)
　　$10^{17}$ 秒
・フェムト秒
　　$10^{-15}$ 秒
・アト秒
　　$10^{-18}$ 秒
・γ線の周波数
　　$10^{24}$ Hz (周期$10^{-24}$秒)

**宇宙の年齢** をγ線の周波数レベルの時間分解能で見たとしても、分解能は **僅か$10^{41}$程度**にしかなりません。

### 長さ(波長)のオーダーで考えると
・(観測可能な)宇宙の大きさ
　　137億光年(1光年は約$10^{16}$m)
　　$10^{26}$ m
・原子の直径
　　$10^{-10}$ m
・γ線の波長
　　$10^{-16}$ m

(観測可能な)**宇宙の大きさ**をγ線の波長レベルで見たとしても、分解能は **僅か$10^{42}$程度**にしかなりません。

量子状態の位相制御を宇宙規模の物差しで考えたとして、パルスを時間で制御するにしても長さで制御するにしても$10^{41}〜10^{42}$程度の分解能にしかならず、**2048bitの因数分解に必要となる位相操作の分解能$10^{616}$には全く届きません**。

(2020/1/17追記)
興味のある人は、こちらもどうぞ
[数の比較 - Wikipedia](https://ja.wikipedia.org/wiki/数の比較)

## 「1-qubitの任意の位相操作はH(アダマール)ゲートとT(π/8)ゲートで実現できる」らしい
理論上は「1-qubitの任意の回転は Hadamard演算とπ/8演算で効率よく構成(=必要精度で近似)できる．(Solovay-Kitaevの定理)」らしいです。

参考.
・[Solovay-Kitaevの定理を「見える化?」する](https://qiita.com/shnchr/items/ac8b6a0e2ee49ef6b383) **(2021/11/26追記)**
・[Exact and approximate synthesis of quantum circuits](https://www.mathstat.dal.ca/~selinger/newsynth/#downloading) **(2022/5/10追記)**
・[Optimal ancilla-free Clifford+T approximation of z-rotations](https://arxiv.org/abs/1403.2975) **(2022/5/10追記)**
・[量子コンピューターの計算精度とSolovay-Kitaevの定理](https://qiita.com/kyamaz/items/6d2c2708cb3351e57be1) **(2023/5/17追記)**
・[Solovay-Kitaevの定理 〜Haskell実装例 gridsynth 〜](https://qiita.com/kyamaz/items/26e378325b70542898c9) **(2023/5/17追記)**


つまり、**実際の量子コンピュータでH(アダマール)ゲートとT(π/8)ゲートを十分に高い精度(できればエラーフリー)で実装できさえすれば、ここまでに述べた問題は解決できそう**です。
しかし、これらのHゲートやT(π/8)ゲートといった基本操作に必要となる分解能(精度)は、やはりRSA2048を解くためには最低でも$10^{616}$のオーダーではないでしょうか?!

**(2020/1/17追記)**
位相制御の難しさにばかり頭が行って見落としていましたが、1-qubitの任意の回転はHとπ/8でできるそうですが、因数分解に必要な複数qubitの操作にはCNOT(制御X)のような制御ゲートも必要です。

## その他の量子アルゴリズム
ショアのアルゴリズム以降、他にも因数分解の量子アルゴリズムが研究されているらしいのですが、そちらについては、まだどういったものがあるのか確認していません。
もし、それらが(逆)量子フーリエ変換に依存しているのであれば、基本的にはショアと同様の疑問が生じます。

**(2020/1/17追記)**
 @TenninYan さんがコメントで論文を紹介くださったので、リンクを「関連情報」にも載せます。
・[How to factor 2048 bit RSA integers in 8 hours using 20 million noisy qubits](https://arxiv.org/pdf/1905.09749.pdf)

**(2020/12/24追記)**
素人(私)にはあまりに難しすぎる論文ですが、Shorのアルゴリズムをベースに、問題側の特性を生かした工夫(べき乗の剰余の計算を桁ごとに分割してQFTの桁数を2048bitから4bitに下げる(?)的な)を加え、さらにエラー率を下げるための様々な工夫がされているように見受けました。

**(2022/5/25追記)**
こちらの @shnchr さんの解説が素晴らしいです。(忘れないようにリンクを:smile:)
・[量子コンピュータでRSAを解くのに必要な物は？](https://qiita.com/shnchr/items/c3355c1aed66f9411e65)

# (心の叫び)誰か教えて!!
量子エラー訂正による安定した量子ビットが実現できるようになったとして、どのような工夫をすれば$π/2^{2048}$の位相操作を十分な精度(最低でも位相誤差$π/2^{2049}$未満)で実行できるのでしょうか?

例えば、誤差のないHゲートやT(π/8)ゲートはどのように実装すれば良いのでしょうか?

**(2020/1/17追記)**
今回の投稿をキッカケに、任意の回転を任意の精度でT(π/8)ゲートとHゲートで高速に近似できる方法(Solovay-Kitaev algorithm)や、Tゲートの精度を上げる「蒸留」という方法(Bravyi-Kitaev 15-to-1 magic state distillation protocol)があることを知りました。
また、勇気を出して問題提起したことに答えて @TenninYan さんがコメントでGoogleの論文を紹介して下さりました。
こちらの論文には、現時点の技術レベル(エラーとか)の延長上で私の疑問を始めさまざまな問題にどのように対応するかの過去の論文を含めた叡智が(引用を含めて)まとめられていそうです。
何分にも**ド素人**なので、どのくらい先になるかは分かりませんが、何かについて理解がある程度できましたら整理して投稿し、共有したいと思います。

**(2020/1/19追記)**
@qope さんがコメントで教えて下さりました、回転ゲート(HやTなど)やCNOTのエラー訂正の方法(トラバーサル型ゲート?)の原理、位相誤差とエラー率の関係、エラー訂正のためのゲート増加とエラー率の減少および前提となるエラー率の閾値の関係などについてイメージできるように勉強を始めようと思います。(相変わらず数式とか見ただけではイメージができないので、時間はかかりそうですが:sweat_smile:)

**(2020/12/24追記:コメント欄(@qupoさん)参照)**
「しきい値定理」 (threshold theorem)、「p(n)個のゲートを含む量子回路は、部品の誤り確率がたかだかpであるハードウェアによるO(poly(log p(n)/ε)p(n))個のゲートを用いて、たかだかεの誤り確率でシュミレートできる。ここでpはある一定のしきい値より小さくp<p_th、使用するハードウェアの雑音に関しては合理的な過程が満たされるとするものとする」(ニールセン&チャン、木村達也訳「量子コンピュータと量子通信〈3〉量子通信・情報処理と誤り訂正」p.178から引用)というものがあり、これにより理論的には一定条件をクリアできれば理論上$π/2^{2048}$精度の位相操作も実現できるそうです。
(ところで、$π/2^{2048}$精度(分解能$10^{616}$)の量子操作の正しさってどうやって確認(測定)するんだろう? 統計的な評価はできそうな気がしないし...:thinking:)

# 参考文献
[Cluster-based architecture for fault-tolerant quantum computation](https://arxiv.org/abs/0912.5150)
[量子計算超入門(p.236,pp76-93)](http://quantphys.org/keisukefujii/tokyotopological.pdf)

# 関連情報
[ショアのアルゴリズムと量子フーリエ変換 ](https://qiita.com/kenmaro/items/8e5cad76587e56e85e0d)(@kenmaro)
[量子コンピュータで因数分解が高速に解ける？〜 ショアのアルゴリズム 〜 ](https://qiita.com/kyamaz/items/eebd0f7734c8a33de2ad)(@kyamaz)
[量子位相推定とショアのアルゴリズム ](https://qiita.com/seiya-sugo/items/98b5b806cdb74ce6ea72)(@seiya-sugo)
[量子位相推定とショアのアルゴリズム.pdf](https://speakerdeck.com/seiyasugo/liang-zi-wei-xiang-tui-ding-tosiyoafalsearugorizumu)
[量子フーリエ変換と位相の周期について〜IBM Q ExperienceとQiskitで書く ](https://qiita.com/kifumi/items/c245394b7b7bcf4a1fd3)(@kifumi)
[量子計算と基礎物理 - 京都大学](http://www2.yukawa.kyoto-u.ac.jp/ws/2013/yitpqip/pdf/fujii.pdf)
[量子計算の基礎! 前編!](http://quantphys.org/keisukefujii/kyotoqc.pdf)
[C. M. Dawson, M. A. Nielsen, “The Solovay-Kitaev algorithm“](https://arxiv.org/abs/quant-ph/0505030)
[【ユニバーサル性】Solovay–Kitaev theoremとGottesman–Knill theorem
 ](https://qiita.com/YuichiroMinato/items/406e359ca8361689e6a4)(@YuichiroMinato)
**(2020/1/17追記)**
[Magic state distillation and gate compilation in quantum algorithms for quantum chemistry](https://arxiv.org/pdf/1501.01298.pdf)
[How to factor 2048 bit RSA integers in 8 hours using 20 million noisy qubits](https://arxiv.org/pdf/1905.09749.pdf)
[数の比較 - Wikipedia](https://ja.wikipedia.org/wiki/数の比較)
**(2020/1/19追記)**
[Nielsen, M.A. and Chuang, I.L., *Quantum Computation and Quantum Information*, 2010, Cambridge University Press.](http://mjg.global.s3.amazonaws.com/static/projects/refs/Quantum_Computation_and_Quantum_Information.pdf)
ミカエル ニールセン、アイザック チャン『量子コンピュータと量子通信〈2〉量子コンピュータとアルゴリズム (量子コンピュータと量子通信 2)』
ミカエル ニールセン、アイザック チャン『量子コンピュータと量子通信〈3〉量子通信・情報処理と誤り訂正 (量子コンピュータと量子通信 3)』
[量子コンピュータでフーリエ変換すると高速フーリエ変換より高速な件 ](https://qiita.com/piyo7/items/d6f95876c7ec0188f991)(@piyo7)
**(2020/1/23追記)**
[量子誤り訂正の初歩 with python ](https://qiita.com/unchicchi/items/2fb137de1652f5c3368c)(@unchicchi)
[Quantum Native Dojo 1-3. 複数量子ビットの記述 ](https://dojo.qulacs.org/ja/latest/notebooks/1.3_multiqubit_representation_and_operations.html)
**(2020/6/10追記)**
[ショアのアルゴリズムで21を素因数分解！量子コンピューターの基礎から解説！](https://todai-counseling.com/?p=573)
[量子コンピュータを使用する素因数分解アルゴリズム](https://slpr.sakura.ne.jp/qp/shor-algorithm/)
**(2021/11/26追記)**
[Solovay-Kitaevの定理を「見える化?」する](https://qiita.com/shnchr/items/ac8b6a0e2ee49ef6b383)(@shnchr)
**(2022/5/11追記)**
[Exact and approximate synthesis of quantum circuits](https://www.mathstat.dal.ca/~selinger/newsynth/#downloading)
[Optimal ancilla-free Clifford+T approximation of z-rotations](https://arxiv.org/abs/1403.2975)
**(2022/5/25追記)**
[量子コンピュータでRSAを解くのに必要な物は？](https://qiita.com/shnchr/items/c3355c1aed66f9411e65)(@shnchr)
**(2023/11/20追記)**
[「ショアのアルゴリズム」の解説が寒いので](https://qiita.com/gigagulin/items/f38328e92c432869eeba)(@gigagulin)
**(2023/12/7追記)**
[ショアのアルゴリズム](https://plasmaima.com/%E9%87%8F%E5%AD%90%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF/%E3%82%B7%E3%83%A7%E3%82%A2%E3%81%AE%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0)
[いちばんやさしい量子コンピュータで暗号を解くshorのアルゴリズム概要](https://blueqat.com/yuichiro_minato2/11c3f4fb-eaa7-48fa-bed0-e5daf39c02fe)
[Shorのアルゴリズム入門(MaruLabo)](https://www.marulabo.net/docs/shor/)

# 更新履歴
2020/1/15 初版
2020/1/16 関連情報追加
2020/1/17 @TenninYan さんにコメントを頂いての「追記」の追加と「その他の量子アルゴリズム」、「関連情報」に若干の追記
2020/1/17 T(π/8位相回転)ゲートの表記はT(π/8)ゲートと訂正させて頂きました。
2020/1/17 「数の比較」のリンク足しました。
2020/1/17 量子計算にはHや位相回転ゲート以外に制御ゲートが必要なのを見落としていたので追記しました。
2020/1/19 @qope さんにコメントを頂いて、今後勉強していくことについて追記しました。
2020/1/19 関連情報追加
2020/1/23 関連情報追加
2020/6/10 関連情報追加
2020/12/24 コメント追記
2021/4/9 関連情報 Quantum Computation and Quantum Informationにリンクを追加
2021/11/26 関連情報「Solovay-Kitaevの定理を「見える化?」する」へのリンク追加
2022/5/10 関連情報追加
2022/5/25 関連情報追加
2023/5/17 関連情報追加
2023/11/20 関連情報追加
2023/12/7 関連情報追加