引用Mr. Marsaglia关于为CMWC PRNG生成更多参数:
“那些想要更多对r的人,a需要找到形式为p = ab ^ r + 1的素数,其中b = 2 ^ 32-1是原始根”。
我的问题在于我应该使用的方法来执行此操作。特别是非常大的素数。这就是我在MATLAB中写的:
isPrimitiveRoot = 0;
goodParameters = zeros(1,vectorSize);
nextFreeSpace = 1;
r = 1;
b = 2^32-1;
for a=0:2^32-1
isPrimitiveRoot = 0;
number = a*b^r+1;
if(isprime(number))
p = number;
phi_p = p - 1;
factors = factor(phi_p);
isPrimitiveRoot = 1;
for i=1:length(factors)
if(isprime(factors(i)))
if(mod(b^(phi_p/factors(i)),p)==1)
isPrimitiveRoot = 0;
end
end
end
end
if(isPrimitiveRoot)
goodParameters(nextFreeSpace) = a;
disp([nextFreeSpace a]);
nextFreeSpace = nextFreeSpace + 1;
end
end
我这样做是因为找到某个a
延迟的良好r
参数的步骤是:
p = a*b^r+1
是素数b
是原始根
p
。为此你需要评估
p-1
的主要因素并验证
那b^((p-1)/p_i) =/= 1 (mod(p))
对于p_i
的所有p-1
素因子。现在很明显为什么脚本不起作用。我选择b = 2^32 -1
和滞后r = 1
来保持简单。但是评估b^(phi_p/factors(i))
会导致数字过大(Inf
)。
答案 0 :(得分:1)
好吧,我总是可以在matlab中使用我的vpi工具箱。虽然我没有提供显式生成/测试原始根的工具,但vpi确实能够处理任意大整数,以及powermod函数来完成大部分工作。
然而,我会指出,无论工具如何,在这里完成一个简单的暴力循环超过2 ^ 32个元素将需要一段时间。