
このリポジトリには、楕円曲線離散対数環境で使用される空間効率的な量子モジュラ逆元計算回路とアフィン点加算回路のリソース見積もりのためのQiskitコードが含まれています。
現在のコードベースは、次の3つのワークフローを中心としています:
.
├── README.md
│
├── eea_model/: original classical EEA reference implementation used for algorithm prototyping and correctness validation.
│
├── run_eea_s835_fastdual_recursive_chunks_checkpoint.py
├── run_eea_s835_fastdual_recursive_chunks_checkpoint_nctopt.py
├── count_s835_fastdual_wrapped_point_addition_blocks_compiled.py
│
├── eea_circuit.py
├── eea_circuit_s835_fastdual.py
├── eea_circuit_s835_lowaux.py
├── eea_circuit_updated.py
├── under1000_eea_shared_s835_fastdual_wrapped.py
├── under1000_modular_arithmetic_base.py
│
├── point_addition_fig14_s835_fastdual_wrapped_quadratic.py
├── quadratic_fig15_inplace_s835_fastdual_wrapped.py
├── quadratic_gidney_arithmetic.py
├── quadratic_lazy_instruction.py
├── quadratic_modular_arithmetic.py
├── quadratic_squ_minus.py
│
├── ccx_recursive_block_counter.py
├── nct_template_segment_optimizer.py
│
├── test_eea_strict_main.py
└── test_point_addition_strict_main.py
run_eea_s835_fastdual_recursive_chunks_checkpoint.py
EEAアルゴリズム3のステップを、チェックポイント化されたチャンク単位で再帰的にカウントします。
run_eea_s835_fastdual_recursive_chunks_checkpoint_nctopt.py
同じEEAカウントワークフローですが、局所的なNCTテンプレート最適化を伴います。
count_s835_fastdual_wrapped_point_addition_blocks_compiled.py
再利用可能なコンパイル済みサブブロックを再帰的にカウントし、繰り返される算術コンポーネントを正確な多重度で組み立てることにより、ラップされた点加算回路をカウントします。
eea_circuit_s835_fastdual.py: 本番EEA回路の主要実装。eea_circuit_s835_lowaux.py: 主要実装で使用される低補助ヘルパールーチン。eea_circuit_updated.py: 共有EEAビルディングブロックと再帰的リソースカウントユーティリティ。eea_circuit.py: テスト用の後方互換性ラッパー。point_addition_fig14_s835_fastdual_wrapped_quadratic.py: Fig.14のスケジュールに対応するラップされたアフィン点加算回路を構築します。quadratic_fig15_inplace_s835_fastdual_wrapped.py: EEA、乗算、測定、リセット、およびフィードフォワード位相補正を備えたFig.15のインプレース除算およびインプレース乗算構造を構築します。quadratic_modular_arithmetic.py: 点加算カウンタで使用されるモジュラ加算/減算、乗算、逆乗算、2倍化、および半減命令。quadratic_gidney_arithmetic.py: 二次モジュラ算術レイヤーで使用されるGidneyスタイルの算術プリミティブ、測定およびフィードフォワードヘルパー。quadratic_squ_minus.py: アフィン点加算スケジュールで使用されるスクエアマイナスブロック。under1000_eea_shared_s835_fastdual_wrapped.py: 点加算回路で使用される共有EEAラッパーとヘルパー。under1000_modular_arithmetic_base.py: 小さな共有モジュラ算術ユーティリティ。ccx_recursive_block_counter.py: MCX展開およびSWAP展開のポリシーを備えたQiskit回路用の再帰的カウンタ。nct_template_segment_optimizer.py: {X, CX, CCX}セグメント用の局所テンプレートベースのオプティマイザ。推奨環境:
メインの依存関係を次のようにインストールします:
python -m pip install --upgrade pip
python -m pip install qiskit
テストスイートを実行します:
python test_eea_strict_main.py
python test_point_addition_strict_main.py
より高速な点加算スモークテストを行う場合:
python test_point_addition_strict_main.py --skip-n256 --skip-report
標準のEEAカウントエントリポイントは次のとおりです:
python run_eea_s835_fastdual_recursive_chunks_checkpoint.py \
--n 192 \
--chunk-size 25 \
--measurement-uncompute \
--resume \
--workdir eea_s835_fastdual_chunks25 \
--out eea_s835_fastdual_algorithm3_recursive_chunks_n192_measurement.json
重要な引数:
--n: ビット幅。--T-max: アルゴリズム3のステップ数の任意指定による上書き。デフォルトではeea.get_n_config(n)の値が使用されます。--chunk-size: チェックポイントチャンクごとにカウントされるアルゴリズム3のステップ数。--aux-size: ヘルパーキュービットプールの任意指定による上書き。省略した場合、レイアウトのヘルパーサイズが自動的に計算されます。--measurement-uncompute: カウント対象のEEAブロックで測定ベースのアンコンピュテーションを有効にします。--resume: --workdir内の既存の非空チャンクJSONファイルを再利用します。--workdir: チャンクごとのチェックポイントファイル用ディレクトリ。--out: 各チャンクの後に書き込まれる累積JSONサマリー。スクリプトは、次のようなチャンクごとのファイルを書き込みます:
eea_s835_fastdual_chunks25/eea_s835_fastdual_n192_T0001_0025.json
また、次のようなフィールドを含む累積出力JSONを書き込みます:
mode
n
T_max
num_qubits
len_width
shift_width
aux_size
measurement_based
ops
chunks
elapsed_s_so_far
最適化されたカウントエントリポイントは次のとおりです:
python run_eea_s835_fastdual_recursive_chunks_checkpoint_nctopt.py \
--n 128 \
--chunk-size 25 \
--measurement-uncompute \
--templates small-nct \
--rounds 1 \
--max-nct-segment-gates 40 \
--segment-timeout-s 10 \
--timeout-mode auto \
--resume \
--workdir eea_s835_fastdual_chunks_nctopt_failopen_r1_128_seg40_to10 \
--out eea_s835_fastdual_algorithm3_recursive_chunks_n128_measurement_nctopt_failopen_r1_seg40_to10.json
このワークフローは、{X, CX, CCX}セグメントに対して局所テンプレート最適化を試みます。これは境界付きフェイルオープンカウンタとして設計されています:最適化されたステップがタイムアウトするか例外を発生させた場合、そのステップはテンプレートラウンドなしで正確にカウントされた後、チェックポイント化されるため、最終的な報告カウントは完全なままです。
標準のEEA引数に加えて有用な引数:
--templates {small-nct,all-nct}: テンプレートライブラリの選択。--rounds: テンプレート最適化ラウンドの数。--max-nct-segment-gates: テンプレート最適化に送られる可逆セグメントの最大サイズ。--max-nct-segment-qubits: セグメント内のキュービットの最大数。--segment-timeout-s: 個々のセグメント最適化のタイムアウト。--step-timeout-s: 変更なしのカウントにフォールバックするまでのアルゴリズム3ステップ全体のタイムアウト。--fallback-step-timeout-s: 正確なフォールバックカウントのタイムアウト。--force: ステップ/チャンクのチェックポイントが既に存在する場合でも再計算します。--ignore-policy-mismatch: 最適化ポリシーが異なる場合でも古いチェックポイントを再利用します。これは主にデバッグ用です。最適化されたワークフローは、ステップレベルのチェックポイントを次の場所に書き込みます:
<workdir>/steps/
また、チャンクレベルのサマリーを次の場所に書き込みます:
<workdir>/
点加算カウンタは、上記のEEAワークフローのいずれかで生成されたEEAアルゴリズム3のJSONに依存します。点加算カウンタの--n値は、EEA JSON内のnフィールドと一致する必要があります。
n=64の例:
python run_eea_s835_fastdual_recursive_chunks_checkpoint.py \
--n 64 \
--chunk-size 25 \
--measurement-uncompute \
--resume \
--workdir eea_s835_fastdual_chunks25_n64 \
--out eea_s835_fastdual_algorithm3_recursive_chunks_n64_measurement.json
次に実行します:
python count_s835_fastdual_wrapped_point_addition_blocks_compiled.py \
--n 64 \
--eea-steps-json eea_s835_fastdual_algorithm3_recursive_chunks_n64_measurement.json \
--out point_addition_s835_fastdual_wrapped_blocks_compiled_counts_n64.json
最適化されたn=128のEEA出力の例:
python count_s835_fastdual_wrapped_point_addition_blocks_compiled.py \
--n 128 \
--eea-steps-json eea_s835_fastdual_algorithm3_recursive_chunks_n128_measurement_nctopt_failopen_r1_seg40_to10.json \
--out point_addition_s835_fastdual_wrapped_blocks_compiled_counts_n128.json
重要な引数:
--n: ビット幅。--p: 法。デフォルトはsecp256k1素数。--s-qubits: 共有EEA算術レジスタサイズの任意指定による上書き。--point-constant {secp256k1-generator,zero,custom}: Fig.14の定数座標更新用の点定数の選択。--x2、--y2: カスタム点座標。--point-constant customを使用する場合に必要です。--eea-steps-json: 再帰的アルゴリズム3のEEAカウントを含むJSONファイル。--allow-eea-n-mismatch: EEA JSONのnが要求された--nと異なることを許可するデバッグ専用の上書き。--mcx-policy {clean-vchain,keep}: 再帰的カウント用のMCX展開ポリシー。--validate-full-mul: 小さいの場合、完全な乗算/二乗の定義を再帰的にカウントし、組み立てられたブロックカウントと比較します。出力レポートには次のものが含まれます:
counting_mode
n
p
point_constant_kind
qiskit_width_report
eea_meta
block_summaries
raw_block_counters
key_ccx
validation
elapsed_s
点加算カウンタは、再利用可能なQiskit回路を構築し、{CCX, CX, X}基底でそれらを再帰的にカウントした後、乗算、逆乗算、インプレース除算、インプレース乗算、スクエアマイナス、およびFig.14点加算ブロック全体などのより大きな繰り返しブロックを組み立てます。
このリポジトリには、2つのプレーンなPythonテストドライバが含まれています。これらは意図的にpytest、Aer、または完全な状態ベクトルシミュレーションなしで書かれています。テストは、適切な場所でQiskit定義を再帰的に展開し、Toffoliネットワークブロックの計算基底状態をシミュレートします。
EEAテストは次の場所にあります:
test_eea_strict_main.py
デフォルトのEEAスイートを次のように実行します:
python test_eea_strict_main.py
デフォルトのスイートは以下をチェックします:
nのエンドポイントショートカットではないこと;T_maxの両方を使用した、デフォルト素数3, 5, 7, 11, 13, 17に対するアルゴリズム3のエンドポイント;3, 5, 7に対する完全なアルゴリズム1ラッパー。便利なバリアント:
# Fast structural + block tests only.
python test_eea_strict_main.py --skip-endpoint --skip-alg1
# Include the heavier PDF/Table-4 p=37, x=13 trace benchmark.
python test_eea_strict_main.py --table4
# Test all x values for primes above 13 as well.
python test_eea_strict_main.py --primes 3 5 7 11 13 17 --mid-all-x --verbose
点加算テストは次の場所にあります:
test_point_addition_strict_main.py
デフォルトの点加算スイートを次のように実行します:
python test_point_addition_strict_main.py
デフォルトの点加算スイートは以下をチェックします:
n=256の幅の恒等式835 = 1 + 3*256 + 66;H、measure、reset、古典制御Z、およびswap操作を含む明示的な動的回路構造;大素数回帰マトリックスは、12ビットから512ビットの素数体にわたる、体のビット幅nと素数法pの代表的なペアをカバーしています。テストされるインスタンスには、例えばn=16, p=65521、n=32, p=4294967291、n=256でのsecp256k1素数、およびn=128, 160, 192, 224, 384, 512での代表的な素数が含まれます。
各(n,p)ペアについて、テストには境界、対称、ランダム、および比較的長いEEAトレースが含まれます。完全なコンパイル済み算術の組み立ては、選択された中程度の幅のインスタンスに対してのみ実行され、より大きな(n,p)ペアは回路構築、レジスタレイアウト、スケジューリング、および再帰的リソースカウントパスの検証に使用されます。
便利なバリアント:
# Skip the tiny integrated report and only check construction/schedule/assembly.
python test_point_addition_strict_main.py --skip-report
# Fast smoke test that also skips the n=256 width construction check.
python test_point_addition_strict_main.py --skip-n256 --skip-report
# Use a different small prime/width for compiled-block validation.
python test_point_addition_strict_main.py --n 5 --p 17
Qiskitがインストールされていない場合、test_point_addition_strict_main.pyはスキップメッセージを出力して正常に終了します。EEA厳密テストは、EEA/PDFブロックゲートを構築するためQiskitが必要です。
私たちの論文では、次の数値リソース見積もり結果を報告しています:
n = 64, 128, 160, 192, 224, 256, 384, 512
典型的なワークフローは次のとおりです:
nに対してEEAアルゴリズム3カウンタを実行する;nに対してNCT最適化バージョンを任意で実行する;key_ccx、block_summaries、およびqiskit_width_reportフィールドを収集する。大きな幅の場合、チャンクとステップのチェックポイントは中断された長時間実行をサポートすることを目的としているため、--resumeを使用して--workdirディレクトリを保持してください。
このコードベースを研究で使用する場合は、次のように引用してください:
@misc{luo2026quantumalgorithmellipticcurve,
title={Quantum Algorithm for Elliptic Curve Discrete Logarithms with Space-Efficient Point Addition},
author={Han Luo and Ziyi Yang and Jingquan Luo and Ziruo Wang and Yuexin Su and Xiaoming Sun and Lvzhou Li and Tongyang Li},
year={2026},
eprint={2607.13816},
archivePrefix={arXiv},
primaryClass={quant-ph},
url={https://arxiv.org/abs/2607.13816},
}
n--out: 出力JSONパス。