这是怎样的功能?

时间:2015-03-15 15:40:09

标签: c primes

我正在阅读http://www2.informatik.hu-berlin.de/~weber/slipOff/hashmap_c.html并且很难理解这个功能是如何运作的:

static unsigned long isPrime(unsigned long val)
{
  int i, p, exp, a;

  for (i = 9; i--;)
  {
    a = (rand() % (val-4)) + 2;
    p = 1;
    exp = val-1;
    while (exp)
    {
      if (exp & 1)
        p = (p*a)%val;

      a = (a*a)%val;
      exp >>= 1;
    }

    if (p != 1)
      return 0;
  }

  return 1;
}

如果它的名字是它的作用的任何指示,它会检查一个数字是否为素数。但是,我无法弄清楚它是如何做到的。

我能理解每个陈述的作用,但我看不出它是如何运作的。

1 个答案:

答案 0 :(得分:6)

基本上,如果数字q是素数,则费马定理表明

a (q - 1) = 1 (mod q)

其中aq是共同素数。

所以基本上while循环只计算一些随机数到幂val-1并且还取模val。如果最终结果为1,则表示val为素数,否则为素数。但总的来说,即使a不是素数,p的某些随机值也是如此。因此,我们通常采用一些随机数并重复相同的过程,如果最后给出p=1,我们说val是高概率的素数(外循环用于重复过程,更多迭代)你的答案是正确的概率更多)。所以基本上如果val是素数,这个方法会正确地将它检测为素数,但如果它是复合的,它可能会检测到它是素数,并且它的概率很低。虽然这种方法不如其他方法有效。