CMWC(互补乘法携带)Matlab

时间:2011-06-03 15:47:11

标签: matlab random generator

引用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参数的步骤是:

  1. 证明p = a*b^r+1是素数
  2. 证明b是原始根 p。为此你需要评估 p-1的主要因素并验证 那b^((p-1)/p_i) =/= 1 (mod(p)) 对于p_i的所有p-1素因子。
  3. 现在很明显为什么脚本不起作用。我选择b = 2^32 -1和滞后r = 1来保持简单。但是评估b^(phi_p/factors(i))会导致数字过大(Inf)。

    1. 我应该做什么呢?
    2. 我应该使用其他软件吗?
    3. 是否有另一种验证原始根的算法?

1 个答案:

答案 0 :(得分:1)

好吧,我总是可以在matlab中使用我的vpi工具箱。虽然我没有提供显式生成/测试原始根的工具,但vpi确实能够处理任意大整数,以及powermod函数来完成大部分工作。

然而,我会指出,无论工具如何,在这里完成一个简单的暴力循环超过2 ^ 32个元素将需要一段时间。