在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
本身的实现来工作。 最佳答案
正如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)周期的(当且仅当x + p_1 ... p_n在其中时,x才在其中),因此我们将其称为轮子。
您在要求这个Coprime集的极限,因为我们采用越来越多的质数p_i。但是,在p_n以下的Coprime(p_1,...,p_n)中唯一的数字是1。为证明这一点,请注意,该数字的质数因子将是p_i之一。
因此,当质数趋于无穷大时,Coprime(p_1,...,p_n)在1和p_n之间留下了一个巨大的空洞。因此,您可以想到的唯一限制是空集:没有无限大的轮子。