snarkjs/src/zqfield.js
src/zqfield.jsRaw
1const bigInt = require("./bigint");
2const fUtils = require("./futils.js");
3
4class ZqField {
5 constructor(q) {
6 this.q = q;
7 this.nq = bigInt.zero.minus(q);
8 this.zero = bigInt.zero;
9 this.one = bigInt.one;
10 }
11
12 copy(a) {
13 return bigInt(a);
14 }
15
16 add(a, b) {
17 return a.add(b);
18 }
19
20 double(a) {
21 return this.add(a,a);
22 }
23
24 sub(a, b) {
25 return a.minus(b);
26 }
27
28 neg(a) {
29 return bigInt.zero.minus(a);
30 }
31
32 mul(a, b) {
33 return a.mulMod(this.q, b);
34 }
35
36 inverse(a) {
37 return a.modInv(this.q);
38 }
39
40 div(a, b) {
41 return this.mul(a, this.inverse(b));
42 }
43
44 square(a) {
45 return a.square().mod(this.q);
46 }
47
48 isZero(a) {
49 return a.isZero();
50 }
51
52 equals(a, b) {
53 return this.affine(a).equals(this.affine(b));
54 }
55
56 affine(a) {
57 return a.affine(this.q);
58 }
59
60 mulEscalar(base, e) {
61 return fUtils.mulEscalar(this, base, e);
62 }
63
64 exp(base, e) {
65 return fUtils.exp(this, base, e);
66 }
67
68 toString(a) {
69 const ca = this.affine(a);
70 return `"0x${ca.toString(16)}"`;
71 }
72}
73
74
75module.exports = ZqField;