diff options
author | Niels Möller <nisse@lysator.liu.se> | 2012-02-29 16:14:09 +0100 |
---|---|---|
committer | Niels Möller <nisse@lysator.liu.se> | 2012-02-29 16:14:09 +0100 |
commit | fdc2929eb49ef333140a09437a1cf522c514858b (patch) | |
tree | a7f8fe153e11b6a1b3b0701f117dea026cdf1424 /mini-gmp | |
parent | efbef7234ca34ea8822e6f3882786dba13ff8dbe (diff) | |
download | gmp-fdc2929eb49ef333140a09437a1cf522c514858b.tar.gz |
mini-gmp: Fixed a couple of reuse bugs. New functions mpz_?div_r_ui,
mpz_powm_ui.
Diffstat (limited to 'mini-gmp')
-rw-r--r-- | mini-gmp/mini-gmp.c | 33 | ||||
-rw-r--r-- | mini-gmp/mini-gmp.h | 4 |
2 files changed, 34 insertions, 3 deletions
diff --git a/mini-gmp/mini-gmp.c b/mini-gmp/mini-gmp.c index 2ac72d46e..e0eb3bad9 100644 --- a/mini-gmp/mini-gmp.c +++ b/mini-gmp/mini-gmp.c @@ -2486,6 +2486,22 @@ mpz_tdiv_q_ui (mpz_t q, const mpz_t n, unsigned long d) } unsigned long +mpz_cdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, r, n, d, DIV_CEIL); +} +unsigned long +mpz_fdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, r, n, d, DIV_FLOOR); +} +unsigned long +mpz_tdiv_r_ui (mpz_t r, const mpz_t n, unsigned long d) +{ + return mpz_div_qr_ui (NULL, r, n, d, DIV_TRUNC); +} + +unsigned long mpz_cdiv_ui (const mpz_t n, unsigned long d) { return mpz_div_qr_ui (NULL, NULL, n, d, DIV_CEIL); @@ -2683,20 +2699,22 @@ mpz_gcdext (mpz_t g, mpz_t s, mpz_t t, const mpz_t u, const mpz_t v) if (u->_mp_size == 0) { /* g = 0 u + sgn(v) v */ + signed long sign = mpz_sgn (v); mpz_abs (g, v); if (s) mpz_set_ui (s, 0); if (t) - mpz_set_si (t, mpz_sgn (v)); + mpz_set_si (t, sign); return; } if (v->_mp_size == 0) { /* g = sgn(u) u + 0 v */ + signed long sign = mpz_sgn (v); mpz_abs (g, u); if (s) - mpz_set_si (s, mpz_sgn (u)); + mpz_set_si (s, sign); if (t) mpz_set_ui (t, 0); return; @@ -2933,7 +2951,8 @@ mpz_sqrtrem (mpz_t s, mpz_t r, const mpz_t u) if (u->_mp_size == 0) { mpz_set_ui (s, 0); - mpz_set_ui (r, 0); + if (r) + mpz_set_ui (r, 0); return; } @@ -3103,6 +3122,14 @@ mpz_powm (mpz_t r, const mpz_t b, const mpz_t e, const mpz_t m) mpz_clear (base); } +void mpz_powm_ui (mpz_t r, const mpz_t b, unsigned long elimb, const mpz_t m) +{ + mpz_t e; + mpz_init_set_ui (e, elimb); + mpz_powm (r, b, e, m); + mpz_clear (e); +} + /* Logical operations and bit manipulation. */ diff --git a/mini-gmp/mini-gmp.h b/mini-gmp/mini-gmp.h index b0a1c77c7..bc9197cee 100644 --- a/mini-gmp/mini-gmp.h +++ b/mini-gmp/mini-gmp.h @@ -151,6 +151,9 @@ unsigned long mpz_tdiv_qr_ui (mpz_t, mpz_t, const mpz_t, unsigned long); unsigned long mpz_cdiv_q_ui (mpz_t, const mpz_t, unsigned long); unsigned long mpz_fdiv_q_ui (mpz_t, const mpz_t, unsigned long); unsigned long mpz_tdiv_q_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_cdiv_r_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_fdiv_r_ui (mpz_t, const mpz_t, unsigned long); +unsigned long mpz_tdiv_r_ui (mpz_t, const mpz_t, unsigned long); unsigned long mpz_cdiv_ui (const mpz_t, unsigned long); unsigned long mpz_fdiv_ui (const mpz_t, unsigned long); unsigned long mpz_tdiv_ui (const mpz_t, unsigned long); @@ -171,6 +174,7 @@ void mpz_sqrt (mpz_t, const mpz_t); void mpz_ui_pow_ui (mpz_t, unsigned long, unsigned long); void mpz_powm (mpz_t, const mpz_t, const mpz_t, const mpz_t); +void mpz_powm_ui (mpz_t, const mpz_t, unsigned long, const mpz_t); int mpz_tstbit (const mpz_t, mp_bitcnt_t); void mpz_setbit (mpz_t, mp_bitcnt_t); |