楕円曲線離散対数問題(ECDLP)のための量子ソルバーで、Project ElevenによってQ-Day Prize Challenge向けに構築されました。目標は、Shorのアルゴリズムを使用して実際の量子ハードウェア上でECC秘密鍵を復元することです。
すべてのチャレンジ曲線は、secp256k1ファミリーに一致するF_p上のy^2 = x^3 + 7(a = 0, b = 7)を使用しています。このソルバーは、ECDLPに対するShorのアルゴリズムの2レジスタ変種を実装しています。
秘密鍵dは、群位数nを法として同じ線形関係を満たす複数の(j, k)サンプルを収集することで復元されます。このソルバーは、制御付き点加算のための6つのオラクル戦略をサポートしており、曲線のサイズに基づいて自動的に選択されるか、--oracleで手動で指定できます。
最大約6ビットの群位数を持つ曲線に使用されます。projecteleven.pyで実装されています。
各制御付き点加算「add S」は、qc.unitary()を介して適用される2^(n+1) x 2^(n+1)の置換行列として表現されます。この行列は完全な群作用をエンコードします。左上ブロックは単位行列(制御=0)、右下ブロックは写像P -> P+S(制御=1)に従って基底状態を置換します。
より大きな曲線に使用されます。quantum_arithmetic.pyで実装されています。
密行列を構築する代わりに、各「add S」の置換はトランスポジション(互換)にサイクル分解されます。各トランスポジション(2つの基底状態|a> <-> |b>の交換)は次のように実装されます。
MCXは**(n-2)個の専用アンシラ量子ビットを用いたVチェーン分解を使用し、アンシラなしのO(n^2)ではなく、MCXごとにO(n)個のToffoliゲートを実現します。各制御付き加算は独立したサブ回路**として構築され、単一の不透明ゲートとして追加されるため、QiskitでのDAGの二次的な増大を回避します。
--oracle coordinate)約6ビットまでの曲線で利用可能です。quantum_oracle.pyで実装されています。
点を群インデックスとしてエンコードする代わりに、量子レジスタはバイナリの実際の**(x, y)体要素座標**とアイデンティティフラグを保持します。点レジスタのレイアウトは次のとおりです。
x_reg: f_bits量子ビット(f_bits = ceil(log2(p)))y_reg: f_bits量子ビットid_flag: 1量子ビット(1 = 無限遠点)各制御付き「add S」は、すべての有効な座標エンコーディングにわたるEC加算式から計算され、座標レジスタ上の置換を生成します。この置換は、戦略2と同じCNOT削減+MCXインフラストラクチャを使用してトランスポジションにサイクル分解されます。
--oracle arithmetic)多項式スケーリングの点加算のためのフレームワーク。quantum_oracle.pyとquantum_arithmetic.pyで実装されています。
戦略3と同じ座標エンコーディングを使用し、QFTベースのモジュラー算術プリミティブを構成要素として、完全に算術的な点加算を目指します。コードベースには、テスト済みの次の実装が含まれています。
算術プリミティブは、点加算あたりO(n^3)のスケーリングを達成します(置換アプローチのO(N*n)に対して)。ただし、QFTベースの操作は約150倍の定数係数を持つため、算術アプローチは約20ビット以上の群位数を持つ曲線でのみ効率的です。現在のチャレンジサイズ(最大12ビット)では、置換ベースの加算器の方が高速であり、デフォルトで使用されます。
--oracle google)google_semiclassical.pyで実装されています。Griffiths & Niu(1996)の量子ビットリサイクル位相推定技法に触発され、Babbush et al.(2026)でsecp256k1 ECDLPリソース推定のために大規模に適用されました。Babbush et al.の論文は2026年3月30日に公開されました。
2つのマルチ量子ビット計数レジスタ(j, k)と一括逆QFTを、2つの単一リサイクル量子ビットと古典的条件付き位相補正に置き換えます。各計数レジスタビットは順次処理されます。|+>に準備し、制御付き点加算を適用し、以前に測定されたすべてのビットに基づいて位相を補正し、その後測定します。Qiskitのダイナミックサーキットプリミティブresetとif_testにより、IBM Quantumハードウェア上でこれが可能になります。
制御付き点加算のオラクルは既存のインフラストラクチャ(<=6ビットの場合はdense unitary、>6ビットの場合はefficient permutation)に委譲されるため、量子ビットの節約は計数レジスタの排除によってのみもたらされます。
--oracle ripple)ripple_carry_shor.pyで実装されています。制御付き点加算にCDKMリップルキャリー加算器(Cuccaro et al. 2004)を使用し、密なユニタリ行列とサイクル分解されたトランスポジション回路の両方を置き換えます。
群インデックスエンコーディングでは、点P = kGは巡回群内のそのインデックスkで表されます。S = sGを加算することは、**既知の定数sのモジュラー加算(mod n)**になります。重要な洞察: 各制御付き点加算は、QiskitのCDKMRippleCarryAdderとIntegerComparatorを介して実装された、既知の定数の単一の制御付きモジュラー加算に帰着します。
オラクルは2m個の制御付きモジュラー加算(計数レジスタごとにm個)で構成され、各制御付きmod-addは次の処理を実行します。
回路構築に秘密鍵dの知識は使用されません。Gの冪乗の群インデックスは2^i mod n(公開)として計算されます。Qの冪乗の群インデックスは、Gによって生成された巡回群の公開された列挙から導出されます。点Qはこの列挙内で検索されます。
コードベースには、256ビットでの完全に算術的な座標エンコーディングへの基盤として、QFTベースのモジュラー算術構成要素(Beauregard/Draper加算器、量子-量子モジュラー乗算、モジュラー逆元/否定)が含まれています。これらのプリミティブは、p=13までの素数に対してStatevectorシミュレーションで正しく動作することが確認されています。
IBM Quantumハードウェア上で、17ビットまでのチャレンジ曲線に対して秘密鍵の復元に成功しました。
すべての実行はIBM Quantumオープンインスタンスプランで実行されました。このプランでは月額10分の無料量子計算が許可されています。完全な実行ログはexecutions/フォルダにあります。
リップルキャリー戦略(戦略6)により、大幅な飛躍が可能になりました。10ビット(40量子ビット、200万ゲート)から**17ビット(69量子ビット、112Kゲート)**へと、7ビットの鍵サイズ増加に対して2量子ビットゲート数が18分の1に削減されました。CDKM加算器の最近接ゲート構造はIBMのheavy-hexトポロジに効率的にマッピングされ、ルーティングオーバーヘッドを約1倍に保ちます。
半古典戦略(--oracle google)は、IBM Heron r2プロセッサ上でダイナミックサーキット(中間回路reset、if_testによる古典的条件付きpゲート)を使用して、4ビット、6ビット、7ビットでの鍵復元に成功しました。7ビットでは、回路はわずか14量子ビット(標準の置換アプローチでは26量子ビット)を使用し、トランスパイル後も同等の2Qゲート数を生成します。
8ビット以上では、現在のIBMハードウェア上で半古典アプローチは実用的ではなくなります。if_elseとresetはHeron r2でサポートされていますが(バックエンドターゲット検査で確認)、各古典フィードバックポイントは完全なQPU同期を必要とします。つまり、古典コントローラが約16個のアクティブ量子ビットの条件を処理している間、156個すべての物理量子ビットがアイドル状態になる必要があります。約295KのCZゲートが16以上のフィードバックポイントに分割されているため、1ショットあたりの実行オーバーヘッドにより、ジョブがQPUの時間予算を超えます。ダイナミックサーキットなしで同じゲート数を単一の連続バッチとして実行する標準の置換アプローチは、この規模で正常に完了します。
近似QFTトランケーション(max_correctionsパラメータ)は、if_elseブロックの数をO(n^2)からO(n)に削減します。これは、測定ステップごとに最も近いk個の位相補正のみを保持し(kを超える角度はpi/2^{k+1}未満に寄与し、ハードウェアノイズフロアを下回る)ます。max_corrections=1の場合、8ビット回路には16個のif_elseブロックがありますが、それでもこのゲート数ではIBMハードウェア上でタイムアウトを引き起こすのに十分です。
典型的なIBM Quantum 2量子ビット(CX)ゲートフィデリティを約99.5%と仮定すると、推定回路フィデリティはゲート数に応じて指数関数的に低下します。
回路フィデリティはF ≈ (0.995)^{CX_count}として計算されます。4ビットを超えると、推定フィデリティは天文学的に小さくなります。出力分布は圧倒的にノイズです。
8ビット以上では、各ショットはほぼ一意のビットストリングを生成します(8ビットで8,192ショット中8,128の一意の結果、16ビットと17ビットでは20,000すべてが一意)。出力はビットストリングレベルで一様ランダムサンプリングと区別できません。それでもアルゴリズムは正しい秘密鍵を復元します。
重要な洞察は、Shorの後処理は生のビットストリング分析が示す以上にノイズに対してロバストであるということです。各ショットは(j, k, r)測定トリプルを生成します。抽出ではd_cand = (r - j) · k^{-1} mod nを計算し、d_cand · G == Qで検証します。真のdのみがEC検証に合格するため、数千のノイズショットの中から1つの正しい候補があれば十分です。
純粋にランダムな(j, k, r)トリプルは、確率約1/nで正しいd_candを生成します。Sショットの場合、ノイズのみから予想される検証済みヒット数は約S/nです。17ビット(n=65,173、S=20,000)では、ノイズヒットの期待値は約0.3です。この規模で復元が成功した場合、古典的なノイズフロアを超える量子信号の証拠を提供します。
ショット数>> nの小さな曲線(例:n=547、1,024ショットの10ビット)では、ノイズフロアは候補あたり約1,024/547 ≈ 1.9票です。少数の信号を含むショットでも、正しいdをノイズフロアより上に押し上げます。これにより、計算を不可能にすると思われる回路フィデリティにもかかわらず、アルゴリズムが成功する理由が説明されます。
おもちゃ規模では、抽出の検証ステップ(d_cand * G == Q)は真のdのみを受け入れるフィルターとして機能します。これは、純粋にランダムな(j, k, r)トリプルでも、実行あたり約shots / nの割合で有効な候補を生成することを意味します。shots >> nの場合、ランダムノイズだけでも高い確率でdを復元できます。
量子回路がこの古典的なノイズフロアを超えて信号に寄与しているかどうかをテストするために、6ビットチャレンジ(n=31)をわずか8ショット(群位数を大幅に下回る)で10回、ibm_kingstonで実行しました。
結果: 4/10成功(40%)。古典的なノイズベースラインは約20%(モンテカルロシミュレーションで計算:8個のランダムビットストリングから(r-j)*k_inv mod 31を検証でフィルタリング)です。片側二項検定: P(X >= 4 | n=10, p=0.20) = 0.121。ノイズフロアに対する2倍の改善を示しています。個別にはp < 0.05で統計的に有意ではありません(それには5以上の成功が必要)、観測された割合は、実行あたりランダムチャンスが提供するものを超えて、量子信号が約1〜2個の追加の有効な(j, k)ペアに寄与していることと一致しています。
この結果は、古典的なノイズフロアと理論的な量子優位性のレジームの間に位置しています。n >> shotsとなるより大きな曲線サイズでは、ノイズベースラインが1%未満に低下し、鍵復元が成功すれば量子計算の強力な証拠となります。
git clone https://github.com/GiancarloLelli/quantum.git cd quantum
python -m venv . Scripts\Activate.ps1 # For Windows only
pip install -r requirements.txt
### 実行方法
[IBM Quantum](https://quantum.ibm.com/) アカウントが必要です。初回実行時に API トークンを渡すと、ローカルに保存されます:```bash
# Solve the 4-bit challenge curve:
python projecteleven.py --challenge 4 --token YOUR_IBM_TOKEN --backend ibm_marrakesh
# Subsequent runs (token already saved):
python projecteleven.py --challenge 4 --backend ibm_marrakesh
# Use the coordinate-based quantum oracle:
python projecteleven.py --challenge 4 --oracle coordinate --backend ibm_marrakesh
# Use the arithmetic oracle (coordinate encoding + QFT primitives):
python projecteleven.py --challenge 4 --oracle arithmetic --backend ibm_marrakesh
# Use ripple-carry modular addition (CDKM — best for 8-bit+):
python projecteleven.py --challenge 16 --oracle ripple --backend ibm_fez --shots 20000
# Use Google semiclassical phase estimation (qubit-recycled):
python projecteleven.py --challenge 4 --oracle google --backend ibm_marrakesh
# Use a specific IBM Quantum instance:
python projecteleven.py --challenge 4 --instance ibm-q/open/main --backend ibm_marrakesh
# Verify curve parameters without quantum execution:
python projecteleven.py --curve curve_4 --verify-only
projecteleven.py # Shor solver — dense unitary approach + CLI entry point quantum_arithmetic.py # Efficient permutation decomposition + QFT arithmetic primitives quantum_oracle.py # Coordinate-based oracle + arithmetic oracle framework google_semiclassical.py # Google semiclassical PE — qubit-recycled phase estimation ripple_carry_shor.py # Ripple-carry modular addition oracle (CDKM) — best for 8-bit+ input_curves.json # Challenge curves (4-bit to 30-bit) problem/curves.py # Curve generation utility requirements.txt # qiskit, qiskit-ibm-runtime
## 参考文献
- P. Shor, ["量子計算のためのアルゴリズム:離散対数と素因数分解"](https://arxiv.org/abs/quant-ph/9508027) (1994)
- S. Beauregard, ["2n+3量子ビットを用いたShorのアルゴリズムの回路"](https://arxiv.org/abs/quant-ph/0205095) (2003)
- S. A. Cuccaro, T. G. Draper, S. A. Kutin, D. P. Moulton, ["新しい量子リップルキャリー加算回路"](https://arxiv.org/abs/quant-ph/0410184) (2004)
- M. Roetteler, M. Naehrig, K. Svore, K. Lauter, ["楕円曲線離散対数を計算するための量子リソース見積もり"](https://arxiv.org/abs/1706.06752) (2017)
- R. Griffiths, C.-S. Niu, ["量子計算のための半古典的フーリエ変換"](https://arxiv.org/abs/quant-ph/9511007) (1996)
- R. Babbush 他, ["量子脆弱性に対する楕円曲線暗号通貨の保護:リソース見積もりと緩和策"](https://quantumai.google/static/site-assets/downloads/cryptocurrency-whitepaper.pdf) (2026)
## ライセンス
このプロジェクトは、Q-Day Prize Challengeへの応募作品であり、[MIT LICENSE](https://github.com/yuvadm/quantumslop/blob/HEAD/LICENSE)の下で公開されています。
| 曲線サイズ | 標準量子ビット数 | 半古典量子ビット数 | 節約率 | ハードウェア検証 |
|---|
| 4ビット (n=7) | 11 | 5 | 55% | あり |
| 6ビット (n=31) | 17 | 7 | 59% | あり |
| 7ビット (n=79) | 26 + アンシラ | 14 | 46% | あり |
| 8ビット (n=139) | 25 + アンシラ | 10 + アンシラ | 60% | なし(QPU同期オーバーヘッド) |
| 10ビット (n=547) | 31 + アンシラ | 12 + アンシラ | 61% | なし(QPU同期オーバーヘッド) |
| 曲線サイズ | 量子ビット数 | 2Qゲート数(トランスパイル後) | ハードウェア検証 |
|---|
| 4ビット (n=7) | 17 | 1,824 | あり(シミュレーション) |
| 8ビット (n=139) | 37 | 11,224 | — |
| 10ビット (n=547) | 45 | 17,204 | — |
| 12ビット (n=2143) | 53 | 24,304 | — |
| 16ビット (n=32497) | 65 | 98,049 | あり |
| 17ビット (n=65173) | 69 | 111,816 | あり |
| 指標 | Dense Unitary | Efficient Permutation | Coordinate Oracle | Arithmetic Oracle | Semiclassical PE | Ripple-Carry |
|---|
| 点のエンコーディング | 群インデックス | 群インデックス | (x, y, id_flag) | (x, y, id_flag) | 群インデックス | 群インデックス |
| 加算あたりのスケーリング | O(4^n) 分解 | O(N * n) | O(N * f_bits) | O(n^3) 漸近的 | O(N * n) | O(m^2) |
| 量子ビット数(4ビット) | 11 | 13 | 24 | 24 | 5 | 17 |
| 量子ビット数(6ビット) | 17 | 21 | 36 | 36 | 9 | 25 |
| 2Qゲート数(4ビット) | 774 | ~1,200 | 6,449 | 6,449 | ~1,200 | 1,824 |
| 2Qゲート数(6ビット) | 23,471 | ~38,000 | 95,254 | 95,254 | ~38,000 | 4,582 |
| 実用的範囲 | <= 6ビット | <= ~16ビット | <= 6ビット | >= 20ビット(将来) | <= ~16ビット | <= ~20ビット |
| チャレンジ | p | n | 戦略 | 量子ビット数 | 2Qゲート数 | トランスパイル深さ | ショット数 | バックエンド | 復元されたd | ジョブID |
|---|
| 4ビット | 13 | 7 | Dense unitary | 11 | 774 | 2,425 | 8,192 | ibm_torino | 6 | d73u28kvllmc73anvi90 |
| 4ビット | 13 | 7 | Coordinate oracle | 24 | 6,449 | 13,125 | 8,192 | ibm_kingston | 6 | d74ht798qmgc73fm32c0 |
| 4ビット | 13 | 7 | Arithmetic oracle | 24 | 6,477 | 13,452 | 8,192 | ibm_torino | 6 | d75648lbjrds73ec0eng |
| 4ビット | 13 | 7 | Semiclassical PE | 5 | 747 | 2,522 | 256 | ibm_kingston | 6 | d75p1ftbjrds73ecne3g |
| 6ビット | 43 | 31 | Dense unitary | 17 | 23,471 | 72,475 | 8,192 | ibm_torino | 18 | d73u2l5koquc73e24u8g |
| 6ビット | 43 | 31 | Coordinate oracle | 36 | 95,254 | 169,766 | 8,192 | ibm_kingston | 18 | d74hu918qmgc73fm33g0 |
| 6ビット | 43 | 31 | Semiclassical PE | 7 | 23,256 | 73,183 | 256 | ibm_kingston | 18 | d75p1unq1anc738cmr6g |
| 7ビット | 67 | 79 | Semiclassical PE | 14 | 127,918 | 266,122 | 256 | ibm_kingston | 56 | d75p3sq3qcgc73fs2fpg |
| 8ビット | 163 | 139 | Efficient permutation | 32 | 294,628 | 599,517 | 8,192 | ibm_kingston | 103 | d73ui15koquc73e25e4g |
| 9ビット | 349 | 313 | Efficient permutation | 36 | 887,544 | 1,764,266 | 8,192 | ibm_torino | 135 | d73ua2h8qmgc73flei9g |
| 10ビット | 547 | 547 | Efficient permutation | 40 | 2,049,138 | 3,948,250 | 1,024 | ibm_torino | 165 | d752vfu8faus73evhovg |
| 16ビット | 32,803 | 32,497 | Ripple-carry | 65 | 98,049 | 202,994 | 20,000 | ibm_fez | 20,248 | d790j2hq1efs73d2979g |
| 17ビット | 65,647 | 65,173 | Ripple-carry | 69 | 111,816 | 231,475 | 20,000 | ibm_fez | 1,441 | d790krrc6das739idasg |
| チャレンジ | 戦略 | 2Qゲート数 | 推定回路フィデリティ | 一意の結果数 | 総ショット数 | 信号レジーム |
|---|
| 4ビット | Dense | 774 | ~2.1% | 1,869 / 2,048 | 8,192 | 弱信号 |
| 6ビット | Dense | 23,471 | ~10^{-51} | 3,776 / 131,072 | 8,192 | ノイズ支配 |
| 8ビット | Permutation | 294,628 | ~10^{-644} | 8,128 / 4.3B | 8,192 | ノイズ支配 |
| 9ビット | Permutation | 887,544 | ~10^{-1,939} | 8,168 / 68.7B | 8,192 | ノイズ支配 |
| 10ビット | Permutation | 2,049,138 | ~10^{-4,477} | 1,024 / 1.1T | 1,024 | ノイズ支配 |
| 16ビット | Ripple-carry | 98,049 | ~10^{-214} | 20,000 / 2^65 | 20,000 | ノイズ支配 |
| 17ビット | Ripple-carry | 111,816 | ~10^{-244} | 20,000 / 2^69 | 20,000 | ノイズ支配 |
| 実行 | ジョブID | 結果 |
|---|
| 1 | d75qrrq3qcgc73fs4hn0 | 失敗 |
| 2 | d75qs3e8faus73f0ep6g | 失敗 |
| 3 | d75qsafq1anc738coujg | 失敗 |
| 4 | d75qsie8faus73f0eplg | d = 18 |
| 5 | d75qsq23qcgc73fs4ing | d = 18 |
| 6 | d75qt168faus73f0eq50 | 失敗 |
| 7 | d75qt7vq1anc738covf0 | d = 18 |
| 8 | d75qthu8faus73f0eqmg | 失敗 |
| 9 | d75qtodbjrds73ecpk80 | d = 18 |
| 10 | d75qtvi3qcgc73fs4jsg | 失敗 |
| フラグ | 説明 | デフォルト |
|---|
--challenge N | input_curves.json から Nビットのチャレンジカーブを解く | — |
--curve NAME | 組み込みのテストカーブ (curve_4) を使用 | — |
--token TOKEN | IBM Quantum API トークン (初回使用時にローカルに保存) | — |
--backend NAME | IBM Quantum バックエンド | ibm_marrakesh |
--instance ID | IBM Quantum インスタンス | open-instance |
--shots N | 測定ショット数 | 8192 |
--oracle TYPE | Oracle 戦略: dense, permutation, coordinate, arithmetic, google, または ripple | auto |
--optimization-level N | Qiskit トランスパイル最適化レベル (0-3) | 3 |
--d N | テスト用の既知の秘密鍵 (--curve と併用) | — |
--verify-only | カーブパラメータを検証して終了 | — |