arnaucube
arnaucube/snarkjsPublic Self-hosted repository
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;