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

Lar*_*een 8 primes lazy-evaluation raku

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

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

say @primes[@primes.elems-1];
Run Code Online (Sandbox Code Playgroud)

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

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

Jon*_*ton 12

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

  • 从最小的 10 位数字开始(通过一堆即使是素数也永远不会匹配的候选者毫无意义)
  • 使用快速内置is-prime方法而不是手动算法

从而得到:

say (1_000_000_000..*).first(*.is-prime)
Run Code Online (Sandbox Code Playgroud)

其中产生:

1000000007
Run Code Online (Sandbox Code Playgroud)

您也可以过滤掉偶数,但我怀疑is-prime会以您单独测试它们的速度拒绝它们。(此外,事实证明该数字与第一个 10 位数字非常接近,因此除了1_000_000_000在实践中说明之外没有任何其他意义。)