Skip to content

Commit fee8d9a

Browse files
committed
✨ feat: implement '@algorithm.ts/sieve-prime'
1 parent eb890fe commit fee8d9a

File tree

8 files changed

+215
-0
lines changed

8 files changed

+215
-0
lines changed

Diff for: README.md

+2
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ Package | Description
6969
[@algorithm.ts/mcmf][] | MCMF algorithm. #MinCostMaxFlow, #NetworkFlow.
7070
[@algorithm.ts/priority-queue][] | Priority Queue (heap).
7171
[@algorithm.ts/sliding-window][] | Sliding window algorithm.
72+
[@algorithm.ts/sieve-prime][] | A linear time algorithm to sieve prime numbers.
7273
[@algorithm.ts/sudoku][] | A collection of utilities to generate / solve Sudoku problems.
7374
[@algorithm.ts/trie][] | Trie. (digital tree or prefix tree)
7475
[@algorithm.ts/upper-bound][] | Find the index of first elements which greater than the target element.
@@ -94,6 +95,7 @@ algorithm.ts is [MIT licensed](https://github.com/guanghechen/algorithm.ts/blob/
9495
[@algorithm.ts/manacher]: ./packages/manacher
9596
[@algorithm.ts/mcmf]: ./packages/mcmf
9697
[@algorithm.ts/priority-queue]: ./packages/priority-queue
98+
[@algorithm.ts/sieve-prime]: ./packages/sieve-prime
9799
[@algorithm.ts/sliding-window]: ./packages/sliding-window
98100
[@algorithm.ts/sudoku]: ./packages/sudoku
99101
[@algorithm.ts/trie]: ./packages/trie

Diff for: packages/sieve-prime/README.md

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
<header>
2+
<h1 align="center">
3+
<a href="https://github.com/guanghechen/algorithm.ts/tree/main/packages/sieve-prime#readme">@algorithm.ts/sieve-prime</a>
4+
</h1>
5+
<div align="center">
6+
<a href="https://www.npmjs.com/package/@algorithm.ts/sieve-prime">
7+
<img
8+
alt="Npm Version"
9+
src="https://img.shields.io/npm/v/@algorithm.ts/sieve-prime.svg"
10+
/>
11+
</a>
12+
<a href="https://www.npmjs.com/package/@algorithm.ts/sieve-prime">
13+
<img
14+
alt="Npm Download"
15+
src="https://img.shields.io/npm/dm/@algorithm.ts/sieve-prime.svg"
16+
/>
17+
</a>
18+
<a href="https://www.npmjs.com/package/@algorithm.ts/sieve-prime">
19+
<img
20+
alt="Npm License"
21+
src="https://img.shields.io/npm/l/@algorithm.ts/sieve-prime.svg"
22+
/>
23+
</a>
24+
<a href="#install">
25+
<img
26+
alt="Module Formats: cjs, esm"
27+
src="https://img.shields.io/badge/module_formats-cjs%2C%20esm-green.svg"
28+
/>
29+
</a>
30+
<a href="https://github.com/nodejs/node">
31+
<img
32+
alt="Node.js Version"
33+
src="https://img.shields.io/node/v/@algorithm.ts/sieve-prime"
34+
/>
35+
</a>
36+
<a href="https://github.com/facebook/jest">
37+
<img
38+
alt="Tested with Jest"
39+
src="https://img.shields.io/badge/tested_with-jest-9c465e.svg"
40+
/>
41+
</a>
42+
<a href="https://github.com/prettier/prettier">
43+
<img
44+
alt="Code Style: prettier"
45+
src="https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square"
46+
/>
47+
</a>
48+
</div>
49+
</header>
50+
<br/>
51+
52+
53+
A typescript implementation of the **Linear Sieve** algorithm for prime numbers.
54+
55+
If you are interested in this algorithm, you can check [here][sieve-prime].
56+
57+
58+
## Install
59+
60+
* npm
61+
62+
```bash
63+
npm install --save @algorithm.ts/sieve-prime
64+
```
65+
66+
* yarn
67+
68+
```bash
69+
yarn add @algorithm.ts/sieve-prime
70+
```
71+
72+
* deno
73+
74+
```typescript
75+
import sievePrime from 'https://raw.githubusercontent.com/guanghechen/algorithm.ts/main/packages/sieve-prime/src/index.ts'
76+
```
77+
78+
## Usage
79+
80+
* Get all prime numbers in the range $[2, N)$:
81+
82+
```typescript
83+
import sievePrime from '@algorithm.ts/sieve-prime'
84+
85+
sievePrime(5) // => [2, 3]
86+
sievePrime(6) // => [2, 3, 5]
87+
sievePrime(10) // => [2, 3, 5, 7]
88+
```
89+
90+
91+
## Related
92+
93+
* [数论基础之筛法][sieve-prime]
94+
95+
96+
[homepage]: https://github.com/guanghechen/algorithm.ts/tree/main/packages/sieve-prime#readme
97+
[sieve-prime]: https://me.guanghechen.com/post/math/number-theory/sieve/#heading-%E7%BA%BF%E6%80%A7%E7%AD%9B

Diff for: packages/sieve-prime/__test__/sieve-prime.spec.ts

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import sievePrime from '../src'
2+
3+
describe('sieve-prime', function () {
4+
test('boundary', function () {
5+
expect(sievePrime(-1)).toEqual([])
6+
expect(sievePrime(0)).toEqual([])
7+
expect(sievePrime(1)).toEqual([])
8+
expect(sievePrime(2)).toEqual([])
9+
expect(sievePrime(5)).toEqual([2, 3])
10+
expect(sievePrime(6)).toEqual([2, 3, 5])
11+
})
12+
13+
test('strict', function () {
14+
const primes: number[] = sievePrime(1000)
15+
16+
const answers: number[] = []
17+
for (let i = 2; i < 1000; ++i) {
18+
let flag = true
19+
for (let j = 2; j * j <= i; ++j) {
20+
if (i > j && i % j === 0) {
21+
flag = false
22+
break
23+
}
24+
}
25+
if (flag) answers.push(i)
26+
}
27+
28+
expect(primes).toEqual(answers)
29+
})
30+
})

Diff for: packages/sieve-prime/package.json

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"name": "@algorithm.ts/sieve-prime",
3+
"version": "1.0.19",
4+
"description": "A linear time algorithm to sieve prime numbers",
5+
"author": {
6+
"name": "guanghechen",
7+
"url": "https://github.com/guanghechen/"
8+
},
9+
"repository": {
10+
"type": "git",
11+
"url": "https://github.com/guanghechen/algorithm.ts.git",
12+
"directory": "packages/sieve-prime"
13+
},
14+
"homepage": "https://github.com/guanghechen/algorithm.ts/tree/main/packages/sieve-prime#readme",
15+
"keywords": [
16+
"algorithm",
17+
"prime",
18+
"linear sieve"
19+
],
20+
"main": "lib/cjs/index.js",
21+
"module": "lib/esm/index.js",
22+
"types": "lib/types/index.d.ts",
23+
"source": "src/index.ts",
24+
"license": "MIT",
25+
"engines": {
26+
"node": ">= 14.15.0"
27+
},
28+
"files": [
29+
"lib/",
30+
"!lib/**/*.js.map",
31+
"!lib/**/*.d.ts.map",
32+
"package.json",
33+
"CHANGELOG.md",
34+
"LICENSE",
35+
"README.md"
36+
],
37+
"scripts": {
38+
"build": "cross-env NODE_ENV=production rollup -c ../../rollup.config.js",
39+
"prebuild": "rimraf lib/ && tsc -p tsconfig.src.json --emitDeclarationOnly",
40+
"prepublishOnly": "cross-env ROLLUP_SHOULD_SOURCEMAP=false yarn build",
41+
"test": "cross-env TS_NODE_FILES=true jest --config ../../jest.config.js --rootDir ."
42+
}
43+
}

