@gkucmierz/utils 1.28.3 → 1.28.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -4
- package/package.json +31 -2
- package/src/SetCnt.mjs +52 -6
- package/src/Trie.mjs +35 -2
- package/src/base64.mjs +24 -0
- package/src/bijective-numeration.mjs +24 -0
- package/src/binary-search.mjs +25 -5
- package/src/copy-case.mjs +5 -5
- package/src/egcd.mjs +8 -0
- package/src/factors.mjs +6 -8
- package/src/gcd.mjs +8 -8
- package/src/get-type.mjs +6 -2
- package/src/gpn.mjs +14 -0
- package/src/heap.mjs +26 -0
- package/src/herons-formula.mjs +17 -0
- package/src/lcm.mjs +13 -0
- package/src/list-node.mjs +19 -0
- package/src/matrix.mjs +6 -3
- package/src/memoize.mjs +5 -5
- package/src/mod.mjs +8 -14
- package/src/phi.mjs +13 -0
- package/src/pow-mod.mjs +12 -12
- package/src/range-array.mjs +12 -0
- package/src/square-root.mjs +6 -8
- package/src/tonelli-shanks.mjs +7 -2
- package/.github/workflows/deploy-docs.yml +0 -22
- package/.github/workflows/npm-publish.yml +0 -25
- package/.husky/pre-commit +0 -4
- package/jsdoc.json +0 -10
- package/package-lock.json +0 -1422
- package/scripts/generate_main.mjs +0 -43
- package/spec/SetCnt.spec.mjs +0 -58
- package/spec/Trie.spec.mjs +0 -69
- package/spec/base64.spec.mjs +0 -29
- package/spec/bijective-numeration.spec.mjs +0 -123
- package/spec/binary-search.spec.mjs +0 -91
- package/spec/copy-case.spec.mjs +0 -12
- package/spec/factors.spec.mjs +0 -35
- package/spec/gcd.spec.mjs +0 -27
- package/spec/get-type.spec.mjs +0 -75
- package/spec/gpn.spec.mjs +0 -35
- package/spec/heap.spec.mjs +0 -32
- package/spec/herons-formula.spec.mjs +0 -41
- package/spec/list-node.spec.mjs +0 -33
- package/spec/main.spec.mjs +0 -8
- package/spec/matrix.spec.mjs +0 -19
- package/spec/memoize.spec.mjs +0 -46
- package/spec/mod.spec.mjs +0 -39
- package/spec/phi.spec.mjs +0 -60
- package/spec/pow-mod.spec.mjs +0 -21
- package/spec/range-array.spec.mjs +0 -19
- package/spec/square-root.spec.mjs +0 -22
- package/spec/support/jasmine.json +0 -16
- package/spec/tonelli-shanks.spec.mjs +0 -15
package/spec/list-node.spec.mjs
DELETED
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import { ListNode } from '../src/list-node.mjs';
|
|
3
|
-
|
|
4
|
-
describe('ListNode', () => {
|
|
5
|
-
it('constructor', () => {
|
|
6
|
-
expect(new ListNode().val).toEqual(0);
|
|
7
|
-
expect(new ListNode().next).toEqual(null);
|
|
8
|
-
expect(new ListNode(123).val).toEqual(123);
|
|
9
|
-
expect(new ListNode(123).next).toEqual(null);
|
|
10
|
-
expect(new ListNode(123, 'next').next).toEqual('next');
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
it('toArr', () => {
|
|
14
|
-
expect(new ListNode().toArr()).toEqual([0]);
|
|
15
|
-
expect(new ListNode(123).toArr()).toEqual([123]);
|
|
16
|
-
expect(new ListNode(1, new ListNode(2)).toArr()).toEqual([1, 2]);
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
it('fromArr', () => {
|
|
20
|
-
expect(ListNode.fromArr([1, 2])).toEqual(new ListNode(1, new ListNode(2)));
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('both', () => {
|
|
24
|
-
const arr = [1, 2, 3, 4, 5];
|
|
25
|
-
expect(ListNode.fromArr(arr).toArr()).toEqual(arr);
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
it('cyclic reference', () => {
|
|
29
|
-
const node = ListNode.fromArr([1, 2]);
|
|
30
|
-
node.next.next = node;
|
|
31
|
-
expect(() => node.toArr()).toThrow(new Error('Cyclic reference detected'));
|
|
32
|
-
});
|
|
33
|
-
});
|
package/spec/main.spec.mjs
DELETED
package/spec/matrix.spec.mjs
DELETED
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
matrixAsArray,
|
|
4
|
-
} from '../src/matrix.mjs';
|
|
5
|
-
|
|
6
|
-
describe('matrix', () => {
|
|
7
|
-
it('matrixAsArray', () => {
|
|
8
|
-
const m = [
|
|
9
|
-
[1, 2],
|
|
10
|
-
[3, 4],
|
|
11
|
-
];
|
|
12
|
-
const arr = matrixAsArray(m);
|
|
13
|
-
expect(arr.length).toBe(4);
|
|
14
|
-
expect(arr[0]).toBe(1);
|
|
15
|
-
expect(arr[1]).toBe(2);
|
|
16
|
-
expect(arr[2]).toBe(3);
|
|
17
|
-
expect(arr[3]).toBe(4);
|
|
18
|
-
});
|
|
19
|
-
});
|
package/spec/memoize.spec.mjs
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
memoize,
|
|
4
|
-
} from '../src/memoize.mjs';
|
|
5
|
-
|
|
6
|
-
describe('memoize', () => {
|
|
7
|
-
it('called once', () => {
|
|
8
|
-
let cnt = 0;
|
|
9
|
-
const add = memoize((a, b) => {
|
|
10
|
-
++cnt;
|
|
11
|
-
return a + b;
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
expect(add(1, 2)).toBe(3);
|
|
15
|
-
expect(cnt).toBe(1);
|
|
16
|
-
expect(add(1, 2)).toBe(3);
|
|
17
|
-
expect(cnt).toBe(1);
|
|
18
|
-
|
|
19
|
-
expect(add(2, 1)).toBe(3);
|
|
20
|
-
expect(cnt).toBe(2);
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it('variable args length', () => {
|
|
24
|
-
const fn = memoize((...args) => args.length);
|
|
25
|
-
|
|
26
|
-
expect(fn()).toBe(0);
|
|
27
|
-
expect(fn(1)).toBe(1);
|
|
28
|
-
expect(fn(1, 2)).toBe(2);
|
|
29
|
-
expect(fn(1, 2, 3)).toBe(3);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
it('different empty object arrays', () => {
|
|
33
|
-
let cnt = 0;
|
|
34
|
-
const fn = memoize(() => ++cnt);
|
|
35
|
-
const emptyArr = [];
|
|
36
|
-
fn(emptyArr);
|
|
37
|
-
expect(cnt).toBe(1);
|
|
38
|
-
fn(emptyArr);
|
|
39
|
-
expect(cnt).toBe(1);
|
|
40
|
-
fn([]);
|
|
41
|
-
expect(cnt).toBe(2);
|
|
42
|
-
fn([]);
|
|
43
|
-
expect(cnt).toBe(3);
|
|
44
|
-
});
|
|
45
|
-
});
|
|
46
|
-
|
package/spec/mod.spec.mjs
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
mod,
|
|
4
|
-
modBI,
|
|
5
|
-
} from '../src/mod.mjs';
|
|
6
|
-
|
|
7
|
-
describe('mod', () => {
|
|
8
|
-
it('mod', () => {
|
|
9
|
-
expect(mod(4, 100)).toEqual(4);
|
|
10
|
-
expect(mod(104, 100)).toEqual(4);
|
|
11
|
-
expect(mod(4 - 100, 100)).toEqual(4);
|
|
12
|
-
expect(mod(4 + 96, 100)).toEqual(0);
|
|
13
|
-
expect(mod(-4 - 96, 100)).toEqual(0);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('mod sign', () => {
|
|
17
|
-
expect(mod(4, 100)).toEqual(4);
|
|
18
|
-
expect(mod(-4, 100)).toEqual(96);
|
|
19
|
-
expect(mod(4, -100)).toEqual(-96);
|
|
20
|
-
expect(mod(-4, -100)).toEqual(-4);
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
describe('mod BI', () => {
|
|
25
|
-
it('mod', () => {
|
|
26
|
-
expect(modBI(4n, 100n)).toEqual(4n);
|
|
27
|
-
expect(modBI(104n, 100n)).toEqual(4n);
|
|
28
|
-
expect(modBI(4n - 100n, 100n)).toEqual(4n);
|
|
29
|
-
expect(modBI(4n + 96n, 100n)).toEqual(0n);
|
|
30
|
-
expect(modBI(-4n - 96n, 100n)).toEqual(0n);
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
it('mod sign', () => {
|
|
34
|
-
expect(modBI(4n, 100n)).toEqual(4n);
|
|
35
|
-
expect(modBI(-4n, 100n)).toEqual(96n);
|
|
36
|
-
expect(modBI(4n, -100n)).toEqual(-96n);
|
|
37
|
-
expect(modBI(-4n, -100n)).toEqual(-4n);
|
|
38
|
-
});
|
|
39
|
-
});
|
package/spec/phi.spec.mjs
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
phi,
|
|
4
|
-
phiBI,
|
|
5
|
-
} from '../src/phi.mjs';
|
|
6
|
-
|
|
7
|
-
describe('phi', () => {
|
|
8
|
-
it('Number x1', () => {
|
|
9
|
-
expect(phi(1)).toBe(1);
|
|
10
|
-
expect(phi(11)).toBe(10);
|
|
11
|
-
expect(phi(21)).toBe(12);
|
|
12
|
-
expect(phi(31)).toBe(30);
|
|
13
|
-
expect(phi(41)).toBe(40);
|
|
14
|
-
expect(phi(51)).toBe(32);
|
|
15
|
-
expect(phi(61)).toBe(60);
|
|
16
|
-
expect(phi(71)).toBe(70);
|
|
17
|
-
expect(phi(81)).toBe(54);
|
|
18
|
-
expect(phi(91)).toBe(72);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('Number x5', () => {
|
|
22
|
-
expect(phi(5)).toBe(4);
|
|
23
|
-
expect(phi(15)).toBe(8);
|
|
24
|
-
expect(phi(25)).toBe(20);
|
|
25
|
-
expect(phi(35)).toBe(24);
|
|
26
|
-
expect(phi(45)).toBe(24);
|
|
27
|
-
expect(phi(55)).toBe(40);
|
|
28
|
-
expect(phi(65)).toBe(48);
|
|
29
|
-
expect(phi(75)).toBe(40);
|
|
30
|
-
expect(phi(85)).toBe(64);
|
|
31
|
-
expect(phi(95)).toBe(72);
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
it('BigInt x1', () => {
|
|
35
|
-
expect(phiBI(1n)).toBe(1n);
|
|
36
|
-
expect(phiBI(11n)).toBe(10n);
|
|
37
|
-
expect(phiBI(21n)).toBe(12n);
|
|
38
|
-
expect(phiBI(31n)).toBe(30n);
|
|
39
|
-
expect(phiBI(41n)).toBe(40n);
|
|
40
|
-
expect(phiBI(51n)).toBe(32n);
|
|
41
|
-
expect(phiBI(61n)).toBe(60n);
|
|
42
|
-
expect(phiBI(71n)).toBe(70n);
|
|
43
|
-
expect(phiBI(81n)).toBe(54n);
|
|
44
|
-
expect(phiBI(91n)).toBe(72n);
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
it('BigInt x5', () => {
|
|
48
|
-
expect(phiBI(5n)).toBe(4n);
|
|
49
|
-
expect(phiBI(15n)).toBe(8n);
|
|
50
|
-
expect(phiBI(25n)).toBe(20n);
|
|
51
|
-
expect(phiBI(35n)).toBe(24n);
|
|
52
|
-
expect(phiBI(45n)).toBe(24n);
|
|
53
|
-
expect(phiBI(55n)).toBe(40n);
|
|
54
|
-
expect(phiBI(65n)).toBe(48n);
|
|
55
|
-
expect(phiBI(75n)).toBe(40n);
|
|
56
|
-
expect(phiBI(85n)).toBe(64n);
|
|
57
|
-
expect(phiBI(95n)).toBe(72n);
|
|
58
|
-
});
|
|
59
|
-
});
|
|
60
|
-
|
package/spec/pow-mod.spec.mjs
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
powMod,
|
|
4
|
-
powModBI,
|
|
5
|
-
} from '../src/pow-mod.mjs';
|
|
6
|
-
|
|
7
|
-
describe('pow-mod', () => {
|
|
8
|
-
it('powMod', () => {
|
|
9
|
-
expect(powMod(2, 1)).toEqual(2);
|
|
10
|
-
expect(powMod(2, 1, 10)).toEqual(2);
|
|
11
|
-
expect(powMod(2, 1, 2)).toEqual(0);
|
|
12
|
-
expect(powMod(2, 0, 2)).toEqual(1);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
it('powModBI', () => {
|
|
16
|
-
expect(powModBI(2n, 1n)).toEqual(2n);
|
|
17
|
-
expect(powModBI(2n, 1n, 10n)).toEqual(2n);
|
|
18
|
-
expect(powModBI(2n, 1n, 2n)).toEqual(0n);
|
|
19
|
-
expect(powModBI(2n, 0n, 2n)).toEqual(1n);
|
|
20
|
-
});
|
|
21
|
-
});
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
range2array,
|
|
4
|
-
array2range,
|
|
5
|
-
} from '../src/range-array.mjs';
|
|
6
|
-
|
|
7
|
-
describe('range-array', () => {
|
|
8
|
-
it('array2range', () => {
|
|
9
|
-
expect(array2range([])).toEqual([]);
|
|
10
|
-
expect(array2range([1,3,4,5,7,9,10])).toEqual([[1,1],[3,5],[7,7],[9,10]]);
|
|
11
|
-
expect(array2range([10,12,13,14,15,16,17,20,22,23,27])).toEqual([[10,10],[12,17],[20,20],[22,23],[27,27]]);
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
it('range2array', () => {
|
|
15
|
-
expect(range2array([])).toEqual([]);
|
|
16
|
-
expect(range2array([[1],[3,5],[7],[9,10]])).toEqual([1,3,4,5,7,9,10]);
|
|
17
|
-
expect(range2array([[10],[12,17],[20],[22,23],[27]])).toEqual([10,12,13,14,15,16,17,20,22,23,27]);
|
|
18
|
-
});
|
|
19
|
-
});
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
squareRoot,
|
|
4
|
-
squareRootBI,
|
|
5
|
-
} from '../src/square-root.mjs';
|
|
6
|
-
|
|
7
|
-
describe('square-root', () => {
|
|
8
|
-
it('squareRootBI small', () => {
|
|
9
|
-
expect(squareRootBI(0n)).toEqual(0n);
|
|
10
|
-
expect(squareRootBI(1n)).toEqual(1n);
|
|
11
|
-
expect(squareRootBI(2n)).toEqual(1n);
|
|
12
|
-
expect(squareRootBI(3n)).toEqual(1n);
|
|
13
|
-
expect(squareRootBI(4n)).toEqual(2n);
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
it('squareRootBI 0-1e3', () => {
|
|
17
|
-
for (let i = 0; i < 1e3; ++i) {
|
|
18
|
-
const sqf = BigInt(Math.floor(i ** 0.5));
|
|
19
|
-
expect(squareRootBI(BigInt(i))).toEqual(sqf);
|
|
20
|
-
}
|
|
21
|
-
});
|
|
22
|
-
});
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
tonelliShanksBI,
|
|
4
|
-
} from '../src/tonelli-shanks.mjs';
|
|
5
|
-
|
|
6
|
-
describe('tonelli-shanks', () => {
|
|
7
|
-
it('tonelliShanksBI', () => {
|
|
8
|
-
const a = 8479994658316772151941616510097127087554541274812435112009425778595495359700244470400642403747058566807127814165396640215844192327900454116257979487432016769329970767046735091249898678088061634796559556704959846424131820416048436501387617211770124292793308079214153179977624440438616958575058361193975686620046439877308339989295604537867493683872778843921771307305602776398786978353866231661453376056771972069776398999013769588936194859344941268223184197231368887060609212875507518936172060702209557124430477137421847130682601666968691651447236917018634902407704797328509461854842432015009878011354022108661461024768n;
|
|
9
|
-
const p = 30531851861994333252675935111487950694414332763909083514133769861350960895076504687261369815735742549428789138300843082086550059082835141454526618160634109969195486322015775943030060449557090064811940139431735209185996454739163555910726493597222646855506445602953689527405362207926990442391705014604777038685880527537489845359101552442292804398472642356609304810680731556542002301547846635101455995732584071355903010856718680732337369128498655255277003643669031694516851390505923416710601212618443109844041514942401969629158975457079026906304328749039997262960301209158175920051890620947063936347307238412281568760161n;
|
|
10
|
-
const r = tonelliShanksBI(a, p);
|
|
11
|
-
|
|
12
|
-
expect((r * r) % p).toEqual(a);
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
});
|