arnaucube
arnaucube/snarkjsPublic Self-hosted repository
snarkjs/src/zqfield.js
src/zqfield.jsRaw
 1const bigInt = require("./bigint");
 2const fUtils = require("./futils.js");
 3
 4class F1Field {
 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.times(b).mod(this.q);
34    }
35
36    inverse(a) {
37        return this.affine(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        let aux = a;
58        if (aux.isNegative()) {
59            if (aux.lesserOrEquals(this.nq)) {
60                aux = a.mod(this.q);
61            }
62            if (aux.isNegative()) {
63                aux = aux.add(this.q);
64            }
65        } else {
66            if (aux.greaterOrEquals(this.q)) {
67                aux = aux.mod(this.q);
68            }
69        }
70        return aux;
71    }
72
73    mulEscalar(base, e) {
74        return fUtils.mulEscalar(this, base, e);
75    }
76
77    exp(base, e) {
78        return fUtils.exp(this, base, e);
79    }
80
81    toString(a) {
82        const ca = this.affine(a);
83        return `"0x${ca.toString(16)}"`;
84    }
85}
86
87module.exports = F1Field;