- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我偶然发现一种称为欧拉筛的改进版的埃拉托色尼筛时,我正在阅读不同的筛分算法。根据Wikipedia在 Haskell 中有一个稍微不同版本的想法(称为 Turner's Sieve)的实现。
现在我试图了解给出的代码片段到底是做什么的,我想我已经明白了,但现在我想将代码翻译成 F# 并且真的不知道从哪里开始。我主要担心的是似乎没有“减去”两个序列的功能。
这是代码:
import Data.OrdList (minus)
primes = euler [2..]
euler (p : xs) = p : euler (xs `minus` map (*p) (p : xs))
最佳答案
如果你想像 Haskell 那样计算无限列表的合并/差异,那么 LazyList 类型(在 F# 电源包中找到)就会浮现在脑海中。
它产生了非常冗长的代码,如下面的翻译:
#r "FSharp.PowerPack.dll"
//A lazy stream of numbers, starting from x
let rec numsFrom x = LazyList.consDelayed x (fun () -> numsFrom (x+1))
//subtracts L2 from L1, where L1 and L2 are both sorted(!) lazy lists
let rec lazyDiff L1 L2 =
match L1,L2 with
| LazyList.Cons(x1,xs1),LazyList.Cons(x2,xs2) when x1<x2 ->
LazyList.consDelayed x1 (fun () -> lazyDiff xs1 L2)
| LazyList.Cons(x1,xs1),LazyList.Cons(x2,xs2) when x1=x2 ->
lazyDiff xs1 L2
| LazyList.Cons(x1,xs1),LazyList.Cons(x2,xs2) when x1>x2 ->
lazyDiff L1 xs2
| _ -> failwith "Should not occur with infinite lists!"
let rec euler = function
| LazyList.Cons(p,xs) as LL ->
let remaining = lazyDiff xs (LazyList.map ((*) p) LL)
LazyList.consDelayed p (fun () -> euler remaining)
| _ -> failwith "Should be unpossible with infinite lists!"
let primes = euler (numsFrom 2)
> primes |> Seq.take 15 |> Seq.toList;;
val it : int list = [2; 3; 5; 7; 11; 13; 17; 19; 23; 29; 31; 37; 41; 43; 47]
failwith
即使我们知道计算中的所有列表都是(懒惰的)无限的,也可以避免编译器提示不完全匹配的子句。
关于Haskell --> F# : Turner's Sieve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2325914/
根据链接:http://en.wikipedia.org/wiki/Sieve_of_Sundaram,用于生成最多为 n 的素数列表的“sundaram 筛法”的运行时间为 O(n*log(n))。
我目前正在尝试比较两种不同素数生成算法的平均运行速度。我有这个简单的埃拉托色尼筛法实现: std::vector sieve_of_eratosthenes(int32_t n) { std:
我正在研究一个简单的埃拉托色尼筛法算法,代码如下: int main() { const int n = 1000000; int sqrn = floor(sqrt(n));
当我偶然发现一种称为欧拉筛的改进版的埃拉托色尼筛时,我正在阅读不同的筛分算法。根据Wikipedia在 Haskell 中有一个稍微不同版本的想法(称为 Turner's Sieve)的实现。 现在我
这是我编写的用于在上限可以大到 1000000000 的范围之间查找素数的代码。我使用了 Hashmap,除了 2 之外没有存储任何偶数,也没有存储 sero 和 1但当我使用输入 lb = 1 和
我最近编写了这段代码,但想知道是否有更快的方法来查找素数(不是筛子;我仍在尝试实现)。有什么建议吗?我正在使用 Python,而且对它还很陌生。 def isPrime(input): cur
我正在编写一种方法来查找不超过 n(埃拉托色尼筛法)的素数,是的,这是作业。我希望提高我编写的方法的性能。最近几天我一直在调整它,但无法遵循给出的伪代码并提高性能。 伪代码如下: 创建要处理的号码队列
目前我有两个功能: 一个需要生成素数的数量。 第二个取素数上限生成。 它们是这样编码的(在 C++ 中): prime_list erato_sieve(ul_it upper_limit) {
我一直在研究 Stroustrup 的书: http://www.amazon.com/Programming-Principles-Practice-Using-C/dp/0321543726我目前
我正在尝试使用筛子打印出一组特定的素数,但我似乎没有得到任何输出,但它编译正常。程序不会退出,除非我强制执行,所以我猜它卡在了某个地方...我该如何解决这个问题? #include #include
我编写了以下代码,使用 Sieve 的方法列出了 20 亿以内的所有质数。我使用位掩码来标记目的。虽然我能够正确地得到素数,但每次都会丢失一些开头的素数。请帮我找出程序中的错误。 #include
来自 Wikipedia: The complexity of the algorithm is O(n(logn)(loglogn)) bit operations. 你是如何做到这一点的? 复杂性
来自 Wikipedia: The complexity of the algorithm is O(n(logn)(loglogn)) bit operations. 你是如何做到这一点的? 复杂性
我正在尝试实现 Sieve of Eratosthene在 C++ 中。但是,经过多次尝试后,我总是会遇到运行时错误。我认为这与正在使用的迭代器的状态在某处损坏有关。我不能把我的手指放在上面。这是我的
最近我一直在研究使用阿特金筛 (http://en.wikipedia.org/wiki/Sieve_of_atkin) 生成其素数的 C++ 素数生成器。我的目标是能够生成任何 32 位数字。我将主
我正在尝试理解“Eratosthenes 筛法”。这是我的算法(下面的代码),以及我无法理解的功能列表(按顺序)。 为什么 i * i 比 i * 2 更有效?是的,我可以理解它会减少迭代次数,因此效
我用 Java 编写了以下“分段筛”程序。它需要筛选一系列数字,使用“筛选素数”(素数数组列表变量)划掉复合数,然后返回尚未划掉的素数。这是代码: public ArrayList sieveWork
我更多地来自 java/php 背景,我现在正在学习 C++。我试图用 C++ 重新创建埃拉托色尼筛法并打印出 5000 以下的所有素数。 我正在用 http://www.compileonline.
我想首先说明我是一个 python 新手,我很感激任何能向我清楚、完整地解释它的人。 我正在查看以下链接中的代码: http://rosettacode.org/wiki/Sieve_of_Erato
我正在研究 PrimeSieve 的数组列表实现,我已经编写了所有代码,但它似乎无法运行,所以我不确定是因为循环不好还是因为我设置了错误的扫描器。 这是代码。 import java.util.S
我是一名优秀的程序员,十分优秀!