-3

Python を使用して非常に大きな数を計算する必要があります。

それは同じくらい大きいかもしれません

factorial(n x 10,000,0000)*factorial(n x 10,000,0000)

だから、通常の32ビットのコンピューターではオーバーフローすると思います...

回避策はありますか?

4

4 に答える 4

3

これは Python では問題になりません。

>>> 2**100
1267650600228229401496703205376L

Python はプレーン整数を long 整数に自動的に変換し、オーバーフローしません。

http://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex

于 2013-07-28T10:14:29.287 に答える
1

bignumsを使用したい。Pythonはそれらをネイティブに持っています。

于 2013-07-28T10:14:32.303 に答える
1

n へのスターリングの近似! (n/e)^n * sqrt(2 * pi * n) です。これはおおよそ n * log(n/e) 桁です。

(n * 1e8)!^2 を計算しています。これは、おおよそ 2 * n * 1e8 * log(n * 1e8 / e) 桁、つまり 2e8 * n * (17 + log(n)) になります。n が比較的小さく、log(n) が無視できると仮定すると、これは 3.4e9 * n 桁になります。

1 バイトに約 2.4 桁を格納できるため、Python が数値を完全に効率的に格納できると仮定すると、結果は (1.4 * n) ギガバイトの RAM を使用することになります。

32 マシンは最大 4GB の RAM をアドレス指定できるため、理論的には n = 1 または 2 を計算できますが、n = 3 の場合、マシンは結果を RAM に保持することさえできません。結果を計算すると、Python は RAM に複数の bignum (一時変数など) を保持する必要があるため、実際のメモリ使用量は上記の計算よりも高くなります。

実際には、十分な RAM を備えた 64 ビット マシンでは、Python でこの計算の結果を得ることができないと予想されます。マシンはすべての時間をガベージ コレクションに費やします。

于 2013-07-28T10:41:25.590 に答える
0

私の知る限り、Python (3) の整数は任意に大きくなる可能性があります。

于 2013-07-28T10:14:20.960 に答える