@@ -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
193194void 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
271279bool 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])
323332void 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
342354void 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
384398void 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