py: Fix mpn_sub, was increasing wrong source pointer.
Also change int -> machine_int_t where appropriate.
This commit is contained in:
parent
2ee55c312d
commit
aca141269e
14
py/mpz.c
14
py/mpz.c
@ -113,7 +113,7 @@ uint mpn_sub(mpz_dig_t *idig, const mpz_dig_t *jdig, uint jlen, const mpz_dig_t
|
|||||||
borrow >>= DIG_SIZE;
|
borrow >>= DIG_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; jlen > 0; --jlen, ++idig, ++kdig) {
|
for (; jlen > 0; --jlen, ++idig, ++jdig) {
|
||||||
borrow += *jdig;
|
borrow += *jdig;
|
||||||
*idig = borrow & DIG_MASK;
|
*idig = borrow & DIG_MASK;
|
||||||
borrow >>= DIG_SIZE;
|
borrow >>= DIG_SIZE;
|
||||||
@ -315,7 +315,7 @@ void mpn_div(mpz_dig_t *num_dig, machine_uint_t *num_len, mpz_dig_t *den_dig, ma
|
|||||||
|
|
||||||
#define MIN_ALLOC (4)
|
#define MIN_ALLOC (4)
|
||||||
#define ALIGN_ALLOC (2)
|
#define ALIGN_ALLOC (2)
|
||||||
#define NUM_DIG_FOR_INT (sizeof(int) * 8 / DIG_SIZE + 1)
|
#define NUM_DIG_FOR_INT (sizeof(machine_int_t) * 8 / DIG_SIZE + 1)
|
||||||
|
|
||||||
static const uint log_base2_floor[] = {
|
static const uint log_base2_floor[] = {
|
||||||
0,
|
0,
|
||||||
@ -329,7 +329,7 @@ static const uint log_base2_floor[] = {
|
|||||||
4, 4, 4, 5
|
4, 4, 4, 5
|
||||||
};
|
};
|
||||||
|
|
||||||
bool mpz_int_is_sml_int(int i) {
|
bool mpz_int_is_sml_int(machine_int_t i) {
|
||||||
return -(1 << DIG_SIZE) < i && i < (1 << DIG_SIZE);
|
return -(1 << DIG_SIZE) < i && i < (1 << DIG_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -497,7 +497,7 @@ int mpz_cmp(const mpz_t *z1, const mpz_t *z2) {
|
|||||||
return cmp;
|
return cmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
int mpz_cmp_sml_int(const mpz_t *z, int sml_int) {
|
int mpz_cmp_sml_int(const mpz_t *z, machine_int_t sml_int) {
|
||||||
int cmp;
|
int cmp;
|
||||||
if (z->neg == 0) {
|
if (z->neg == 0) {
|
||||||
if (sml_int < 0) return 1;
|
if (sml_int < 0) return 1;
|
||||||
@ -885,13 +885,13 @@ mpz_t *mpz_mod(const mpz_t *lhs, const mpz_t *rhs) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int mpz_as_int(const mpz_t *i) {
|
machine_int_t mpz_as_int(const mpz_t *i) {
|
||||||
int val = 0;
|
machine_int_t val = 0;
|
||||||
mpz_dig_t *d = i->dig + i->len;
|
mpz_dig_t *d = i->dig + i->len;
|
||||||
|
|
||||||
while (--d >= i->dig)
|
while (--d >= i->dig)
|
||||||
{
|
{
|
||||||
int oldval = val;
|
machine_int_t oldval = val;
|
||||||
val = (val << DIG_SIZE) | *d;
|
val = (val << DIG_SIZE) | *d;
|
||||||
if (val < oldval)
|
if (val < oldval)
|
||||||
{
|
{
|
||||||
|
6
py/mpz.h
6
py/mpz.h
@ -11,7 +11,7 @@ typedef struct _mpz_t {
|
|||||||
mpz_dig_t *dig;
|
mpz_dig_t *dig;
|
||||||
} mpz_t;
|
} mpz_t;
|
||||||
|
|
||||||
bool mpz_int_is_sml_int(int i);
|
bool mpz_int_is_sml_int(machine_int_t i);
|
||||||
|
|
||||||
void mpz_init_zero(mpz_t *z);
|
void mpz_init_zero(mpz_t *z);
|
||||||
void mpz_init_from_int(mpz_t *z, machine_int_t val);
|
void mpz_init_from_int(mpz_t *z, machine_int_t val);
|
||||||
@ -35,7 +35,7 @@ bool mpz_is_odd(const mpz_t *z);
|
|||||||
bool mpz_is_even(const mpz_t *z);
|
bool mpz_is_even(const mpz_t *z);
|
||||||
|
|
||||||
int mpz_cmp(const mpz_t *lhs, const mpz_t *rhs);
|
int mpz_cmp(const mpz_t *lhs, const mpz_t *rhs);
|
||||||
int mpz_cmp_sml_int(const mpz_t *lhs, int sml_int);
|
int mpz_cmp_sml_int(const mpz_t *lhs, machine_int_t sml_int);
|
||||||
|
|
||||||
mpz_t *mpz_abs(const mpz_t *z);
|
mpz_t *mpz_abs(const mpz_t *z);
|
||||||
mpz_t *mpz_neg(const mpz_t *z);
|
mpz_t *mpz_neg(const mpz_t *z);
|
||||||
@ -58,7 +58,7 @@ void mpz_divmod_inpl(mpz_t *dest_quo, mpz_t *dest_rem, const mpz_t *lhs, const m
|
|||||||
mpz_t *mpz_div(const mpz_t *lhs, const mpz_t *rhs);
|
mpz_t *mpz_div(const mpz_t *lhs, const mpz_t *rhs);
|
||||||
mpz_t *mpz_mod(const mpz_t *lhs, const mpz_t *rhs);
|
mpz_t *mpz_mod(const mpz_t *lhs, const mpz_t *rhs);
|
||||||
|
|
||||||
int mpz_as_int(const mpz_t *z);
|
machine_int_t mpz_as_int(const mpz_t *z);
|
||||||
machine_float_t mpz_as_float(const mpz_t *z);
|
machine_float_t mpz_as_float(const mpz_t *z);
|
||||||
uint mpz_as_str_size(const mpz_t *z, uint base);
|
uint mpz_as_str_size(const mpz_t *z, uint base);
|
||||||
char *mpz_as_str(const mpz_t *z, uint base);
|
char *mpz_as_str(const mpz_t *z, uint base);
|
||||||
|
Loading…
Reference in New Issue
Block a user