summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS3
-rw-r--r--src/pow_z.c9
2 files changed, 11 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 40587cc..c7049f4 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,6 @@
+Changes in version 0.8.3:
+ - Speed-up of mpc_pow_z when the exponent fits in an unsigned long
+
Changes in version 0.8.2:
- Speed-up of mpc_pow_ui through binary exponentiation
diff --git a/src/pow_z.c b/src/pow_z.c
index 9ce20d1..9b769fe 100644
--- a/src/pow_z.c
+++ b/src/pow_z.c
@@ -1,6 +1,6 @@
/* mpc_pow_z -- Raise a complex number to an integer power.
-Copyright (C) 2009 Paul Zimmermann
+Copyright (C) 2009, 2010 Paul Zimmermann
This file is part of the MPC Library.
@@ -28,6 +28,13 @@ mpc_pow_z (mpc_ptr z, mpc_srcptr x, mpz_srcptr y, mpc_rnd_t rnd)
int inex;
size_t n = mpz_sizeinbase (y, 2);
+ /* if y fits in an unsigned long or long, call the corresponding functions,
+ which are supposed to be more efficient */
+ if (mpz_fits_ulong_p (y))
+ return mpc_pow_ui (z, x, mpz_get_ui (y), rnd);
+ else if (mpz_fits_slong_p (y))
+ return mpc_pow_si (z, x, mpz_get_si (y), rnd);
+
mpc_init3 (yy, (n < MPFR_PREC_MIN) ? MPFR_PREC_MIN : n, MPFR_PREC_MIN);
mpc_set_z (yy, y, MPC_RNDNN); /* exact */
inex = mpc_pow (z, x, yy, rnd);