其中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。然而,即使a和m都是素数,这也不会自动发生。
不能使用的两个素数的例子:a = 13, m = 17,因为13^4 mod 17 == 1,循环将非常短(4步)。
所以,我们还需要一些其他的要求。长话短说,这种类型的生成器(乘法同余生成器)产生最大循环(m-1),如果:
- m为素数
- a是m 的原始根
不幸的是,后一个要求有点困难,因为没有找到原始根的通用公式。(请注意,a不一定是素数,例如,m=17和a=10的组合是完整的周期。)
因此,尽管这是一个看似简单的问题,但它触及了数论的一些相当基本的方面。