Algorithm 使用(mod 2^32+;1)进行重复

Algorithm 使用(mod 2^32+;1)进行重复,algorithm,math,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)做任何我要求的事情,但那个数字是素数 如果试验值“a”会

其中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个可能值的集合都包含了值零,并且在那里重复会被卡住,因此它不是循环的。但即使排除零,如果以641的倍数开始,则只会访问641的倍数,而另一个因子也是如此


这种“访问所有值”属性只有在将某个素数模化,并且排除零时才有效。

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

如果我们使用递归:

r:=(RA)模块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的组合给出了完整的循环。)


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

最适合or?它有效,因为数字是素数。梅森素数应该起作用,否则两个整数m,n可能会出现,使得m*n是模数的除数,并且会为sbox和逆sbox返回非唯一值。在你的例子中,使用2^16+1作为模数只会给你唯一的值,并允许b用于实现逆sbox,但只适用于Mersenne素数。这是一个数论问题,但答案是“不存在这样的值”,因为| Zn˟|=(n-1)仅适用于素数n,并且它仅对n()的某些值是循环的。你应该跟进。