【问题标题】:recurrence using (mod 2^32+1)使用 (mod 2^32+1) 重复
【发布时间】:2014-07-02 02:55:47
【问题描述】:

在 m = 2^32+1 = 641*6700417 的情况下,mod 函数只不过是 32 位处理器上的一次减法。我不在乎复发
Seed = Seed*a%m
不是一个好的随机数生成器。我希望在加密算法中将其用作 32 位宽的 sbox。如果“a”的试验值会导致重复访问所有 2^32 值,是否有一种算法会返回 true?

假设这样的算法存在,我怀疑如果 a*b%m = 1,那么使用“b”的递归将向后运行。我怀疑是真的。我会使用“b”来实现反向 sbox。

我可以使用 mod (2^16+1) 完成我要求的所有操作,但这个数字是素数。

【问题讨论】:

  • 之所以有效,是因为这个数字是素数。梅森素数应该可以工作,否则可能有两个整数 m, n 使得 m*n 是模数的除数,并且将返回 sbox 和逆 sbox 的非唯一值。在您的情况下,使用 2^16 + 1 作为模数只会为您提供唯一值,并且允许 b 用于实现逆 sbox,但仅适用于梅森素数。
  • 这是一道数论题,但答案是“不存在这样的值”,因为 |Zn˟| = (n-1) 仅适用于素数 n,并且仅对于某些 n 值是循环的 (details in this article)。你应该跟进math.stackexchange.com

标签: algorithm math


【解决方案1】:

如果“a”的试验值会导致重复访问所有 232 个值,是否有一种算法会返回 true?

是的,有:

return false;

最明显的原因是所有 232 个可能值的集合都包含值零,并且重复出现卡住了,因此它不是循环的。但即使你排除了零,如果你从 641 的倍数开始,那么你只会访问 641 的倍数,其他因素也是如此。

这种“访问所有值”属性仅在您对某个素数进行模减并且排除零时才有效。

【讨论】:

    【解决方案2】:

    这不是一个很简单的问题。很容易回答,在您的情况下,您使用的数字很差。然而,简单的答案:使用素数也不是正确的答案。

    如果我们使用递归:

    r := (r a) mod m

    很容易看出,当且仅当所有 a^i mod mi = 0 .. m-2 给出不同的数字。但是,即使 am 都是素数,这也不会自动发生。

    不能使用两个素数的例子:a = 13, m = 17,因为13^4 mod 17 == 1,循环将是非常短(4 步)。

    因此,我们还需要一些其他要求。长话短说,这种类型的生成器(乘同余生成器)会产生最大循环 (m-1),如果:

    • m 是素数
    • am 的原根

    不幸的是,后一个要求有点困难,因为没有找到原始根的通用公式。 (请注意,a 不一定是素数,例如 m=17 和 a=10 的组合给出了完整的循环。)

    因此,尽管这是一个看似简单的问题,但它涉及数论的一些相当基本的方面。

    【讨论】:

      猜你喜欢
      • 2012-11-29
      • 1970-01-01
      • 2016-07-19
      • 1970-01-01
      • 2010-12-02
      • 2021-10-28
      • 2010-10-28
      • 1970-01-01
      相关资源
      最近更新 更多