merge: Add LinearSieve.js (#828)

This commit is contained in:
Allen Guan
2021-11-01 00:58:45 +08:00
committed by GitHub
parent 09eebc492a
commit 7c39839714
2 changed files with 40 additions and 0 deletions

24
Maths/LinearSieve.js Normal file
View File

@ -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 }

View File

@ -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()
}
})
})