2012-04-26 12 views
10

私は非常に大きな数を操作する必要があるプロジェクト(Scalaで)に取り組んでいます。積分型で表現するには大きすぎます。 JavaはBigIntegerクラスとBigDecimalクラスを提供します(スカラーは、それらの周りに素敵な薄いラッパーを提供します)。しかし、これらのライブラリは過去に使用した他の任意の精度ライブラリ(すなわちhttp://www.ginac.de/CLN/)よりも大幅に遅く、速度差は言語単独に起因する可能性があるよりも大きいようです。JVM任意精度ライブラリ

私は自分のプログラムのプロファイリングを行い、実行時間の44%がBigIntegerの乗算メソッドで費やされています。私はプログラムを少しスピードアップしたいので、BigIntegerクラス(およびScalaラッパー)よりも高速で効率的なオプションを探しています。私はLargeInteger(JScienceから)とAint(Afloatから)を見てきました。しかし、両方とも標準のBigIntegerクラスよりも遅く実行されるようです。

高性能整数の乗算と加算に焦点を当てたJava(またはJVMで利用可能)の任意精度の数学ライブラリを知っている人はいますか?

+0

ここでいくつかの良い経験http://stackoverflow.com/questions/277309/java-floating-point-high-precision-library – thoredge

+0

感謝があるようです。しかし、私はこの質問を見て、JScienceライブラリとAFloatライブラリ(私が言ったように、BigIntegerよりも遅いようです)を試しました。これは、私の数字がサイズ(約1500桁)の夕暮れゾーンにあるためです。いずれにしても、操作がはるかに高速になることがわかっています(C++コードがこれを達成したため)。言語の違いに加えて、変更可能性(不変のJava implsに対して)も有効です。 – nomad

答えて

1

残念ながら、私はあなたがJavaのネイティブライブラリにとって不運であると思います。私は1つを発見していない。 JNIを使​​用して、任意の精度の優れたパフォーマンスを持つGMPをラップすることをお勧めします。 JNIのオーバーヘッドがありますが、1500桁の範囲であれば、アルゴリズムの複雑さの差に比べて小さいはずです。あなたはJava用のGMPのさまざまなラッピングを見つけることができます(私は最も普及しているものはhereと考えています)。

+0

ありがとうRex。私はこの答えを受け入れるでしょう。それは音のようです。しかし、それはb/c私は大きな整数のような多数を作成しているようだ、JNIのオーバーヘッドとJVM /ネイティブオブジェクトの割り当ては実際にここで私を殺しています。 JavaのBigIntegerよりもパフォーマンスが悪くなります。 – nomad

+0

@nomad - 整数を再利用する必要があります。 GMPはこれを行うことができ、Scalaは、再利用の問題をいくらか助けることができる、左寄せの更新操作を与えることができます。これを行う方法のアイデアについては、Computer Languages Benchmark GameのGMPを使用する "pidigits" Scalaプログラムを参照してください。 (私はこれが最もエレガントだと主張していないが、少なくともいくらか実行可能である。) –

2

私はちょっと遅かったです...私は、C++とJavaの両方で利用できるapfloatライブラリしか知りません。 Apfloat-Library: