円周率πが完全乱数列であるならば、πは全ての情報を含んでいます。(無限大の情報量を持つとは別)
|----chatGPT
|πが**正規数(normal number)**かどうかは、
|どんな数字の並びも同じ頻度で現れるか?
|という問題ですが、
|πが正規数だと証明はされていません(かなり意外ポイント)。
|つまり、ものすごくランダムっぽい。
| でも「本当に完全か?」は未解決。 |
|---|
ここではπが完全乱数列であると仮定します。
このプログラムは円周率を発生させ、文字にデコードし、円周率に含まれる情報を取り出します。
このプログラムのデコード方法は、i=" 0123456789.,abcdefghijklmnopqrstuvwxyz"という文字列を使い、十進数で2桁ずつ区切って100で割り、iの長さを掛けて、iに当てはめるというものです。
取り出せる情報はデコード方法によって変わります。πは上質の乱数列なので、殆どが無駄な情報で、実用的とは言えません。
このプログラムのπの発生はspigot型アルゴリズムに依ります。
#!/usr/bin/env python3
# spigot型アルゴリズムでπを発生させ、2桁チャンクで文字にデコードする。
# 修正点: 桁の比較・抽出を浮動小数点除算(/)から整数floor除算(//)に変更。
# original の a/b, a1/b1 は近似値がπを上下から挟むため実用上かなり深くまで
# 正しい桁を出すが、(1)相異なる有理数が float では == になりうる、
# (2)整数境界直下で int(a/b) の floor がずれる、という不健全さが原理的に残る。
# // にすると正しさが IEEE-754 の丸めにも π の桁統計にも依存せず無条件で厳密。
import sys
k, a, b, a1, b1 = 2, 4, 1, 12, 4
i = " 0123456789.,abcdefghijklmnopqrstuvwxyz"
buf = [] # 2桁バッファ。外ループをまたいで保持する
while True:
# Next approximation
p, q, k = k*k, 2*k+1, k+1
a, b, a1, b1 = a1, b1, p*a + q*a1, p*b + q*b1
# Decode common digits in disjoint 2-digit chunks
d = a // b
d1 = a1 // b1
while d == d1:
buf.append(d)
if len(buf) == 2:
# (buf0*10+buf1)/100*len(i) を整数演算化(0..99 の範囲で float 版と一致)
n = (buf[0] * 10 + buf[1]) * len(i) // 100
print(i[n], end='')
sys.stdout.flush()
buf = []
a, a1 = 10 * (a % b), 10 * (a1 % b1)
d, d1 = a // b, a1 // b1
次に、環境ノイズからの真性乱数から任意の情報を取り出す試行です。
truerand.rand()はx86_64で取り出せるハードウエア起源の真性乱数です。ここでは、それを完全乱数であると仮定しています。
完全乱数と真性乱数の違いは以下の通りです。
|コンピュータで使える乱数は、2種類あり、周期をもつ疑似乱数と、TRNGから得られる真性乱数があります。
|他に、「完全乱数」というものも存在し、確率的にしか扱うことは出来ません。
|つまり、完全乱数はイデア界にしか存在しません。
|
|「真性乱数」は「完全乱数」と定義が違います。
|
|・真性乱数とは、原理的に予測不能で真に無秩序な乱数。
|コンピューターによって算術的に生成する疑似乱数に対していう。
|放射性元素の崩壊など、量子的なふるまいを利用する物理乱数が知られる。
|真乱数。- 小学館 - デジタル大辞泉より。
|
|・完全乱数とは、完全にでたらめな順番で発生する数値の列を指し、理想の乱数とも呼ばれます。
|確率的にしか扱うことができません。 - Search Labs | AIによる。
|
|定義が違いますが、真性乱数を完全乱数と看做して、同様に扱って良いでしょう。
|
|完全乱数はユングの共時性(因果律を超えた奇妙な偶然の一致)があるので、
|EPRパラドックスがEPR相関になったこともあり、
|現実世界で作るのは困難もしくは不可能かもしれません。
|真性乱数が完全乱数か否かであるかは、yes/noの2つの答があります。
意中の人の電話番号も、完全乱数列の中に含まれます。
完全乱数からは下のデコード方法で任意の情報を取り出せるので、下のプログラムを持っているだけで、「意中の人の電話番号を取り出すことのできるプログラムを持っている」と言えます。
但し、乱数列の中のどこからどこまでかは分からないため、「意中の人の電話番号を知っている」とは言えません。
試行回数が有限回ならば、その中に意中の人の電話番号がない可能性があるので、その場合、意中の人の電話番号を持っているとは言えません。
完全乱数列は殆どが無駄な情報で、実用的とは言えませんが、無限に続ければ多分期待したナンバー列は出てくるので、辛抱強く待ち続けましょう。但し、多分その前に地球が滅亡してしまうでしょう。
何もかも知ってをるなり竈猫 富安風生
意中の人の電話番号は、竈猫に聞いたら分かりますが、猫はナンバーを喋れないので、猫語のデコードが必要です。完全乱数列は竈猫です。
これがまあ、情報の内在性と言っていいでしょう。
truerandモジュール:
#!/usr/bin/env python3
import os
import binascii
import truerand
def main():
while(1):
randomdata=truerand.rand(1) # 1バイトの完全乱数の読み出し
i='0123456789 '
n=int(randomdata/256*len(i))
print(i[n],end='')
return
if __name__=='__main__':
main()
exit(0)
次に、3桁の薬箱の鍵のナンバーを当てる試行をしてみました。
確率pで起こる事象の持つ情報量は-log_2 p なので、
1/1000の確率で当たる金庫の鍵クイズの答が持つ情報量は-log_2 1/1000=3log_2 10=9.96578…です。
確率0で起こる事象が起こったら情報量無限大で、確率1で起こる事象が起こったら情報量0です。
情報量という言葉の定義は、
①情報理論で定量的に定義した「情報量」。②ただ単に1ビットの情報が何桁並んでいるかを表した「情報量」。
です。
この2つは互いに矛盾しないで一つとして扱える場合があります。
単位は[bit]です。
表現(エンコード)による情報量の違い
例えば、πを「円の円周と直径の比」と表すと、utf-8コードで、27バイトです。しかし、3.141592…とすると無限の情報量です。単に「π」と書くとutf-8コードで2バイトです。「pi」と書くとASCIIコードで2バイトです。これらは、内容と入れ物の区別もありますが、同じものを指し、π=3.14とすると、「3.14」はASCIIコードで4バイト、
64ビット浮動小数点数で、3.14≒「0x1f 0x85 0xeb 0x51 0xb8 0x1e 0x09 0x40」で8バイトになり、エンコード規則が違うと、それぞれの情報量も違うということになります。