数千万桁の数値を処理し、このレベルで計算できる方法を探しています。Java と少しの Python を使用できます。したがって、これらのいずれかのライブラリは便利ですが、これらの種類の数値を処理できるプログラムも機能します。誰か提案はありますか?
ありがとう
Java の場合は、組み込みクラスBigInteger
とBigDecimal
. BigInteger
数値は、使用可能なメモリによってサイズが制限されます。小数点の右側に最大 2 32BigDecimal
桁の任意の大きな 10 進数を表すことができます(実際には、使用可能なメモリによっても制限されます)。
これらは両方とも、かなり基本的な数学演算に限定されています。(算術、整数累乗など。ルート、ログなどはありません。) これ以上のものが必要な場合は、NIST の Java Numerics ページにあるライブラリのリストを参照してください。( Apfloat パッケージは、任意精度の超越関数と複雑な数学をサポートしています。)
Python は、ライブラリを必要とせずに大きな数を処理できます。
>>> 100 ** 100
1000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000L
他の人が示唆しているように、速度を上げたい場合はgmpyを使用することをお勧めします。
Java ではBigIntegerを使用できます。
Pythonの場合、 GNUBignumライブラリのPythonラッパーであるgmpyをお勧めします。Pythonは理論的には任意の大きさの整数(メモリによってのみ制限される)を処理し、数千桁程度の数値には問題ありませんが、100万桁の整数の処理にはあまり適していません。高速乗算、桁変換、およびその他の標準操作に最先端のアルゴリズムを使用していません。 対照的に、そのような規模の数値を処理するように設計されています。gmpy
いくつかのサンプルタイミングを次に示します。これは、数千桁であっても、gmpy
Pythonの組み込みのlongよりも大幅に高速であることを示しています。
$ python -m timeit -s "from gmpy import mpz" "str(mpz(10)**10000)"
1000 loops, best of 3: 575 usec per loop
$ python -m timeit "str(10**10000)"
100 loops, best of 3: 11.8 msec per loop
余談ですが、ある時点で、Pythonコア開発者の1人が、Pythonの長整数実装をGMPを直接使用する実装に置き換えようとしました。日常の非整数のユースケースでは、Pythonの速度が実際に低下することが判明しました。詳細については、 http://bugs.python.org/issue1814を参照してください。
BigDecimal で十分です。ただし、 JScienceを見ることができます。
どのような数学演算が必要ですか?
Java はすでに java.math.BigDecimal や java.math.BigInteger などの基本的な処理 (加算、乗算など) に使用できるクラスを提供しています。