クフでダローバルな日記

タフでもグローバルもない

円周率の情報媒体としての利用性

はじめに

 今日では、円周率における各数の出現頻度がほぼ均一であることから、完全に乱数のような分布をしていることが発見され、任意の有限自然数列が含まれていると予想されている[1]。このことから、円周率の中には任意の情報が含まれており、今後は円周率が記憶媒体となりうるのではないか、と予想する者も居る[2]。
 しかし、直感的に、情報量が多くなるほど円周率の中での桁数が多くなり、本来のデータを表すのに必要な数を超えてしまうのではないかと思われる。今回、円周率の中にASCIIコードで表されたアルファベットが何桁目に現れるかを調べることで、この仮説を検証する。

手法

 まず、円周率5億桁のtxtファイルを用意する。コードは
GMP の使い方
の4.1に依る。[3]
 次に、円周率の中で何桁目に現れるかを調べるRubyファイルを作成した。例えばAならば65,AAならば6565が円周率の第何位にあるかを示すものである。コードは以下。

File.open("../pi5oku.txt", "r") do |file|
	ary = file.readlines
	pis = ary[1]
	("A".."Z").each do |str|
		str_num = str.bytes[0].to_s
		pos = pis.index(str_num)
		puts "#{str} is at #{pos}"
	end
	("AA".."ZZ").each do |str|
		str_num = str.bytes[0].to_s<<str.bytes[1].to_s
		pos = pis.index(str_num)
		puts "#{str} is at #{pos}"
	end

	("AAA".."ZZZ").each do |str|
		str_num = str.bytes[0].to_s<<str.bytes[1].to_s<<str.bytes[2].to_s
		pos = pis.index(str_num)
		puts "#{str} is at #{pos}"
		if pos == nil
			n += 1
		end
	end

	("AAAA".."ZZZZ").each do |str|
		str_num = str.bytes[0].to_s<<str.bytes[1].to_s<<str.bytes[2].to_s<<str.bytes[3].to_s
		pos = pis.index(str_num)
		puts "#{str} is at #{pos}"
		if pos == nil
			m += 1
		end
	end
end

 なお、この中で大文字のアルファベットの連続したもののみを用いたが、これは小文字にするとASCIIコードが3桁になり、不必要に桁数が多くなるからである。

結果

 各文字数について以下のようになった。なお、二文字以上の場合については、頭文字で分類している。
1文字
f:id:SWIMATH2:20140126002558j:plain
2文字
f:id:SWIMATH2:20140126002604j:plain
3文字
f:id:SWIMATH2:20140126002611j:plain
4文字
f:id:SWIMATH2:20140126002441j:plain
平均(指数グラフ)
f:id:SWIMATH2:20140126002632j:plain

考察

 まず、各文字数内での比較について見ると、文字数が多くなるにつれて頭文字間の差が小さくなり、乱数様分布をしていることが確認できる。
 一方、平均値についてのグラフを見てみると、指数グラフでおよそ直線上になっており、出現位置は文字数nのとき100^n桁目となることが予想される。
 従来の表現様式では文字数に比例したものになることから、円周率による情報表現は有効でないと結論できる。
 今回の検証では、なぜ小数第100^n位程度にあるかが不明なままなので今後の研究に期待したい。

Acknowledgement

I want to thank all the people who helped me.

参考文献

1 金田研究室HPhttp://pi2.cc.u-tokyo.ac.jp/pi-decimal_current-j.html 訪問日2014/01/26
2 円周率SUGEEEEEEEEEEE 訪問日2014/01/26
3 GMP の使い方 訪問日2014/01/26