arnaucube
arnaucube/circomPublic Self-hosted repository
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#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