[libmath-prime-util-perl] 62/181: Add moebius/exp_mangoldt to util.c
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:51:07 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.36
in repository libmath-prime-util-perl.
commit 2696cc6ed4931d76ef1f310838df796859a82613
Author: Dana Jacobsen <dana at acm.org>
Date: Mon Dec 30 01:15:42 2013 -0800
Add moebius/exp_mangoldt to util.c
---
Changes | 6 ++++--
util.c | 32 ++++++++++++++++++++++++++++++++
util.h | 2 ++
3 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/Changes b/Changes
index 2eff5b0..3358497 100644
--- a/Changes
+++ b/Changes
@@ -21,6 +21,10 @@ Revision history for Perl module Math::Prime::Util
[FUNCTIONALITY AND PERFORMANCE]
+ - Win32 fixes from bulk88 / bulkdd. Thanks!
+
+ - Lots of XS interface reorgs.
+
- Speedup for input number validation: speedup for all functions,
especially noticeable with fast functions (e.g. small n is_prime(n)).
@@ -43,8 +47,6 @@ Revision history for Perl module Math::Prime::Util
- znorder uses Carmichael Lambda instead of Euler Phi. Faster.
- - carmichael_lambda switched to XS->Perl from Perl->XS.
-
0.35 2013-12-08
diff --git a/util.c b/util.c
index 336a333..855b592 100644
--- a/util.c
+++ b/util.c
@@ -825,6 +825,7 @@ UV* _totient_range(UV lo, UV hi) {
UV* totients;
UV i;
if (hi < lo) croak("_totient_range error hi %lu < lo %lu\n", hi, lo);
+ /* TODO: When is it faster to just do individual calls? */
New(0, totients, hi-lo+1, UV);
if (totients == 0)
croak("Could not get memory for %"UVuf" totients\n", hi);
@@ -980,6 +981,37 @@ UV carmichael_lambda(UV n) {
return lambda;
}
+int moebius(UV n) {
+ UV factors[MPU_MAX_FACTORS+1];
+ UV i, nfactors;
+ if (n <= 1) return (int)n;
+
+ if ( (!(n% 4) && n >= 4) || (!(n% 9) && n >= 9) ||
+ (!(n%25) && n >= 25) || (!(n%49) && n >= 49) )
+ return 0;
+
+ nfactors = factor(n, factors);
+ for (i = 1; i < nfactors; i++)
+ if (factors[i] == factors[i-1])
+ return 0;
+ return (nfactors % 2) ? -1 : 1;
+}
+
+UV exp_mangoldt(UV n) {
+ if (n <= 1) return 1;
+ else if ((n & (n-1)) == 0) return 2; /* Power of 2 */
+ else if ((n & 1) == 0) return 1; /* Even number (not 2) */
+ else {
+ UV i, factors[MPU_MAX_FACTORS+1];
+ UV nfactors = factor(n, factors);
+ for (i = 1; i < nfactors; i++)
+ if (factors[i] != factors[0])
+ return 1;
+ return factors[0];
+ }
+}
+
+
UV znorder(UV a, UV n) {
UV fac[MPU_MAX_FACTORS+1];
UV exp[MPU_MAX_FACTORS+1];
diff --git a/util.h b/util.h
index 1cb51d5..6cb0cbb 100644
--- a/util.h
+++ b/util.h
@@ -32,6 +32,8 @@ extern int kronecker_su(IV a, UV b);
extern int kronecker_ss(IV a, IV b);
extern UV totient(UV n);
+extern int moebius(UV n);
+extern UV exp_mangoldt(UV n);
extern UV carmichael_lambda(UV n);
extern UV znprimroot(UV n);
extern UV znorder(UV a, UV n);
--
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