diff scripts/specfun/isprime.m @ 10657:c6833d31f34e

optimize primes and isprime
author Jaroslav Hajek <highegg@gmail.com>
date Tue, 25 May 2010 13:46:22 +0200
parents d1cc2e0ddf55
children faff5367cc05
line wrap: on
line diff
--- a/scripts/specfun/isprime.m
+++ b/scripts/specfun/isprime.m
@@ -36,20 +36,18 @@
 function t = isprime (n)
 
   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
+    n = n(:);
+    idx = 1:numel (n);
+    for p = primes (sqrt (max (n(:))))
+      if (isempty (idx))
+        break;
+      endif
+      mask = rem (n, p) != 0;
+      n = n(mask);
+      idx = idx(mask);
+    endfor
+    t = false (size (n));
+    t(idx) = true;
   else
     print_usage ();
   endif