Skip to content

Commit b72e357

Browse files
authored
feat: add prime factorization algorithm (#214)
1 parent deaa0af commit b72e357

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

maths/prime_factorization.ts

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/**
2+
* @description Get exponenets of each prime number in factorization of a number n
3+
* @param {number} n - A natural number.
4+
* @return {Map<number, number>} - factorization of number n.
5+
* @see https://en.wikipedia.org/wiki/Integer_factorization
6+
* @example factorize(4) = Map {2 => 2}
7+
* @example factorize(5) = Map {5 => 1}
8+
*/
9+
export const factorize = (n: number): Map<number, number> => {
10+
let result: Map<number, number> = new Map();
11+
12+
for (let i = 2; i * i <= n; i++) {
13+
while (n % i == 0) {
14+
let occurence = result.get(i);
15+
if (!occurence) occurence = 0;
16+
result.set(i, occurence + 1);
17+
n = n / i;
18+
}
19+
}
20+
if (n > 1) {
21+
let occurence = result.get(n);
22+
if (!occurence) occurence = 0;
23+
result.set(n, occurence + 1);
24+
}
25+
26+
return result;
27+
};
+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import { factorize } from "../prime_factorization";
2+
3+
4+
interface TestCase {
5+
n: number;
6+
expected: Map<number, number>
7+
}
8+
9+
const cases: TestCase[] = [
10+
{n: 4, expected: new Map([[2, 2]])},
11+
{n: 5, expected: new Map([[5, 1]])},
12+
{n: 7, expected: new Map([[7, 1]])},
13+
{n: 10, expected: new Map([[2, 1], [5, 1]])},
14+
{n: 999, expected: new Map([[3, 3], [37, 1]])},
15+
{n: 999999999999878, expected: new Map([[2, 1], [19, 1], [26315789473681, 1]])},
16+
];
17+
18+
describe("factorize", () => {
19+
20+
test.each(cases)(
21+
"prime factorization of $n should be $expected",
22+
({n, expected}) => {
23+
expect(factorize(n)).toEqual(expected);
24+
},
25+
);
26+
});

0 commit comments

Comments
 (0)