[libmath-prime-util-perl] 18/181: first round of changes for factor(1)
Partha P. Mukherjee
ppm-guest at moszumanska.debian.org
Thu May 21 18:51:02 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 68a087726071095569ed870a5d33df3a4951fb20
Author: Dana Jacobsen <dana at acm.org>
Date: Tue Dec 17 13:59:04 2013 -0800
first round of changes for factor(1)
---
TODO | 2 ++
XS.xs | 10 +++++++---
factor.c | 2 +-
lib/Math/Prime/Util.pm | 2 ++
t/50-factoring.t | 8 ++++----
5 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/TODO b/TODO
index 0be771d..793d840 100644
--- a/TODO
+++ b/TODO
@@ -67,3 +67,5 @@
- Add fordivisors as XS.
- Make divisors() an alias for all_factors().
+
+- Document changes to factor(1)
diff --git a/XS.xs b/XS.xs
index cb98997..0bdcc17 100644
--- a/XS.xs
+++ b/XS.xs
@@ -362,7 +362,8 @@ erat_primes(IN UV low, IN UV high)
#define SIMPLE_FACTOR(func, n, arg1) \
if (n <= 1) { \
- XPUSHs(sv_2mortal(newSVuv( n ))); \
+ if (n == 0) \
+ XPUSHs(sv_2mortal(newSVuv( n ))); \
} else { \
while ( (n% 2) == 0 ) { n /= 2; XPUSHs(sv_2mortal(newSVuv( 2 ))); } \
while ( (n% 3) == 0 ) { n /= 3; XPUSHs(sv_2mortal(newSVuv( 3 ))); } \
@@ -381,7 +382,8 @@ erat_primes(IN UV low, IN UV high)
#define SIMPLE_FACTOR_2ARG(func, n, arg1, arg2) \
/* Stupid MSVC won't bring its C compiler out of the 1980s. */ \
if (n <= 1) { \
- XPUSHs(sv_2mortal(newSVuv( n ))); \
+ if (n == 0) \
+ XPUSHs(sv_2mortal(newSVuv( n ))); \
} else { \
while ( (n% 2) == 0 ) { n /= 2; XPUSHs(sv_2mortal(newSVuv( 2 ))); } \
while ( (n% 3) == 0 ) { n /= 3; XPUSHs(sv_2mortal(newSVuv( 3 ))); } \
@@ -418,18 +420,20 @@ void
_XS_factor_exp(IN UV n)
PREINIT:
UV factors[MPU_MAX_FACTORS+1];
+ UV exponents[MPU_MAX_FACTORS+1];
int i, j, nfactors;
PPCODE:
nfactors = factor(n, factors);
if (GIMME_V == G_SCALAR) {
/* Count unique prime factors and return the scalar */
+ if (n == 1) XSRETURN_UV(0);
for (i = 1, j = 1; i < nfactors; i++)
if (factors[i] != factors[i-1])
j++;
PUSHs(sv_2mortal(newSVuv(j)));
} else {
/* Return ( [p1,e1], [p2,e2], [p3,e3], ... ) */
- UV exponents[MPU_MAX_FACTORS+1];
+ if (n == 1) XSRETURN_EMPTY;
exponents[0] = 1;
for (i = 1, j = 1; i < nfactors; i++) {
if (factors[i] != factors[i-1]) {
diff --git a/factor.c b/factor.c
index 0af17bd..d2a6ba3 100644
--- a/factor.c
+++ b/factor.c
@@ -163,7 +163,7 @@ int trial_factor(UV n, UV *factors, UV maxtrial)
/* Cover the cases 0/1/2/3 now */
if (n < 4 || maxtrial < 2) {
factors[0] = n;
- return 1;
+ return (n == 1) ? 0 : 1;
}
/* Trial division for 2, 3, 5, 7, and see if we're done */
while ( (n & 1) == 0 ) { factors[nfactors++] = 2; n /= 2; }
diff --git a/lib/Math/Prime/Util.pm b/lib/Math/Prime/Util.pm
index 7c84a53..8956d5b 100644
--- a/lib/Math/Prime/Util.pm
+++ b/lib/Math/Prime/Util.pm
@@ -1227,6 +1227,7 @@ sub all_factors {
_validate_num($n) || _validate_positive_integer($n);
+ return () if $n == 1;
return _XS_divisors($n) if $n <= $_XS_MAXVAL;
my %all_factors;
@@ -1832,6 +1833,7 @@ sub factor {
my($n) = @_;
_validate_num($n) || _validate_positive_integer($n);
+ return () if $n == 1;
return _XS_factor($n) if $n <= $_XS_MAXVAL;
if ($_HAVE_GMP) {
diff --git a/t/50-factoring.t b/t/50-factoring.t
index 4cc339d..c9cab00 100644
--- a/t/50-factoring.t
+++ b/t/50-factoring.t
@@ -79,7 +79,7 @@ my %all_factors = (
4 => [1,2,4],
3 => [1,3],
2 => [1,2],
- 1 => [1],
+ 1 => [],
0 => [],
);
@@ -95,7 +95,7 @@ foreach my $n (@testn) {
# Are they all prime?
my $isprime = 1; $isprime *= is_prime($_) for @f;
- if ($n < 2) {
+ if ($n < 1) {
ok( !$isprime, " each factor is not prime" );
} else {
ok( $isprime, " each factor is prime" );
@@ -127,7 +127,7 @@ sub extra_factor_test {
my $fname = shift;
my $fsub = shift;
- is_deeply( [ sort {$a<=>$b} $fsub->(1) ], [1], "$fname(1)" );
+ is_deeply( [ sort {$a<=>$b} $fsub->(1) ], [], "$fname(1)" );
is_deeply( [ sort {$a<=>$b} $fsub->(4) ], [2, 2], "$fname(4)" );
is_deeply( [ sort {$a<=>$b} $fsub->(9) ], [3, 3], "$fname(9)" );
is_deeply( [ sort {$a<=>$b} $fsub->(11) ], [11], "$fname(11)" );
@@ -141,7 +141,7 @@ sub extra_factor_test {
# Factor in scalar context
is( scalar factor(0), 1, "scalar factor(0) should be 1" );
-is( scalar factor(1), 1, "scalar factor(1) should be 1" );
+is( scalar factor(1), 0, "scalar factor(1) should be 0" );
is( scalar factor(3), 1, "scalar factor(3) should be 1" );
is( scalar factor(4), 2, "scalar factor(4) should be 2" );
is( scalar factor(5), 1, "scalar factor(5) should be 1" );
--
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