seedの計算

>求めたseedを個体値と関係付ける方法
プログラム書いた人のコメントから引用。

入力された個体値&性格から性格値とseedを求める部分は、
・実際のHASを生成するあるひとつのseed(不明部分は適当に埋める)について、次のseedを計算
・次のseedからCDSを計算してみて実際の値にあわなかったらやり直し、実際の値にあった場合はそのseedからその2つ前までのseedを計算する
・1つ前、2つ前のseedから性格値を生成し、実際の性格にあわなかったらやり直し、実際の性格と一致したら性格値の候補として書き留める
・以上のプロセスを、入力されたHASを生成しうるすべてのseedについて繰り返す。
(seedの最上位ビットと下位2バイトは個体値生成に使われないため、それ以外の部分を適当に補う)
という方法です。性格値の候補が複数出たときはおそらく特定不能なので諦めてます

http://d.hatena.ne.jp/eunopia/comment?date=20081216#c


>初期seedを-1,-2と減らして計算する方法
seed逆算式は以下の通り


seed[n+1]=(seed[n]*0x41C64E6D+0x6073)%0x100000000
より mod 0x100000000 において
seed[n+1]≡seed[n]*0x41C64E6D+0x6073
seed[n+1]-0x6073≡seed[n]*0x41C64E6D
seed[n+1]-0x6073+0x100000000≡seed[n]*0x41C64E6D
(seed[n+1]+0xFFFF9F8D)*0x41C64E6D-1≡seed[n]*0x41C64E6D*0x41C64E6D-1
(seed[n+1]+0xFFFF9F8D)*0x41C64E6D-1≡seed[n]
※0x41C64E6D*0xEEB9EB65≡1より0x41C64E6D-1=0xEEB9EB65
(seed[n+1]+0xFFFF9F8D)*0xEEB9EB65≡seed[n]
seed[n+1]*0xEEB9EB65+0x6073*0xEEB9EB65≡seed[n]
seed[n+1]*0xEEB9EB65+0xA3561A1≡seed[n]
よって
seed[n]=(seed[n+1]*0xEEB9EB65+0xA3561A1)%0x100000000