Skip to content

Commit

Permalink
base/primes.jl: generalize primes/mask to BitArray or Array{Bool}.
Browse files Browse the repository at this point in the history
For smaller numbers of primes, the Sieve of Eratosthenes still seems
to be quite a bit faster. Perhaps we ought to use a polyalgorithm
here, only using the Sieve of Atkin for large N.
  • Loading branch information
StefanKarpinski committed Feb 16, 2014
1 parent 1850e62 commit 859b9e5
Showing 1 changed file with 6 additions and 7 deletions.
13 changes: 6 additions & 7 deletions base/primes.jl
Original file line number Original file line Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
# http://thomasinterestingblog.wordpress.com/2011/11/30/generating-primes-with-the-sieve-of-atkin-in-c/ # http://thomasinterestingblog.wordpress.com/2011/11/30/generating-primes-with-the-sieve-of-atkin-in-c/
# http://dl.dropboxusercontent.com/u/29023244/atkin.cpp # http://dl.dropboxusercontent.com/u/29023244/atkin.cpp
# #
function primesmask(n::Int) function primesmask(s::AbstractVector{Bool})
s = falses(n) n = length(s)
n < 2 && return s; s[2] = true n < 2 && return s; s[2] = true
n < 3 && return s; s[3] = true n < 3 && return s; s[3] = true
r = ifloor(sqrt(n)) r = ifloor(sqrt(n))
Expand All @@ -24,12 +24,11 @@ function primesmask(n::Int)
end end
return s return s
end end
function primesmask(n::Integer) primesmask(n::Int) = primesmask(falses(n))
n <= typemax(Int) || error("you want WAY too many primes ($n)") primesmask(n::Integer) = n <= typemax(Int) ? primesmask(int(n)) :
primesmask(int(n)) error("you want WAY too many primes ($n)")
end


primes(n::Integer) = find(primesmask(n)) primes(n::Union(Integer,AbstractVector{Bool})) = find(primesmask(n))


# Miller-Rabin for primality testing: # Miller-Rabin for primality testing:
# http://en.wikipedia.org/wiki/Miller–Rabin_primality_test # http://en.wikipedia.org/wiki/Miller–Rabin_primality_test
Expand Down

0 comments on commit 859b9e5

Please sign in to comment.