circom/c/buildasm/fr.c.ejs
c/buildasm/fr.c.ejsRaw
1#include "<%=name.toLowerCase()+".h"%>"
2#include <stdio.h>
3#include <stdlib.h>
4#include <gmp.h>
5
6void <%=name%>_str2element(P<%=name%>Element pE, char *s) {
7 mpz_t r;
8 mpz_init(r);
9 mpz_set_str(r, s, 10);
10 pE->type = <%=name%>_LONG;
11 for (int i=0; i<<%=name%>_N64; i++) pE->longVal[i] = 0;
12 mpz_export((void *)pE->longVal, NULL, -1, 8, -1, 0, r);
13}
14
15char *<%=name%>_element2str(P<%=name%>Element pE) {
16 mpz_t r;
17 mpz_t q;
18 if (!(pE->type & <%=name%>_LONG)) {
19 if (pE->shortVal>=0) {
20 char *r = new char[32];
21 sprintf(r, "%d", pE->shortVal);
22 return r;
23 } else {
24 mpz_init(q);
25 mpz_import(q, <%=name%>_N64, -1, 8, -1, 0, (const void *)Fr_q.longVal);
26 mpz_init_set_si(r, pE->shortVal);
27 mpz_add(r, r, q);
28 mpz_clear(q);
29 }
30 } else {
31 <%=name%>_toNormal(pE);
32 mpz_init(r);
33 mpz_import(r, <%=name%>_N64, -1, 8, -1, 0, (const void *)pE->longVal);
34 }
35 char *res = mpz_get_str (0, 10, r);
36 mpz_clear(r);
37 return res;
38}
39
40void <%=name%>_toMpz(mpz_t r, P<%=name%>Element pE) {
41 mpz_t q;
42 <%=name%>_toNormal(pE);
43 if (!(pE->type & <%=name%>_LONG)) {
44 mpz_set_si(r, pE->shortVal);
45 if (pE->shortVal<0) {
46 mpz_init(q);
47 mpz_import(q, <%=name%>_N64, -1, 8, -1, 0, (const void *)Fr_q.longVal);
48 mpz_add(r, r, q);
49 }
50 } else {
51 mpz_import(r, <%=name%>_N64, -1, 8, -1, 0, (const void *)pE->longVal);
52 }
53}
54
55void <%=name%>_fromMpz(P<%=name%>Element pE, mpz_t v) {
56 if (mpz_fits_sint_p(v)) {
57 pE->type = <%=name%>_SHORT;
58 pE->shortVal = mpz_get_si(v);
59 } else {
60 pE->type = <%=name%>_LONG;
61 for (int i=0; i<<%=name%>_N64; i++) pE->longVal[i] = 0;
62 mpz_export((void *)(pE->longVal), NULL, -1, 8, -1, 0, v);
63 }
64}
65
66void <%=name%>_idiv(P<%=name%>Element r, P<%=name%>Element a, P<%=name%>Element b) {
67 mpz_t ma;
68 mpz_t mb;
69 mpz_t mr;
70 mpz_init(ma);
71 mpz_init(mb);
72 mpz_init(mr);
73
74 <%=name%>_toMpz(ma, a);
75 // char *s1 = mpz_get_str (0, 10, ma);
76 // printf("s1 %s\n", s1);
77 <%=name%>_toMpz(mb, b);
78 // char *s2 = mpz_get_str (0, 10, mb);
79 // printf("s2 %s\n", s2);
80 mpz_fdiv_q(mr, ma, mb);
81 // char *sr = mpz_get_str (0, 10, mr);
82 // printf("r %s\n", sr);
83 <%=name%>_fromMpz(r, mr);
84}
85
86void <%=name%>_inv(P<%=name%>Element r, P<%=name%>Element a) {
87 mpz_t ma;
88 mpz_t mr;
89 mpz_t q;
90 mpz_init(ma);
91 mpz_init(mr);
92
93 mpz_init(q);
94 mpz_import(q, <%=name%>_N64, -1, 8, -1, 0, (const void *)Fr_q.longVal);
95
96 <%=name%>_toMpz(ma, a);
97 mpz_invert(mr, ma, q);
98 <%=name%>_fromMpz(r, mr);
99}
100
101void <%=name%>_div(P<%=name%>Element r, P<%=name%>Element a, P<%=name%>Element b) {
102 <%=name%>Element tmp;
103 <%=name%>_inv(&tmp, b);
104 <%=name%>_mul(r, a, &tmp);
105}
106