summaryrefslogtreecommitdiff
path: root/mini-gmp
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2013-01-11 10:27:53 +0100
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2013-01-11 10:27:53 +0100
commit0917fd20ff03a90f44f0f41fc29513c027342565 (patch)
tree979193e6c31536c1ab719e2968dc6fd36a1834bb /mini-gmp
parentd120c9d796f45a98e988f318d322e4c71b96bd1f (diff)
downloadgmp-0917fd20ff03a90f44f0f41fc29513c027342565.tar.gz
Reverted non-bugfix improvements to mini-gmp, keep them for the next release.
Diffstat (limited to 'mini-gmp')
-rw-r--r--mini-gmp/mini-gmp.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/mini-gmp/mini-gmp.c b/mini-gmp/mini-gmp.c
index e72655e2c..fff52c287 100644
--- a/mini-gmp/mini-gmp.c
+++ b/mini-gmp/mini-gmp.c
@@ -3184,26 +3184,29 @@ mpz_sqrt (mpz_t s, const mpz_t u)
void
mpz_fac_ui (mpz_t x, unsigned long n)
{
- mpz_set_ui (x, n + (n == 0));
- for (;n > 2;)
- mpz_mul_ui (x, x, --n);
+ if (n < 2) {
+ mpz_set_ui (x, 1);
+ return;
+ }
+ mpz_set_ui (x, n);
+ for (;--n > 1;)
+ mpz_mul_ui (x, x, n);
}
void
mpz_bin_uiui (mpz_t r, unsigned long n, unsigned long k)
{
mpz_t t;
- mpz_set_ui (r, k <= n);
-
- if (k > (n >> 1))
- k = (k <= n) ? n - k : 0;
+ if (k > n) {
+ r->_mp_size = 0;
+ return;
+ }
+ mpz_fac_ui (r, n);
mpz_init (t);
mpz_fac_ui (t, k);
-
- for (; k > 0; k--)
- mpz_mul_ui (r, r, n--);
-
+ mpz_divexact (r, r, t);
+ mpz_fac_ui (t, n - k);
mpz_divexact (r, r, t);
mpz_clear (t);
}