Skip to content

Commit f06c2e9

Browse files
committed
Force 64-bit index when long is 32-bit
1 parent 0128fa0 commit f06c2e9

1 file changed

Lines changed: 46 additions & 9 deletions

File tree

src/usolve/refine.c

Lines changed: 46 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */
4258
static 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+
6290
static 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

70101
static 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

78109
static 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 */
87121
static 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

108145
static 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

Comments
 (0)