在 Perl 6 中使用 is-prime
生成素数列表非常容易。 :
my @primes = (^∞).grep: *.is-prime;
如果您需要相对较少的素数,这很有效,但对于大数来说效率很低,因为每个数字都经过独立检查。
有没有办法访问 Perl 6 的内置素数检查逻辑来有效地创建素数列表?
否则我需要自己做一个筛子。很容易,但恐怕高级 Perl 6 代码中的筛选几乎与我开始使用的代码一样低效。
最佳答案
如果你用 --profile
运行你的程序,你会看到超过 99% 的时间都花在了 Int.is-prime
.因为这实际上只是 nqp::isprime_I()
的一个包装器,我试图在没有包装器的情况下运行类似的代码。但这并没有明显改变任何东西。因此,首当其冲的工作正在nqp::isprime_I()
中完成。 .
因此,您真正拥有的唯一选择是并行搜索素数。在(更近的) future ,hyper
会是你的 friend 。但这目前处于“初始朴素实现”阶段,正在讨论更强大的实现:https://gist.github.com/jnthn/6a80a9712fb38b32537f9f0e46fca6d7
在那之前,如果你想更快地运行,你必须手动分解你想要检查素数的值范围,并在 start
内运行它们。阻止,并从结果 Promise
中收集结果.
关于primes - 如何在 Perl 6 中有效地生成素数列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43701570/