请解释试验部如何为Primality Test工作

时间:2013-11-02 21:35:29

标签: java algorithm primes

我遇到了这个通过试验分区测试素性的算法我完全理解这个算法

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)相似。如果是这样,为什么?

2 个答案:

答案 0 :(得分:1)

是的,你是对的,那些是相同的,显然等式i <= Math.sqrt(N)可以重写为i * i <= N的整数,如果你对第一个等式的两个部分都进行平方。
, 即a < ba * 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”)。