summaryrefslogtreecommitdiff
path: root/mini-gmp
diff options
context:
space:
mode:
authorNiels Möller <nisse@lysator.liu.se>2012-02-29 16:14:09 +0100
committerNiels Möller <nisse@lysator.liu.se>2012-02-29 16:14:09 +0100
commitfdc2929eb49ef333140a09437a1cf522c514858b (patch)
treea7f8fe153e11b6a1b3b0701f117dea026cdf1424 /mini-gmp
parentefbef7234ca34ea8822e6f3882786dba13ff8dbe (diff)
downloadgmp-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.c33
-rw-r--r--mini-gmp/mini-gmp.h4
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);