primes - 如何在 Perl 6 中有效地生成素数列表?

标签 primes raku

在 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/

相关文章:

cryptography - 对于密码安全素数,我应该使用多少次 Rabin-Miller 迭代?

lazy-evaluation - 意外的非懒惰

regex - proto 代币候选排序

embedding - 是否可以在 C(或 C++)程序中嵌入 perl6?

Java函数查找素数不起作用

按小于 x 的一组数字列出所有可能的倍数的算法

java - Eratosthenes 筛法实现不检查某些数字

在数组中生成素数时出现 C 段错误

exception - 区分CATCH block 中的异常与失败[RAKU]

optimization - 为什么内联if语句的平均速度至少比其他类型的if慢三分之一?