changeset 9984:d1cc2e0ddf55

isprime: produce logical result
author John W. Eaton <jwe@octave.org>
date Mon, 14 Dec 2009 13:50:11 -0500
parents 2d347a2f4a0a
children 43a29eeda994
files scripts/ChangeLog scripts/specfun/isprime.m
diffstat 2 files changed, 29 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/ChangeLog
+++ b/scripts/ChangeLog
@@ -1,3 +1,8 @@
+2009-12-14  John W. Eaton  <jwe@octave.org>
+
+	* specfun/isprime.m: Produce logical result.  Error if nargin > 1.
+	New tests.
+
 2009-12-14  John W. Eaton  <jwe@octave.org>
 
 	* help/__makeinfo__.m: Use fullfile to concatenate file name
--- a/scripts/specfun/isprime.m
+++ b/scripts/specfun/isprime.m
@@ -1,4 +1,4 @@
-## Copyright (C) 2000, 2006, 2007 Paul Kienzle
+## Copyright (C) 2000, 2006, 2007, 2009 Paul Kienzle
 ##
 ## This file is part of Octave.
 ##
@@ -18,14 +18,13 @@
 
 ## -*- texinfo -*-
 ## @deftypefn {Function File} {} isprime (@var{n})
-##
 ## Return true if @var{n} is a prime number, false otherwise.
 ##
 ## Something like the following is much faster if you need to test a lot
 ## of small numbers:
 ##
 ## @example
-##    @var{t} = ismember (@var{n}, primes (max (@var{n} (:))));
+## @var{t} = ismember (@var{n}, primes (max (@var{n} (:))));
 ## @end example
 ##
 ## If max(n) is very large, then you should be using special purpose 
@@ -36,22 +35,29 @@
 
 function t = isprime (n)
 
-  if (nargin < 1)
+  if (nargin == 1)
+    if (! isscalar (n))
+      nel = numel (n);
+      t = zeros (size (n), "logical");
+      for i = 1:nel
+        t(i) = isprime (n(i));
+      endfor
+    elseif (n != fix (n) || n < 2)
+      t = logical (0);
+    elseif (n < 9)
+      t = all (n != [4, 6, 8]);
+    else
+      q = n./[2, 3:2:sqrt(n)];
+      t = all (q != fix (q));
+    endif
+  else
     print_usage ();
   endif
 
-  if (! isscalar (n))
-    nel = numel (n);
-    t = n;
-    for i = 1:nel
-      t(i) = isprime (t(i));
-    endfor
-  elseif (n != fix (n) || n < 2)
-    t = 0;
-  elseif (n < 9)
-    t = all (n != [4, 6, 8]);
-  else
-    q = n./[2, 3:2:sqrt(n)];
-    t = all (q != fix (q));
-  endif
 endfunction
+
+%!assert (isprime (4), logical (0));
+%!assert (isprime (3), logical (1));
+%!assert (isprime (magic (3)), logical ([0, 0, 0; 1, 1, 1; 0, 0, 1]));
+%!error isprime ()
+%!error isprime (1, 2)