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