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
  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