66
77void build_sqrt (mpz_t n ,unsigned long dim , bool vector [dim ], dyn_array_classic primes , mpz_t x , mpz_t y , dyn_array relations , dyn_array smooth )
88{
9- mpz_t tmp , tmp2 ;
10- mpz_init ( tmp );
11- mpz_init ( tmp2 );
9+ mpz_t tmp_mpz , tmp_mpz_2 ;
10+ mpz_inits ( tmp_mpz , tmp_mpz_2 , NULL );
11+
1212 mpz_set_ui (y , 1 );
1313 mpz_set_ui (x , 1 );
14- unsigned long vector_y [primes .len ];
14+ unsigned long * vector_y = calloc (primes .len , sizeof (unsigned long ));
15+
1516 for (size_t i = 0 ; i < primes .len ; i ++ ) vector_y [i ] = 0 ;
17+
1618 for (size_t e = 0 ; e < dim ; e ++ )
1719 {
1820 if (vector [e ])
1921 {
20- mpz_mul (x , x , * (smooth .start + e ));
21- mpz_mod (x , x , n );
22+ mpz_mul (tmp_mpz , x , smooth .start [e ]);
23+ mpz_mod (x , tmp_mpz , n );
24+
2225 for (size_t i = 0 ; i < primes .len ; i ++ )
2326 {
24- mpz_set_ui (tmp , * (primes .start + i ));
25- while (mpz_divisible_p (* (relations .start + e ), tmp ))
26- {
27- vector_y [i ]++ ;
28- mpz_mul_ui (tmp , tmp , * (primes .start + i ));
29- }
27+ mpz_set_ui (tmp_mpz , primes .start [i ]);
28+ vector_y [i ] += mpz_remove (tmp_mpz_2 , relations .start [e ], tmp_mpz );
3029 }
3130 }
3231 }
32+
3333 for (size_t k = 0 ; k < primes .len ; k ++ )
3434 {
35- mpz_set_ui (tmp2 , vector_y [k ]);
36- mpz_div_2exp (tmp2 , tmp2 , 1 );
37- mpz_set_ui (tmp , * (primes .start + k ));
38- mpz_powm (tmp , tmp , tmp2 , n );
39- mpz_mul (y , y , tmp );
40- mpz_mod (y , y , n );
35+ mpz_set_ui (tmp_mpz , primes .start [k ]);
36+ mpz_powm_ui (tmp_mpz , tmp_mpz , vector_y [k ]>>1 , n );
37+ mpz_mul (tmp_mpz_2 , y , tmp_mpz );
38+ mpz_mod (y , tmp_mpz_2 , n );
4139 }
42- mpz_clears (tmp , tmp2 , NULL );
40+ mpz_clears (tmp_mpz , tmp_mpz_2 , NULL );
41+ free (vector_y );
4342}
0 commit comments