[libmath-prime-util-perl] 03/40: Change to submod and mulsubmod for better portability

Partha P. Mukherjee ppm-guest at moszumanska.debian.org
Thu May 21 18:49:02 UTC 2015


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

ppm-guest pushed a commit to annotated tag v0.30
in repository libmath-prime-util-perl.

commit c4c27ca471ffc44352cd60358e56e9292be5500a
Author: Dana Jacobsen <dana at acm.org>
Date:   Tue Jun 18 22:18:53 2013 -0700

    Change to submod and mulsubmod for better portability
---
 factor.c | 16 ++++++++--------
 mulmod.h |  9 +++++++++
 2 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/factor.c b/factor.c
index 5afa18e..f8fbd9b 100644
--- a/factor.c
+++ b/factor.c
@@ -500,7 +500,7 @@ static void lucas_seq(UV* Uret, UV* Vret, UV* Qkret, UV n, IV P, IV Q, UV k)
 
   Qmod = (Q < 0) ? Q + n : Q;
   Pmod = (P < 0) ? P + n : P;
-  Dmod = addmod( mulmod(Pmod, Pmod, n), n - mulmod(4, Qmod, n), n );
+  Dmod = submod( mulmod(Pmod, Pmod, n), mulmod(4, Qmod, n), n);
   MPUassert(Dmod != 0, "lucas_seq: D is 0");
   U = 1;
   V = Pmod;
@@ -510,7 +510,7 @@ static void lucas_seq(UV* Uret, UV* Vret, UV* Qkret, UV n, IV P, IV Q, UV k)
   if (Q == 1) {
     while (b > 1) {
       U = mulmod(U, V, n);
-      V = muladdmod(V, V, n-2, n);
+      V = mulsubmod(V, V, 2, n);
       b--;
       if ( (k >> (b-1)) & UVCONST(1) ) {
         UV t2 = mulmod(U, Dmod, n);
@@ -523,7 +523,7 @@ static void lucas_seq(UV* Uret, UV* Vret, UV* Qkret, UV n, IV P, IV Q, UV k)
   } else {
     while (b > 1) {
       U = mulmod(U, V, n);
-      V = muladdmod(V, V, n - addmod(Qk, Qk, n), n);
+      V = mulsubmod(V, V, addmod(Qk,Qk,n), n);
       Qk = sqrmod(Qk, n);
       b--;
       if ( (k >> (b-1)) & UVCONST(1) ) {
@@ -617,7 +617,7 @@ int _XS_is_lucas_pseudoprime(UV n, int strength)
     if ( (U == 0 && (V == 2 || V == (n-2))) || (V == 0) )
       return 1;
     while (s--) {
-      V = muladdmod(V, V, n-2, n);
+      V = mulsubmod(V, V, 2, n);
       if (V == 0)
         return 1;
     }
@@ -1353,14 +1353,14 @@ int _XS_is_frobenius_underwood_pseudoprime(UV n)
       t2 = addmod(b, b, n);
       na = mulmod(a, t2, n);
       t1 = addmod(b, a, n);
-      t2 = addmod(b, n-a, n);  /* subtract */
+      t2 = submod(b, a, n);
       b = mulmod(t1, t2, n);
       a = na;
       if ( (np1 >> bit) & UVCONST(1) ) {
         t1 = mulmod(a, 2, n);
         na = addmod(t1, b, n);
         t1 = addmod(b, b, n);
-        b = addmod(t1, n-a, n); /* subtract */
+        b = submod(t1, a, n);
         a = na;
       }
     }
@@ -1371,14 +1371,14 @@ int _XS_is_frobenius_underwood_pseudoprime(UV n)
       t1 = addmod(t1, t2, n);
       na = mulmod(a, t1, n);
       t1 = addmod(b, a, n);
-      t2 = addmod(b, n-a, n);  /* subtract */
+      t2 = submod(b, a, n);
       b = mulmod(t1, t2, n);
       a = na;
       if ( (np1 >> bit) & UVCONST(1) ) {
         t1 = mulmod(a, multiplier, n);
         na = addmod(t1, b, n);
         t1 = addmod(b, b, n);
-        b = addmod(t1, n-a, n); /* subtract */
+        b = submod(t1, a, n);
         a = na;
       }
     }
diff --git a/mulmod.h b/mulmod.h
index ec16d67..55f1526 100644
--- a/mulmod.h
+++ b/mulmod.h
@@ -82,10 +82,19 @@
   #define addmod(n,a,m) ((((m)-(n)) > (a))  ?  ((n)+(a))  :  ((n)+(a)-(m)))
 #endif
 
+/* We need to make sure a and b get evaluated into UVs, then do the
+ * subtract into a UV before the addmod. */
+static INLINE UV submod(UV a, UV b, UV m) {
+  UV t1 = m - b;
+  return addmod(a, t1, m);
+}
+
 /* n^2 + a mod m */
 #define sqraddmod(n, a, m)     addmod(sqrmod(n,m),  a,m)
 /* i*j + a mod m */
 #define muladdmod(i, j, a, m)  addmod(mulmod(i,j,m), a, m)
+/* i*j - a mod m */
+#define mulsubmod(i, j, a, m)  submod(mulmod(i,j,m), a, m)
 
 /* n^power mod m */
 #ifndef HALF_WORD

-- 
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