arnaucube
arnaucube/circomPublic Self-hosted repository
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