[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