summaryrefslogtreecommitdiff
path: root/mpz/fac_ui.c
diff options
context:
space:
mode:
authorMarco Bodrato <bodrato@mail.dm.unipi.it>2011-12-10 21:11:05 +0100
committerMarco Bodrato <bodrato@mail.dm.unipi.it>2011-12-10 21:11:05 +0100
commit860c335019b66ae9a553e85c415dbb75ee8b9764 (patch)
treec4285581b06cdcf460298a33a348daa09b9193a7 /mpz/fac_ui.c
parentbb3fa93808a15788f81448f6a9bbc010bd936523 (diff)
downloadgmp-860c335019b66ae9a553e85c415dbb75ee8b9764.tar.gz
Integrate fac_bc_ui in fac_ui, removes duplicated checks.
Diffstat (limited to 'mpz/fac_ui.c')
-rw-r--r--mpz/fac_ui.c45
1 files changed, 14 insertions, 31 deletions
diff --git a/mpz/fac_ui.c b/mpz/fac_ui.c
index b862f32b9..9219cc0d0 100644
--- a/mpz/fac_ui.c
+++ b/mpz/fac_ui.c
@@ -72,7 +72,7 @@ along with the GNU MP Library. If not, see http://www.gnu.org/licenses/. */
++__i; \
if (((sieve)[__index] & __mask) == 0) \
{ \
- (prime) = id_to_n(__i)
+ (prime) = id_to_n(__i)
#define LOOP_ON_SIEVE_END \
} \
@@ -318,12 +318,14 @@ mpz_prodlimbs (mpz_ptr x, mp_limb_t *factors, mp_limb_t j)
prod = MPZ_REALLOC (x, j);
size = 1;
- for (i = 1; i < j; i++)
+ i = 1;
+ do
{
cy = mpn_mul_1 (prod, prod, size, factors[i]);
prod[size] = cy;
size += cy != 0;
- }
+ i++;
+ } while (i < j);
SIZ (x) = size;
} else {
@@ -363,7 +365,7 @@ mpz_prodlimbs (mpz_ptr x, mp_limb_t *factors, mp_limb_t j)
__q = n; \
do { \
__q /= __prime; \
- if ((__q & 1) == 1) (PR) *= __prime; \
+ if ((__q & 1) != 0) (PR) *= __prime; \
} while (__q >= __prime); \
} while (0)
@@ -560,17 +562,22 @@ mpz_dsc_oddfac_1 (mpz_ptr x, mp_limb_t n)
TMP_FREE;
}
-static void
-mpz_bc_fac_1 (mpz_ptr x, mp_limb_t n)
+/* Computes n!, the factorial of n.
+ WARNING: it assumes that n fits in a limb!
+ */
+void
+mpz_fac_ui (mpz_ptr x, unsigned long n)
{
static const mp_limb_t table[] = { ONE_LIMB_FACTORIAL_TABLE };
+ ASSERT (n <= GMP_NUMB_MAX);
+
if (n < numberof (table))
{
PTR (x)[0] = table[n];
SIZ (x) = 1;
}
- else
+ else if (BELOW_THRESHOLD (n, FAC_ODD_THRESHOLD))
{
mp_limb_t *factors, prod, max_prod, i, j;
TMP_SDECL;
@@ -592,38 +599,14 @@ mpz_bc_fac_1 (mpz_ptr x, mp_limb_t n)
TMP_SFREE;
}
-}
-
-/* Computes n!, the factorial of n.
- WARNING: it assumes that n fits in a limb!
- */
-void
-mpz_fac_ui (mpz_ptr x, unsigned long n)
-{
- static const mp_limb_t table[] = { ONE_LIMB_FACTORIAL_TABLE };
-
- ASSERT (n <= GMP_NUMB_MAX);
-
- if (n < numberof (table))
- {
- PTR (x)[0] = table[n];
- SIZ (x) = 1;
- }
- else if (BELOW_THRESHOLD (n, FAC_ODD_THRESHOLD))
- {
- mpz_bc_fac_1 (x, n);
- }
else
{
mp_limb_t count;
if (BELOW_THRESHOLD (n, FAC_DSC_THRESHOLD))
mpz_bc_oddfac_1 (x, n);
-/* mpz_dc_fac_1 (x, n, 0); */
else
mpz_dsc_oddfac_1 (x, n);
popc_limb (count, n);
mpz_mul_2exp (x, x, n - count);
}
}
-
-#undef FACTORS_PER_LIMB