補題:32bit符号なし整数変数間の算術和演算をブール関数で表す その3
初期seedから日時を求める無謀な挑戦 - Plus Le Toolのための補題。
以下で使う記号の定義については[id:plusletool:20130427:p2]を参照。
また、以下では独自に定義した関数 を使うが、これについては[id:plusletool:20130612:p1]を参照。
補題:32bit符号なし整数変数間の算術和演算をブール関数で表す - Plus Le Toolの続き。
上記記事の(*20)の直前の「この式から何とかして を消去したい。」の続きから始める。
まずは問題を再掲しておく。
(★1)[id:plusletool:20130615:p1](*16)再掲
※
この漸化式を、( ではなく) について解きたい。
前回は間違えて について解いてしまったが、本当は について解く必要がある問題だったんだ。
はじめに(★1)から解く対象である と消去対象である を の外に出しておく。
そのためには[id:plusletool:20130612:p1](*D)を使えばよく、これにより(★1)の漸化式部分は(*1)のようになる。
[id:plusletool:20130612:p1](*D)再掲
のとき、次の式が成り立つ。
(*1)
※
Q.なぜ じゃなくて を使うのですか?
A.今までの記事ではずっと だったから、混同を避けるため。
(*1)を について解くのが目的なので、(*1)の第1式を適当に移行して次のように変形する。
(*2)
(*2)を(*1)の第2式・第3式に代入して整理すると、それぞれ(*3)(*4)のようになる。
(*3)
(*4)
(*3)(*4)をよく見ると、 の形の式が多く含まれている。
この形の式は[id:plusletool:20130612:p1](*D)により に変形できる(∵ )。
[id:plusletool:20130612:p1](*D)再掲
のとき、次の式が成り立つ。
そこで集合 を次のように定義する。
(*5)
これを使うと、(*3)(*4)はそれぞれ(*6)(*7)に書き換えられる。
(*3)再掲
(*4)再掲
(*6)
(*7)
さて、この(*6)(*7)の形の式に見覚えがないだろうか。
実は、前回の(★1)の式中の を に置き換えたものと同じ式なのだ。
[id:plusletool:20130713:p1](★1)再掲
と の要素数はどちらも5なので、前回と同じ手順をたどれば同様の式変形ができるはずだ。
そこで前回の結果を要約すると、次のようなことがいえる。
(*8)前回の要約
と置くと、
↑の式は↓のように変形できる。
これと同様の変形をするために、まず を次のように定義する。
(*9)
このとき(*8)より、(*6)(*7)は次のようになる。
(*10)
また、(*5)(*9)を使うと(*2)は(*11)のようになる。
(*2)再掲
(*5)再掲
(*11)
初期値などの条件も含めて(*10)(*11)を正確に書くと、次のようになる。
(*12)
(*12)には , , の対称式で表される部分が多く含まれている。
対称式は を使えば簡略化できるので、そのために集合 を次のように定義する。
(*13)
これを使うと、(*12)の漸化式部分は次のように書き換えられる。
(*14)
(*14)の第2式( の式)は簡単に解くことができて、 の一般式は次のように表される。
(*15)
よって求めたかった の一般式は次式で表される。
(*16)
(途中からあからさまに前回のコピペだけどいいよね……)
これで5変数の算術和をブール型変数で記述することができた。
ようやく次のステップに進める。
と言っても、残りの演算はすべては論理和・論理積・論理否定・排他的論理和・ビットシフトだけだから、特に難しいところはない……はず。
問題があるとしたら、計算量が多すぎて System.OutOfMemoryException 吐きそうなことくらい……かなぁ。
とにかく、今回の結果は初期seedから起動日時の直接逆算への大きな一歩になると思う。タブンネ。
……
ちなみに。
今回の計算はものすごくめんどうなのが多かったけど、ブール代数式の特定の変数に式を代入して(リード・マラー標準形に)正規化させるプログラムを書いたらあっという間だった。
結論:式変形はプログラムに任せるべし。