具体的にはどうすればいいの? って話です。
つい最近、実用方面でも重要になりましたね。
数年前に書いた記事では計算をこねくり回していましたが、要するに『最下位bitの生成に使われる係数列は行列の最下段』であることと、『それを並べた行列が「128回分の最下位bit列をベクトルとして生成する」行列になること』、そしてその行列が可逆であることが重要なので、各基底についてを作用させたベクトルを並べて行列を作り、その逆行列を求めればよいことになる。
のとき、
で、このが、元の行列のうち、『次の内部状態の最下位bitの生成に関わる部分』のすべてになります。このを128個集めて並べ、行列を作るのが目標です。
しかし、今行列として表現されているは、処理上はビット整数に対するビットローテートやxorとして表現されており、行列として表しなおすのは得策ではありません。
そこで、遷移関数を作用させて得られる値(=更新後の内部状態)を使ってを得ることを考えます。
ここでベクトル空間の性質が活きます。
と分解することができます(以下、以外の要素がになっているベクトルをと表します)。さらに、これら個々に遷移関数を作用させた結果を足し合わせれば、に遷移関数を作用させたのと同じくになるのです。
ベクトルの和は各成分ごとの和になるので、各の第0成分を足し合わせればが得られることになります。これはについても同様です。
以上を実装したものがこちら。