@@ -38,6 +38,22 @@ static void make_exact_root(mpz_t *upol, unsigned long int *deg,
3838 }
3939}
4040
41+ uint64_t mpz_get_ull (const mpz_t op ) {
42+ if (mp_bits_per_limb == 64 ) {
43+ mp_limb_t limb = mpz_getlimbn (op , 0 );
44+ return limb ;
45+ }
46+ if (mpz_size (op ) == 0 ) {
47+ return 0 ;
48+ }
49+ uint64_t limb_lo = (uint64_t )(mpz_getlimbn (op , 0 ));
50+ uint64_t limb_hi = 0 ;
51+ if (mpz_size (op ) >= 2 ) {
52+ limb_hi = (uint64_t )(mpz_getlimbn (op , 1 ));
53+ }
54+ return (limb_hi << 32 ) | limb_lo ;
55+ }
56+
4157/* computes 2^logN f(a) / (f(a) - f(b)) where f(a) = vala, f(b) = valb */
4258static long long int index_linearinterp (mpz_t * vala , mpz_t * valb , mpz_t * q ,
4359 long long int logN ){
@@ -55,16 +71,31 @@ static long long int index_linearinterp(mpz_t *vala, mpz_t *valb, mpz_t *q,
5571 }
5672 return -1 ;
5773 }
58- long long int index = mpz_get_ui (* q );
74+ long long int index = mpz_get_ull (* q );
5975 return index ;
6076}
6177
78+ void mpz_init_set_ull (mpz_t rop , uint64_t op ) {
79+ if (sizeof (mp_bitcnt_t ) == 4 ) {
80+ uint32_t hi = (uint32_t )(op >> 32 );
81+ uint32_t lo = (uint32_t )(op );
82+ mpz_init_set_ui (rop , hi );
83+ mpz_mul_2exp (rop , rop , 32 );
84+ mpz_add_ui (rop , rop , lo );
85+ } else {
86+ mpz_init_set_ui (rop , op );
87+ }
88+ }
89+
6290static void getx_and_eval_2exp (mpz_t * upol , unsigned long int deg ,
6391 mpz_t * a , mpz_t * x , mpz_t * value , mpz_t * q ,
64- int k , long int index ){
92+ int k , long long int index ){
93+ mpz_t index_gmp ;
94+ mpz_init_set_ull (index_gmp , index );
6595 mpz_set (* x , * a );
66- mpz_add_ui (* x , * x , index );
96+ mpz_add (* x , * x , index_gmp );
6797 mpz_poly_eval_2exp_naive (upol , deg , x , k , value , q );
98+ mpz_clear (index_gmp );
6899}
69100
70101static void getx_and_eval_2exp_mpzidx (mpz_t * upol , unsigned long int deg ,
@@ -77,32 +108,38 @@ static void getx_and_eval_2exp_mpzidx(mpz_t *upol, unsigned long int deg,
77108
78109static void getx_and_eval_2expleft (mpz_t * upol , unsigned long int deg ,
79110 mpz_t * a , mpz_t * x , mpz_t * value , mpz_t * q ,
80- int k , long int index ){
111+ int k , long long int index ){
112+ mpz_t index_gmp ;
113+ mpz_init_set_ull (index_gmp , index );
81114 mpz_set (* x , * a );
82- mpz_sub_ui (* x , * x , index );
115+ mpz_sub (* x , * x , index_gmp );
83116 mpz_poly_eval_2exp_naive (upol , deg , x , k , value , q );
117+ mpz_clear (index_gmp );
84118}
85119
86120/* assumes k >= -2 */
87121static void getx_and_eval (mpz_t * upol , unsigned long int deg ,
88122 mpz_t * a , mpz_t * x , mpz_t * value , mpz_t * q ,
89- long int Nlog , long int k , long int index ){
123+ long int Nlog , long int k , long long int index ){
90124
125+ mpz_t index_gmp ;
126+ mpz_init_set_ull (index_gmp , index );
91127 if (k - Nlog >=0 ){
92128 mpz_set_ui (* x , 1 );
93129 mpz_mul_2exp (* x , * x , k - Nlog );
94- mpz_mul_ui (* x ,* x ,index );
130+ mpz_mul (* x ,* x ,index_gmp );
95131 mpz_add (* x , * x , * a );
96132
97133 mpz_poly_eval_2exp_naive (upol , deg , x , 0 , value , q );
98134 }
99135 else {
100136 mpz_set (* x , * a );
101137 mpz_mul_2exp (* x , * x , Nlog - k );
102- mpz_add_ui (* x , * x , index );
138+ mpz_add (* x , * x , index_gmp );
103139
104140 mpz_poly_eval_2exp_naive (upol , deg , x , Nlog - k , value , q );
105141 }
142+ mpz_clear (index_gmp );
106143}
107144
108145static void getx_and_eval_mpzidx (mpz_t * upol , unsigned long int deg ,
@@ -287,7 +324,7 @@ static void refine_root_by_N_positive_k(mpz_t *upol, unsigned long int *deg_ptr,
287324
288325 mpz_set (* vala , * tmpvala );
289326 mpz_set (* valb , * tmpvalb );
290- int64_t maxindex = (1L <<(Nlog ));
327+ int64_t maxindex = (1LL <<(Nlog ));
291328
292329 if (index == -2 || index == 0 || (LOG2 (index ) > Nlog && index > 0 ) ){
293330 if (Nlog == 2 ) index = 2 ;
0 commit comments