From dacdd29342e7f860908c595d3e7346d9642a1a60 Mon Sep 17 00:00:00 2001 From: Yatin Date: Sat, 20 Nov 2021 16:58:42 +0530 Subject: [PATCH] optamization,documantation,return Array[bool] => Array[primes only], test case --- Dynamic-Programming/SieveOfEratosthenes.js | 29 ++++++++++++------- .../tests/SieveOfEratosthenes.test.js | 23 +++++++++++++++ 2 files changed, 41 insertions(+), 11 deletions(-) create mode 100644 Dynamic-Programming/tests/SieveOfEratosthenes.test.js diff --git a/Dynamic-Programming/SieveOfEratosthenes.js b/Dynamic-Programming/SieveOfEratosthenes.js index 4fb1b47b52..77e588c073 100644 --- a/Dynamic-Programming/SieveOfEratosthenes.js +++ b/Dynamic-Programming/SieveOfEratosthenes.js @@ -1,21 +1,28 @@ +/** + * @function SieveOfEratosthenes + * @description Calculates prime numbers till input number n + * @param {Number} n - The input integer + * @return {Number[]} List of Primes till n. + * @see [Sieve_of_Eratosthenes](https://www.geeksforgeeks.org/sieve-of-eratosthenes/) + */ function sieveOfEratosthenes (n) { - /* - * Calculates prime numbers till a number n - * :param n: Number up to which to calculate primes - * :return: A boolean list containing only primes - */ - const primes = new Array(n + 1) - primes.fill(true) // set all as true initially + if (n <= 1) return [] + const primes = new Array(n + 1).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++) { + for (let i = 2; i * i <= n; i++) { if (primes[i]) { - for (let j = 2 * i; j <= n; j += i) { + for (let j = i * i; j <= n; j += i) { primes[j] = false } } } - return primes + + return primes.reduce((result, isPrime, index) => { + if (isPrime) { + result.push(index) + } + return result + }, []) } // Example diff --git a/Dynamic-Programming/tests/SieveOfEratosthenes.test.js b/Dynamic-Programming/tests/SieveOfEratosthenes.test.js new file mode 100644 index 0000000000..7fa2d4cc7e --- /dev/null +++ b/Dynamic-Programming/tests/SieveOfEratosthenes.test.js @@ -0,0 +1,23 @@ +import { sieveOfEratosthenes } from '../SieveOfEratosthenes' + +describe('SieveOfEratosthenes', () => { + it('Primes till 0', () => { + expect(sieveOfEratosthenes(0)).toEqual([]) + }) + + it('Primes till 1', () => { + expect(sieveOfEratosthenes(1)).toEqual([]) + }) + + it('Primes till 10', () => { + expect(sieveOfEratosthenes(10)).toEqual([2, 3, 5, 7]) + }) + + it('Primes till 23', () => { + expect(sieveOfEratosthenes(23)).toEqual([2, 3, 5, 7, 11, 13, 17, 19, 23]) + }) + + it('Primes till 70', () => { + expect(sieveOfEratosthenes(70)).toEqual([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67]) + }) +})