Python 巨大数の限界 6億 4645万 6994桁の世界
前にこんな記事を書いた。
そこでは Python が実に巨大な数値をいとも簡単に扱ったのである。それはそれでオドロキなんであるが、ならばどれだけ大きな数値まで可能なんだろうと、そんなことが気になる。なので、チャレンジしてみた。Pythonの巨大数の限界に。
ソースコード
コメントも入れてるんだけど、ちょっと解説しておく。
2のx乗を計算していく。
xも2倍、2倍、・・・で増やしていく。
ようするに次のように増えていく。
$${2^1,2^2,2^4,2^8,2^{16},・・・}$$
結果はcsvファイルに出力する。
桁数を知りたいんだが、数値の10進数桁数を直接知る関数はなかったので、一度文字列に変換して文字列の長さで確認する。
20億桁を超えるまで繰り返す。
import csv
import sys
import time
def bign():
# 10進数の桁数上限を上げておく
sys.set_int_max_str_digits(2000000000)
# 開始時間をメモしておく
start_boottime = \
time.clock_gettime_ns(time.CLOCK_BOOTTIME)
# ファイルをオープンする(結果の出力先)
with open('pow2.csv', 'w', newline='') as csvfile:
# ファイルは辞書形式でCSV出力する
fieldnames = \
['経過時間', '計算式', '桁数', '上位20桁']
writer = csv.DictWriter\
(csvfile, fieldnames=fieldnames)
writer.writeheader()
# 2をx乗していく
# x は 1,2,4,8,16,...
n = 2
x = 1
while True:
# 2のx乗を計算して文字列に置き換える
# 文字列の長さを知ることで
# 桁数を知ることができる
pow_num = n ** x
pow_str = str(pow_num)
digits = len(pow_str)
# CSVファイルに出力する
# 経過時間、計算式、桁数、上位20桁
writer.writerow( \
{'経過時間': f'{time.clock_gettime_ns \
(time.CLOCK_BOOTTIME) \
- start_boottime:,}', \
'計算式': '2**' + str(x), \
'桁数': f'{digits:,}', \
'上位20桁': pow_str[0:19]})
# 途中で止めてもファイルに残るように
# 常にflushしておく
csvfile.flush()
# 2,000,000,000 (20億)桁以内まで
if 2000000000 < digits:
break
x = x * 2
############################
bign()
桁数の上限を「G」(ギガ)までとったからね。
数値が「G」ではなくって、桁数が「G」。
さすがにもう、読めない。
実行結果
そんでもって結果がどうなったかというと…………。
アプリは途中で強制終了しました。
やっぱり。
いや、アプリが強制終了したというよりも、Termux そのものが強制終了したようだ。まぁ、Termux が Android上で動いてるからね。仕方がないかしらね。
でも幸い、途中の結果まではファイルに出力されている。ちょいとLinux のテキストエディタてある vi で覗いてみると…………。
なんと!
昨今の vi は csv をカラー表示するのか。
み、見やすい!
わざわざ Excel に放り込まんでいいかも。
えーっと、最後は…………。
646,456,994桁
6億 4645万 6994桁
0x268826a2桁
ああ、「G」(ギガ)桁までいってないや。
計算時間は
573,671,620,926[ns]
573.671620926[秒]
10分弱
う〜ん。
想像を絶する桁数だ。
6億 4645万 6994桁
それにしても、この
6億 4645万 6994桁
の数って、いったい何バイトいるん?
しまったサイズも出力しておけばよかったか。
さらにそれをどうやって処理してるんだか。
ため息が漏れそうです。
この桁数の大きさをなんとか実感したいんだが。
この方に手伝っていただこうか。
6億桁じゃあなくって、100万桁だけどね。
1ページ1万桁、100ページで100万桁。
その1ページがどんな感じかというと。
ギリギリ見える?
こんなんが 100ページ続いて100万桁。
100ページというと、カフカの変身くらい?(笑)
6億桁となると…………。
6万ページ!
6万ページがよくわからない!
えーっと、広辞苑が。
3216ページで10.2cm。
60,000ページ÷3,216ページ=18.65671641791冊
広辞苑 18.6冊分!
18.65671641791冊×10.2cm=190.298507462682cm
190cm!
大谷翔平選手の身長レベル!(笑)
Pythonはそんな桁数を扱うことができる(らしい)。
おまけ
出力したCSVファイルを付けておく。
(誰が喜ぶんか知らんけど(~_~;))
この記事が気に入ったらサポートをしてみませんか?