我正在阅读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;
}
如果它的名字是它的作用的任何指示,它会检查一个数字是否为素数。但是,我无法弄清楚它是如何做到的。
我能理解每个陈述的作用,但我看不出它是如何运作的。
答案 0 :(得分:6)
基本上,如果数字q
是素数,则费马定理表明
a
(q - 1)
= 1 (mod q)
其中a
和q
是共同素数。
所以基本上while
循环只计算一些随机数到幂val-1
并且还取模val
。如果最终结果为1,则表示val
为素数,否则为素数。但总的来说,即使a
不是素数,p
的某些随机值也是如此。因此,我们通常采用一些随机数并重复相同的过程,如果最后给出p=1
,我们说val
是高概率的素数(外循环用于重复过程,更多迭代)你的答案是正确的概率更多)。所以基本上如果val
是素数,这个方法会正确地将它检测为素数,但如果它是复合的,它可能会检测到它是素数,并且它的概率很低。虽然这种方法不如其他方法有效。