在 Raku 中使用惰性列表获取第一个 10 位素数

Getting the first 10-digit prime number using lazy lists in Raku

我正在尝试使用 惰性列表 获取第一个 10 位素数。这是我根据(已经给出的)计算素数的代码得出的结论:

my @primes = 2,3,5, {first * %% none(@_), (@_[*-1] ... Inf)} ...  -> $s {$s.chars == 10};

say @primes[@primes.elems-1];

该代码的问题是完成时间太长。

有什么快速的方法可以得到第一个 10 位质数吗?

您可以通过以下方式使其更快:

  • 从最小的 10 位数字开始(没有必要遍历一堆即使是质数也永远不会匹配的候选数)
  • 使用快速内置 is-prime 方法而不是手动算法

从而得到:

say (1_000_000_000..*).first(*.is-prime)

产生:

1000000007

您也可以过滤掉偶数,但我怀疑 is-prime 会像您单独测试它们一样快速地拒绝它们。 (此外,事实证明该数字非常接近前 10 位数字,因此除了在 1_000_000_000 处声明外,在实践中没有任何意义。)