【问题标题】:CMWC (Complementary Multiply-with-carry) MatlabCMWC(互补乘法进位)Matlab
【发布时间】: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 参数的步骤是:

  1. 证明p = a*b^r+1 是素数
  2. 证明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)。

  1. 我应该怎么做?
  2. 我应该使用其他软件吗?
  3. 还有其他验证原根的算法吗?

【问题讨论】:

    标签: matlab random generator


    【解决方案1】:

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

    不过,我要指出的是,无论使用何种工具,对 2^32 个元素进行简单的蛮力循环都需要一段时间才能完成。

    【讨论】:

    • 我使用了文件交换网站上提供的 vpi 工具箱,它穿起来像个魅力。它是免费的并且实施得很好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    • 1970-01-01
    相关资源
    最近更新 更多