【问题标题】:How does this isPrime function work?这个 isPrime 函数是如何工作的?
【发布时间】:2015-03-15 15:40:08
【问题描述】:

我正在阅读 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;
}

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

我可以理解每个语句的作用,但我不明白它是如何工作的。

【问题讨论】:

  • 在调试器中运行,并调用一个小素数,然后逐行执行代码,同时查看所有变量如何变化以及它们变化的内容。
  • @yasar 它基于小费马定理

标签: c primes


【解决方案1】:

如果一个数q 是素数,那么费马定理指出

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

其中aq 是互质数。

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

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2018-07-17
  • 2016-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 1970-01-01
相关资源
最近更新 更多