Try   HackMD

Xorshift128の遷移行列とその逆行列を考える

数学を専攻してらっしゃる方からすると, 色々ツッコミどころ満載かと思いますがご容赦ください.

準備

Xorshift128は, その名前の通り128bit(32bit

×4)からなる内部状態をxor演算とシフト演算によって更新することで乱数を生成しています.

まずは, 内部状態の更新を行列で表してみましょう. (以降の行列表現は全てベクトルに対して左側から作用させるものとします)

kビットだけ左シフトする演算
Lk
(あるいは右シフトする演算
Rk
)は行列を用いて次のように書けます.
(Lk)i,j={1(i=jk)0(otherwise)(Rk)i,j={1(i=j+k)0(otherwise)

また, xor
F2
上の加法として表現できます.

遷移行列の生成

Xorshift128の内部状態を

\boldsymbolrnF2128と表すことにします.
\boldsymbolrn
\boldsymbolrn+1
に更新する遷移行列
T
(すなわち,
\boldsymbolrn+1=T\boldsymbolrn
を満たす
T
)は,
32×32
の小行列によるブロック分割によって
T=(OEOOOOEOOOOEPOOQ)

と書けます. ここで,
P,Q
をそれぞれ
P=(E+R8)(E+L11),Q=(E+R19)
とします.

逆行列の生成

さて, 本題である

Tの逆行列
T1
を考えることにしましょう. 先ほどと同様に
32×32
の小行列によるブロック分割で考えると,
T1=(ABCDEOOOOEOOOOEO)

として表せそうです. 逆行列の性質を用いれば,
TT1=(OEOOOOEOOOOEPOOQ)(ABCDEOOOOEOOOOEO)=(EOOOOEOOOOEOPAPBPC+QPD)=(EOOOOEOOOOEOOOOE)=E

を満たすはずです. 従って,
{PA=OPB=OPC+Q=OPD=E

の4本の式が立つことから, 各
A,B,C,D
について解くと,
A=OB=OC=P1QD=P1

が得られました. 以上より,
T1=(OOP1QP1EOOOOEOOOOEO)

が導出されます.