是否有可能懒洋洋地生成轮子?

时间:2016-09-12 19:17:19

标签: algorithm haskell functional-programming

The Genuine Sieve of Erastosthenes论文中,作者使用有限大小的轮子跳过检查筛子结构上前N个素数的倍数。例如,为了避免检查2, 3的倍数,您可以从5开始,然后交替添加2和4.这是下面的wheel 2

-- wheel 0 = ([2],[1])
-- wheel 1 = ([3,2],[2])
-- wheel 2 = ([5,3,2],[2,4]) -- "start at 5, add 2, 4, 2, 4..."
-- wheel 3 = ([7,5,3,2],[4,2,4,2,4,6,2,6])

在筛分过程启动时,她的轮子完全生成。这是一个权衡,因为更大的轮子需要更多的内存。不过,我发现轮子生成背后的潜在机制本身很有趣。鉴于其明显重复的性质,我想知道是否有可能创造一个"无限轮"像筛子一样,它本身就像一条小溪?我想,这个流将是列表序列[1], [2], [2, 4], [4, 2, 4, 2, 4, 6, 2, 6]...的限制 - 并且可能作为primes本身的实现。

1 个答案:

答案 0 :(得分:1)

正如Bakuriu所说,车轮序列没有限制。没有“无限轮”这样的东西,我会试着说明原因。

如果我们知道第一个素数p_1,...,p_n,我们只需要在与它们相互作用的数字中搜索下一个素数:

isCoprime :: [Int] -> Int -> Bool
isCoprime ps x = all (\p -> x `mod` p /= 0) ps 

设置的Coprime(p_1,...,p_n)是(p_1 ... p_n)-periodic(当且仅当x + p_1 ... p_n在其中时,x在其中),所以我们称之为一个轮子。

你要求这个Coprime集的限制,因为我们需要越来越多的素数p_i。但是,在p_n下面的唯一数字(p_1,...,p_n)是1.为了证明这一点,请注意这个数字的素数因子是p_i之一。

因此素数的数量趋于无穷大,Coprime(p_1,...,p_n)在1和p_n之间留下了一个巨大的空洞。因此,你能想到的唯一限制就是空集:没有无限的轮子。