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