LoginSignup
2
1

More than 3 years have passed since last update.

pythonのintは無限

Posted at

知ってましたか!pythonのintの表現できる数に上限はないんです!!
Cにおいてのintは32bitなので、最大で2147483647までしか表すことはできません。
大きい数を扱うときに用いるlong longでも64bit、つまり9223372036854775807までしか表せません。
一方で、pythonにおいてのintは無限だと言うのです。

それじゃあ

上限はないと聞くと、糞でかい数を扱いたくなるのが人情というもの。
ほんとに限界はないのか、また限界がないならその計算時間がいか程かを確かめるため、
簡単な実験をしてみました!
計算にかかる時間と表示するのにかかる時間、2つを以下のコードを元に実際に確認します。

test.py
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から表示されている図 → print_bag.PNG

グラフにしたものが下になります。
上でも触れたように、ぱっと見 指数的に増大しそうですね!
calculate_time.png
print_time.png

最初はグーゴルプレックスを計算しようと思い始めましたが、そもそも
    $log2(10^{10^{100}}) \simeq 3.32*10^{100}bit = 4.15*10^{87}TB$
だけメモリが必要なので、正味無理な話でした!

結果:すごい大きい数が表せる!





いかがでしたでしょうか?
ワザップっぽい口調で記事を書こうとしましたが、
ワザップぽい口調ってなんだ?となってしまったのでよくわかんないノリになってます。
補足:プログラム実行中の一人だけがめっちゃ頑張る現代社会の縮図
resource.png

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1