我试图找出特定CMWC伪随机数生成器的周期。
维基百科页面提供了标准MWC和CMWC的不同参数周期的一些示例,但并没有真正回答这是如何计算的。
对于给定的乘数,r个种子数和基数b,是否有一种简单的方法来计算它?
例如,假设我有以下参数(对于CMWC):
b=2^32-1
a=4294966362
r=32
我已经确认p=a*b^r+1
是素数。
编辑:oops,复制了错误的值。修正了它,所以p现在应该是素数。
答案 0 :(得分:1)
b是一个原始根,当它的顺序是p-1时,所以b ^ k可以假定从1到p-1的每个值,具体取决于k的值。
元素的顺序是最小s,其中b ^ s = 1(mod p)。 b是原始根,只有当b ^(phi(p)/ k)!= 1(!=表示不同)时,每个k除数为phi(p),并且phi(p)=(p-1) )是Euler的函数(http://en.wikipedia.org/wiki/Euler%27s_totient_function)。
在你的例子中:
- phi(p)= a * b ^ r = p - 1.
- 除数为{1,2,3,31,23091217,4294966362}。
- b的除数为{1,3,5,17,257,65537,4294967295}。
所以,(p-1)= 2 *(3 ^ 33)*(5 ^ 32)*(17 ^ 32)* 31 *(257 ^ 32)*(65537 ^ 32)* 23091217。
p-1有322,570,512个除数(http://en.wikipedia.org/wiki/Divisor_function)
使用模幂运算,可以看到它 b ^((p-1)/ 3)= 1(mod p) 所以b的顺序与p-1不同。
最好用几个除数选择数字 a 和 b ,然后p-1也会有很少的除数,并且它很容易计算(phi(p )/ k)对于每个除数k。 b的顺序为min {phi(p)/ k} = min {(p-1)/ k}。
在Marsaglia的文章“关于Pi和其他小数扩展的随机性”(http://interstat.statjournals.net/YEAR/2005/articles/0510005.pdf)中,有一些a,b和r的值。不完整的时期也是有用的(见文章)。
Base b = 2 ^ 32没有完整的句点,但它返回0到2 ^ 32-1之间的整数。基数b = 2 ^ 32-1不能返回无偏32位整数(它永远不会返回数字2 ^ 31-1 = 4294967295)。
答案 1 :(得分:0)
我误解了获得一个完整时期所需要的东西:
b
也必须是p
的原始根,我不认为这是这种情况(说实话,我没有数学背景,甚至没有开始理解什么原始根是)。如果有一个完整的期间,则期间为a*b^r
。据我所知,不可能(或者至少很难)告诉那个时期会是什么时候(坦率地说,它没有用,因为在实践中需要一段时间)。