recurrence using (mod 2^32+1)



其中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)来做我要求的任何事情但这个数是素数

是否存在一种算法,如果"a"的试验值会导致递归访问所有232值,则返回true ?

有:

return false;

最明显的原因是所有232可能值的集合包括值0,在那里递归卡住了,所以它不是循环的。但是,即使你排除了0,如果你从641的倍数开始,那么你只会访问641的倍数,对于另一个因子也是如此。

这种"访问所有值"的性质只有当你对某个素数取约模并且排除零时才有效。

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

如果我们使用递归式:

r : = ( r )国防部m

很容易看出,这给出了最大循环(m-1)当且仅当所有a^i mod m给出i = 0的不同数。 m 2。然而,即使am都是素数,这也不会自动发生。

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

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

  • m为素数
  • am
  • 的原始根

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

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

最新更新