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}
  9
 10ZqField::~ZqField() {
 11    mpz_clear(tmp);
 12    mpz_clear(p);
 13    mpz_clear(zero);
 14    mpz_clear(one);
 15}
 16
 17void ZqField::add(PBigInt r, PBigInt a, PBigInt b) {
 18    mpz_add(*r,*a,*b);
 19    if (mpz_cmp(*r, p) >= 0) {
 20        mpz_sub(*r, *r, p);
 21    }
 22}
 23
 24void ZqField::sub(PBigInt r, PBigInt a, PBigInt b) {
 25    if (mpz_cmp(*a, *b) >= 0) {
 26        mpz_sub(*r, *a, *b);
 27    } else {
 28        mpz_sub(tmp, *b, *a);
 29        mpz_sub(*r, p, tmp);
 30    }
 31}
 32
 33void ZqField::mul(PBigInt r, PBigInt a, PBigInt b) {
 34    mpz_mul(tmp,*a,*b);
 35    mpz_fdiv_r(*r, tmp, p);
 36}
 37
 38void ZqField::div(PBigInt r, PBigInt a, PBigInt b) {
 39    mpz_invert(tmp, *b, p);
 40    mpz_mul(tmp,*a,tmp);
 41    mpz_fdiv_r(*r, tmp, p);
 42}
 43
 44void ZqField::idiv(PBigInt r, PBigInt a, PBigInt b) {
 45    mpz_fdiv_q(*r, *a, *b);
 46}
 47
 48void ZqField::mod(PBigInt r, PBigInt a, PBigInt b) {
 49    mpz_fdiv_r(*r, *a, *b);
 50}
 51
 52void ZqField::lt(PBigInt r, PBigInt a, PBigInt b) {
 53    int c = mpz_cmp(*a, *b);
 54    if (c<0) {
 55        mpz_set(*r, one);
 56    } else {
 57        mpz_set(*r, zero);
 58    }
 59}
 60
 61void ZqField::eq(PBigInt r, PBigInt a, PBigInt b) {
 62    int c = mpz_cmp(*a, *b);
 63    if (c==0) {
 64        mpz_set(*r, one);
 65    } else {
 66        mpz_set(*r, zero);
 67    }
 68}
 69
 70void ZqField::gt(PBigInt r, PBigInt a, PBigInt b) {
 71    int c = mpz_cmp(*a, *b);
 72    if (c>0) {
 73        mpz_set(*r, one);
 74    } else {
 75        mpz_set(*r, zero);
 76    }
 77}
 78
 79void ZqField::leq(PBigInt r, PBigInt a, PBigInt b) {
 80    int c = mpz_cmp(*a, *b);
 81    if (c<=0) {
 82        mpz_set(*r, one);
 83    } else {
 84        mpz_set(*r, zero);
 85    }
 86}
 87
 88void ZqField::geq(PBigInt r, PBigInt a, PBigInt b) {
 89    int c = mpz_cmp(*a, *b);
 90    if (c>=0) {
 91        mpz_set(*r, one);
 92    } else {
 93        mpz_set(*r, zero);
 94    }
 95}
 96
 97void ZqField::neq(PBigInt r, PBigInt a, PBigInt b) {
 98    int c = mpz_cmp(*a, *b);
 99    if (c!=0) {
100        mpz_set(*r, one);
101    } else {
102        mpz_set(*r, zero);
103    }
104}
105
106int ZqField::isTrue(PBigInt a) {
107    return mpz_sgn(*a);
108}
109
110void ZqField::copyn(PBigInt a, PBigInt b, int n) {
111    for (int i=0;i<n; i++) mpz_set(a[i], b[i]);
112}