2つのn桁の数字を乗算するための最速のアルゴリズムは何ですか?


21

2つのn桁の数値を乗算するのにどのアルゴリズムが最速かを知りたいですか?ここでスペースの複雑さを緩和できます!


1
理論的な質問と実際の質問のどちらに興味がありますか?
ユヴァルフィルマス

両方ですが、より実用的なものに傾いています!
アンディ

1
実用的な質問については、GMPの使用をお勧めします。彼らが何を使うのか興味があるなら、ドキュメントまたはソースコードを見てください。
ユヴァルフィルマス

誰も知らない。まだ見つかりません。
ジェフ

回答:


22

現在、MartinFürerによるFürerのアルゴリズムの時間複雑度はあり、複素数に対するフーリエ変換を使用しています。彼のアルゴリズムは、実際にはシェーンハーゲとStrassenのアルゴリズムに基づいており、時間の複雑さはnlog(n)2Θ(log(n))Θ(nlog(n)log(log(n)))

グレード学校乗算アルゴリズムよりも高速である他のアルゴリズムの時間複雑有するカラツバ乗算である ≈と時間複雑性を有するToom 3アルゴリズムO n 1.585Θn 1.465O(nlog23)O(n1.585)Θ(n1.465)

これらは高速アルゴリズムであることに注意してください。乗算のための最速のアルゴリズムを見つけることは、コンピューターサイエンスの未解決の問題です。

参考文献:

  1. Fürerのアルゴリズム
  2. 多数のFFTベースの乗算
  3. 高速フーリエ変換
  4. Toom–Cook乗算
  5. Schönhage–Strassenアルゴリズム
  6. からつばアルゴリズム

複雑さを持つアルゴリズムを説明したD. HarveyとJ. van der Hoeven(2019年3月)の最近の論文に注意してください。O(nlnn)
ハードマス

9

aviでリストされたFFTアルゴリズムは大きな定数を追加するため、数千ビット未満の数値では実用的ではないことに注意してください 。

そのリストに加えて、いくつかの興味深いアルゴリズムと未解決の質問があります。

  • RAMモデルでの線形時間乗算(事前計算あり)
  • 定数による乗算は準線形 PDF)-これは、合計ビットの複雑さを得る、線形以下の数の加算を意味し。これは基本的に、長い方の乗算(低い方のの数に基づいてシフト/加算する)と同等です。これはですが、スピードアップ。1On2OlognO(n2logn)1O(n2)O(logn)
  • 残基番号システムおよびその他の数字の表現。乗算はほぼ線形時間です。欠点は、乗算がモジュール式であり、{オーバーフロー検出、パリティ、大きさの比較}がすべて、数値をバイナリまたは同様の表現に変換して従来の比較を行うのと同じくらい難しいか、ほとんど同じです。この変換は、少なくとも従来の乗算と同じくらい悪いです(現時点ではわかりません)。
    • その他の表現:
      • [ 対数表現 ]:乗算は対数表現の加算です。例:
        16×32=2log216+log232=24+5=29
        • 欠点は、対数表現との間の変換が乗算と同じくらい難しいか、より困難になる可能性があることです。また、表現は分数/無理/近似などになる可能性があります。
      • 正準表現:素因数分解の指数として数値を表します。乗算は、指数の加算です。例:
        36×48=3251×223141=22324151
      • マイナス面は、乗算または乗算よりもはるかに難しい問題である因子または因数分解を必要とします。追加などの他の操作は非常に難しい可能性があります。

1
剰余/中国語剰余定理に基づいた正しいモジュラスのアプローチは、逆変換しても従来の乗算よりも高速化できると信じています。ある時点で、これは少なくとも脚注としてTAOCPの第4章にありました。(FFTベースの方法にはまだ近づいていませんが、興味深い歴史的なメモです)
スティーブンスタドニッキー

@StevenStadnickiああ、クールだ、私はそれを見る必要がある。複雑さをたまたま知っていますか?
Realzなスロー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.