TinyMTの更新を行列で書いてみようのコーナー(後編)
初めに
TinyMTの更新を行列で書いてみようのコーナー(前編) - yatsuna_827’s blogのつづき。 前編では数式が盛り沢山だったせいで多数の数学アレルギー患者に急性発作を引き起こさせてしまいましたが、今回は1と・しか出てこないので比較的安全だと思います。
前回求めた行列
$$
\begin{align}
\begin{bmatrix}
{\boldsymbol s}'_{0} & {\boldsymbol s}'_{1} & {\boldsymbol s}'_{2} & {\boldsymbol s}'_{3}
\end{bmatrix} =
\begin{bmatrix}
{\boldsymbol s}_{0} & {\boldsymbol s}_{1} & {\boldsymbol s}_{2} & {\boldsymbol s}_{3}
\end{bmatrix}
\begin{bmatrix}
{\boldsymbol O} & U_{31}C_{mat1} & U_{31}(L'_{1}L'_{10}+ C_{mat2}) & U_{31} L'_{1} \\
I & C_{mat1} & L'_{1}L'_{10} + C_{mat2} & L'_{1} \\
{\boldsymbol O} & I+C_{mat1} & L'_{1}L'_{10} + C_{mat2} & L'_{1} \\
{\boldsymbol O} & (I + R_{1})C_{mat1} & R'_{1}L_{10} + R'_{1}C_{mat2} & R'_{1}
\end{bmatrix}
\end{align}
$$
確認したところで、一列ずつ行きましょう。
1列目
零行列と単位行列しか無いので特筆することは無いです。
見やすいように0は・で表します。零行列は全部・なので割愛。単位行列は
です。(こっちも言うまでも無いですが)
2列目
まず前編を書いた後で気づいたのですが、が成り立ちます。は最下位bitのみに作用するので、最上位bitが欠落しようが何の関係も無いのです。なので、2列目の1行目と2行目はどちらもです。
mat1は0x8f7011eeで、2進数に直すと10001111011100000001000111101110となります。はこれを最下段に並べた行列で、
となります。
はこれに単位行列を加えた行列で、
です。
そしては、にを加えた行列です。
は自信が無かったのでExcelくんに計算してもらいました。結果的にはを右と上にそれぞれ1ずつずらした行列です。
よっては、
となります。
3列目
まずはを展開しましょう。
が成り立つので、括弧を展開すると
$$
\begin{align}
(I + L_{1})(I + L_{10}) &= I + L_{1} + L_{10} + L_{1}L_{10} \\
&= I + L_{1} + L_{10} + L_{11}
\end{align}
$$
となります。
ただし、4行目のの展開はは成り立たないので注意です。(押し出されたbitの情報が欠損するため。)
こちらは、
$$
\begin{align}
(I + R_{1})L_{10} = L_{10} + R_{1}L_{10}
\end{align}
$$
で終わりです。
また、にを作用させると、自動的に最上位bitは押し出されて欠落するので、
$$
U_{31}L_{n}=L_{n}
$$
が成り立ちます。
以上を踏まえると、3列目は1行目から順に
$$
\begin{align}
U_{31} + L_{1} + L_{10} + L_{11} + C_{mat2} \\
I + L_{1} + L_{10} + L_{11} + C_{mat2} \\
I + L_{1} + L_{10} + L_{11} + C_{mat2} \\
L_{10} + R_{1}L_{10} + C_{mat2} + R_{1}C_{mat2}
\end{align}
$$
となります。
は
という行列で、mat2の値はmat2 0xfc78ff1f(2進数で11111100011110001111111100011111)なので、は
なので、1行目は
という行列になります。2行目、3行目はほぼ同じ行列で、(1,1)成分が1になっただけです。
4行目、は
です。よく見るとととは若干異なっているのがわかると思います。
は
なので、4行目は
となります。
4列目
ほとんどまんまです。1行目は
$$
U_{31}(I + L_{1}) = U_{31} + L_{1}
$$
なので、
2行目、3行目はで、
4行目はで、
です。
組み合わせる
これらの行列を並べると、前回求めた更新を表す行列ができあがります。
ワッショイ!
最後に
計算が苦手なので大変でした(小並感)。ですが、Excelを使うことで、計算が合っているかどうかを確かめながら作業を進めることができました。
線形代数の初めの方に出てくるクッソめんどくさい行列計算は、Excelを使うととても楽です。逆行列も求められます。ということで…
オマケ
最後の最後に
前編を書き上げた後で計算ミスやら記述ミスやらが次々発覚してサイレント修正しながら後編を書きました。大晦日に。ガキ使見ながら。弟たちは友達の家に遊びに行っているというのに。。。
それは置いておくとして、本家MTも同様に624項をまとめて1つの内部状態とみなすことで、行列を用いてと表せるので、誰かやってみてください。求める過程自体は、おそらくTinyMTよりも簡単だと思います。来年のAdvent Calenderのネタにどうでしょうか。
それではよいお年を。