はじめに
擬似乱数を発生させるアルゴリズムとして,線形合同法,Xorshift,メルセンヌ・ツイスタ,などいくつか有名なものがある. その中でも操作が単純で高速なXorshiftについて,ざっくり何をやっているのかを元論文1 2を参照しながら考えてみたい.証明やパラメタの詳細は元論文を見てもらうことにして,ここでは大まかな考えかたを追っていこう.
Es gibt mehrere Algorithmen, Pseudozufallszahlen zu generieren, z.B. Lineare Kongruenzgenratoren, Xorshift, Mersenne Twister und so weiter. In diesem Blogartikel disktirern wir über das Konzept des Xorshift Algorithms.
行列による擬似乱数の生成
擬似乱数を発生させる方法には様々なアプローチがあり得るが,大きな方向性として, n次のバイナリに対して,バイナリ行列を作用させていき,という数列を作ることで,擬似乱数を発生させる方法を考えよう.
このとき,以下の主張は同値になる.
- ゼロでない任意のn次バイナリに対して,バイナリ行列を作用させていくと,ゼロ以外のn次バイナリを全て作ってくれる.
- バイナリ行列の周期は
同値性に関して,元の論文2では固有多項式を用いたりして議論しているが,感覚的には自然に納得できると思う.
1 2 に関して:
の周期がということは,あるバイナリに対してで,当然それまで()には踏んでいない. なのでその間,n次バイナリのとりうる元が個あるうち,ゼロと初期バイナリを除いたすべての元を踏んでいかないといけないことが分かる(途中で同じものを踏むと,そこでループする).
1 2 に関して:
行列を作用させると,あるバイナリに対して,一意にバイナリを与えるので,とりうるバイナリを全て発生させていくには,毎回異なるバイナリを発生させ続けなければならない.なので,回の操作で元のバイナリに戻るという周期になるはずだ.
Jetzt denken wir über eine Methode nach, bei der wir eine binäre n×n Matrix auf eine n-th binäre Vektor anwenden und die Folge von binären Vektoren erstellen. Um möglichst viele untershiedliche Zahlen zu erzeugen, sollten wir eine Matrix wählen, deren Periode 2ⁿ−1 ist.
Xorshiftを使う理由
では,周期のバイナリ行列はどうやって見つければいいだろうか. すぐにわかる特徴として,行列は正則でなければならない(もし正則でないとすると,どこかでつぶれてゼロになってしまう). ただこれだけでは行列の形は絞れないし,実際,周期の条件を満たすような行列は大量に存在する.
むしろ方針としては,どのような行列の作り方をすれば行列計算のコストがかからないか,という視点から行列の候補を出していき,それらが周期の条件を満たすかチェックしていきたい.そこで出てくるのがXorshiftという操作だ.
ビットシフトの操作は行列では,shift matrixとして表される. 例えばの行列では,左に1ビットシフトさせる行列,右に1ビットシフトさせる行列,はそれぞれ次のように表される.
これらは正則でないので,xor(排他的論理和)の操作を加えることでまたはとすると,正則かつ計算コストが少ない操作を作ることが出来る.Cコードではそれぞれ次のように表される.
y ^ (y << a)
y ^ (y >> b)
なので,これらを組み合わせることで,行列の候補を作って,周期の条件を満たすか確認すればよい.
元論文1によれば,のとき,またはという形で,周期の条件を満たすものはなく,の形であれば,条件を満たすの組み合わせが多数存在するそうだ.
これまでの議論で分かるように,Xorshiftのアルゴリズムは,個のバイナリが出現することは保証するものの,どのようなばらつき方で出てくるかについては言及していないので,その点については別途テストする必要がある. の場合はという組み合わせが良く用いられており,特に理由がなければこのパラメタを用いるのが良さそうだ.
Nun die Frage ist, wie man eine Matrix mit einer Periode von 2ⁿ−1 finden. Eine notwendige Eigenschaft ist, dass die Matrix regelmäßig sein muss. Das reicht jedoch nicht aus, um die Form der Matrix zu bestimmen. Daher suchen wir zunächst nach Matrixoperation, die mit geringem Rechenaufwand durchgeführt werden kann. Und dann prüfen wir, ob diese Matrix die Periode-Anforderung erfüllt. Für solche Matrixoperation ist xor-Shift ein guter Kandidat. Bit-Shift Operation kann als eine Shift-Matrix beschrieben werden. Da eine Shift-Matrix nicht regulär ist, führen wir eine zusätzliche xor-Operation durch. Auf diese Weise kann ein regulär Matrixoperation mit geringem Rechenaufwand erstellt werden. Für n=32 ist es möglich, eine Matirx mit der Periode von 2ⁿ−1 aus drei (oder mehr) xor-Shift Operationen zu erstellen, und normalerweise wird (a, b, c) = (13, 17, 15) verwendet.
- Marsaglia, G. (2003). Xorshift RNGs. Journal of Statistical Software, 8(14), 1–6. https://doi.org/10.18637/jss.v008.i14↩
- George Marsaglia, Liang-Huei Tsay, Matrices and the structure of random number sequences, Linear Algebra and its Applications, Volume 67, 1985, Pages 147-156, ISSN 0024-3795, https://doi.org/10.1016/0024-3795(85)90192-2.↩