【发布时间】:2011-06-03 15:47:11
【问题描述】:
引用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
我这样做是因为为某个 r 滞后找到好的 a 参数的步骤是:
- 证明
p = a*b^r+1是素数 - 证明
b是一个原根 的p。为此,您需要评估p-1的素数并验证 那b^((p-1)/p_i) =/= 1 (mod(p))对于p-1的所有p_i素因数。
现在很明显为什么脚本不起作用了。我选择了b = 2^32 -1 和延迟r = 1 以保持简单。但是评估 b^(phi_p/factors(i)) 会产生太大的数字 (Inf)。
- 我应该怎么做?
- 我应该使用其他软件吗?
- 还有其他验证原根的算法吗?
【问题讨论】: