[libmath-prime-util-perl] 01/16: Tweak to mulmod use
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:44:22 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.06
in repository libmath-prime-util-perl.
commit e0ab486cf9bbb4e2f7a153c97d8bb7eabe5ea44e
Author: Dana Jacobsen <dana at acm.org>
Date: Fri Jun 8 14:13:11 2012 -0600
Tweak to mulmod use
---
Changes | 3 +++
factor.c | 13 +++++++------
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/Changes b/Changes
index 9277d67..980499a 100644
--- a/Changes
+++ b/Changes
@@ -1,5 +1,8 @@
Revision history for Perl extension Math::Prime::Util.
+0.05 8 June 2012
+ - Use assembler for mulmod if 64-bit and gcc and x86
+
0.04 7 June 2012
- Didn't do tests on 32-bit machine before release. Test suite caught
problem with next_prime overflow.
diff --git a/factor.c b/factor.c
index b02ff1a..1b06519 100644
--- a/factor.c
+++ b/factor.c
@@ -100,9 +100,11 @@ int trial_factor(UV n, UV *factors, UV maxtrial)
/* UV is the largest integral type available (that we know of). */
+ /* if n is smaller than this, you can multiply without overflow */
+ #define HALF_WORD (UVCONST(1) << (BITS_PER_WORD/2))
+
#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
/* Inline assembly -- basically as fast as a regular (a*b)%m */
- /* Arguably we don't need all the ifs to avoid it */
static UV _mulmod(UV a, UV b, UV c) {
UV d; /* to hold the result of a*b mod c */
/* calculates a*b mod c, stores result in d */
@@ -116,6 +118,8 @@ int trial_factor(UV n, UV *factors, UV maxtrial)
);
return d;
}
+ #define mulmod(a,b,m) _mulmod(a,b,m)
+ #define sqrmod(n,m) _mulmod(n,n,m)
#else
/* Do it by hand */
static UV _mulmod(UV a, UV b, UV m) {
@@ -134,14 +138,11 @@ int trial_factor(UV n, UV *factors, UV maxtrial)
}
return r;
}
+ #define mulmod(a,b,m) (((a)|(b)) < HALF_WORD) ? ((a)*(b))%(m):_mulmod(a,b,m)
+ #define sqrmod(n,m) ((n) < HALF_WORD) ? ((n)*(n))%(m):_mulmod(n,n,m)
#endif
- /* if n is smaller than this, you can multiply without overflow */
- #define HALF_WORD (UVCONST(1) << (BITS_PER_WORD/2))
-
#define addmod(n,a,m) ((((m)-(n)) > (a)) ? ((n)+(a)) : ((n)+(a)-(m)))
- #define mulmod(a,b,m) (((a)|(b)) < HALF_WORD) ? ((a)*(b))%(m) : _mulmod(a,b,m)
- #define sqrmod(n,m) ((n) < HALF_WORD) ? ((n)*(n))%(m) : _mulmod(n,n,m)
/* n^power mod m */
static UV powmod(UV n, UV power, UV m) {
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libmath-prime-util-perl.git
More information about the Pkg-perl-cvs-commits
mailing list