snarkjs/src/f1field.js
src/f1field.jsRaw
1const bigInt = require("big-integer");
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;