生成素数是我经常尝试的一个玩具问题,尤其是在尝试一种新的编程语言、平台或风格时。
我正在考虑使用hadoop(map reduce)编写一个素数生成算法或素数测试算法。
我想我应该把这个问题贴出来,以获得提示、参考、算法和方法。
虽然我的主要兴趣是基于map-reduce的算法,但我不介意看一看新的hadoop编程模型,或者看一下使用picloud
关于质数生成,我这里似乎有一些有趣的问题:这里,这里,这里,但与并行方法无关的问题没有引起我的注意。
提前谢谢。
生成素数是我经常尝试的一个玩具问题,尤其是在尝试一种新的编程语言、平台或风格时。
我正在考虑使用hadoop(map reduce)编写一个素数生成算法或素数测试算法。
我想我应该把这个问题贴出来,以获得提示、参考、算法和方法。
虽然我的主要兴趣是基于map-reduce的算法,但我不介意看一看新的hadoop编程模型,或者看一下使用picloud
关于质数生成,我这里似乎有一些有趣的问题:这里,这里,这里,但与并行方法无关的问题没有引起我的注意。
提前谢谢。
1条答案
按热度按时间bsxbgnwa1#
这是一个基于Map和归约(折叠)的算法。它表示埃拉托斯烯的筛
p={3,5,7,…}\u{{p2,p2+2p,p2+4p,…}p在p}
对于奇数素数(即没有2)。折叠树无限地向右侧加深,如下所示:
其中,每个素数表示该素数的奇数倍流,例如,对于7:49,49+14,49+28,把这些数合并得到所有的合数,然后在合数之间的空隙中找到素数。它是在haskell中,因此计时由lazy求值机制隐式处理(以及算法调整,其中每个比较节点总是允许从左侧通过第一个数字,而不要求从右侧通过一个数字,因为它无论如何都保证更大)。
赔率可以用来代替奇数素数作为生成倍数的种子,以简化事情(具有明显的性能影响)。
这项工作自然可以分成连续素数平方之间的部分。haskell代码如下,但我们也可以将其视为可执行伪代码(其中
:
是一个列表节点惰性构造函数,一个函数调用f(x)
是书面的f x
,括号仅用于分组):这里有一个讨论。更复杂、更懒散的日程安排在这里。同样,这个答案显示了(相关的)haskell代码在生成器方面的近似翻译;这个是python的。