ふと気になったので検証してみた。
今回は
\begin{align}
f(x) &= x桁の整数がすべて現れるような桁数
\end{align}
として計算します。
例えば、f(x)=33というのは、(整数部を含め)小数第32位まで見ればすべての数字が表れるということを示しています。
ある無理数において特定の数列が存在することを証明するのには観測するしかなく、観測するまでそれが存在するかどうかは分からないが観測した瞬間に特定の数列が無理数に存在することが示されるの、面白くないですか?ぼくは面白いと思います。例えば0が12桁連続で存在する場所だったり、直観に反していたとしても観測さえしてしまえば存在するのです。13桁連続で存在する場所はぼくは知らないのですが、存在するかもしれないと考えたらワクワクします。日本科学未来館とかでそんな感じの展示があった気がするけれど、最後に行ったのが小学生の頃なので詳細までは覚えてないです。
##検証コード
n = int(input())
with open("pi-10oku.txt") as f:
pi = f.read()
print("read")
length = [False] * (10**n)
for i in range(len(e)):
length[int(e[i:i+n])] = True
if sum(length) == 10**(n):
print(i+1)
break
pi-10oku.txtはこちらからダウンロードできます。
String型で検証するので、小数点はあらかじめ消しておくと良いでしょう。
もしくはこちらのプログラムで計算することが出来ます。
参考:円周率を求める
def arctan(p, n):
x = p//n
nn = n*n
c = 1
s = x
k = 1
while x > 0:
x //= nn
k += 2
c = -c
s += c*(x//k)
return s
def pi_mantissa(digit, redund=10):
p = 10**digit
q = 10**redund
p *= q
pi = 4*(12*arctan(p,18)+8*arctan(p,57)-5*arctan(p,239))
pi //= q
return pi
print(pi_mantissa(求めたい桁数))
こちらのプログラムは、1万桁程度なら高速に求めることが可能ですが、桁数が多くなるほど計算時間がめちゃくちゃ伸びるので注意してください。
##実行結果
n=1 -> f(x)=33
n=2 -> f(x)=606
n=3 -> f(x)=8554
n=4 -> f(x)=99847
n=5 -> f(x)=1369561
##感想
nが大きくなったらなんか収束しそうだけど計算を待つのがしんどいです。
途中経過とかを見ていると、やはり最初はテンポよく見つかっているけれど後の方になっていくにつれて見つかるのが遅くなってゆくので、コンプガチャが違法になる理由も分かるなぁと思いました。
###余談
ネイピア数だとこうなります。
ネイピア数は良い感じのネットソースが無かったのですが、こちらのデータを良い感じにコピペしたり改行や空白を置換すると使えるデータになります。
置換に関しては、ぼくは普段Wordを使っていますが、好きなものを使えばいいと思います。
n=1 -> f(x)=21
n=2 -> f(x)=371
n=3 -> f(x)=8090
n=4 -> f(x)=102125
n=5 -> f(x)<1000000
# n=5 において、100万桁調べたときは99999通り見つかっています
100万桁までのデータしか見つからなかったので、n=5の解を見つけることが出来ませんでした。