circom/ports/c/buildasm/fr.c.ejs
ports/c/buildasm/fr.c.ejsRaw
1#include "<%=name.toLowerCase()+".h"%>"
2#include <stdio.h>
3#include <stdlib.h>
4#include <gmp.h>
5#include <assert.h>
6
7mpz_t q;
8mpz_t zero;
9mpz_t one;
10mpz_t mask;
11size_t nBits;
12
13
14void <%=name%>_toMpz(mpz_t r, P<%=name%>Element pE) {
15 <%=name%>_toNormal(pE);
16 if (!(pE->type & <%=name%>_LONG)) {
17 mpz_set_si(r, pE->shortVal);
18 if (pE->shortVal<0) {
19 mpz_add(r, r, q);
20 }
21 } else {
22 <%=name%>_toNormal(pE);
23 mpz_import(r, <%=name%>_N64, -1, 8, -1, 0, (const void *)pE->longVal);
24 }
25}
26
27void <%=name%>_fromMpz(P<%=name%>Element pE, mpz_t v) {
28 if (mpz_fits_sint_p(v)) {
29 pE->type = <%=name%>_SHORT;
30 pE->shortVal = mpz_get_si(v);
31 } else {
32 pE->type = <%=name%>_LONG;
33 for (int i=0; i<<%=name%>_N64; i++) pE->longVal[i] = 0;
34 mpz_export((void *)(pE->longVal), NULL, -1, 8, -1, 0, v);
35 }
36}
37
38
39void <%=name%>_init() {
40 mpz_init(q);
41 mpz_import(q, <%=name%>_N64, -1, 8, -1, 0, (const void *)Fr_q.longVal);
42 mpz_init_set_ui(zero, 0);
43 mpz_init_set_ui(one, 1);
44 nBits = mpz_sizeinbase (q, 2);
45 mpz_init(mask);
46 mpz_mul_2exp(mask, one, nBits);
47 mpz_sub(mask, mask, one);
48
49}
50
51void <%=name%>_str2element(P<%=name%>Element pE, char const *s) {
52 mpz_t mr;
53 mpz_init_set_str(mr, s, 10);
54 <%=name%>_fromMpz(pE, mr);
55}
56
57char *<%=name%>_element2str(P<%=name%>Element pE) {
58 mpz_t r;
59 if (!(pE->type & <%=name%>_LONG)) {
60 if (pE->shortVal>=0) {
61 char *r = new char[32];
62 sprintf(r, "%d", pE->shortVal);
63 return r;
64 } else {
65 mpz_init_set_si(r, pE->shortVal);
66 mpz_add(r, r, q);
67 }
68 } else {
69 <%=name%>_toNormal(pE);
70 mpz_init(r);
71 mpz_import(r, <%=name%>_N64, -1, 8, -1, 0, (const void *)pE->longVal);
72 }
73 char *res = mpz_get_str (0, 10, r);
74 mpz_clear(r);
75 return res;
76}
77
78void <%=name%>_idiv(P<%=name%>Element r, P<%=name%>Element a, P<%=name%>Element b) {
79 mpz_t ma;
80 mpz_t mb;
81 mpz_t mr;
82 mpz_init(ma);
83 mpz_init(mb);
84 mpz_init(mr);
85
86 <%=name%>_toMpz(ma, a);
87 // char *s1 = mpz_get_str (0, 10, ma);
88 // printf("s1 %s\n", s1);
89 <%=name%>_toMpz(mb, b);
90 // char *s2 = mpz_get_str (0, 10, mb);
91 // printf("s2 %s\n", s2);
92 mpz_fdiv_q(mr, ma, mb);
93 // char *sr = mpz_get_str (0, 10, mr);
94 // printf("r %s\n", sr);
95 <%=name%>_fromMpz(r, mr);
96}
97
98void <%=name%>_mod(P<%=name%>Element r, P<%=name%>Element a, P<%=name%>Element b) {
99 mpz_t ma;
100 mpz_t mb;
101 mpz_t mr;
102 mpz_init(ma);
103 mpz_init(mb);
104 mpz_init(mr);
105
106 <%=name%>_toMpz(ma, a);
107 <%=name%>_toMpz(mb, b);
108 mpz_fdiv_r(mr, ma, mb);
109 <%=name%>_fromMpz(r, mr);
110}
111
112void <%=name%>_shl(P<%=name%>Element r, P<%=name%>Element a, P<%=name%>Element b) {
113 mpz_t ma;
114 mpz_t mb;
115 mpz_t mr;
116 mpz_init(ma);
117 mpz_init(mb);
118 mpz_init(mr);
119
120 <%=name%>_toMpz(ma, a);
121 <%=name%>_toMpz(mb, b);
122 if (mpz_cmp_ui(mb, nBits) < 0) {
123 mpz_mul_2exp(mr, ma, mpz_get_ui(mb));
124 mpz_and(mr, mr, mask);
125 if (mpz_cmp(mr, q) >= 0) {
126 mpz_sub(mr, mr, q);
127 }
128 } else {
129 mpz_sub(mb, q, mb);
130 if (mpz_cmp_ui(mb, nBits) < 0) {
131 mpz_tdiv_q_2exp(mr, ma, mpz_get_ui(mb));
132 } else {
133 mpz_set(mr, zero);
134 }
135 }
136 <%=name%>_fromMpz(r, mr);
137}
138
139void <%=name%>_shr(P<%=name%>Element r, P<%=name%>Element a, P<%=name%>Element b) {
140 mpz_t ma;
141 mpz_t mb;
142 mpz_t mr;
143 mpz_init(ma);
144 mpz_init(mb);
145 mpz_init(mr);
146
147 <%=name%>_toMpz(ma, a);
148 <%=name%>_toMpz(mb, b);
149 if (mpz_cmp_ui(mb, nBits) < 0) {
150 mpz_tdiv_q_2exp(mr, ma, mpz_get_ui(mb));
151 } else {
152 mpz_sub(mb, q, mb);
153 if (mpz_cmp_ui(mb, nBits) < 0) {
154 mpz_mul_2exp(mr, ma, mpz_get_ui(mb));
155 mpz_and(mr, mr, mask);
156 if (mpz_cmp(mr, q) >= 0) {
157 mpz_sub(mr, mr, q);
158 }
159 } else {
160 mpz_set(mr, zero);
161 }
162 }
163 <%=name%>_fromMpz(r, mr);
164}
165
166
167void <%=name%>_pow(P<%=name%>Element r, P<%=name%>Element a, P<%=name%>Element b) {
168 mpz_t ma;
169 mpz_t mb;
170 mpz_t mr;
171 mpz_init(ma);
172 mpz_init(mb);
173 mpz_init(mr);
174
175 <%=name%>_toMpz(ma, a);
176 <%=name%>_toMpz(mb, b);
177 mpz_powm(mr, ma, mb, q);
178 <%=name%>_fromMpz(r, mr);
179}
180
181void <%=name%>_inv(P<%=name%>Element r, P<%=name%>Element a) {
182 mpz_t ma;
183 mpz_t mr;
184 mpz_init(ma);
185 mpz_init(mr);
186
187 <%=name%>_toMpz(ma, a);
188 mpz_invert(mr, ma, q);
189 <%=name%>_fromMpz(r, mr);
190}
191
192void <%=name%>_div(P<%=name%>Element r, P<%=name%>Element a, P<%=name%>Element b) {
193 <%=name%>Element tmp;
194 <%=name%>_inv(&tmp, b);
195 <%=name%>_mul(r, a, &tmp);
196}
197
198void <%=name%>_fail() {
199 assert(false);
200}
201