ホームページ > バックエンド開発 > C++ > 特に非常に大きな数値 (12000 ビット以上など) の計算を高速化するには、数値理論変換 (NTT) とモジュラー算術を最適化するにはどうすればよいですか?

特に非常に大きな数値 (12000 ビット以上など) の計算を高速化するには、数値理論変換 (NTT) とモジュラー算術を最適化するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-16 03:13:18
オリジナル
553 人が閲覧しました

How can I optimize my Number Theoretic Transform (NTT) and modular arithmetic for faster computation, especially with very large numbers (e.g., over 12000 bits)?

剰余演算と NTT (有限体 DFT) 最適化

問題ステートメント


高速に NTT を使いたかった二乗 (高速なビッグナム二乗計算を参照) ですが、結果は遅くても本当に大きな数値の場合 .. 12000 ビット以上です。


それでは私の質問ですは:


  1. NTT 変換を最適化する方法はありますか?並列処理 (スレッド) によって高速化するつもりはありませんでした。これは低レベル層のみです。

  2. モジュラー演算を高速化する方法はありますか?


これは、NTT 用に C で作成した (すでに最適化された) ソース コードです (サードパーティのライブラリを必要とせずに C で完全かつ 100% 動作し、スレッドセーフである必要もあります。ソース配列は一時的なものとして使用されることに注意してください。また、配列をそれ自体に変換することもできません。
< ;/p>

事前計算を使用した最適化されたソリューション

  1. べき乗: W と iW (1 の原始根とその逆関数) のべき乗を事前計算して保存し、NTT プロセス中の再計算を回避します。これにより、乗算と除算の数が大幅に削減され、計算が高速化されます。
  2. ループのアンロール: NTT アルゴリズムでループをアンロールして、ループの反復に関連するオーバーヘッドを削減します。これにより、分岐命令の数が減り、パフォーマンスが向上します。
  3. モジュラー演算の最適化: ビット単位の演算とアセンブリ言語を使用して、モジュラー算術演算 (加算、減算、乗算、およびべき乗) を効率的に実装します。 。これにより、不要な分岐や条件付きステートメントが排除され、実行が高速化されます。

実装例

事前計算されたべき乗とビットごとの演算を使用した、C での最適化された NTT 実装の例を次に示します。

追加のヒント

  • C など、ビットごとの操作とインライン アセンブリをサポートする高級言語。
  • プロファイラーを使用してコード内のボトルネックを特定し、それらを最適化の対象にします。
  • 次を使用して NTT アルゴリズムを並列化することを検討してください。複数のスレッドまたは SIMD 命令。

以上が特に非常に大きな数値 (12000 ビット以上など) の計算を高速化するには、数値理論変換 (NTT) とモジュラー算術を最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート