20

私は現在、数字を7桁で分割して、独自のBigIntクラスを作成しています。(つまり、ベース 10,000,000)

足し算、引き算、掛け算を実装し、現在は割り算と mod を実装しています。長い除算による除算 (最上位桁を除算して数値を推定する) を実行するコードを書きましたが、それは機能します。

ただし、遅すぎます。108 桁の数値と 67 桁の数値で演算をテストすると、除算の計算に 1.9 ミリ秒かかり、他の演算 (加減算の計算に 0.007 ~ 0.008 ミリ秒、乗算の計算に 0.1 ミリ秒) よりもはるかに遅くなります。

カラツバや高速乗算のための FFT アルゴリズムのように、除算を計算するためにどのようなアルゴリズムが存在しますか? ウィキペディアはいくつかの除算アルゴリズム (除数の乗法逆数を計算し、それを被除数で乗算する) を示していますが、除算の実装にはあまり役立たないと思います。「大規模整数メソッド」セクションも読みましたが、それも役に立ちません... :(

4

3 に答える 3

3

ビッグ整数演算の標準リファレンスは、DonaldKnuthの著書Artof Computer Programming、Volume 2、Section4.3です。彼の除算アルゴリズムは基本的に小学校のアルゴリズムですが、いくつかの小さな改良が加えられています。

ちなみに、大きな整数の算術を実装するほとんどの人は、記数法の基数として10の累乗ではなく2の累乗を使用します。

于 2012-01-16T20:37:11.197 に答える
2

GMPライブラリのソースコードを見て、必要な機能をJavaScriptに移植するか、それがどのように行われるかを理解することをお勧めします。

そこに優れたアルゴリズムがある場合、このライブラリにはおそらくそれがあります。そしてそれはLGPLの下で配布されます。

于 2012-01-16T17:34:19.840 に答える
1

かなり高速な除算アルゴリズムについては、http://myweb.lmu.edu/dmsmith/MComp1996.pdfを参照してください。

それでも O(n^2) ですが、適度な長さでは効率的です。これは、単語のサイズよりも小さい基数を使用している場合に特に適しています。何年も前に、私はそれを Python で実装しました。コードはhttp://home.comcast.net/~casevh/decint_041.tar.gzに埋め込まれています。関数 smithdiv() およびremaining_norm() を探します。

于 2012-01-17T16:46:42.140 に答える