在 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
处声明外,在实践中没有任何意义。)
我正在尝试使用 惰性列表 获取第一个 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
处声明外,在实践中没有任何意义。)