pokefinderの実装を見に行ったらなんか短かった。
試してみたら、SIMDを抜きにしても前に書いた記事の実装の倍くらい速かった。
調べてみたらXoroshiroのオリジナル実装でも同じようにしてジャンプ関数が提供されていた(ただし固定長のみ)。
2倍程度の速度向上だけであれば後回しにしていたと思う。
しかし、既存の実装のネックであった空間計算量(128bit * 128次配列 * 64)が大きく改善されるので、取り組まないわけにはいかなかった。
任意のベクトルに対し、は一次独立になる[1]、すなわち基底になる。つまり、Xoroshiro128pやXorShiftの任意の状態ベクトルは、任意に固定したベクトルについての形式で表現される。
基準として取ったベクトルをとし、を表現したときの係数をとする。このはの取り方には依らず、ただの値のみによって定まる。これは基準とするベクトルをに取り換えたとしても、が線形写像であることにより
が成り立つからである。
このをについてあらかじめ計算しておけば、任意のに対して回の小ジャンプの組み合わせてジャンプが可能になる。
各に対応する係数は以下のようにして求められる。
https://gist.github.com/yatsuna827/fe396453d474ba7727497fae4418a792
松本眞 (2004)「 有限体の擬似乱数への応用 」の定理4.20による。が原始多項式になることは命題4.10を見よ。 ↩︎