From: Paul Eggert Date: Sun, 6 Jul 2025 20:59:56 +0000 (-0700) Subject: factor: avoid an mpz init+clear X-Git-Tag: v9.8~186 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=033a50af8ba71f521b638d88309bd15421059e83;p=thirdparty%2Fcoreutils.git factor: avoid an mpz init+clear * src/factor.c (mp_factor_insert_ui): Rename fom mp_factor_insert_ui, and change arg type from unsigned long int to mp_limb_t. All uses changed. This avoids creating and freeing a small mpz_t. (mp_factor_using_division): Add a static assert requiring that that mp_limb_t be wide enough, which it should be (and is in standard GMP). --- diff --git a/src/factor.c b/src/factor.c index f7ddce0b8d..687152067a 100644 --- a/src/factor.c +++ b/src/factor.c @@ -705,14 +705,10 @@ mp_factor_insert (struct mp_factors *factors, mpz_t prime, mp_bitcnt_t m) /* Store into FACTORS a prime factor PRIME with multiplicity M. */ static void -mp_factor_insert_ui (struct mp_factors *factors, unsigned long int prime, - mp_bitcnt_t m) +mp_factor_insert1 (struct mp_factors *factors, mp_limb_t prime, mp_bitcnt_t m) { - mpz_t pz; - - mpz_init_set_ui (pz, prime); + mpz_t pz = MPZ_ROINIT_N (&prime, 1); mp_factor_insert (factors, pz, m); - mpz_clear (pz); } @@ -978,12 +974,12 @@ mp_factor_using_division (mpz_t t) if (m) { mpz_fdiv_q_2exp (t, t, m); - mp_factor_insert_ui (&factors, 2, m); + mp_factor_insert1 (&factors, 2, m); if (mp_finish_in_single (&factors, t)) return factors; } - unsigned long int d = 3; + mp_limb_t d = 3; for (idx_t i = 0; i < PRIMES_PTAB_ENTRIES; i++) { for (m = 0; mpz_divisible_ui_p (t, d); m++) @@ -991,13 +987,15 @@ mp_factor_using_division (mpz_t t) mpz_divexact_ui (t, t, d); if (mp_finish_up_in_single (&factors, t, i, d)) { - mp_factor_insert_ui (&factors, d, m + 1); + mp_factor_insert1 (&factors, d, m + 1); return factors; } } if (m) - mp_factor_insert_ui (&factors, d, m); + mp_factor_insert1 (&factors, d, m); d += primes_diff[i + 1]; + static_assert (SQUARE_OF_FIRST_OMITTED_PRIME + <= MIN (MP_LIMB_MAX, ULONG_MAX)); if (mpz_cmp_ui (t, d * d) < 0) break; }