Julia的Prime Iterator

u00*_*03f 5 primes julia

是否有(高效)迭代器在Julia中生成素数?内置函数一次primes[N]生成所有素数N,而不是根据需要生成,并且当N非常大或未知时可能无法使用.

msc*_*uer 6

您可以Base.Count{BigInt}使用概率素性测试过滤通过(大)整数(迭代器)的计数器

iterprimes = filter(isprime,countfrom(big(2),1))
Run Code Online (Sandbox Code Playgroud)

然后例如

julia> collect(take(iterprimes, 5))
5-element Array{Any,1}:
  2
  3
  5
  7
 11
Run Code Online (Sandbox Code Playgroud)

这不像筛子那样有效,但在记忆中没有保留巨大的结构.我记得,isprime对于标准的重复选择,至少有2 ^ 64的误报.

编辑:

第二种可能性是生成(参见Generator)块primes(N*(i-1)+1,N*i)Base.flatten它们到一个列表中:

Base.flatten(primes(1000000*(i-1)+1,1000000*i) for i in countfrom(1))
Run Code Online (Sandbox Code Playgroud)

在这台机器上,这个迭代器实际上胜过普通primes计算前10 ^ 9素数.

编辑2:

迭代器使用gmpznextprime.

type 
   PrimeIter
end
function nextprime(y::BigInt)
    x = BigInt()
    ccall((:__gmpz_nextprime,:libgmp), Void, (Ptr{BigInt},Ptr{BigInt}), &x, &y)
    x
end
Base.start(::PrimeIter) = big(2)
Base.next(::PrimeIter, state) = state, nextprime(state)
Base.done(::PrimeIter, _) = false
Base.iteratorsize(::PrimeIter) = Base.IsInfinite()


> first(drop(PrimeIter(), 10^5))
1299721
Run Code Online (Sandbox Code Playgroud)

  • `SymEngine.jl`包从`SymEngine`包装`nextprime`函数.它并不比使用`isprime`为n小于100_000提供的示例更快,但对于较大的n值似乎更快. (2认同)