見出し画像

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桁

の数って、いったい何バイトいるん?
しまったサイズも出力しておけばよかったか。
さらにそれをどうやって処理してるんだか。
ため息が漏れそうです。

この桁数の大きさをなんとか実感したいんだが。
この方に手伝っていただこうか。

円周率 1,000,000,000桁表

6億桁じゃあなくって、100万桁だけどね。
1ページ1万桁、100ページで100万桁。

その1ページがどんな感じかというと。

円周率 10,000桁

ギリギリ見える?

こんなんが 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ファイルを付けておく。
(誰が喜ぶんか知らんけど(~_~;))

この記事が気に入ったらサポートをしてみませんか?