diff --git a/Maths/LinearSieve.js b/Maths/LinearSieve.js new file mode 100644 index 000000000..8092c9ebe --- /dev/null +++ b/Maths/LinearSieve.js @@ -0,0 +1,24 @@ +const LinearSieve = (n) => { + /* + * Calculates prime numbers till a number n + * Time Complexity: O(n) + * Explanation: https://cp-algorithms.com/algebra/prime-sieve-linear.html + * :param n: Number up to which to calculate primes + * :return: A list containing only primes + */ + const isnPrime = new Array(n + 1) + isnPrime[0] = isnPrime[1] = true + const primes = [] + for (let i = 2; i <= n; i++) { + if (!isnPrime[i]) primes.push(i) + for (const p of primes) { + const k = i * p + if (k > n) break + isnPrime[k] = true + if (i % p === 0) break + } + } + return primes +} + +export { LinearSieve } diff --git a/Maths/test/LinearSieve.test.js b/Maths/test/LinearSieve.test.js new file mode 100644 index 000000000..b71904349 --- /dev/null +++ b/Maths/test/LinearSieve.test.js @@ -0,0 +1,16 @@ +import { LinearSieve } from '../LinearSieve' +import { PrimeCheck } from '../PrimeCheck' + +describe('LinearSieve', () => { + it('should return primes below 100', () => { + expect(LinearSieve(100)).toEqual([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]) + }) + + it('should return primes only', () => { + const n = 100000 + const primes = LinearSieve(n) + for (const p of primes) { + expect(PrimeCheck(p)).toBeTruthy() + } + }) +})