A * X MOD(2 ^ N)-1的逆

时间:2009-05-21 19:23:29

标签: c++ math prng

给定函数y = f(A,X):

unsigned long F(unsigned long A, unsigned long x) {
    return  ((unsigned long long)A*X)%4294967295;
}

对于'x'的所有值,如何找到反函数x = g(A,y)使得x = g(A,f(A,x))?

如果f()对于'x'的所有值都不可逆,那么最接近逆的是什么?

(F是一个过时的PRNG,我试图理解一个人如何反转这样的功能)。

  • 更新
    如果A是(2 ^ N)-1的相对素数,则g(A,Y)只是f(A-1,y)。
    如果A不是相对素数,那么y的范围受到约束...... 如果限制在该范围内,g()是否仍然存在?

5 个答案:

答案 0 :(得分:8)

您需要Extended Euclidean algorithm。这给你R和S这样

gcd(A,2^N-1) = R * A + S * (2^N-1).

如果gcd为1则R为A的乘法逆。则反函数为

g(A,y) = R*y mod (2^N-1).

好的,对于G = Gcd(A,2 ^ N-1)不是1的情况,这是更新。在这种情况下

R*y mod (2^N-1) = R*A*x mod (2^N-1) = G*x mod (2^N-1).

如果y由函数f计算,那么y可以被G整除。因此我们可以将上面的等式除以G并得到一个模(2 ^ N-1)/ G的等式。因此,这组解决方案是

  x = R*y/G + k*(2^N-1)/G, where k is an arbitrary integer.

答案 1 :(得分:6)

解决方案给出了herehttp://en.wikipedia.org/wiki/Linear_congruence_theorem),并且演示了如何使用扩展的欧几里德算法来找到解决方案。

模数函数一般没有逆函数,但有时你可以找到一组映射到给定y的x。

答案 2 :(得分:3)

Accipitridae,Glenn和Jeff Moser之间有答案,但值得解释的是为什么不是每个数字都有一个逆转模型4294967295.原因是4294967295不是素数;它是five factors的乘积:3 x 5 x 17 x 257 x 65537.数字 x 在mod m if and only if下有一个多重逆 x m coprime,因此任何这些因素的倍数都不能在函数中出现反转。

这就是为这些PRNG选择的模数通常为素数的原因。

答案 3 :(得分:2)

呃......这是一个有效的方法:

unsigned long G(unsigned long A, unsigned long y)
{
    for(unsigned int i = 0; i < 4294967295; i++)
    {
        if(y == F(A, i)) return i);
    }
}

答案 4 :(得分:2)

你需要计算A mod ((2^N) - 1)的倒数,但是你可能并不总是给出你的模数的倒数。见this on Wolfram Alpha

请注意

A = 12343有逆(A ^ -1 = 876879007 mod 4294967295)

但是12345没有反转。

因此,如果A是relatively prime且(2 ^ n)-1,那么您可以使用Extended Euclidean Algorithm

轻松创建反函数

g(A,y) = F(A^-1, y)

否则你运气不好。

更新:针对您更新的问题,您仍然无法在限制范围内获得唯一的反转。即使您使用CookieOfFortune的强力解决方案,您也会遇到类似

的问题

G(12345, F(12345, 4294967294)) == 286331152 != 4294967294