【发布时间】:2013-03-03 03:19:15
【问题描述】:
我曾尝试为Fermat primality test 编写代码,但显然失败了。
所以,如果我理解得很好:如果p 是素数,那么((a^p)-a)%p=0 其中p%a!=0。
我的代码似乎没问题,因此很可能我误解了基础知识。我在这里错过了什么?
private bool IsPrime(int candidate)
{
//checking if candidate = 0 || 1 || 2
int a = candidate + 1; //candidate can't be divisor of candidate+1
if ((Math.Pow(a, candidate) - a) % candidate == 0) return true;
return false;
}
【问题讨论】:
-
“但显然失败了”。为何如此?哪个输入失败了?
-
除了非常小的输入外,您无法以这种方式实现模幂运算。它会很快溢出,并且对于任何不是 2 的幂的候选者来说都是非常具有破坏性的。你需要通过平方取幂,使用 64 位中间值。
-
@Kevin 尝试从 4 到 20。4 到 13 为真。 14到15是假的。 16 对。 17 到 20 错误。
-
@harold 如何处理?
-
所有素数都将满足该测试。并非所有通过测试的候选人都是素数。您必须测试许多
as,然后才能说一个数字是可能素数,即使这样,您也会将一类合数(“卡迈克尔数”)误认为是素数。