---
# System prepended metadata

title: Xoroshift128の逆行列の考察にちょこっと補足する

---

# Xoroshift128の逆行列の考察にちょこっと補足する

### なにをするの？
やろうと思っていたXorShift128の逆行列の考察を、[ニアト(@21i10r29)](https://twitter.com/21i10r29)さんが[してくれました](https://hackmd.io/W2x324giSDqNWmaCUCoQDw)。素晴らしいですね。でもやっぱり実装が欲しいよね。

### 方針
$P^{-1} = ((E+R_8)(E+L_{11}))^{-1}$さえ具体的に求められれば十分なので、ここをやっていきます。

### 計算
$((E+R_8)(E+L_{11}))^{-1} = (E+L_{11})^{-1}(E+R_8)^{-1}$が成り立つので、それぞれの逆行列を求めたい。

(じつはほとんど[xoroshiro128+の逆行列の考察で言及](https://hackmd.io/-qn_Hz2IQyCtR-VAbk8Rew?view)していたのだが)たとえば$E+L_{11}$を$\bf{x}$に作用させたものを$\bf{y}$とし、それぞれの第$i$成分を$x_i,y_i$とするとき、
$$y_i = \begin{cases} x_i \quad (0\leq i<11) \\  x_i\oplus x_{i-n} \quad (11 \leq i < 32) \end{cases}$$が成り立つ。
$i=0,1,\cdots10$についてはそのまま$x_i=y_i$である。
次に$i=11$について考えると、$y_{11}=x_{11}\oplus x_{0}$であるが、既に$x_0=y_0$が分かっているため、これを代入すると$x_{11}=y_{11}\oplus y_0$が得られる。$i=12,\cdots,21$についても同様。
$i=22$になると$y_{22}=x_{22}\oplus x_{11}=x_{22}\oplus y_{11}\oplus y_0$であるため、$x_{22}=y_{22}\oplus y_{11}\oplus y_{0}$となる。
$i=23,\cdots,31$についても同様。
従って、
$$x_i = \begin{cases} y_i \quad (0\leq i<11) \\  y_i\oplus y_{i-11} \quad (11 \leq i < 22) \\
y_i\oplus y_{i-11} \oplus y_{i-22} \quad (22 \leq i < 32)
\end{cases}$$
が得られる。これは$(E+L_{11}+L_{22})$に等しい。
実際、
$$\begin{align}
(E+L_{11})(E+L_{11}+L_{22}) &= (E+L_{11}+L_{22})+(L_{11}+L_{22}+L_{33}) \\ &= E
\end{align}$$
である($2$元体上のベクトル空間であるから加法についての逆元はそれ自身であり、$L_{33}$は零行列に等しい)。
$(E+R_{8})^{-1}$も同様にして$(E+R_{8}+R_{16}+R_{24})$であることがわかる。

### 実装してみた。
![](https://i.imgur.com/OT0Ms7A.png)

テスト用のコードと実行結果。
![](https://i.imgur.com/jWcpYbf.png)
![](https://i.imgur.com/25c6k5x.png)

確かにちゃんと戻ってますね。

### 手元で使いたい人向け
ライブラリ公開してます。
https://github.com/yatsuna827/PokemonPRNG/releases/tag/v3.1.0