[libmath-prime-util-perl] 13/17: Add Mangoldt function
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:47:14 UTC 2015
This is an automated email from the git hooks/post-receive script.
ppm-guest pushed a commit to annotated tag v0.21
in repository libmath-prime-util-perl.
commit 5c7004570b2210d32d05dff2892d5e59281ab31d
Author: Dana Jacobsen <dana at acm.org>
Date: Fri Feb 22 09:20:41 2013 -0800
Add Mangoldt function
---
Changes | 4 +++-
lib/Math/Prime/Util.pm | 35 ++++++++++++++++++++++++++++++++++-
util.c | 1 +
3 files changed, 38 insertions(+), 2 deletions(-)
diff --git a/Changes b/Changes
index 0623989..714a7af 100644
--- a/Changes
+++ b/Changes
@@ -12,7 +12,9 @@ Revision history for Perl extension Math::Prime::Util.
- Add mertens function: 1000+ times faster than summing moebius($_).
- - Speedup of divisor sum. Also default to sigma if no sub given.
+ - Add exp_mangoldt function: exponential of von Mangoldt's function.
+
+ - divisor sum is 2x faster. Also default to sigma if no sub given.
0.20 3 February 2012
diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index 3b4f4ed..3d111e2 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -27,7 +27,7 @@ our @EXPORT_OK = qw(
random_strong_prime random_maurer_prime
primorial pn_primorial
factor all_factors
- moebius mertens euler_phi jordan_totient
+ moebius mertens euler_phi jordan_totient exp_mangoldt
divisor_sum
ExponentialIntegral LogarithmicIntegral RiemannZeta RiemannR
);
@@ -1271,6 +1271,24 @@ sub _omega {
return scalar @factors;
}
+# Exponential of Mangoldt function (A014963).
+# Return p if n = p^m [p prime, m >= 1], 1 otherwise.
+sub exp_mangoldt {
+ my($n) = @_;
+ return 1 if defined $n && $n <= 1;
+ _validate_positive_integer($n);
+
+ #my $is_prime = ($n<=$_XS_MAXVAL) ? _XS_is_prob_prime($n) : is_prob_prime($n);
+ #return $n if $is_prime;
+
+ my %factor_mult;
+ my @factors = grep { !$factor_mult{$_}++ }
+ ($n <= $_XS_MAXVAL) ? _XS_factor($n) : factor($n);
+
+ return 1 unless scalar @factors == 1;
+ return $factors[0];
+}
+
#############################################################################
# Front ends to functions.
@@ -1963,6 +1981,9 @@ Version 0.21
# Mertens function directly (more efficient for large values)
say mertens(10_000_000);
+ # Exponential of Mangoldt function
+ say "lamba(49) = ", log(exp_mangoldt(49));
+
# divisor sum
$sigma = divisor_sum( $n );
$sigma2 = divisor_sum( $n, sub { $_[0]*$_[0] } );
@@ -2453,6 +2474,18 @@ This function can be used to generate some other useful functions, such as
the Dedikind psi function, where C<psi(n) = J(2,n) / J(1,n)>.
+=head2 exp_mangoldt
+
+ say "exp(lambda($_)) = ", exp_mangoldt($_) for 1 .. 100;
+
+The Mangoldt function Λ(n) (also known as von Mangoldt's function) is equal
+to log p if n is prime or a power of a prime, and 0 otherwise. We return
+the exponential so all results are integers. Hence the return value
+for C<exp_mangoldt> is:
+ C<p> if C<n = p^m> for some prime C<p> and integer C<m E<gt>= 1>
+ 1 otherwise.
+
+
=head2 divisor_sum
say "Sum of divisors of $n:", divisor_sum( $n );
diff --git a/util.c b/util.c
index c09d49f..402106b 100644
--- a/util.c
+++ b/util.c
@@ -642,6 +642,7 @@ IV* _moebius_range(UV lo, UV hi)
*/
range = hi-lo+1;
sqrtn = (UV) (sqrt(hi) + 0.5);
+ /* sqrtn = (UV) sqrt(hi); if (sqrtn*sqrtn < hi) sqrtn++; */ /* TODO */
New(0, mu, range, IV);
if (mu == 0)
--
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