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