这行在getPrimes算法中意味着什么?

时间:2013-06-23 02:21:03

标签: javascript

var fs = require('fs');
var outfile = "primes.txt";
function getPrimes(max) {
    var primeSieve = [], i, j, primes = [];
    for (i = 2; i <= max; ++i) {
        if (!primeSieve[i]) {
            // i has not been marked - it is prime
            primes.push(i);
            for (j = i << 1; j <= max; j += i) {
                primeSieve[j] = true;
            }
        }
    }
    return primes;
}
fs.writeFileSync(outfile,  getPrimes(1000).slice(0,100) + ",");
console.log("Script: " + __filename + "\nWrote: " + getPrimes(1000).slice(0,100) + "To: " + outfile);

我有上面的代码,我修改了以产生输出(由其他人提供的主算法)。我是Javascript的新手,并且不确定以下行实际上在做什么以及&lt;&lt;运营商意味着(我一直无法在Javascript网站上找到)。

for (j = i << 1; j <= max; j += i)

我知道它将主要primeSieve数组中的相关数字标记为true,因此它们不会填充primes数组,但是我不知道它是如何做的。

1 个答案:

答案 0 :(得分:1)

<<运算符是left shift operator。左参数(在转换为整数值后,如果需要)向左移动右参数指定的位数,右填充零。向左移动与乘以2相同。

内部循环只在true的每个元素中存储primeSieve,该元素的索引是i的倍数。因此,如果primeSieve[j]true,则j必须是某些先前i的倍数(因此j不能为素数)。相反,如果primeSieve[i]不是true,那么它不是i之前任何值的倍数;因为它包括从2i-1的所有整数,所以i必须是素数。

为了收集所有素数达到一定的最大值,这种方法远远优于独立测试每个整数的素数的技术。但是,它远非最有效的方法。例如,请注意primeSieve的元素可能会多次设置为true。例如,在primeSieve[6]时设置i==2,在i==3时设置i。此外,一旦max超过max的平方根,内循环就会浪费,因为保证在此时标记所有最多{{1}}的复合数字。有关这一切是如何工作的更多信息,请参阅Wikipedia article on the Sieve of Eratosthenes,并指出更有效的方法。

P.S。该代码看起来suspiciously familiar。 : - )