circom/ports/c/buildasm/fr.c
ports/c/buildasm/fr.cRaw
1#include "fr.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 Fr_toMpz(mpz_t r, PFrElement pE) {
15 Fr_toNormal(pE);
16 if (!(pE->type & Fr_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, Fr_N64, -1, 8, -1, 0, (const void *)pE->longVal);
23 }
24}
25
26void Fr_fromMpz(PFrElement pE, mpz_t v) {
27 if (mpz_fits_sint_p(v)) {
28 pE->type = Fr_SHORT;
29 pE->shortVal = mpz_get_si(v);
30 } else {
31 pE->type = Fr_LONG;
32 for (int i=0; i<Fr_N64; i++) pE->longVal[i] = 0;
33 mpz_export((void *)(pE->longVal), NULL, -1, 8, -1, 0, v);
34 }
35}
36
37
38void Fr_init() {
39 mpz_init(q);
40 mpz_import(q, Fr_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 Fr_str2element(PFrElement pE, char const *s) {
51 mpz_t mr;
52 mpz_init_set_str(mr, s, 10);
53 Fr_fromMpz(pE, mr);
54}
55
56char *Fr_element2str(PFrElement pE) {
57 mpz_t r;
58 if (!(pE->type & Fr_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 Fr_toNormal(pE);
69 mpz_init(r);
70 mpz_import(r, Fr_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 Fr_idiv(PFrElement r, PFrElement a, PFrElement 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 Fr_toMpz(ma, a);
86 // char *s1 = mpz_get_str (0, 10, ma);
87 // printf("s1 %s\n", s1);
88 Fr_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 Fr_fromMpz(r, mr);
95}
96
97void Fr_mod(PFrElement r, PFrElement a, PFrElement 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 Fr_toMpz(ma, a);
106 Fr_toMpz(mb, b);
107 mpz_fdiv_r(mr, ma, mb);
108 Fr_fromMpz(r, mr);
109}
110
111void Fr_shl(PFrElement r, PFrElement a, PFrElement 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 Fr_toMpz(ma, a);
120 Fr_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 Fr_fromMpz(r, mr);
128}
129
130void Fr_shr(PFrElement r, PFrElement a, PFrElement 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 Fr_toMpz(ma, a);
139 Fr_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 Fr_fromMpz(r, mr);
147}
148
149
150void Fr_pow(PFrElement r, PFrElement a, PFrElement 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 Fr_toMpz(ma, a);
159 Fr_toMpz(mb, b);
160 mpz_powm(mr, ma, mb, q);
161 Fr_fromMpz(r, mr);
162}
163
164void Fr_inv(PFrElement r, PFrElement a) {
165 mpz_t ma;
166 mpz_t mr;
167 mpz_init(ma);
168 mpz_init(mr);
169
170 Fr_toMpz(ma, a);
171 mpz_invert(mr, ma, q);
172 Fr_fromMpz(r, mr);
173}
174
175void Fr_div(PFrElement r, PFrElement a, PFrElement b) {
176 FrElement tmp;
177 Fr_inv(&tmp, b);
178 Fr_mul(r, a, &tmp);
179}
180
181void Fr_fail() {
182 assert(false);
183}
184