复发使用(mod 2 ^ 32 + 1)

时间:2014-07-02 02:55:47

标签: algorithm math

在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)做我要求的所有事情,但这个数字是素数。

2 个答案:

答案 0 :(得分:2)

  

如果试验值为“a”会导致重复访问所有2个 32 值,是否有算法会返回true?

是的,有:

return false;

最明显的原因是所有2个 32 可能值的集合包括零值,并且重现被卡住,因此它不是循环的。但即使你排除零,如果你从641的倍数开始,那么你只会访问641的倍数,而另一个因素也是如此。

这种“访问所有值”属性仅在减少模数某些素数时才有效,并且如果排除零。

答案 1 :(得分:0)

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

如果我们使用重复:

r :=( r a )mod m

很容易看出,当且仅当所有 a ^ i mod时,这才给出最大周期( m -1) m i = 0 .. m -2提供不同的数字。但是,即使 a m 都是素数,这也不会自动发生。

无法使用的两个素数的示例: a = 13, m = 17,因为13 ^ 4 mod 17 == 1,并且循环将是很短(4个步骤)。

因此,我们还需要一些其他要求。为了简短起见,这种类型的发生器(乘法同余生成器)产生最大周期( m -1),如果:

  • m 是素数
  • a m
  • 的原始根

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

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