知ってましたか!pythonのintの表現できる数に上限はないんです!!
Cにおいてのintは32bitなので、最大で2147483647までしか表すことはできません。
大きい数を扱うときに用いるlong longでも64bit、つまり9223372036854775807までしか表せません。
一方で、pythonにおいてのintは無限だと言うのです。
それじゃあ
上限はないと聞くと、糞でかい数を扱いたくなるのが人情というもの。
ほんとに限界はないのか、また限界がないならその計算時間がいか程かを確かめるため、
簡単な実験をしてみました!
計算にかかる時間と表示するのにかかる時間、2つを以下のコードを元に実際に確認します。
num_list, time_list = [], []
for i in range(9):
start = time.time()
ans = 10 ** (10 ** i)
end = time.time()
print('Elapsed time to calculate 10 ** {} is {}'.format(10 ** i, end - start))
num_list.append(10 ** i)
time_list.append(end - start)
plt.plot(num_list, time_list)
plt.show()
実験結果を以下の表に示します!
分かりづらいですが、表の左端の数字は$10^n$の$n$の部分を表しています。
そのため、表の一番上の欄の100は$10^{100}$を計算、表示するのにかかった時間です。
$10^n$ | calculate[s] | print[s] |
---|---|---|
100 | 0.000 | 0.000 |
1000 | 0.000 | 0.000 |
10000 | 0.000 | 0.002992 |
1e05 | 0.01562 | 0.1396 |
1e06 | 0.1562 | 13.27 |
1e07 | 5.985 | 1324 |
1e08 | 221.7 | - |
1e09 | 8791 | - |
こんな大きい数でもちゃんと計算できるけど、結構時間かかりますね。
$n$が10倍になると大体計算時間は40倍、表示時間は100倍になりそうな感じがします。
ちなみに、"表示する"とは言っても値が大きすぎてバグってコンソールに表示しきれてません(当然)。
それと、printの1e08と1e09は時間がかかりすぎて飽きたのでNo dataです。
バグって0から表示されている図 →
グラフにしたものが下になります。
上でも触れたように、ぱっと見 指数的に増大しそうですね!
最初はグーゴルプレックスを計算しようと思い始めましたが、そもそも
$log2(10^{10^{100}}) \simeq 3.3210^{100}bit = 4.1510^{87}TB$
だけメモリが必要なので、正味無理な話でした!
結果:すごい大きい数が表せる!
いかがでしたでしょうか? ワザップっぽい口調で記事を書こうとしましたが、 ワザップぽい口調ってなんだ?となってしまったのでよくわかんないノリになってます。 補足:プログラム実行中の一人だけがめっちゃ頑張る現代社会の縮図 ![resource.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/419937/29e47660-2cbf-bb96-08af-5fb51017c6a3.png)