[libmath-prime-util-perl] 11/40: Add braindead p+1 factoring
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:49:03 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 1fa0cbe0fc916fbe067808b8af453b3f73df6fc2
Author: Dana Jacobsen <dana at acm.org>
Date: Wed Jun 26 18:16:35 2013 -0700
Add braindead p+1 factoring
---
Changes | 1 +
TODO | 2 ++
XS.xs | 5 +++++
factor.c | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 59 insertions(+)
diff --git a/Changes b/Changes
index d1aa936..2e7b980 100644
--- a/Changes
+++ b/Changes
@@ -12,6 +12,7 @@ Revision history for Perl extension Math::Prime::Util.
- Added:
is_frobenius_underwood_pseudoprime
lucas_sequence
+ pplus1_factor
0.29 30 May 2013
diff --git a/TODO b/TODO
index 33f6bc5..42b72f2 100644
--- a/TODO
+++ b/TODO
@@ -48,3 +48,5 @@
- Write a standalone function that demonstrates the memory leak with MULTICALL,
so we can use MULTICALL.
+
+- Tests, documentation, optimizations, and comparisons for p+1 factoring
diff --git a/XS.xs b/XS.xs
index 502a95d..fe7851a 100644
--- a/XS.xs
+++ b/XS.xs
@@ -420,6 +420,11 @@ pminus1_factor(IN UV n, IN UV B1 = 1*1024*1024, IN UV B2 = 0)
B2 = 10*B1;
SIMPLE_FACTOR_2ARG(pminus1_factor, n, B1, B2);
+void
+pplus1_factor(IN UV n, IN UV B = 200)
+ PPCODE:
+ SIMPLE_FACTOR(pplus1_factor, n, B);
+
int
_XS_is_pseudoprime(IN UV n, IN UV a)
diff --git a/factor.c b/factor.c
index 61e2025..2be4af2 100644
--- a/factor.c
+++ b/factor.c
@@ -943,6 +943,57 @@ int pminus1_factor(UV n, UV *factors, UV B1, UV B2)
return 1;
}
+/* Simple Williams p+1 */
+int pplus1_factor(UV n, UV *factors, UV B)
+{
+ UV i, f, b;
+ UV P1, P2, P3, U1, U2, U3, V1, V2, V3;
+
+ /* Calculate 3 sequences at once */
+ P1 = 5 % n;
+ P2 = 9 % n;
+ P3 = 13 % n;
+ U1 = P1; U2 = P2; U3 = P3;
+ for (i = 1; i < B; i++) {
+ { UV v = i; b = 1; while (v >>= 1) b++; }
+ V1 = mulsubmod(P1, P1, 2, n);
+ V2 = mulsubmod(P2, P2, 2, n);
+ V3 = mulsubmod(P3, P3, 2, n);
+ while (b > 1) {
+ b--;
+ if ( (i >> (b-1)) & UVCONST(1) ) {
+ U1 = mulsubmod(U1, V1, P1, n);
+ V1 = mulsubmod(V1, V1, 2, n);
+ U2 = mulsubmod(U2, V2, P2, n);
+ V2 = mulsubmod(V2, V2, 2, n);
+ U3 = mulsubmod(U3, V3, P3, n);
+ V3 = mulsubmod(V3, V3, 2, n);
+ } else {
+ V1 = mulsubmod(U1, V1, P1, n);
+ U1 = mulsubmod(U1, U1, 2, n);
+ V2 = mulsubmod(U2, V2, P2, n);
+ U2 = mulsubmod(U2, U2, 2, n);
+ V3 = mulsubmod(U3, V3, P3, n);
+ U3 = mulsubmod(U3, U3, 2, n);
+ }
+ }
+ P1 = U1; P2 = U2; P3 = U3;
+ f = gcd_ui(n, submod(U1, 2, n));
+ if (f == 1 || f == n)
+ f = gcd_ui(n, submod(U2, 2, n));
+ if (f == 1 || f == n)
+ f = gcd_ui(n, submod(U3, 2, n));
+ if (f > 1 && f != n) {
+ factors[0] = f;
+ factors[1] = n/f;
+ MPUassert( factors[0] * factors[1] == n , "incorrect factoring");
+ return 2;
+ }
+ }
+ factors[0] = n;
+ return 1;
+}
+
/* My modification of Ben Buhrow's modification of Bob Silverman's SQUFOF code.
*/
--
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