Python を使用して非常に大きな数を計算する必要があります。
それは同じくらい大きいかもしれません
factorial(n x 10,000,0000)*factorial(n x 10,000,0000)
だから、通常の32ビットのコンピューターではオーバーフローすると思います...
回避策はありますか?
Python を使用して非常に大きな数を計算する必要があります。
それは同じくらい大きいかもしれません
factorial(n x 10,000,0000)*factorial(n x 10,000,0000)
だから、通常の32ビットのコンピューターではオーバーフローすると思います...
回避策はありますか?
これは Python では問題になりません。
>>> 2**100
1267650600228229401496703205376L
Python はプレーン整数を long 整数に自動的に変換し、オーバーフローしません。
http://docs.python.org/2/library/stdtypes.html#numeric-types-int-float-long-complex
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 でこの計算の結果を得ることができないと予想されます。マシンはすべての時間をガベージ コレクションに費やします。
私の知る限り、Python (3) の整数は任意に大きくなる可能性があります。