snarkjs/src/ratzqfield.js
src/ratzqfield.jsRaw
1const fUtils = require("./futils.js");
2
3class RatZqField {
4 constructor(F) {
5 this.F = F;
6 this.zero = [F.zero, F.one];
7 this.one = [F.one, F.one];
8 this.two = [F.two, F.one];
9 this.twoinv = [F.one, F.two];
10 this.q = F.q;
11 }
12
13 add(a,b) {
14 return [
15 this.F.add(
16 this.F.mul(a[0], b[1]),
17 this.F.mul(a[1], b[0])),
18 this.F.mul(a[1], b[1])];
19 }
20
21 double(a) {
22 return [this.F.add(a[0], a[0]), a[1]];
23 }
24
25 sub(a,b) {
26 return [
27 this.F.sub(
28 this.F.mul(a[0], b[1]),
29 this.F.mul(a[1], b[0])),
30 this.F.mul(a[1], b[1])];
31 }
32
33 neg(a) {
34 return [this.F.neg(a[0]), a[1]];
35 }
36
37 mul(a,b) {
38 return [
39 this.F.mul(a[0], b[0]),
40 this.F.mul(a[1], b[1]),
41 ];
42 }
43
44 copy(a) {
45 return [a[0], a[1]];
46 }
47
48 div(a, b) {
49 return [
50 this.F.mul(a[0], b[1]),
51 this.F.mul(a[1], b[0]),
52 ];
53 }
54
55 inverse(a) {
56 return [a[1], a[0]];
57 }
58
59 square(a) {
60 return [
61 this.F.square(a[0]),
62 this.F.square(a[1])
63 ];
64 }
65
66 mulScalar(base, e) {
67 return [this.F.mulScalar(base[0], e) , base[1]];
68 }
69
70 exp(base, e) {
71 return fUtils.exp(this, base, e);
72 }
73
74 equals(a, b) {
75 return this.F.equals(
76 this.F.mul(a[0], b[1]),
77 this.F.mul(a[1], b[0])
78 );
79 }
80
81 isZero(a) {
82 return this.F.isZero(a[0]);
83 }
84
85 affine(a) {
86 return [this.F.div(a[0], a[1]), this.F.one];
87 }
88
89 toString(a) {
90 const ca = this.affine(a);
91 return `"0x${ca[0].toString(16)}"`;
92 }
93
94 random() {
95 return [this.F.random(), this.F.one];
96 }
97
98 fromF(a) {
99 return [a, this.F.one];
100 }
101
102 toF(a) {
103 return this.affine(a)[0];
104 }
105}
106
107
108module.exports = RatZqField;