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}