Random 带进位周期的互补乘法

Random 带进位周期的互补乘法,random,computer-science,Random,Computer Science,我试图找出一个特定的CMWC伪随机数发生器的周期是多少 wikipedia页面上有一些关于标准MWC和CMWC的不同参数周期的示例,但没有真正回答如何计算 有没有一个简单的方法来计算给定的乘数,r个种子数和基数b 例如,假设我有以下参数(对于CMWC): b=2^32-1 a=4294966362 r=32 我已经验证了p=a*b^r+1是素数 编辑:哦,复制了错误的a值。修正了它,所以p现在应该是素数。我误解了获得完整周期所需的条件: b也必须是p的原始根,我认为这里不是这样(老实说,我甚至没

我试图找出一个特定的CMWC伪随机数发生器的周期是多少

wikipedia页面上有一些关于标准MWC和CMWC的不同参数周期的示例,但没有真正回答如何计算

有没有一个简单的方法来计算给定的乘数,r个种子数和基数b

例如,假设我有以下参数(对于CMWC):

b=2^32-1

a=4294966362

r=32

我已经验证了
p=a*b^r+1
是素数


编辑:哦,复制了错误的a值。修正了它,所以p现在应该是素数。

我误解了获得完整周期所需的条件:

b
也必须是
p
的原始根,我认为这里不是这样(老实说,我甚至没有数学背景来理解原始根是什么)。如果有完整的周期,则周期将为
a*b^r
。就我所知,不可能(或者至少很难)知道这个周期会是什么样子(坦率地说,这没有用,因为实际上需要一个完整的周期)


来源:

b的顺序为p-1时,它是一个基元根,因此b^k可以根据k的值假定从1到p-1的每个值

元素的顺序是b^s=1(mod p)的最小s。 b是本原根当且仅当b^(φ(p)/k)!=对于φ(p)的每k个除数,1(!=表示不同),φ(p)=(p-1)是欧拉的toticent函数(http://en.wikipedia.org/wiki/Euler%27s_totient_function)

在您的示例中:
-φ(p)=a*b^r=p-1。
-a的除数是{1,2,3,31230912174294966362}。
-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有322570512个除数(http://en.wikipedia.org/wiki/Divisor_function)

通过模幂运算,可以看出 b^((p-1)/3)=1(mod p) 所以b的阶数与p-1的阶数不同

最好选择除数较少的数字a和b,这样p-1也会有较少的除数,并且对于每个除数k,计算(φ(p)/k)会很容易。b的顺序是min{phi(p)/k}=min{(p-1)/k}

在Marsaglia的文章“关于π和其他十进制展开式的随机性”中(http://interstat.statjournals.net/YEAR/2005/articles/0510005.pdf),有一些a、b和r的值。未满的句号也很有用(见文章)


基b=2^32没有完整的句点,但它返回0到2^32-1之间的整数。基b=2^32-1不能返回无偏32位整数(它永远不会返回数字2^31-1=4294967295)。

+1将数学全部放在一个位置。我不得不四处找了几个小时才把这一切整理好。