【问题标题】:Inverse of A*X MOD (2^N)-1A*X MOD (2^N)-1 的倒数
【发布时间】:2010-10-28 00:52:13
【问题描述】:

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

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

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

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

(F 是一个过时的 PRNG,我试图了解如何反转这样的函数)。

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

【问题讨论】:

  • 你没有用 SO 来做你的功课,是吗? :)
  • 我希望我在学校时也能收到这样的问题。
  • 我也是,大声笑 - 我可能一直坚持下去。
  • 在宾夕法尼亚大学主修计算机科学专业,你会在这类事情上花费一年的时间。

标签: c++ math prng


【解决方案1】:

嗯...这是一个可行的方法:

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

【讨论】:

  • 虽然从蛮力的角度来看很好,但数学仍然是一个问题。在这种情况下,您不会得到独特的结果。例如你的 G(12345, F(12345, 4294967294)) == 286331152 != 4294967294;
【解决方案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.

【讨论】:

    【解决方案3】:

    您需要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.
    

    【讨论】:

      【解决方案4】:

      给出了解决方案here (http://en.wikipedia.org/wiki/Linear_congruence_theorem),其中包括如何使用扩展欧几里得算法来寻找解决方案的演示。

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

      【讨论】:

        【解决方案5】:

        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 下有一个乘法逆元mcoprime,因此任何是这些因子的倍数的数字在您的函数中都不能有逆数。

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

        【讨论】:

        • 事实上,如果您的模数始终是数字 2^n-1,那么您的反函数 G 仅针对梅森素数定义。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-02
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        相关资源
        最近更新 更多