finitefields 0.0.5 → 0.0.6
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/galois.ts +86 -27
- package/main.js +2 -0
- package/main.ts +2 -0
- package/package.json +1 -1
package/galois.ts
CHANGED
|
@@ -19,17 +19,16 @@ fail = (...args:any[]): never => {
|
|
|
19
19
|
return void 0 as never;
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
const arithmetics = (p:bigint,op:fieldops) =>
|
|
22
|
+
const arithmeticsℤp = (p:bigint,op:fieldops) =>
|
|
23
23
|
(op==fieldops.$add) ?
|
|
24
|
-
(a:bigint,b:bigint) => (a+b)%p :
|
|
24
|
+
(a:bigint,b:bigint=0n) => (a+b)%p :
|
|
25
25
|
(op==fieldops.$sub) ?
|
|
26
|
-
(a:bigint,b:bigint) => (a-b)%p :
|
|
26
|
+
(a:bigint,b:bigint=0n) => ((a-b)<1)?(a-b+p):(a-b)%p :
|
|
27
27
|
(op==fieldops.$mul) ?
|
|
28
|
-
(a:bigint,b:bigint) => (a*b)%p :
|
|
29
|
-
(op==fieldops.$
|
|
30
|
-
(a:bigint
|
|
31
|
-
fail();
|
|
32
|
-
|
|
28
|
+
(a:bigint,b:bigint=0n) => (a*b)%p :
|
|
29
|
+
(op==fieldops.$inv) ?
|
|
30
|
+
(a:bigint) => (!a)?fail('0 has no inverse'):Util.sqmul(a,(p-2n),p) :
|
|
31
|
+
fail('unknown field operation');
|
|
33
32
|
|
|
34
33
|
Util = {
|
|
35
34
|
countbits(x:bigint): bigint {
|
|
@@ -87,6 +86,45 @@ Util = {
|
|
|
87
86
|
return (val%max);
|
|
88
87
|
else
|
|
89
88
|
return val;
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
eea(x:bigint,p:bigint): bigint {
|
|
92
|
+
return fail('eea() not implemented') as never;
|
|
93
|
+
},
|
|
94
|
+
|
|
95
|
+
sqmul(a:bigint,e:bigint,p:bigint): bigint {
|
|
96
|
+
let bitstring:boolean[];
|
|
97
|
+
let bitlen:bigint;
|
|
98
|
+
let n:bigint;
|
|
99
|
+
let val:bigint;
|
|
100
|
+
let mul:(y:bigint,z:bigint,p_:bigint)=>bigint;
|
|
101
|
+
let sq:(y:bigint,p_:bigint)=>bigint;
|
|
102
|
+
|
|
103
|
+
log(`${a}^${e} (mod ${p}) = `);
|
|
104
|
+
|
|
105
|
+
mul = (y:bigint,z:bigint,p_:bigint):bigint => ((y*z)%p_);
|
|
106
|
+
sq = (y:bigint,p_:bigint):bigint => ((y*y)%p_);
|
|
107
|
+
|
|
108
|
+
val = a;
|
|
109
|
+
bitlen = this.countbits(e);
|
|
110
|
+
if (!bitlen)
|
|
111
|
+
return fail('error: n ≯ 0');
|
|
112
|
+
n = (bitlen-1n);
|
|
113
|
+
bitstring = new Array<boolean>(Number(bitlen))
|
|
114
|
+
.fill(false,0,Number(bitlen))
|
|
115
|
+
.map((x:boolean,idx:number):boolean =>
|
|
116
|
+
(((e>>n--)&1n)===1n) && (!!idx));
|
|
117
|
+
// log(bitstring.map((x:boolean):number => (x)?1:0));
|
|
118
|
+
bitstring
|
|
119
|
+
.forEach((x:boolean):void => {
|
|
120
|
+
val = (x) ?
|
|
121
|
+
mul(a,sq(val,p),p) :
|
|
122
|
+
sq(a,p);
|
|
123
|
+
|
|
124
|
+
return void 0;
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
return (val%p);
|
|
90
128
|
}
|
|
91
129
|
}
|
|
92
130
|
|
|
@@ -94,10 +132,14 @@ enum fieldops {
|
|
|
94
132
|
$add,
|
|
95
133
|
$sub,
|
|
96
134
|
$mul,
|
|
97
|
-
$
|
|
135
|
+
$inv
|
|
98
136
|
}
|
|
99
137
|
|
|
100
138
|
interface Igalois {
|
|
139
|
+
add: (a:bigint,b:bigint)=>bigint;
|
|
140
|
+
sub: (a:bigint,b:bigint)=>bigint;
|
|
141
|
+
mul: (a:bigint,b:bigint)=>bigint;
|
|
142
|
+
inv: (a:bigint)=>bigint;
|
|
101
143
|
verify:()=>void;
|
|
102
144
|
constructor:Function;
|
|
103
145
|
}
|
|
@@ -106,38 +148,55 @@ interface Iutil {
|
|
|
106
148
|
isprime: (p:bigint,bitlen?:bigint,s?:number)=>boolean;
|
|
107
149
|
countbits: (x:bigint)=>bigint;
|
|
108
150
|
rnd: (bitlen:bigint,max:bigint)=>bigint;
|
|
151
|
+
eea: (x:bigint,p:bigint)=>bigint;
|
|
152
|
+
sqmul: (a:bigint,e:bigint,p:bigint)=>bigint;
|
|
109
153
|
}
|
|
110
154
|
|
|
111
|
-
class GF implements Igalois {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
155
|
+
abstract class GF implements Igalois {
|
|
156
|
+
protected modulus: bigint;
|
|
157
|
+
protected bitlen: bigint;
|
|
158
|
+
public abstract add: (a:bigint,b:bigint)=>bigint;
|
|
159
|
+
public abstract sub: typeof this.add;
|
|
160
|
+
public abstract mul: typeof this.add;
|
|
161
|
+
public abstract inv: (a:bigint)=>bigint;
|
|
162
|
+
|
|
163
|
+
public abstract verify(): void;
|
|
164
|
+
|
|
165
|
+
constructor(field:bigint,bitlen:bigint) {
|
|
166
|
+
this.modulus = field;
|
|
167
|
+
this.bitlen = bitlen;
|
|
168
|
+
this.verify();
|
|
169
|
+
|
|
170
|
+
return this;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
class PrimeField extends GF implements Igalois {
|
|
176
|
+
public add: (a:bigint,b:bigint)=>bigint;
|
|
177
|
+
public sub: typeof this.add;
|
|
178
|
+
public mul: typeof this.add;
|
|
179
|
+
public inv: (a:bigint)=>bigint;
|
|
118
180
|
|
|
119
181
|
public verify(): void {
|
|
120
182
|
if (!Util.isprime(this.modulus))
|
|
121
|
-
return fail(
|
|
183
|
+
return fail('error: p ∉ ℙ');
|
|
122
184
|
else if (Util.countbits(this.modulus) > this.bitlen)
|
|
123
|
-
return fail(
|
|
185
|
+
return fail('error: p ≮ 2ⁿ', this.bitlen);
|
|
124
186
|
|
|
125
187
|
return void 0;
|
|
126
188
|
}
|
|
127
189
|
|
|
128
190
|
constructor(field:bigint,bitlen:bigint) {
|
|
129
|
-
|
|
130
|
-
this.
|
|
131
|
-
this.
|
|
132
|
-
|
|
133
|
-
this.
|
|
134
|
-
this.sub = arithmetics(this.modulus, fieldops.$sub);
|
|
135
|
-
this.mul = arithmetics(this.modulus, fieldops.$mul);
|
|
136
|
-
this.div = arithmetics(this.modulus, fieldops.$div);
|
|
191
|
+
super(field,bitlen);
|
|
192
|
+
this.add = arithmeticsℤp(this.modulus, fieldops.$add);
|
|
193
|
+
this.sub = arithmeticsℤp(this.modulus, fieldops.$sub);
|
|
194
|
+
this.mul = arithmeticsℤp(this.modulus, fieldops.$mul);
|
|
195
|
+
this.inv = arithmeticsℤp(this.modulus, fieldops.$inv);
|
|
137
196
|
|
|
138
197
|
return this;
|
|
139
198
|
}
|
|
140
199
|
|
|
141
200
|
}
|
|
142
201
|
|
|
143
|
-
export { Util,
|
|
202
|
+
export { Util, PrimeField };
|
package/main.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* main.ts */
|
|
2
2
|
import { Polynomial } from './polynomial.js';
|
|
3
|
+
import { Util, PrimeField } from './galois.js';
|
|
3
4
|
let log;
|
|
4
5
|
log = console.log;
|
|
5
6
|
let p1;
|
|
@@ -20,4 +21,5 @@ p2 = new Polynomial({ tobject: 0n, x3: 1n, x2: 0n, x: 1n, 1: 1n }, 2n);
|
|
|
20
21
|
p3 = new Polynomial(1n << 254n, 2n);
|
|
21
22
|
log(p3, p3.eval());
|
|
22
23
|
// log(p3.eval());
|
|
24
|
+
export { Polynomial, Util, PrimeField };
|
|
23
25
|
//# sourceMappingURL=main.js.map
|
package/main.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/* main.ts */
|
|
2
2
|
import { Polynomial } from './polynomial.js';
|
|
3
|
+
import { Util,PrimeField } from './galois.js';
|
|
3
4
|
|
|
4
5
|
let log:(...x:any[])=>void;
|
|
5
6
|
log = console.log;
|
|
@@ -26,3 +27,4 @@ p3 = new Polynomial(1n<<254n, 2n);
|
|
|
26
27
|
log(p3, p3.eval());
|
|
27
28
|
// log(p3.eval());
|
|
28
29
|
|
|
30
|
+
export { Polynomial,Util,PrimeField };
|