finitefields 0.0.3
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/.lesshst +3 -0
- package/.viminfo +112 -0
- package/Makefile +13 -0
- package/main.d.ts +2 -0
- package/main.d.ts.map +1 -0
- package/main.js +23 -0
- package/main.js.map +1 -0
- package/main.ts +28 -0
- package/package.json +26 -0
- package/polynomial.d.ts +37 -0
- package/polynomial.d.ts.map +1 -0
- package/polynomial.js +129 -0
- package/polynomial.js.map +1 -0
- package/polynomial.ts +201 -0
- package/tsconfig.json +43 -0
package/.lesshst
ADDED
package/.viminfo
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# This viminfo file was generated by Vim 9.0.
|
|
2
|
+
# You may edit it if you're careful!
|
|
3
|
+
|
|
4
|
+
# Viminfo version
|
|
5
|
+
|1,4
|
|
6
|
+
|
|
7
|
+
# Value of 'encoding' when this file was written
|
|
8
|
+
*encoding=latin1
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
# hlsearch on (H) or off (h):
|
|
12
|
+
~h
|
|
13
|
+
# Command Line History (newest to oldest):
|
|
14
|
+
:wq
|
|
15
|
+
|2,0,1770671027,,"wq"
|
|
16
|
+
|
|
17
|
+
# Search String History (newest to oldest):
|
|
18
|
+
|
|
19
|
+
# Expression History (newest to oldest):
|
|
20
|
+
|
|
21
|
+
# Input Line History (newest to oldest):
|
|
22
|
+
|
|
23
|
+
# Debug Line History (newest to oldest):
|
|
24
|
+
|
|
25
|
+
# Registers:
|
|
26
|
+
""- CHAR 0
|
|
27
|
+
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
|
|
28
|
+
|3,1,36,0,1,0,1770671022,"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"
|
|
29
|
+
|
|
30
|
+
# File marks:
|
|
31
|
+
'0 1 72 ~/.npmrc
|
|
32
|
+
|4,48,1,72,1770671027,"~/.npmrc"
|
|
33
|
+
'1 1 39 /home/jobj/token
|
|
34
|
+
|4,49,1,39,1770670606,"/home/jobj/token"
|
|
35
|
+
'2 5 11 ~/.gitignore
|
|
36
|
+
|4,50,5,11,1770670071,"~/.gitignore"
|
|
37
|
+
'3 4 8 ~/.gitignore
|
|
38
|
+
|4,51,4,8,1770670048,"~/.gitignore"
|
|
39
|
+
'4 4 8 ~/.gitignore
|
|
40
|
+
|4,52,4,8,1770670048,"~/.gitignore"
|
|
41
|
+
|
|
42
|
+
# Jumplist (newest first):
|
|
43
|
+
-' 1 72 ~/.npmrc
|
|
44
|
+
|4,39,1,72,1770671027,"~/.npmrc"
|
|
45
|
+
-' 1 39 /home/jobj/token
|
|
46
|
+
|4,39,1,39,1770670606,"/home/jobj/token"
|
|
47
|
+
-' 1 39 /home/jobj/token
|
|
48
|
+
|4,39,1,39,1770670606,"/home/jobj/token"
|
|
49
|
+
-' 5 11 ~/.gitignore
|
|
50
|
+
|4,39,5,11,1770670071,"~/.gitignore"
|
|
51
|
+
-' 5 11 ~/.gitignore
|
|
52
|
+
|4,39,5,11,1770670071,"~/.gitignore"
|
|
53
|
+
-' 5 11 ~/.gitignore
|
|
54
|
+
|4,39,5,11,1770670071,"~/.gitignore"
|
|
55
|
+
-' 5 11 ~/.gitignore
|
|
56
|
+
|4,39,5,11,1770670071,"~/.gitignore"
|
|
57
|
+
-' 4 8 ~/.gitignore
|
|
58
|
+
|4,39,4,8,1770670065,"~/.gitignore"
|
|
59
|
+
-' 4 8 ~/.gitignore
|
|
60
|
+
|4,39,4,8,1770670065,"~/.gitignore"
|
|
61
|
+
-' 4 8 ~/.gitignore
|
|
62
|
+
|4,39,4,8,1770670065,"~/.gitignore"
|
|
63
|
+
-' 4 8 ~/.gitignore
|
|
64
|
+
|4,39,4,8,1770670065,"~/.gitignore"
|
|
65
|
+
-' 4 8 ~/.gitignore
|
|
66
|
+
|4,39,4,8,1770670048,"~/.gitignore"
|
|
67
|
+
-' 4 8 ~/.gitignore
|
|
68
|
+
|4,39,4,8,1770670048,"~/.gitignore"
|
|
69
|
+
-' 4 8 ~/.gitignore
|
|
70
|
+
|4,39,4,8,1770670048,"~/.gitignore"
|
|
71
|
+
-' 4 8 ~/.gitignore
|
|
72
|
+
|4,39,4,8,1770670048,"~/.gitignore"
|
|
73
|
+
-' 1 0 ~/.gitignore
|
|
74
|
+
|4,39,1,0,1770670030,"~/.gitignore"
|
|
75
|
+
-' 1 0 ~/.gitignore
|
|
76
|
+
|4,39,1,0,1770670030,"~/.gitignore"
|
|
77
|
+
-' 1 0 ~/.gitignore
|
|
78
|
+
|4,39,1,0,1770670030,"~/.gitignore"
|
|
79
|
+
-' 1 0 ~/.gitignore
|
|
80
|
+
|4,39,1,0,1770670030,"~/.gitignore"
|
|
81
|
+
-' 1 0 ~/.gitignore
|
|
82
|
+
|4,39,1,0,1770670030,"~/.gitignore"
|
|
83
|
+
-' 1 0 ~/.gitignore
|
|
84
|
+
|4,39,1,0,1770670030,"~/.gitignore"
|
|
85
|
+
-' 1 0 ~/.gitignore
|
|
86
|
+
|4,39,1,0,1770670030,"~/.gitignore"
|
|
87
|
+
-' 1 0 ~/.gitignore
|
|
88
|
+
|4,39,1,0,1770670030,"~/.gitignore"
|
|
89
|
+
|
|
90
|
+
# History of marks within files (newest to oldest):
|
|
91
|
+
|
|
92
|
+
> ~/.npmrc
|
|
93
|
+
* 1770671026 0
|
|
94
|
+
" 1 72
|
|
95
|
+
^ 1 73
|
|
96
|
+
. 1 57
|
|
97
|
+
+ 1 57
|
|
98
|
+
|
|
99
|
+
> /home/jobj/token
|
|
100
|
+
* 1770670605 0
|
|
101
|
+
" 1 39
|
|
102
|
+
^ 1 40
|
|
103
|
+
. 1 24
|
|
104
|
+
+ 1 24
|
|
105
|
+
|
|
106
|
+
> ~/.gitignore
|
|
107
|
+
* 1770670070 0
|
|
108
|
+
" 5 11
|
|
109
|
+
^ 5 12
|
|
110
|
+
. 5 11
|
|
111
|
+
+ 4 8
|
|
112
|
+
+ 5 11
|
package/Makefile
ADDED
package/main.d.ts
ADDED
package/main.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["main.ts"],"names":[],"mappings":""}
|
package/main.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/* main.ts */
|
|
2
|
+
import { Polynomial } from './polynomial.js';
|
|
3
|
+
let log;
|
|
4
|
+
log = console.log;
|
|
5
|
+
let p1;
|
|
6
|
+
let p2;
|
|
7
|
+
let p3;
|
|
8
|
+
let x0;
|
|
9
|
+
let x1;
|
|
10
|
+
let x2;
|
|
11
|
+
let x3;
|
|
12
|
+
x0 = BigInt(1);
|
|
13
|
+
x1 = BigInt(0);
|
|
14
|
+
x2 = BigInt(1);
|
|
15
|
+
x3 = BigInt(0);
|
|
16
|
+
p1 = new Polynomial([x0, x1, x2, x3], 2n);
|
|
17
|
+
p2 = new Polynomial({ tobject: 0n, x3: 1n, x2: 0n, x: 1n, 1: 1n }, 2n);
|
|
18
|
+
// log(p1, " + ", p2, " =");
|
|
19
|
+
// p3 = Polynomial.add(p1,p2);
|
|
20
|
+
p3 = new Polynomial(256n, 2n);
|
|
21
|
+
log(p3, p3.eval());
|
|
22
|
+
// log(p3.eval());
|
|
23
|
+
//# sourceMappingURL=main.js.map
|
package/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["main.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C,IAAI,GAAsB,CAAC;AAC3B,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;AAElB,IAAI,EAAa,CAAC;AAClB,IAAI,EAAa,CAAC;AAClB,IAAI,EAAa,CAAC;AAClB,IAAI,EAAS,CAAC;AACd,IAAI,EAAS,CAAC;AACd,IAAI,EAAS,CAAC;AACd,IAAI,EAAS,CAAC;AAEd,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACf,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACf,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACf,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AAEf,EAAE,GAAG,IAAI,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;AAC1C,EAAE,GAAG,IAAI,UAAU,CAAC,EAAE,OAAO,EAAC,EAAE,EAAE,EAAE,EAAC,EAAE,EAAE,EAAE,EAAC,EAAE,EAAE,CAAC,EAAC,EAAE,EAAE,CAAC,EAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AAClE,4BAA4B;AAC5B,8BAA8B;AAC9B,EAAE,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;AAE9B,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;AACnB,kBAAkB"}
|
package/main.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/* main.ts */
|
|
2
|
+
import { Polynomial } from './polynomial.js';
|
|
3
|
+
|
|
4
|
+
let log:(...x:any[])=>void;
|
|
5
|
+
log = console.log;
|
|
6
|
+
|
|
7
|
+
let p1:Polynomial;
|
|
8
|
+
let p2:Polynomial;
|
|
9
|
+
let p3:Polynomial;
|
|
10
|
+
let x0:bigint;
|
|
11
|
+
let x1:bigint;
|
|
12
|
+
let x2:bigint;
|
|
13
|
+
let x3:bigint;
|
|
14
|
+
|
|
15
|
+
x0 = BigInt(1);
|
|
16
|
+
x1 = BigInt(0);
|
|
17
|
+
x2 = BigInt(1);
|
|
18
|
+
x3 = BigInt(0);
|
|
19
|
+
|
|
20
|
+
p1 = new Polynomial([x0, x1, x2, x3], 2n);
|
|
21
|
+
p2 = new Polynomial({ tobject:0n, x3:1n, x2:0n, x:1n, 1:1n }, 2n);
|
|
22
|
+
// log(p1, " + ", p2, " =");
|
|
23
|
+
// p3 = Polynomial.add(p1,p2);
|
|
24
|
+
p3 = new Polynomial(256n, 2n);
|
|
25
|
+
|
|
26
|
+
log(p3, p3.eval());
|
|
27
|
+
// log(p3.eval());
|
|
28
|
+
|
package/package.json
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "finitefields",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "0.0.3",
|
|
5
|
+
"description": "Galois/Finite field crypto and raw elliptic curves",
|
|
6
|
+
"main": "main.js",
|
|
7
|
+
"scripts": {
|
|
8
|
+
"build": "tsc",
|
|
9
|
+
"start": "node .",
|
|
10
|
+
"pub": "npm version patch && npm publish"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"galois",
|
|
14
|
+
"galois fields",
|
|
15
|
+
"finite fields",
|
|
16
|
+
"cryptography",
|
|
17
|
+
"elliptic curves"
|
|
18
|
+
],
|
|
19
|
+
"author": "@dr-Jonas-Birch",
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@types/node": "^25.2.2",
|
|
23
|
+
"@types/typescript": "^2.0.0",
|
|
24
|
+
"typescript": "^5.9.3"
|
|
25
|
+
}
|
|
26
|
+
}
|
package/polynomial.d.ts
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
declare let zip: (xs: bigint[], ys: bigint[]) => zipped;
|
|
2
|
+
type zipitem = {
|
|
3
|
+
x: bigint;
|
|
4
|
+
y: bigint;
|
|
5
|
+
};
|
|
6
|
+
type zipped = zipitem[];
|
|
7
|
+
type xs = 'tobject' | '1' | 'x' | 'x2' | 'x3' | 'x4' | 'x5' | 'x6' | 'x7';
|
|
8
|
+
type Polysource = bigint | bigint[] | Tobject;
|
|
9
|
+
type Tobject = {
|
|
10
|
+
[K in xs]?: bigint;
|
|
11
|
+
};
|
|
12
|
+
interface Ipolynomial {
|
|
13
|
+
fromarr(src: bigint[]): void;
|
|
14
|
+
fromobj(src: Tobject): void;
|
|
15
|
+
fromint(src: bigint): void;
|
|
16
|
+
verifyorder(order: bigint): boolean;
|
|
17
|
+
eval(): bigint;
|
|
18
|
+
constructor: Function;
|
|
19
|
+
}
|
|
20
|
+
declare class Polynomial implements Ipolynomial {
|
|
21
|
+
private data;
|
|
22
|
+
private degree;
|
|
23
|
+
private order;
|
|
24
|
+
static int2pol(src: bigint): bigint[];
|
|
25
|
+
static int2pol_(val: bigint, arr: bigint[]): bigint[];
|
|
26
|
+
static evaluate(src: bigint[], order: bigint): bigint;
|
|
27
|
+
static evaluate_(src: bigint[], order: bigint, val: bigint): bigint;
|
|
28
|
+
static add(a: Polynomial, b: Polynomial): Polynomial;
|
|
29
|
+
constructor(src: Polysource, order: bigint);
|
|
30
|
+
fromarr(src: bigint[]): void;
|
|
31
|
+
fromobj(src: Tobject): void;
|
|
32
|
+
fromint(src: bigint): void;
|
|
33
|
+
verifyorder(order: bigint): boolean;
|
|
34
|
+
eval(): bigint;
|
|
35
|
+
}
|
|
36
|
+
export { Polynomial, zip };
|
|
37
|
+
//# sourceMappingURL=polynomial.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polynomial.d.ts","sourceRoot":"","sources":["polynomial.ts"],"names":[],"mappings":"AAWA,QAAA,IAAI,GAAG,EAAC,CAAC,EAAE,EAAC,MAAM,EAAE,EAAC,EAAE,EAAC,MAAM,EAAE,KAAG,MAAM,CAAC;AAc1C,KAAK,OAAO,GAAG;IAAC,CAAC,EAAC,MAAM,CAAC;IAAA,CAAC,EAAC,MAAM,CAAA;CAAC,CAAC;AACnC,KAAK,MAAM,GAAG,OAAO,EAAE,CAAC;AAExB,KAAK,EAAE,GACD,SAAS,GACT,GAAG,GACH,GAAG,GACH,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,GACJ,IAAI,CAAC;AAEX,KAAK,UAAU,GACT,MAAM,GACN,MAAM,EAAE,GACR,OAAO,CAAC;AAEd,KAAK,OAAO,GAAG;KACV,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM;CACrB,CAAA;AAED,UAAU,WAAW;IACjB,OAAO,CAAC,GAAG,EAAC,MAAM,EAAE,GAAG,IAAI,CAAC;IAC5B,OAAO,CAAC,GAAG,EAAC,OAAO,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,GAAG,EAAC,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,CAAC,KAAK,EAAC,MAAM,GAAG,OAAO,CAAC;IACnC,IAAI,IAAI,MAAM,CAAC;IACf,WAAW,EAAE,QAAQ,CAAC;CACzB;AAED,cAAM,UAAW,YAAW,WAAW;IACnC,OAAO,CAAC,IAAI,CAAU;IACtB,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,KAAK,CAAQ;IAErB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAC,MAAM,GAAG,MAAM,EAAE;IAIpC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAC,MAAM,EAAE,GAAG,EAAC,MAAM,EAAE,GAAG,MAAM,EAAE;IAenD,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAC,MAAM,EAAE,EAAE,KAAK,EAAC,MAAM,GAAG,MAAM;IAInD,MAAM,CAAC,SAAS,CAAC,GAAG,EAAC,MAAM,EAAE,EAAE,KAAK,EAAC,MAAM,EAAE,GAAG,EAAC,MAAM,GAAG,MAAM;IAmBhE,MAAM,CAAC,GAAG,CAAC,CAAC,EAAC,UAAU,EAAE,CAAC,EAAC,UAAU,GAAG,UAAU;gBAa/B,GAAG,EAAC,UAAU,EAAE,KAAK,EAAC,MAAM;IAmCxC,OAAO,CAAC,GAAG,EAAC,MAAM,EAAE,GAAG,IAAI;IAS3B,OAAO,CAAC,GAAG,EAAC,OAAO,GAAG,IAAI;IAW1B,OAAO,CAAC,GAAG,EAAC,MAAM,GAAG,IAAI;IASzB,WAAW,CAAC,KAAK,EAAC,MAAM,GAAG,OAAO;IAclC,IAAI,IAAI,MAAM;CAGxB;AAED,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC"}
|
package/polynomial.js
ADDED
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* polynomial data structure
|
|
3
|
+
*
|
|
4
|
+
* finitefields package by @dr-Jonas-Birch
|
|
5
|
+
*
|
|
6
|
+
* 2026
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
let fail;
|
|
10
|
+
let log;
|
|
11
|
+
let zip;
|
|
12
|
+
fail = () => {
|
|
13
|
+
throw new Error();
|
|
14
|
+
return void 0;
|
|
15
|
+
};
|
|
16
|
+
zip = (xs, ys) => (xs.length == ys.length) ? xs
|
|
17
|
+
.map((x, idx) => ({ x, y: (ys[idx] || 0n) })) :
|
|
18
|
+
fail();
|
|
19
|
+
log = console.log;
|
|
20
|
+
class Polynomial {
|
|
21
|
+
data;
|
|
22
|
+
degree;
|
|
23
|
+
order;
|
|
24
|
+
static int2pol(src) {
|
|
25
|
+
return Polynomial.int2pol_(src, []);
|
|
26
|
+
}
|
|
27
|
+
static int2pol_(val, arr) {
|
|
28
|
+
let x;
|
|
29
|
+
let y;
|
|
30
|
+
let bit;
|
|
31
|
+
if (!val)
|
|
32
|
+
return arr;
|
|
33
|
+
y = (val >> 1n);
|
|
34
|
+
bit = (val & 1n);
|
|
35
|
+
x = new Array(bit, ...arr);
|
|
36
|
+
return Polynomial.int2pol_(y, x);
|
|
37
|
+
}
|
|
38
|
+
static evaluate(src, order) {
|
|
39
|
+
return Polynomial.evaluate_(src, order, 0n);
|
|
40
|
+
}
|
|
41
|
+
static evaluate_(src, order, val) {
|
|
42
|
+
let x;
|
|
43
|
+
let y;
|
|
44
|
+
let z;
|
|
45
|
+
let arr;
|
|
46
|
+
if (!src.length)
|
|
47
|
+
return val;
|
|
48
|
+
else
|
|
49
|
+
y = (order * val);
|
|
50
|
+
arr = new Array(...src);
|
|
51
|
+
z = arr.shift()
|
|
52
|
+
|| 0n;
|
|
53
|
+
x = (y + z);
|
|
54
|
+
return Polynomial.evaluate_(arr, order, x);
|
|
55
|
+
}
|
|
56
|
+
static add(a, b) {
|
|
57
|
+
let z;
|
|
58
|
+
let p;
|
|
59
|
+
let arr;
|
|
60
|
+
z = zip(a.data, b.data);
|
|
61
|
+
arr = z
|
|
62
|
+
.map(({ x, y }) => ((x + y) % BigInt(a.order)));
|
|
63
|
+
return new Polynomial(arr, a.order);
|
|
64
|
+
}
|
|
65
|
+
constructor(src, order) {
|
|
66
|
+
this.data = [];
|
|
67
|
+
this.degree = 0;
|
|
68
|
+
if (!src)
|
|
69
|
+
fail();
|
|
70
|
+
switch (true) {
|
|
71
|
+
case src instanceof Array:
|
|
72
|
+
this.fromarr(src);
|
|
73
|
+
break;
|
|
74
|
+
case typeof src === 'bigint':
|
|
75
|
+
if (order != 2n)
|
|
76
|
+
fail();
|
|
77
|
+
this.fromint(src);
|
|
78
|
+
break;
|
|
79
|
+
case ((typeof src !== 'bigint') && ('tobject' in src)):
|
|
80
|
+
this.fromobj(src);
|
|
81
|
+
break;
|
|
82
|
+
default:
|
|
83
|
+
fail();
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
if (this.verifyorder(order))
|
|
87
|
+
this.order = order;
|
|
88
|
+
else
|
|
89
|
+
fail();
|
|
90
|
+
return this;
|
|
91
|
+
}
|
|
92
|
+
fromarr(src) {
|
|
93
|
+
if (!src)
|
|
94
|
+
fail();
|
|
95
|
+
this.data = src;
|
|
96
|
+
this.degree = this.data.length;
|
|
97
|
+
return void 0;
|
|
98
|
+
}
|
|
99
|
+
fromobj(src) {
|
|
100
|
+
if (!src)
|
|
101
|
+
fail();
|
|
102
|
+
const { tobject, ...obj } = src;
|
|
103
|
+
this.data = Object.values(obj);
|
|
104
|
+
this.degree = this.data.length;
|
|
105
|
+
return void 0;
|
|
106
|
+
}
|
|
107
|
+
fromint(src) {
|
|
108
|
+
if (!src)
|
|
109
|
+
fail();
|
|
110
|
+
this.data = Polynomial.int2pol(src);
|
|
111
|
+
this.degree = this.data.length;
|
|
112
|
+
return void 0;
|
|
113
|
+
}
|
|
114
|
+
verifyorder(order) {
|
|
115
|
+
let arr;
|
|
116
|
+
if (!order)
|
|
117
|
+
fail();
|
|
118
|
+
else if (!this.degree)
|
|
119
|
+
return true;
|
|
120
|
+
arr = this.data
|
|
121
|
+
.map((x) => !(x >= order));
|
|
122
|
+
return arr.every((x) => x);
|
|
123
|
+
}
|
|
124
|
+
eval() {
|
|
125
|
+
return Polynomial.evaluate(this.data, this.order);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export { Polynomial, zip };
|
|
129
|
+
//# sourceMappingURL=polynomial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"polynomial.js","sourceRoot":"","sources":["polynomial.ts"],"names":[],"mappings":"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"}
|
package/polynomial.ts
ADDED
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* polynomial data structure
|
|
3
|
+
*
|
|
4
|
+
* finitefields package by @dr-Jonas-Birch
|
|
5
|
+
*
|
|
6
|
+
* 2026
|
|
7
|
+
*
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
let fail:()=>never;
|
|
11
|
+
let log:(...x:any[])=>void;
|
|
12
|
+
let zip:(xs:bigint[],ys:bigint[])=>zipped;
|
|
13
|
+
|
|
14
|
+
fail = (): never => {
|
|
15
|
+
throw new Error();
|
|
16
|
+
|
|
17
|
+
return void 0 as never;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
zip = (xs:bigint[],ys:bigint[]): zipped => (xs.length==ys.length) ? xs
|
|
21
|
+
.map((x:bigint,idx:number): {x:bigint,y:bigint} => ({x,y:(ys[idx]||0n)})) :
|
|
22
|
+
fail();
|
|
23
|
+
|
|
24
|
+
log = console.log;
|
|
25
|
+
|
|
26
|
+
type zipitem = {x:bigint,y:bigint};
|
|
27
|
+
type zipped = zipitem[];
|
|
28
|
+
|
|
29
|
+
type xs =
|
|
30
|
+
| 'tobject'
|
|
31
|
+
| '1'
|
|
32
|
+
| 'x'
|
|
33
|
+
| 'x2'
|
|
34
|
+
| 'x3'
|
|
35
|
+
| 'x4'
|
|
36
|
+
| 'x5'
|
|
37
|
+
| 'x6'
|
|
38
|
+
| 'x7';
|
|
39
|
+
|
|
40
|
+
type Polysource =
|
|
41
|
+
| bigint
|
|
42
|
+
| bigint[]
|
|
43
|
+
| Tobject;
|
|
44
|
+
|
|
45
|
+
type Tobject = {
|
|
46
|
+
[K in xs]?: bigint;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
interface Ipolynomial {
|
|
50
|
+
fromarr(src:bigint[]): void;
|
|
51
|
+
fromobj(src:Tobject): void;
|
|
52
|
+
fromint(src:bigint): void;
|
|
53
|
+
verifyorder(order:bigint): boolean;
|
|
54
|
+
eval(): bigint;
|
|
55
|
+
constructor: Function;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class Polynomial implements Ipolynomial {
|
|
59
|
+
private data:bigint[];
|
|
60
|
+
private degree:number;
|
|
61
|
+
private order:bigint;
|
|
62
|
+
|
|
63
|
+
static int2pol(src:bigint): bigint[] {
|
|
64
|
+
return Polynomial.int2pol_(src, []);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static int2pol_(val:bigint, arr:bigint[]): bigint[] {
|
|
68
|
+
let x:bigint[];
|
|
69
|
+
let y:bigint;
|
|
70
|
+
let bit:bigint;
|
|
71
|
+
|
|
72
|
+
if (!val)
|
|
73
|
+
return arr;
|
|
74
|
+
|
|
75
|
+
y = (val >> 1n);
|
|
76
|
+
bit = (val & 1n);
|
|
77
|
+
x = new Array(bit, ...arr);
|
|
78
|
+
|
|
79
|
+
return Polynomial.int2pol_(y, x);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
static evaluate(src:bigint[], order:bigint): bigint {
|
|
83
|
+
return Polynomial.evaluate_(src, order, 0n);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
static evaluate_(src:bigint[], order:bigint, val:bigint): bigint {
|
|
87
|
+
let x:bigint;
|
|
88
|
+
let y:bigint;
|
|
89
|
+
let z:bigint;
|
|
90
|
+
let arr:bigint[];
|
|
91
|
+
|
|
92
|
+
if (!src.length)
|
|
93
|
+
return val;
|
|
94
|
+
else
|
|
95
|
+
y = (order*val);
|
|
96
|
+
|
|
97
|
+
arr = new Array(...src);
|
|
98
|
+
z = arr.shift()
|
|
99
|
+
|| 0n;
|
|
100
|
+
x = (y+z);
|
|
101
|
+
|
|
102
|
+
return Polynomial.evaluate_(arr, order, x);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
static add(a:Polynomial, b:Polynomial): Polynomial {
|
|
106
|
+
let z:zipped;
|
|
107
|
+
let p:Polynomial;
|
|
108
|
+
let arr:bigint[];
|
|
109
|
+
|
|
110
|
+
z = zip(a.data, b.data);
|
|
111
|
+
arr = z
|
|
112
|
+
.map(({x,y}: zipitem): bigint =>
|
|
113
|
+
((x+y)%BigInt(a.order)));
|
|
114
|
+
|
|
115
|
+
return new Polynomial(arr, a.order);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
public constructor(src:Polysource, order:bigint) {
|
|
119
|
+
this.data = [];
|
|
120
|
+
this.degree = 0;
|
|
121
|
+
|
|
122
|
+
if (!src)
|
|
123
|
+
fail();
|
|
124
|
+
|
|
125
|
+
switch (true) {
|
|
126
|
+
case src instanceof Array:
|
|
127
|
+
this.fromarr(src as bigint[]);
|
|
128
|
+
break;
|
|
129
|
+
|
|
130
|
+
case typeof src === 'bigint':
|
|
131
|
+
if (order != 2n)
|
|
132
|
+
fail();
|
|
133
|
+
this.fromint(src as bigint);
|
|
134
|
+
break;
|
|
135
|
+
|
|
136
|
+
case ((typeof src !== 'bigint') && ('tobject' in (src as Tobject))):
|
|
137
|
+
this.fromobj(src as Tobject);
|
|
138
|
+
break;
|
|
139
|
+
|
|
140
|
+
default:
|
|
141
|
+
fail();
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (this.verifyorder(order))
|
|
146
|
+
this.order = order;
|
|
147
|
+
else
|
|
148
|
+
fail();
|
|
149
|
+
|
|
150
|
+
return this;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
public fromarr(src:bigint[]): void {
|
|
154
|
+
if (!src)
|
|
155
|
+
fail();
|
|
156
|
+
this.data = src;
|
|
157
|
+
this.degree = this.data.length;
|
|
158
|
+
|
|
159
|
+
return void 0;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
public fromobj(src:Tobject): void {
|
|
163
|
+
if (!src)
|
|
164
|
+
fail();
|
|
165
|
+
|
|
166
|
+
const { tobject, ...obj } = src;
|
|
167
|
+
this.data = Object.values(obj);
|
|
168
|
+
this.degree = this.data.length;
|
|
169
|
+
|
|
170
|
+
return void 0;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public fromint(src:bigint): void {
|
|
174
|
+
if (!src)
|
|
175
|
+
fail();
|
|
176
|
+
this.data = Polynomial.int2pol(src);
|
|
177
|
+
this.degree = this.data.length;
|
|
178
|
+
|
|
179
|
+
return void 0;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
public verifyorder(order:bigint): boolean {
|
|
183
|
+
let arr:boolean[];
|
|
184
|
+
|
|
185
|
+
if (!order)
|
|
186
|
+
fail();
|
|
187
|
+
else if (!this.degree)
|
|
188
|
+
return true;
|
|
189
|
+
|
|
190
|
+
arr = this.data
|
|
191
|
+
.map((x:bigint): boolean => !(x>=order));
|
|
192
|
+
|
|
193
|
+
return arr.every((x:boolean):boolean => x);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public eval(): bigint {
|
|
197
|
+
return Polynomial.evaluate(this.data, this.order);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export { Polynomial, zip };
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
// Visit https://aka.ms/tsconfig to read more about this file
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
// File Layout
|
|
5
|
+
// "rootDir": "./src",
|
|
6
|
+
// "outDir": "./dist",
|
|
7
|
+
|
|
8
|
+
// Environment Settings
|
|
9
|
+
// See also https://aka.ms/tsconfig/module
|
|
10
|
+
"module": "nodenext",
|
|
11
|
+
"target": "esnext",
|
|
12
|
+
// For nodejs:
|
|
13
|
+
"lib": ["esnext","dom"],
|
|
14
|
+
"types": ["node"],
|
|
15
|
+
// and npm install -D @types/node
|
|
16
|
+
|
|
17
|
+
// Other Outputs
|
|
18
|
+
"sourceMap": true,
|
|
19
|
+
"declaration": true,
|
|
20
|
+
"declarationMap": true,
|
|
21
|
+
|
|
22
|
+
// Stricter Typechecking Options
|
|
23
|
+
"noUncheckedIndexedAccess": true,
|
|
24
|
+
"exactOptionalPropertyTypes": false,
|
|
25
|
+
|
|
26
|
+
// Style Options
|
|
27
|
+
// "noImplicitReturns": true,
|
|
28
|
+
// "noImplicitOverride": true,
|
|
29
|
+
// "noUnusedLocals": true,
|
|
30
|
+
// "noUnusedParameters": true,
|
|
31
|
+
// "noFallthroughCasesInSwitch": true,
|
|
32
|
+
// "noPropertyAccessFromIndexSignature": true,
|
|
33
|
+
|
|
34
|
+
// Recommended Options
|
|
35
|
+
"strict": true,
|
|
36
|
+
"jsx": "react-jsx",
|
|
37
|
+
"verbatimModuleSyntax": true,
|
|
38
|
+
"isolatedModules": true,
|
|
39
|
+
"noUncheckedSideEffectImports": true,
|
|
40
|
+
"moduleDetection": "force",
|
|
41
|
+
"skipLibCheck": true,
|
|
42
|
+
}
|
|
43
|
+
}
|