【发布时间】:2011-07-21 06:05:37
【问题描述】:
我是 F# 的新手,我只是想知道是否有任何方法可以在 F# 中获得素数的惰性序列。
在 Haskell 中,我使用下一个代码:
primes :: [Integer]
primes = sieve[2..]
where sieve (p:xs) = p : sieve [x | x <- xs, x `mod` p > 0]
在 F# 中,我可以检查数字是否为素数:
let isPrime (number : bigint) =
match number with
| _ -> seq { bigint(2) .. bigint(Math.Sqrt(float number))}
|> Seq.exists (fun x -> if (number % x = bigint(0)) then true else false)
|> not
但我不知道如何将其转换为惰性序列。
【问题讨论】:
-
你需要
bigint吗?我怀疑筛子能否很快计算出不适合long的素数。 -
是的,我需要,因为我正在尝试解决项目 eluer #3 任务 (projecteuler.net/index.php?section=problems&id=3)。
-
小剧透:这个数字中最大的主要因素很适合长整数。您还可以使用 I 后缀来表示 bigint:0I 而不是 bigint 0。
-
旁注:没有理由检查
number % 4和所有下一个偶数 - 如果number % 2 == 0,则根本不会进行检查,如果不是,则可以假设number % 4 != 0也是如此。
标签: f#