剰余演算と NTT (有限体 DFT) 最適化
問題ステートメント
高速に NTT を使いたかった二乗 (高速なビッグナム二乗計算を参照) ですが、結果は遅くても本当に大きな数値の場合 .. 12000 ビット以上です。
それでは私の質問ですは:
- NTT 変換を最適化する方法はありますか?並列処理 (スレッド) によって高速化するつもりはありませんでした。これは低レベル層のみです。
- モジュラー演算を高速化する方法はありますか?
これは、NTT 用に C で作成した (すでに最適化された) ソース コードです (サードパーティのライブラリを必要とせずに C で完全かつ 100% 動作し、スレッドセーフである必要もあります。ソース配列は一時的なものとして使用されることに注意してください。また、配列をそれ自体に変換することもできません。
< ;/p>
事前計算を使用した最適化されたソリューション
-
べき乗: W と iW (1 の原始根とその逆関数) のべき乗を事前計算して保存し、NTT プロセス中の再計算を回避します。これにより、乗算と除算の数が大幅に削減され、計算が高速化されます。
-
ループのアンロール: NTT アルゴリズムでループをアンロールして、ループの反復に関連するオーバーヘッドを削減します。これにより、分岐命令の数が減り、パフォーマンスが向上します。
-
モジュラー演算の最適化: ビット単位の演算とアセンブリ言語を使用して、モジュラー算術演算 (加算、減算、乗算、およびべき乗) を効率的に実装します。 。これにより、不要な分岐や条件付きステートメントが排除され、実行が高速化されます。
実装例
事前計算されたべき乗とビットごとの演算を使用した、C での最適化された NTT 実装の例を次に示します。
追加のヒント
- C など、ビットごとの操作とインライン アセンブリをサポートする高級言語。
- プロファイラーを使用してコード内のボトルネックを特定し、それらを最適化の対象にします。
- 次を使用して NTT アルゴリズムを並列化することを検討してください。複数のスレッドまたは SIMD 命令。
以上が特に非常に大きな数値 (12000 ビット以上など) の計算を高速化するには、数値理論変換 (NTT) とモジュラー算術を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。