Skip to content

Commit 3b86c3a

Browse files
committed
cleaned utils.c
1 parent 624a9b7 commit 3b86c3a

3 files changed

Lines changed: 103 additions & 87 deletions

File tree

include/utils.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ void my_log10(mpf_t res, mpf_t x, mpf_t ln2, mpf_t ln10, mpf_t e);
2828

2929
int my_legendre(mpz_t n, unsigned long p);
3030
void sqrt_mod(mpz_t n, unsigned long p, gmp_randstate_t state);
31-
int mpz_equal(const mpz_t a, const mpz_t b);
3231
bool fermat_primality(mpz_t n);
3332

3433
// Linear algebra functions

src/main.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ unsigned long compute_best_mult(mpf_t best_time, mpf_t work, mpf_t time1, mpf_t
5959
for (unsigned long k = 1 ; k < 40 ; k++)
6060
{
6161
mpz_mul_ui(n, N, k);
62-
mpf_set_z(tmpf ,n);
62+
mpf_set_z(tmpf, n);
6363
natural_log(tmpf, tmpf, ln2, e);
6464
natural_log(tmpf2, tmpf, ln2, e);
6565
mpf_mul(tmpf, tmpf, tmpf2);
@@ -160,6 +160,7 @@ void compute_factor_base(dyn_array_classic* primes, dyn_array* roots, dyn_array_
160160
{
161161
append_classic(primes, B.start[i]);
162162
mpz_set(tmp2, n);
163+
163164
sqrt_mod(tmp2, B.start[i], state);
164165
append(roots, tmp2);
165166
mpz_mul_ui(*prod_primes, *prod_primes, B.start[i]);

src/utils.c

Lines changed: 101 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ void recursive_exp(mpf_t res, mpz_t pow, mpf_t e)
3030
mpf_init(tmpf);
3131
mpz_t tmp;
3232
mpz_init(tmp);
33+
3334
if (mpz_even_p(pow))
3435
{
3536
mpz_div_ui(tmp, pow, 2);
@@ -59,8 +60,7 @@ void myexp(mpf_t res, mpf_t x, mpf_t e)
5960
mpf_t tmp_res, rest;
6061
mpz_t tmp;
6162

62-
mpf_init(rest);
63-
mpf_init(tmp_res);
63+
mpf_inits(tmp_res, rest, NULL);
6464
mpz_init(tmp);
6565

6666
mpz_set_f(tmp, x);
@@ -116,8 +116,7 @@ void natural_log(mpf_t res, mpf_t x, mpf_t ln2, mpf_t e)
116116

117117
mpf_t a, tmpf;
118118

119-
mpf_init(tmpf);
120-
mpf_init(a);
119+
mpf_inits(a, tmpf, NULL);
121120
mpf_set_prec(a, 32);
122121
mpf_set_z(a, tmp);
123122
mpf_mul(a, a, ln2);
@@ -130,6 +129,7 @@ void natural_log(mpf_t res, mpf_t x, mpf_t ln2, mpf_t e)
130129
mpf_add(a, a, tmpf);
131130
}
132131
mpf_set(res, a);
132+
133133
mpz_clear(tmp);
134134
mpf_clears(tmpf, a, NULL);
135135
}
@@ -140,12 +140,11 @@ void my_log10(mpf_t res, mpf_t x, mpf_t ln2, mpf_t ln10, mpf_t e)
140140

141141
mpz_init(tmp);
142142
mpz_set_f(tmp, x);
143-
mpz_set_ui(tmp,mpz_sizeinbase(tmp, 2));
143+
mpz_set_ui(tmp, mpz_sizeinbase(tmp, 2));
144144

145145
mpf_t a, tmpf;
146146

147-
mpf_init(tmpf);
148-
mpf_init(a);
147+
mpf_inits(a, tmpf, NULL);
149148
mpf_set_prec(a, 32);
150149
mpf_set_z(a, tmp);
151150
mpf_mul(a, a, ln2);
@@ -167,14 +166,16 @@ int my_legendre(mpz_t n, unsigned long p)
167166
{
168167
mpz_t tmp;
169168
mpz_init(tmp);
169+
mpz_mod_ui(tmp, n, p);
170+
170171
unsigned long tmpl;
171-
mpz_mod_ui(tmp,n,p);
172172
tmpl = mpz_get_ui(tmp);
173+
173174
int t = 1;
174175
unsigned long tmps;
175176
while (tmpl)
176177
{
177-
while (tmpl%2 == 0)
178+
while (!(tmpl&1))
178179
{
179180
tmpl >>= 1;
180181
if (p%8 == 3 || p%8 == 5) t = -t;
@@ -192,87 +193,95 @@ int my_legendre(mpz_t n, unsigned long p)
192193

193194
void sqrt_mod(mpz_t n, const unsigned long p, gmp_randstate_t state)
194195
{
195-
mpz_t z,tmp,tmp2,P_value;
196+
mpz_t z, tmp, P_value;
197+
mpz_inits(z, tmp, NULL);
198+
196199
unsigned long P;
197200
unsigned long tmp3;
198201
unsigned long r = 0;
199-
mpz_init(z);
200-
mpz_init(tmp);
201202

202-
mpz_mod_ui(n,n,p);
203+
mpz_mod_ui(n, n, p);
203204
P = p-1;
204-
mpz_init_set_ui(P_value,P);
205-
mpz_set_ui(tmp,p);
206-
mpz_urandomm(z,state,tmp);
207-
if (mpz_cmp_ui(z,1) != 1) mpz_set_ui(z,2);
208-
while (my_legendre(z,p) != -1)
205+
mpz_init_set_ui(P_value, P);
206+
mpz_set_ui(tmp, p);
207+
208+
mpz_urandomm(z, state, tmp);
209+
if (mpz_cmp_ui(z, 1) != 1) mpz_set_ui(z, 2);
210+
211+
while (my_legendre(z, p) != -1)
209212
{
210-
mpz_urandomm(z,state,tmp);
211-
if (mpz_cmp_ui(z,1) != 1) mpz_set_ui(z,2);
213+
mpz_urandomm(z, state, tmp);
214+
if (mpz_cmp_ui(z, 1) != 1) mpz_set_ui(z, 2);
212215
}
213-
while (P%2 == 0)
216+
217+
while (!(P&1))
214218
{
215219
P >>= 1;
216220
r++;
217221
}
218222
mpz_t generator, lambda, omega, res, m, two_mpz;
219-
mpz_init(generator);
220-
mpz_init(lambda);
221-
mpz_init(omega);
222-
mpz_powm_ui(generator,z,P,tmp);
223-
mpz_powm_ui(lambda,n,P,tmp);
223+
mpz_inits(generator, lambda, omega, NULL);
224+
225+
mpz_powm_ui(generator, z, P, tmp);
226+
mpz_powm_ui(lambda, n, P, tmp);
227+
224228
tmp3 = (P+1)>>1;
225-
mpz_powm_ui(omega,n,tmp3,tmp);
226-
mpz_init_set_ui(res,0);
229+
mpz_powm_ui(omega, n, tmp3, tmp);
230+
231+
mpz_init_set_ui(res, 0);
227232
mpz_init(m);
228-
mpz_init_set_ui(two_mpz,2);
229-
mpz_t tmp_l;
230-
mpz_init(tmp_l);
231-
mpz_init(tmp2);
233+
mpz_init_set_ui(two_mpz, 2);
234+
235+
mpz_t tmp_l, tmp2;
236+
mpz_inits(tmp_l, tmp2, NULL);
237+
232238
while (1)
233239
{
234-
if (mpz_cmp_ui(lambda,0) == 0)
240+
if (!mpz_cmp_ui(lambda, 0))
235241
{
236-
mpz_set_ui(n,0);
242+
mpz_set_ui(n, 0);
237243
break;
238244
}
239-
if (mpz_cmp_ui(lambda,1) == 0)
245+
246+
if (!mpz_cmp_ui(lambda, 1))
240247
{
241-
mpz_set(n,omega);
248+
mpz_set(n, omega);
242249
break;
243250
}
244-
mpz_set_ui(m,1);
245-
while (mpz_cmp_ui(m,r) < 0)
251+
252+
mpz_set_ui(m, 1);
253+
while (mpz_cmp_ui(m, r) < 0)
246254
{
247-
mpz_powm(tmp_l,two_mpz,m,P_value);
248-
mpz_powm(tmp_l,lambda,tmp_l,tmp);
249-
if (mpz_cmp_ui(tmp_l,1) == 0) break;
250-
mpz_add_ui(m,m,1);
255+
mpz_powm(tmp_l, two_mpz, m, P_value);
256+
mpz_powm(tmp_l, lambda, tmp_l, tmp);
257+
258+
if (!mpz_cmp_ui(tmp_l, 1)) break;
259+
260+
mpz_add_ui(m, m, 1);
251261
}
252-
mpz_ui_sub(tmp2,r-1,m);
253-
mpz_powm(tmp_l,two_mpz,tmp2,P_value);
262+
263+
mpz_ui_sub(tmp2, r-1, m);
264+
mpz_powm(tmp_l, two_mpz, tmp2, P_value);
254265
mpz_mul_2exp(tmp2, tmp_l, 1);
255266

256-
mpz_powm(tmp2,generator,tmp2,tmp);
257-
mpz_mul(lambda,lambda,tmp2);
258-
mpz_mod(lambda,lambda,tmp);
267+
mpz_powm(tmp2, generator, tmp2, tmp);
268+
mpz_mul(lambda, lambda, tmp2);
269+
mpz_mod(lambda, lambda, tmp);
259270

260-
mpz_powm(tmp2,generator,tmp_l,tmp);
261-
mpz_mul(omega,omega,tmp2);
262-
mpz_mod(omega,omega,tmp);
271+
mpz_powm(tmp2, generator, tmp_l, tmp);
272+
mpz_mul(omega, omega, tmp2);
273+
mpz_mod(omega, omega, tmp);
263274
}
264-
mpz_clears(z, tmp, tmp2, P_value, generator, lambda, omega, res, m, two_mpz, NULL);
265-
}
266275

267-
int mpz_equal(const mpz_t a, const mpz_t b) {
268-
return (mpz_cmp(a, b));
276+
mpz_clears(z, tmp, tmp2, P_value, generator, lambda, omega, res, m, two_mpz, NULL);
269277
}
270278

271279
bool fermat_primality(mpz_t n)
272280
{
273281
mpz_t res, base, exponent;
274282
mpz_init_set_ui(base, 2);
275283
mpz_inits(res, exponent, NULL);
284+
276285
mpz_sub_ui(exponent, n, 1);
277286

278287
mpz_powm(res, base, exponent, n);
@@ -323,72 +332,79 @@ bool dot_prod(const unsigned long n, const bool lbd[n], const bool x[n])
323332
void poly_prod(mpz_t res, const mpz_t poly_a, const mpz_t poly_b)
324333
{
325334
mpz_t tmp_poly;
326-
mpz_init_set_ui(tmp_poly,0);
335+
mpz_init_set_ui(tmp_poly, 0);
336+
327337
mpz_t tmp;
328-
mpz_init(tmp);
329-
mpz_set(tmp,poly_a);
338+
mpz_init_set(tmp, poly_a);
330339
my_int_log2(tmp);
340+
331341
for (unsigned long i = mpz_get_ui(tmp) ; i > 0 ; i--)
332342
{
333-
mpz_div_2exp(tmp,poly_a,i);
334-
if (mpz_odd_p(tmp)) mpz_xor(tmp_poly,tmp_poly,poly_b);
335-
mpz_mul_2exp(tmp_poly,tmp_poly,1);
343+
mpz_div_2exp(tmp, poly_a, i);
344+
if (mpz_odd_p(tmp)) mpz_xor(tmp_poly, tmp_poly, poly_b);
345+
mpz_mul_2exp(tmp_poly, tmp_poly, 1);
336346
}
337-
if (mpz_odd_p(poly_a)) mpz_xor(tmp_poly,tmp_poly,poly_b);
338-
mpz_set(res,tmp_poly);
339-
mpz_clears(tmp,tmp_poly,NULL);
347+
348+
if (mpz_odd_p(poly_a)) mpz_xor(tmp_poly, tmp_poly, poly_b);
349+
mpz_set(res, tmp_poly);
350+
351+
mpz_clears(tmp, tmp_poly, NULL);
340352
}
341353

342354
void div_poly(mpz_t quotient, mpz_t remainder, const mpz_t poly_a, const mpz_t poly_b)
343355
{
344356
mpz_t tmp, tmp2;
345-
mpz_init_set(tmp,poly_a); // problem is there
346-
mpz_init_set(tmp2,poly_b); // or at this line : GNU MP cannot reallocate memory (new_size = 40000; old_size = 4)
357+
mpz_init_set(tmp, poly_a);
358+
mpz_init_set(tmp2, poly_b);
347359
my_int_log2(tmp);
348360
my_int_log2(tmp2);
349-
if (mpz_cmp(tmp,tmp2) < 0)
361+
if (mpz_cmp(tmp, tmp2) < 0)
350362
{
351-
mpz_set(remainder,poly_a);
352-
mpz_set_ui(quotient,0);
363+
mpz_set(remainder, poly_a);
364+
mpz_set_ui(quotient, 0);
353365
}
354366
else
355367
{
356-
mpz_set(remainder,poly_a);
357-
mpz_set_ui(quotient,0);
358-
mpz_set(tmp,poly_a);
359-
mpz_set(tmp2,poly_b);
368+
mpz_set(remainder, poly_a);
369+
mpz_set_ui(quotient, 0);
370+
mpz_set(tmp, poly_a);
371+
mpz_set(tmp2, poly_b);
360372
my_int_log2(tmp);
361373
my_int_log2(tmp2);
362374
signed long dif = mpz_get_ui(tmp)-mpz_get_ui(tmp2);
375+
363376
for (signed long j = dif ; j > 0 ; j--)
364377
{
365-
if (mpz_cmp_ui(remainder,0))
378+
if (mpz_cmp_ui(remainder, 0))
366379
{
367-
mpz_add_ui(quotient,quotient,1);
368-
mpz_mul_2exp(tmp,poly_b,j);
369-
mpz_xor(remainder,remainder,tmp);
380+
mpz_add_ui(quotient, quotient, 1);
381+
mpz_mul_2exp(tmp, poly_b, j);
382+
mpz_xor(remainder, remainder, tmp);
370383
}
371-
mpz_mul_ui(quotient,quotient,2);
384+
mpz_mul_2exp(quotient, quotient, 1);
372385
}
373-
mpz_set(tmp,remainder);
386+
387+
mpz_set(tmp, remainder);
374388
my_int_log2(tmp);
375-
if (mpz_cmp_ui(remainder,0) && mpz_cmp(tmp,tmp2) > -1)
389+
if (mpz_cmp_ui(remainder, 0) && mpz_cmp(tmp, tmp2) > -1)
376390
{
377-
mpz_add_ui(quotient,quotient,1);
378-
mpz_xor(remainder,remainder,poly_b);
391+
mpz_add_ui(quotient, quotient, 1);
392+
mpz_xor(remainder, remainder, poly_b);
379393
}
380394
}
381-
mpz_clears(tmp,tmp2,NULL);
395+
mpz_clears(tmp, tmp2, NULL);
382396
}
383397

384398
void poly_eval(dyn_array_classic A, mpz_t poly, unsigned long n, bool x[n], bool res[n], unsigned long limit)
385399
{
386-
bool tmp2[n];
387-
for (unsigned long i = 0 ; i < n ; i++) tmp2[i] = false;
388400
mpz_t tmp;
389-
mpz_init_set(tmp,poly);
401+
mpz_init_set(tmp, poly);
390402
my_int_log2(tmp);
403+
404+
bool *tmp2 = calloc(n, sizeof(bool));
405+
391406
unsigned long degree = mpz_get_ui(tmp);
407+
392408
for (unsigned long i = 0 ; i < degree ; i++)
393409
{
394410
mpz_div_2exp(tmp, poly, degree-i);

0 commit comments

Comments
 (0)