読者です 読者をやめる 読者になる 読者になる

arXiv探訪

興味の赴くままに数学するだけ

疑似乱数について その0

数学 コンピューター

某所でメルセンヌ・ツイスターの話題があり、その仕組みを知りたくなって勉強を始めた。とは言え疑似乱数とは何ぞや? 程度の知識しか無いため、当面はウィキペディアの受け売りになるけど纏めていく。

まずノイマン(John von Neumann)の貢献があって計算機が登場し、それと同時発生的に疑似乱数(pseudo random number)という概念が議論されるようになった。何故かと言うと計算機の目的はシミュレーションにあって、例えばウラム(Ulam)*1が考案した方法(モンテカルロ法)は中性子の動きを調べるのに用いられたそうだ。ただし乱数といっても疑似であり、その実体は与えられた初期値より漸次的に決まる数列を指す(数に限らないけど)。特にコンピュータは有限個の状態しか取れないので、その数列は必ず周期を持つので完璧な? 乱数とは程遠い。それでも周期が長かったり、出現する値が一様に分布していれば「乱数っぽい」だろう。この「乱数っぽさ」は統計的な検定手法により示すことができる。こうした検定を通り、また記憶装置や実行時間、実装のし易さなどの物理的制約も考慮されて、様々な要件を満たしたものが標準化されて一般的に用いられる。

理論、アルゴリズム、回路、実装(プログラム)など様々なレベルでの疑似乱数が研究されている。

ノイマンが最初に考案した方法(1946)は個人的に衝撃的だった。その名を平方採中法(middle-square method)という。{ 2k }桁の数{ a_{n} }を用意し、それを{ 2 }乗して中央の{ 2k }桁を{ a_{n+1} }とする。初期値{ a_{0} }の取り方で周期は変化するが高々{ 10^{2k} }程度になる。とにかく欠点だらけで、まず数学的に意味を見出しにくいのと、その結果として最大周期の判定法が分からないことがある。そして{ 2 }乗しているので{ k }を大きくすると巨大数同士の掛け算となり大変である。この大変さはイベントMATH POWER 2016を観れば実感できる。カオスのことを考えれば{ 2 }乗するのは分からなくもない。でもいきなり非線形でそれをノイマンが言ってるのが面白い。当時のコンピュータは扱える桁数が少ないのもあったかもしれない。

いやこれはダメだろ、と思ったかは分からないがLehmerが1949年に発表した乗算型合同法(multiplicative congruential method)はずっと簡素に{ x_{n+1}\equiv ax_{n} \pmod{m} }で定義される。{ a, m }の取り方で周期が変わるが、最大周期を判定する(効率の良い)方法がある(後述)。ちなみに最大周期{ m-1 }を取るなら初期値は{ 0 }でなければ何でもよい。先ほどと比べて、こちらは定数の乗算しかないのでシフト演算と(排他的論理)和で実現でき、実装も簡単なので嬉しい。

少し改良したのが線型合同法(linear congruential method)である。混合型(mixed-)とも呼ばれ、{ x_{n+1}\equiv ax_{n}+b }で定義される。こちらも最大周期を判定する方法がある。最近まで標準だったので今でも使われているらしい。色々と問題の指摘は受けてきたが、それを解消し続けてきた歴史もある。お遊び目的なら良し、でも時代遅れ。

線型帰還シフトレジスタ(LFSR: Linear Feedback Shift Register)*2やGFSR(Galois ?)は複数のシフト演算と和で漸次的に計算する方法。生成式の二元体{ \mathbb{F}_{2} }での規約性とかで最大周期を生成するかが決まるのかな? 要検証。松本、栗田(1992、94)はGFSRを行列で捻ってTwisted GFSRを作り、それを更に発展させたのがメルセンヌ・ツイスター(Mersenne-Twister)だそうだ。

次回は線型合同法に関する最大周期条件、の予定。参考文献は後でまとめて書きます。

*1:Borsuk-Ulamの定理のウラムですかね? ウィキペディアにはウラムの螺旋とか書いてあったけど。

*2:シフトレジスタも訳せよ! 諦めんなよ!