我遇到了这个通过试验分区测试素性的算法我完全理解这个算法
static boolean isPrime(int N) {
if (N < 2)
return false;
for (int i = 2; i <= Math.sqrt(N); i++)
if (N % i == 0)
return false;
return true;
}
它运作得很好。但后来我遇到了另一个同样有效的但我并不完全理解它背后的逻辑。
static boolean isPrime(int N) {
if (N < 2)
return false;
for (int i = 2; i * i<N; i++)
if (N % i == 0)
return false;
return true;
}
似乎i *i < N
的行为与i <= Math.sqrt(N)
相似。如果是这样,为什么?
答案 0 :(得分:1)
是的,你是对的,那些是相同的,显然等式i <= Math.sqrt(N)
可以重写为i * i <= N
的整数,如果你对第一个等式的两个部分都进行平方。
,
即a < b
与a * a < b * b
等价,对于正a,b;
答案 1 :(得分:1)
顺便说一下,如果您认为速度过慢,可以通过一些调整加快代码速度:
static boolean isPrime(int N) {
if (N <= 1)
return false;
if (N % 2 == 0)
return N == 2;
for (int i = 3; i <= Math.sqrt(N); i += 2)
if (N % i == 0)
return false;
return true;
}
这个版本对负数和可分性进行了2次特殊测试,然后仅从那时开始除以奇数:3,5,7,......(注意“+ = 2”)。