Diff for: packages/sieve-prime/src/index.ts

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/**
2+
*
3+
* @param N
4+
* @returns
5+
*/
6+
export function sievePrime(N: number): number[] {
7+
if (N <= 1) return []
8+
9+
let tot = 0
10+
const primes: number[] = []
11+
const isNotPrime: Uint8Array = new Uint8Array(N)
12+
13+
for (let x = 2; x < N; ++x) {
14+
// eslint-disable-next-line no-plusplus
15+
if (!isNotPrime[x]) primes[tot++] = x
16+
for (let i = 0; i < tot; ++i) {
17+
if (primes[i] * x >= N) break
18+
19+
isNotPrime[primes[i] * x] = 1
20+
21+
// Ensure that each number is only marked by its smallest positive factor.
22+
if (x % primes[i] === 0) break
23+
}
24+
}
25+
26+
primes.length = tot
27+
return primes
28+
}
29+
30+
export default sievePrime

Diff for: packages/sieve-prime/tsconfig.json

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"extends": "../../tsconfig",
3+
"include": ["src", "script", "__test__"]
4+
}

Diff for: packages/sieve-prime/tsconfig.src.json

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"extends": "../../tsconfig.settings",
3+
"compilerOptions": {
4+
"declarationDir": "lib/types",
5+
"rootDir": "src"
6+
},
7+
"include": ["src"]
8+
}

Diff for: tsconfig.json

+1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"@algorithm.ts/manacher": ["packages/manacher/src"],
2020
"@algorithm.ts/mcmf": ["packages/mcmf/src"],
2121
"@algorithm.ts/priority-queue": ["packages/priority-queue/src"],
22+
"@algorithm.ts/sieve-prime": ["packages/sieve-prime/src"],
2223
"@algorithm.ts/sliding-window": ["packages/sliding-window/src"],
2324
"@algorithm.ts/sudoku": ["packages/sudoku/src"],
2425
"@algorithm.ts/trie": ["packages/trie/src"],

0 commit comments

Comments
 (0)