Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add Linear prime sieve #219

Open
wants to merge 8 commits into
base: master
Choose a base branch
from
Prev Previous commit
Next Next commit
Refactor linearPrimeSieve.js
sandeeps456 committed Oct 1, 2018
commit b43738839e18f4f8a797cb5ad671192b244d04b4
47 changes: 29 additions & 18 deletions src/algorithms/math/linear-prime-sieve/linearPrimeSieve.js
Original file line number Diff line number Diff line change
@@ -3,22 +3,33 @@
* @return {number[]}
*/
export default function linearPrimeSieve(maxNumber) {
const primes =[];
const leastPrimeFactor = new Array(maxNumber + 1).fill(0); // leastPrimeFactor[i] gives us the least prime factor of 'i'

for(let i=2; i<=maxNumber; i++ ){
if(!leastPrimeFactor[i]){ // leastPrimeFactor[i] = 0 means 'i' itself is its least prime factor, i.e 'i' is prime
leastPrimeFactor[i] = i;
primes.push(i);
}

/*
* start setting leastPrimeFactor[] for numbers 'x', where x = p * i, p is x's least prime factor and p <= leastPrimeFactor[i]
* x = p*i, this representation will be unique for any number, therefore leastPrimeFactor[x] will be set only once.
*/
for(let j=0; j<primes.length && primes[j]*i <=maxNumber && primes[j]<=leastPrimeFactor[i]; j++)
leastPrimeFactor[primes[j]*i] = primes[j];
}

return primes;
const primes = [];
// leastPrimeFactor[i] gives us the least prime factor of 'i'
const leastPrimeFactor = new Array(maxNumber + 1).fill(0);

for (let i = 2; i <= maxNumber; i += 1) {
if (!leastPrimeFactor[i]) {
/* leastPrimeFactor[i] = 0 means 'i' itself is its least prime factor,
* i.e 'i' is prime
*/
leastPrimeFactor[i] = i;
primes.push(i);
}

/*
* start setting leastPrimeFactor[] for numbers 'x', where x = p * i, p is x's
* least prime factor and p <= leastPrimeFactor[i]. x = p*i, this representation will
* be unique for any number, therefore leastPrimeFactor[x] will be
* set only once.
*/

let j = 0;
while (j < primes.length) {
if ((primes[j] * i > maxNumber) || (primes[j] > leastPrimeFactor[i])) { break; }
leastPrimeFactor[primes[j] * i] = primes[j];
j += 1;
}
}

return primes;
}