生成素数的并行算法(可能使用hadoop的map reduce)

fzsnzjdm  于 2021-06-03  发布在  Hadoop
关注(0)|答案(1)|浏览(451)

生成素数是我经常尝试的一个玩具问题,尤其是在尝试一种新的编程语言、平台或风格时。
我正在考虑使用hadoop(map reduce)编写一个素数生成算法或素数测试算法。
我想我应该把这个问题贴出来,以获得提示、参考、算法和方法。
虽然我的主要兴趣是基于map-reduce的算法,但我不介意看一看新的hadoop编程模型,或者看一下使用picloud
关于质数生成,我这里似乎有一些有趣的问题:这里,这里,这里,但与并行方法无关的问题没有引起我的注意。
提前谢谢。

bsxbgnwa

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 ,括号仅用于分组):

primes = 2 : g []
  where
    g ps = 3 : minus [5,7..] (_U [[p*p, p*p+2*p..] | p <- g ps])
    _U ((x:xs):t) = x : union xs (_U (pairs t))
    pairs ((x:xs):ys:t) = (x : union xs ys) : pairs t

union (x:xs) (y:ys) = case compare x y of 
    LT -> x : union  xs (y:ys) 
    EQ -> x : union  xs    ys 
    GT -> y : union (x:xs) ys

minus (x:xs) (y:ys) = case compare x y of
    LT -> x : minus  xs (y:ys) 
    EQ ->     minus  xs    ys 
    GT ->     minus (x:xs) ys

这里有一个讨论。更复杂、更懒散的日程安排在这里。同样,这个答案显示了(相关的)haskell代码在生成器方面的近似翻译;这个是python的。

相关问题