[flint] 12/24: fix and speed up n_is_prime on 32-bit

felix salfelder felix-guest at moszumanska.debian.org
Wed Jun 25 11:16:11 UTC 2014


This is an automated email from the git hooks/post-receive script.

felix-guest pushed a commit to branch master
in repository flint.

commit e0cf7cc98b17fa99b2225847550462a9d8cadeb1
Author: Fredrik Johansson <fredrik.johansson at gmail.com>
Date:   Tue Jun 17 20:41:34 2014 +0200

    fix and speed up n_is_prime on 32-bit
---
 ulong_extras/is_probabprime.c | 21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/ulong_extras/is_probabprime.c b/ulong_extras/is_probabprime.c
index 98a7a11..98b4877 100644
--- a/ulong_extras/is_probabprime.c
+++ b/ulong_extras/is_probabprime.c
@@ -40,7 +40,11 @@ int n_is_probabprime(mp_limb_t n)
     mp_limb_t d;
     unsigned int norm;
     int isprime;
+#if FLINT64
     double npre;
+#else
+    mp_limb_t ninv;
+#endif
 
     if (n <= UWORD(1)) return 0;
     if (n == UWORD(2)) return 1;
@@ -61,24 +65,27 @@ int n_is_probabprime(mp_limb_t n)
     d = n - 1;
     count_trailing_zeros(norm, d);
     d >>= norm;
-    npre = n_precompute_inverse(n);
 
 #if !FLINT64
 
     /* For 32-bit, just the 2-base or 3-base Miller-Rabin is enough */
+    /* The preinv functions are faster on 32-bit, and work up to
+       2^32 (precomp only works up to 2^31) */
+    ninv = n_preinvert_limb(n);
+
     if (n < UWORD(9080191))
     {
-        isprime = n_is_strong_probabprime_precomp(n, npre, UWORD(31), d)
-               && n_is_strong_probabprime_precomp(n, npre, UWORD(73), d);
+        isprime = n_is_strong_probabprime2_preinv(n, ninv, UWORD(31), d)
+               && n_is_strong_probabprime2_preinv(n, ninv, UWORD(73), d);
     }
     else
     {
-        isprime = n_is_strong_probabprime_precomp(n, npre, UWORD(2), d)
-               && n_is_strong_probabprime_precomp(n, npre, UWORD(7), d)
-               && n_is_strong_probabprime_precomp(n, npre, UWORD(61), d);
+        isprime = n_is_strong_probabprime2_preinv(n, ninv, UWORD(2), d)
+               && n_is_strong_probabprime2_preinv(n, ninv, UWORD(7), d)
+               && n_is_strong_probabprime2_preinv(n, ninv, UWORD(61), d);
     }
-
 #else
+    npre = n_precompute_inverse(n);
 
     /* For 64-bit, BPSW seems to be a little bit faster than 3 bases. */
     if (n < UWORD(341531))

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/flint.git



More information about the debian-science-commits mailing list