为什么我们可以在找到素数时使用sqrt(n)而不是n / 2作为上限?

时间:2014-01-27 14:25:04

标签: java algorithm math

我们如何在此代码中使用sqrt(n)代替n/2?使用sqrt(n)是否正确?

    static boolean isPrime(long n)
{
    if(n<=1) return false;
    double limit = Math.sqrt(n);
    for(long i = 2; i <= limit; i++)
    {
        if(n%i==0) return false;
    }
    return true;
}

3 个答案:

答案 0 :(得分:8)

如果n不是素数,请说n = p * q,则pq不能都大于sqrt(n)(否则p*q将大于n

答案 1 :(得分:1)

如果n可被整除,则所示算法会检查2和sqrt(n)之间的每个整数。 如果n可以被大于sqrt(n)的数字整除,比如说a,则会有b因子a * b = nb < a。在这种情况下,算法将找到b“first”并且看到n不是素数。

因此无需检查任何数字&gt; SQRT(N)。

答案 2 :(得分:0)

如果你不使用sqrt(),那么代码可能更容易理解(也更快)。

for (long i = 2; i*i <= n; i = (i==2) ? 3 : i+2) {
    ....
}

考虑我 i&gt; n,n可被i整除,因此n / i = m。那么m必须小于i。但这意味着你的循环必须早已遇到过,并发现n可以被m整除。所以这意味着你可以通过循环2..k来找到n的所有除数,其中k k&lt; = n。

如果计算素数列表,您还可以利用如果n不是素数,它必须可以被素数整除的事实。因此,仅检查低于或等于sqrt(n)的素数就足够了。由于素数比该范围内的普通数少得多,因此您的代码运行速度会更快。您可以从已经计算的列表部分中获取素数。