如何在Perl 6中高效生成素数列表?

msc*_*cha 6 primes perl6

在Perl 6中生成素数列表非常容易:

my @primes = (^?).grep: *.is-prime;
Run Code Online (Sandbox Code Playgroud)

如果你需要相对较少数量的素数,这种方法就足够了,但对于大数字来说效率非常低,因为每个数字都是独立检查的.

有没有办法访问Perl 6的内置主要检查逻辑,以有效地创建素数列表?否则我需要自己建一个筛子.很容易,但我担心高级Perl 6代码中的筛子几乎和我开始使用的代码一样低效.

Eli*_*sen 5

如果您运行程序--profile,您将看到超过99%的时间用于Int.is-prime.由于这实际上只是一个包装器nqp::isprime_I(),我试图在没有包装器的情况下运行类似的代码.但这并没有明显改变.因此,工作的主要内容正在进行中nqp::isprime_I().

因此,您真正拥有的唯一选择是并行搜索素数.在(更近的)未来,hyper将是你的朋友.但目前处于"最初的初始实施"阶段,正在讨论更强大的实施方案:https://gist.github.com/jnthn/6a80a9712fb38b32537f9f0e46fca6d7

在此之前,如果您希望更快地运行,则必须手动分解要检查准备的值的范围并在start块中运行它们,并从结果中收集结果Promise.


Cur*_*mes 5

我为primesieve编写了一些 Perl 6 绑定:

https://github.com/CurtTilmes/perl6-primesieve

数学::基本筛