circom/c/zqfield.cpp
c/zqfield.cppRaw
1#include "zqfield.h"
2
3ZqField::ZqField(PBigInt ap) {
4 mpz_init2(tmp, 1024);
5 mpz_init_set(p, *ap);
6 mpz_init_set_ui(zero, 0);
7 mpz_init_set_ui(one, 1);
8 nBits = mpz_sizeinbase (p, 2);
9 mpz_init(mask);
10 mpz_mul_2exp(mask, one, nBits-1);
11 mpz_sub(mask, mask, one);
12}
13
14ZqField::~ZqField() {
15 mpz_clear(tmp);
16 mpz_clear(p);
17 mpz_clear(zero);
18 mpz_clear(one);
19}
20
21void ZqField::add(PBigInt r, PBigInt a, PBigInt b) {
22 mpz_add(*r,*a,*b);
23 if (mpz_cmp(*r, p) >= 0) {
24 mpz_sub(*r, *r, p);
25 }
26}
27
28void ZqField::sub(PBigInt r, PBigInt a, PBigInt b) {
29 if (mpz_cmp(*a, *b) >= 0) {
30 mpz_sub(*r, *a, *b);
31 } else {
32 mpz_sub(tmp, *b, *a);
33 mpz_sub(*r, p, tmp);
34 }
35}
36
37void ZqField::neg(PBigInt r, PBigInt a) {
38 if (mpz_sgn(*a) > 0) {
39 mpz_sub(*r, p, *a);
40 } else {
41 mpz_set(*r, *a);
42 }
43}
44
45void ZqField::mul(PBigInt r, PBigInt a, PBigInt b) {
46 mpz_mul(tmp,*a,*b);
47 mpz_fdiv_r(*r, tmp, p);
48}
49
50void ZqField::div(PBigInt r, PBigInt a, PBigInt b) {
51 mpz_invert(tmp, *b, p);
52 mpz_mul(tmp,*a,tmp);
53 mpz_fdiv_r(*r, tmp, p);
54}
55
56void ZqField::idiv(PBigInt r, PBigInt a, PBigInt b) {
57 mpz_fdiv_q(*r, *a, *b);
58}
59
60void ZqField::mod(PBigInt r, PBigInt a, PBigInt b) {
61 mpz_fdiv_r(*r, *a, *b);
62}
63
64void ZqField::pow(PBigInt r, PBigInt a, PBigInt b) {
65 mpz_powm(*r, *a, *b, p);
66}
67
68void ZqField::lt(PBigInt r, PBigInt a, PBigInt b) {
69 int c = mpz_cmp(*a, *b);
70 if (c<0) {
71 mpz_set(*r, one);
72 } else {
73 mpz_set(*r, zero);
74 }
75}
76
77void ZqField::eq(PBigInt r, PBigInt a, PBigInt b) {
78 int c = mpz_cmp(*a, *b);
79 if (c==0) {
80 mpz_set(*r, one);
81 } else {
82 mpz_set(*r, zero);
83 }
84}
85
86void ZqField::gt(PBigInt r, PBigInt a, PBigInt b) {
87 int c = mpz_cmp(*a, *b);
88 if (c>0) {
89 mpz_set(*r, one);
90 } else {
91 mpz_set(*r, zero);
92 }
93}
94
95void ZqField::leq(PBigInt r, PBigInt a, PBigInt b) {
96 int c = mpz_cmp(*a, *b);
97 if (c<=0) {
98 mpz_set(*r, one);
99 } else {
100 mpz_set(*r, zero);
101 }
102}
103
104void ZqField::geq(PBigInt r, PBigInt a, PBigInt b) {
105 int c = mpz_cmp(*a, *b);
106 if (c>=0) {
107 mpz_set(*r, one);
108 } else {
109 mpz_set(*r, zero);
110 }
111}
112
113void ZqField::neq(PBigInt r, PBigInt a, PBigInt b) {
114 int c = mpz_cmp(*a, *b);
115 if (c!=0) {
116 mpz_set(*r, one);
117 } else {
118 mpz_set(*r, zero);
119 }
120}
121
122void ZqField::land(PBigInt r, PBigInt a, PBigInt b) {
123 if (mpz_sgn(*a) && mpz_sgn(*b)) {
124 mpz_set(*r, one);
125 } else {
126 mpz_set(*r, zero);
127 }
128}
129
130void ZqField::lor(PBigInt r, PBigInt a, PBigInt b) {
131 if (mpz_sgn(*a) || mpz_sgn(*b)) {
132 mpz_set(*r, one);
133 } else {
134 mpz_set(*r, zero);
135 }
136}
137
138void ZqField::lnot(PBigInt r, PBigInt a) {
139 if (mpz_sgn(*a)) {
140 mpz_set(*r, zero);
141 } else {
142 mpz_set(*r, one);
143 }
144}
145
146int ZqField::isTrue(PBigInt a) {
147 return mpz_sgn(*a);
148}
149
150void ZqField::copyn(PBigInt a, PBigInt b, int n) {
151 for (int i=0;i<n; i++) mpz_set(a[i], b[i]);
152}
153
154void ZqField::band(PBigInt r, PBigInt a, PBigInt b) {
155 mpz_and(*r, *a, *b);
156 mpz_and(*r, *r, mask);
157}
158
159void ZqField::bor(PBigInt r, PBigInt a, PBigInt b) {
160 mpz_ior(*r, *a, *b);
161 mpz_and(*r, *r, mask);
162}
163
164void ZqField::bxor(PBigInt r, PBigInt a, PBigInt b) {
165 mpz_xor(*r, *a, *b);
166 mpz_and(*r, *r, mask);
167}
168
169void ZqField::bnot(PBigInt r, PBigInt a) {
170 mpz_xor(*r, *a, mask);
171 mpz_and(*r, *r, mask);
172}
173
174void ZqField::shl(PBigInt r, PBigInt a, PBigInt b) {
175 if (mpz_cmp_ui(*b, nBits) >= 0) {
176 mpz_set(*r, zero);
177 } else {
178 mpz_mul_2exp(*r, *a, mpz_get_ui(*b));
179 mpz_and(*r, *r, mask);
180 }
181}
182
183void ZqField::shr(PBigInt r, PBigInt a, PBigInt b) {
184 if (mpz_cmp_ui(*b, nBits) >= 0) {
185 mpz_set(*r, zero);
186 } else {
187 mpz_tdiv_q_2exp(*r, *a, mpz_get_ui(*b));
188 mpz_and(*r, *r, mask);
189 }
190}
191
192int ZqField::toInt(PBigInt a) {
193 return mpz_get_si (*a);
194}
195