哪个更快的方块或根?

时间:2011-04-14 17:15:16

标签: optimization loops primes

for (int i = 2; i * i <= n; i++)

for (int i = 2; i <= SQRT(n); i++)

只是想知道哪个更快我看了一些原始算法来获得根源,在我看来,平方数字会更快,但我不确定。这些循环用于确定数字“素数”。

5 个答案:

答案 0 :(得分:1)

编译器可能'缓存'SQRT(n)的结果,但我应该计算每一步。

答案 1 :(得分:1)

平方根需要更长时间,除非它是在硬件,查找或特殊机器代码版本中实现的。牛顿迭代是首选算法;它以二次方式收敛。

最适合自己的基准测试。我建议将调用移到循环外的平方根,这样你只需要执行一次而不是每次检查退出条件。

答案 2 :(得分:1)

不应该介于

之间
int sqrt = SQRT(n);
for (int i = 2; i <= sqrt; i++)

for (int i = 2; i * i <= n; i++)

答案取决于你做了多少循环迭代。 sqrt方法每次迭代的工作量较少,但启动成本较高。请注意,这是对过早优化的不满。

答案 3 :(得分:1)

为什么不跳过这两个并使用一些聪明的数学?以下代码使用属性避免它们两个,即第一个n奇数的和总是一个完美的平方。

我旧blogpost的无耻插件(来自我死去的博客)

int isPrime(int n)
{
    int squares = 1;
    int odd = 3;

    if( ((n & 1) == 0) || (n < 9)) return (n == 2) || ((n > 1) && (n & 1));
    else
    {
        for( ;squares <= n; odd += 2)
        {
            if( n % odd == 0) 
                return 0;
            squares+=odd;
        }
        return 1;
    }
}

答案 4 :(得分:0)

广场会更快。

但是如果n大于最大int的平方根,则方块将溢出,然后比较将出错。平方根函数可以(并且你期望)以这样的方式实现,即可以在参数上计算直到最大的可表示的int。这意味着它不会以这种方式出错。

在Java中,最大的int是2 ^ 31 - 1,这意味着它的平方根刚好低于46341.如果你想寻找大于那个的素数,那么平方就会阻止你。