From e23d09b4f165a0fadb947d4945736e2e4d85c873 Mon Sep 17 00:00:00 2001 From: JimmyJoo Date: Fri, 2 Oct 2020 17:13:28 +0900 Subject: [PATCH] Improved SieveOfEratosthenes.js --- Maths/SieveOfEratosthenes.js | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Maths/SieveOfEratosthenes.js b/Maths/SieveOfEratosthenes.js index 1e0a2e2b2..ae2f945d4 100644 --- a/Maths/SieveOfEratosthenes.js +++ b/Maths/SieveOfEratosthenes.js @@ -1,16 +1,24 @@ function sieveOfEratosthenes (n) { /* - * Calculates prime numbers till a number n - * :param n: Number upto which to calculate primes - * :return: A boolean list contaning only primes - */ + * Calculates prime numbers till a number n + * :param n: Number upto which to calculate primes + * :return: A boolean list contaning only primes + */ const primes = new Array(n + 1) primes.fill(true) // set all as true initially primes[0] = primes[1] = false // Handling case for 0 and 1 const sqrtn = Math.ceil(Math.sqrt(n)) for (let i = 2; i <= sqrtn; i++) { if (primes[i]) { - for (let j = 2 * i; j <= n; j += i) { + for (let j = i * i; j <= n; j += i) { + /* + Optimization. + Let j start from i * i, not 2 * i, because smaller multiples of i have been marked false. + + For example, let i = 4. + We do not have to check from 8(4 * 2) to 12(4 * 3) + because they have been already marked false when i=2 and i=3. + */ primes[j] = false } }