以下を行うための最良の方法は何でしょうか。
非常に長い数値を入力します。たとえば、500,000 桁の長さを科学的表記法に含めずに入力します。+2などのように、それを使って数学を行うことができますか?
前もって感謝します。
編集: 500,000 桁の正の整数です。
以下を行うための最良の方法は何でしょうか。
非常に長い数値を入力します。たとえば、500,000 桁の長さを科学的表記法に含めずに入力します。+2などのように、それを使って数学を行うことができますか?
前もって感謝します。
編集: 500,000 桁の正の整数です。
Erlang が無制限のサイズの int 演算をサポートしていることは知っています。
Pythonはそれ自体でかなり優れていますが、gmpy
(他の人が言及したGMPライブラリに橋渡しするか、代わりにMPIRに似たものに橋渡しします[[作業中;-)]])。検討:
$ python -mtimeit -s'x=int("1"*9999); y=int("2"*9999)' 'x*y'
100 loops, best of 3: 6.46 msec per loop
つまり、純粋な Python では、2 つの 10K 桁の整数を乗算するのに 6.5 ミリ秒ほどかかります。と...:
$ python -mtimeit -s'from gmpy import mpz; x=mpz("1"*9999); y=mpz("2"*9999)' 'x*y'
1000 loops, best of 3: 326 usec per loop
... gmpy が手元にあれば、操作は約 20 倍速くなります。桁数が数千ではなく数百の場合は、さらに極端です。
$ python -mtimeit -s'x=int("1"*199999); y=int("2"*199999)' 'x*y'
10 loops, best of 3: 675 msec per loop
対
$ python -mtimeit -s'from gmpy import mpz; x=mpz("1"*199999); y=mpz("2"*199999)' 'x*y'
100 loops, best of 3: 17.8 msec per loop
したがって、10k 桁ではなく 200k 桁の場合、gmpy の速度の利点は約 38 倍になります。
この規模の整数を日常的に処理する必要がある場合、Python + gmpy は実際に実行可能なソリューションです (もちろん、私は偏見があります。なぜなら、私は過去数年間 gmpy を作成して世話をしていたからです ♥ Python (ねえ、私のライセンス) plateは P♥thon です!-)私の趣味の 1 つ (組み合わせ算術) では、このような数をかなり頻繁に処理する必要があります;-) 。
Python は、特別なライブラリを使用せずにこれを行います。Unix システムの 'bc' (電卓を装った完全なプログラミング言語) も同様です。
Mathematica ではそのような計算ができ、完全なプログラムを書くことができます。
それ以外の場合、求めているのは、Python や Java などの別のプログラミング言語の組み込み機能を拡張するための「ライブラリ」です。
Python の場合、decimal モジュールを使用すると、数学演算が実行される精度を指定できます。
Haskell (GHC を使用する場合) には、任意の長さの整数の組み込みサポートもあります。文字列に変換された数値の長さを示すスニペットを次に示します。
Prelude> length $ show $ 10
2
Prelude> length $ show $ 1 + 2^2000000
602060
Prelude> let x = 2^200000
Prelude> let y = 2^200000 + 5
Prelude> y - x
5
または2^200000
、インタラクティブ コンソールに入力して、60 万以上の文字がすべて出力されるまで数分待つこともできます。この方法は、実証するのが少し簡単だと思いました。
Common Lisp には、任意の大きな数に対するサポートも組み込まれています...
探しているのは必ずしも言語ではなく、任意精度のライブラリです。
GMP は C/C++ での高速な実装であり、大きな整数を処理するスクリプト言語はおそらくそのようなものを使用するでしょう。
Perlbignum
にはそのようなことを行うためのモジュールがあり、Python はそれをネイティブにサポートしています。
I rather like Ruby and Python because they automatically switch from Fixnum
to Bignum
. (Python: int
to long
.)
MIT/GNU スキームは、任意の大きな数をサポートしています。
C または C++ では、 GMP (Gnu Multi-Precision ライブラリ)を使用できます。
Perl では、 bignum モジュールを使用できます。
Pythonはこれに非常に適していると思います。