11

Cで表現された関数は次のとおりです。

uint32_t f(uint32_t x) {
    return (x * 0x156) ^ 0xfca802c7;
}

それから私は挑戦に出くわしました:そのすべての不動点を見つける方法は?

この問題を解決するためにすべての値をテストできることはわかっていuint32_tますが、よりエレガントな別の方法があるかどうかを知りたいです。特に、値の任意のペアになりますuint32_tuint64_t(0x156, 0xfca802c7)

4

3 に答える 3

5

Z3 ソルバーを使用してみましょう:

(declare-const x (_ BitVec 32))
(assert (= x (bvxor (bvmul x #x00000156) #xfca802c7)))
(check-sat)
(get-model)

結果は'#x08f2cab1' = 150129329.

于 2016-05-04T07:33:44.733 に答える