aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2025-07-04 11:52:36 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2025-07-09 17:12:39 -0700
commitbdd13ff8c07fa2a535c6e66b4df7a1832e5974ff (patch)
tree734f466e902b31a213de556ecf450edd5d271ace
parentfactor: speed up multiprecision Pollard’s rho (diff)
downloadcoreutils-bdd13ff8c07fa2a535c6e66b4df7a1832e5974ff.tar.gz
coreutils-bdd13ff8c07fa2a535c6e66b4df7a1832e5974ff.zip
factor: port back to mini-gmp
mini-gmp lacs mpn_tdiv_qr, so supply an emulation of it when using mini-gmp. * src/factor.c (copy_mpn_from_mpz, mpn_tdiv_qr) [!mpn_tdiv_qr]: New functions.
-rw-r--r--src/factor.c24
1 files changed, 24 insertions, 0 deletions
diff --git a/src/factor.c b/src/factor.c
index 404929729..766de2492 100644
--- a/src/factor.c
+++ b/src/factor.c
@@ -615,6 +615,30 @@ mpz_va_init (void (*mpz_single_init)(mpz_t), ...)
}
#endif
+#ifndef mpn_tdiv_qr
+
+static void
+copy_mpn_from_mpz (mp_limb_t *p, mp_size_t n, mpz_t z)
+{
+ mp_size_t zsize = mpz_size (z);
+ mpn_copyi (p, mpz_limbs_read (z), zsize);
+ mpn_zero (p + zsize, n - zsize);
+}
+
+static void
+mpn_tdiv_qr (mp_limb_t *qp, mp_limb_t *rp, MAYBE_UNUSED mp_size_t qxn,
+ mp_limb_t const *np, mp_size_t nn,
+ mp_limb_t const *dp, mp_size_t dn)
+{
+ mpz_t q, r, n, d;
+ mpz_inits (q, r, nullptr);
+ mpz_tdiv_qr (q, r, mpz_roinit_n (n, np, nn), mpz_roinit_n (d, dp, dn));
+ copy_mpn_from_mpz (qp, nn - dn + 1, q);
+ copy_mpn_from_mpz (rp, dn, r);
+ mpz_clears (q, r, nullptr);
+}
+#endif
+
static struct mp_factors mp_factor (mpz_t);
static struct mp_factors