補題:32bit符号なし整数変数間の算術和演算をブール関数で表す その2
初期seedから日時を求める無謀な挑戦 - Plus Le Toolのための補題。
以下で使う記号の定義については[id:plusletool:20130427:p2]を参照。
また、以下では独自に定義した関数 を使うが、これについては[id:plusletool:20130612:p1]を参照。
補題:32bit符号なし整数変数間の算術和演算をブール関数で表す - Plus Le Toolの続き。
自力では絶対無理だと思ってたけど、あることに気づいたらあっさり解けちゃった……
とりあえず問題の確認から。
解きたい問題は次の漸化式だった。
(★1)[id:plusletool:20130615:p1](*23)再掲
以前解いた時は と定義して を消去してから変形していったが、うまくいかなかった。
失敗の原因は、 と の対称性を利用せずに安直に を消去しちゃったことにあると考える。
よって今回は、 の他に を使って変形していくことにする。
具体的には、 , を次のように定義する。
(*1)
Q.この定義はどこから出てきたのですか?
A.試行錯誤の末の結果なのでなんとも…… ただ、最初にこう置いておくと計算量が減ることだけは確か。
とにかく、(*1)を使うと(★1)の第2式,第3式はそれぞれ(*2)(*3)のように変形できる。
(*2)
(*3)
(*2)を適当に移項すると、
(*4)
また(*3)の添字を1下げることで、
(*5)
よって(*2)と(*5)の辺々を論理積して整理すると、次のようになる。
(*6)
(*6)の右辺の に(*4)を代入して、
(*7)
最後の行は(*5)を使った。
これはやや強引なやり方で、答えを知ってないとこの変形には普通気づかないだろうが、説明の都合なので許して(・ω<)テヘペロ
(*7)の添字を1下げると、
(*8)
(*8)を(*2)の右辺の に代入し、さらに(*5)の辺々を排他的論理和して整理すると、(*9)のようになる。
(*2)再掲
(*5)再掲
(*9)
(*5)より最後の項は (∵ [tex:n\left(\Omega\right)
(*10)
式(*10)は の漸化式になっているので、 を次のように定義するとうまくいきそうだ。
(*11)
(*11)を使えば、(★1)の第1式( の式)および(*10)はそれぞれ(*12)(*13)のように変形できる。
(★1)再掲
(*12)
(*13)
初期値などの条件も含めて(*12)(*13)を正確に書くと、次のようになる。
(*14)
これでようやく、解けそうな形の漸化式に変形できた。
ところで、(*14)には , , の対称式で表される部分が多く含まれている。
対称式は を使えば簡略化できるので、そのために集合 を次のように定義する。
(*15)
これを使うと、(*14)の漸化式部分は次のように書き換えられる。
(*16)
(*16)の第2式( の式)は簡単に解くことができて、 の一般式は次のように表される。
(*17)
よって求めたかった の一般式は次式で表される。
(*18)
を使わずに書くなら、次のようになる。
(*19)
……やっぱり無駄に長い。
(*19)の各括弧の中は対称式になっているので、それらを別の記号で表したのが(*18)というわけだ。
ああそうそう、長いから括弧の中で改行してるだけで、行列とかベクトルとかじゃないからね! 紛らわしいけど一応そのへん注意。
さてとにかく、これで漸化式(★1)がようやく解けた。
……が!
これを使って次に進もうとしたら、重大なミスに気づいた。
なんと これ、 じゃなくて について解くべき問題だったんだorz
このブール代数の漸化式を誰か解いてください! - Plus Le Toolで この問題解いてください>< なんて言ってしまったのですごく申し訳ない気持ち。
解けたのに答えを書かないわけにはいかないから一応記事にはしてみたけど……
解けて嬉しいか、というとちょっと複雑なキブン。
ちなみに、 について解く方もほぼ同じ手順で解けたので、近いうちに書く予定。書いた(→[id:plusletool:20130714:p1])。