理想的判断素数的方法应该是将所有小于或等于根号n的素数去除n,但是n是一个随机大于1的整数,小于这个数的平方根的素数表不好给定。下面介绍的方法,本意是动态的构建素数表,但是引入了很多冗余的除数。
代码:
bool
prime (
int
num)
{
if (num == 2 || num == 3 || num == 5)
return true;
if (num % 2 == 0 || num % 3 == 0 || num % 5 == 0 || num == 1)
return false;
unsigned long c = 7;
int maxc = int (sqrt (num));
while (c <= maxc)
{
if (num % c == 0)
return false;
c += 4;
if (num % c == 0)
return false;
c += 2;
if (num % c == 0)
return false;
c += 4;
if (num % c == 0)
return false;
c += 2;
if (num % c == 0)
return false;
c += 4;
if (num % c == 0)
return false;
c += 6;
if (num % c == 0)
return false;
c += 2;
if (num % c == 0)
return false;
c += 6;
}
return true;
}
{
if (num == 2 || num == 3 || num == 5)
return true;
if (num % 2 == 0 || num % 3 == 0 || num % 5 == 0 || num == 1)
return false;
unsigned long c = 7;
int maxc = int (sqrt (num));
while (c <= maxc)
{
if (num % c == 0)
return false;
c += 4;
if (num % c == 0)
return false;
c += 2;
if (num % c == 0)
return false;
c += 4;
if (num % c == 0)
return false;
c += 2;
if (num % c == 0)
return false;
c += 4;
if (num % c == 0)
return false;
c += 6;
if (num % c == 0)
return false;
c += 2;
if (num % c == 0)
return false;
c += 6;
}
return true;
}
分析:
相对于sqrt(n)次除,上面的程序需要sqrt(n)*8/30次除,效率提升了15/4倍。
自然数n,我们假设小于n的素数数F(n),F(n)的分布规律为:当n趋向于无穷大时,F(n)/(x/logx) = 1;
所以,动态的冗余度近似为:(sqrt(n)*4/15-x/logx)/sqrt(n)*4/15
其他更好的判断素数的算法,希望你能给我留言或者写在评论上,谢谢!