关于并发:并发Prime Generator

Concurrent Prime Generator我正在研究projecteuler.net上的问题,以学习如何在Erlang中进行编程,而我最难的是创建一个素数生成器,该生成器可以在不到一分钟的时间内创建所有200万以下的素数。 使用顺序样式,我已经编写了三种类型的生成器,包括Eratosthenes的Sieve,但是它们中的任何一个都不能表现良好。 我认为并发的Sieve可以很好地工作,但是我收到bad_arity消息,而且不确定为什么。 关于我为什么有问题或如何正确编码的任何建议? 这是我的代码,注释掉的部分是我尝试使事情并发的地方:
我使用Go和channel编写了Eratosthenesque并发初筛。 这是代码:http://github.com/aht/gosieve 我在这里写了关于它的博客:http://blog.onideas.ws/eratosthenes.go 该程序可以在大约10秒钟内筛选出前一百万个素数(所有素数最高为15,485,863)。 筛是并发的,但是该算法主要是同步的:goroutines(" actor",如果您愿意的话)之间需要太多同步点,因此它们不能并行自由漫游。 " badarity"错误表示您正在尝试使用错误数量的参数来调用" fun"。在这种情况下... %% L = for(1,N,fun()-> spawn(fun(I)-> wait(I,N)end)end), for / 3函数期望有趣的是1,spawn / 1函数希望有趣的是0。请尝试以下操作:
传递给spawn的乐趣继承了环境的必要部分(即I),因此无需显式传递它。 尽管计算素数总是很有趣,但是请记住,这不是Erlang旨在解决的问题。 Erlang是为大型actor风格的并发设计的。在所有数据并行计算示例上,它极有可能表现不佳。在许多情况下,例如ML中的顺序解决方案将是如此之快,以至于任何数量的内核都无法满足Erlang的需求,例如对于此类操作,F#和.NET Task Parallel Library无疑是更好的工具。 您可以在此处找到四个不同的Erlang实现来查找质数(其中两个基于Eratosthenes的Sieve)。该链接还包含比较这4个解决方案的性能的图表。 要考虑的另一种选择是使用概率素数生成。在Joe的书("主要服务器")中有一个例子,我认为它使用了Miller-Rabin。 两个快速的单过程erlang素生成器; sprimes会在约2.7秒内在2m以下生成所有素数,在我的计算机(配备2.4 GHz Core 2 Duo的Macbook)上约f3秒钟生成fprimes。两者都基于Eratosthenes的Sieve,但是由于Erlang最适合列表而不是数组,因此它们都保留一个未消除质数的列表,按当前磁头检查可除性,并保留经过验证的质数的累加器。两者都还实施了原轮以初步减少清单。
lazy:lazy / 1和lazy:next / 1是指伪惰性无限列表的简单实现:
筛子的质数生成不是并发的好地方(但是它可以使用并行性检查可除性,尽管操作还不够复杂,不足以证明我到目前为止编写的所有并行过滤器的额外开销。) ` 素数并行算法:http://www.cs.cmu.edu/~scandal/cacm/node8.html Eratosthenes筛网非常容易实现,但是-正如您所发现的-效率最高。您是否尝试过阿特金筛子? 阿特金筛子@维基百科 这是vb版本
欧拉计划的问题(我想说的是前50个问题中的大多数,如果不是更多的话)主要是关于蛮力的问题,在选择边界时会出现一些独创性。 记住要测试N是否为素数(通过蛮力),您只需要查看N是否可被楼数(sqrt(N))+ 1整除,而不是N / 2。 祝好运 我爱欧拉计划。 在主要发生器方面,我是Eratosthenes筛网的忠实拥护者。 对于2,000,000以下的数字,您可以尝试一个简单的isPrime check实现。我不知道您将如何使用erlang进行操作,但是逻辑很简单。
C#在不到1分钟的时间里就为2,000,000运行了这样的列表 编辑:在一个侧面说明,Eratosthenes的筛子可以很容易地实现并快速运行,但是当您进入庞大的清单时变得笨拙。使用布尔数组和int值的最简单实现运行得非常快。问题在于您开始遇到限制值大小和数组长度的问题。 -切换到字符串或位数组实现很有帮助,但是您仍然面临着以较大的值遍历列表的挑战。 |
相关内容
学习写字楼新选择6000元主流配置
学习写字楼新选择6000元主流配置,,这种配置需要考虑双核心的办...
拖拉机类型游戏电脑|拖拉机小游戏单机版
拖拉机类型游戏电脑|拖拉机小游戏单机版,,拖拉机小游戏单机版...
公共CPU接口类型的详细描述
公共CPU接口类型的详细描述,,我们知道CPU是电脑的大脑, CPU的...
Lucene学习之高亮显示
Lucene学习之高亮显示,索引,字符,在搜索引擎中我们经常会看到...
主板类型百科全书(基于芯片分类)
主板类型百科全书(基于芯片分类),,电脑维修基础之主板型号熟悉,主...
这种配置还不知道。它主要用于日常学习和娱乐,偶
这种配置还不知道。它主要用于日常学习和娱乐,偶尔玩游戏。,,CP...
在Inspiron3000笔记本适合计算机编程和英雄联盟
在Inspiron3000笔记本适合计算机编程和英雄联盟游戏,,问题: 最...
2、学习lucene之索引删除、恢复删除、强制删除
2、学习lucene之索引删除、恢复删除、强制删除,索引,位置, ...
C上的引导检查文件系统:文件的类型
C上的引导检查文件系统:文件的类型,,故障现象:系统检查启动检查...
车载电脑系统编程|车载电脑操作系统
车载电脑系统编程|车载电脑操作系统,,1. 车载电脑操作系统白名...
电脑硬盘接|电脑硬盘接口类型怎么看
电脑硬盘接|电脑硬盘接口类型怎么看,,电脑硬盘接口类型怎么看...
如何查看电脑内存类型|如何查看电脑内存类型大
如何查看电脑内存类型|如何查看电脑内存类型大小,,如何查看电...
Python之可迭代对象、迭代器、生成器
Python之可迭代对象、迭代器、生成器,迭代,生成器,一、概念描...
硬盘接口类型有哪些 固态硬盘接口哪种好
硬盘接口类型有哪些 固态硬盘接口哪种好,硬盘,接口,硬盘接口分...
从零入门学习电脑的电脑小爱需要了解的知识分享
从零入门学习电脑的电脑小爱需要了解的知识分享,的话,如果自己...