Haskell Sundaram的筛选-列表理解

Haskell Sundaram的筛选-列表理解,haskell,list-comprehension,sieve,Haskell,List Comprehension,Sieve,我正在尝试编写一个函数,使用 以下是我的尝试: sSund :: Integer -> [Integer] sSund n = [ i * 2 + 1 | i <- [1..n], j <- [f i], (i + j + 2 * i * j) > n ] where f 1 = 1 f y = y + 1 --use function f because i don't know how insert 1 into j's list 我做错了什

我正在尝试编写一个函数,使用

以下是我的尝试:

sSund :: Integer -> [Integer]
sSund n = [ i * 2 + 1 | i <- [1..n], j <- [f i], (i + j + 2 * i * j) > n ] 
  where f 1 = 1 
        f y = y + 1 --use function f because i don't know how insert 1 into j's list
我做错了什么?

它是如何工作的 Sundaram的seive专注于奇数2n+1,排除了那些数字的乘积


如果两个数字相乘形成一个奇数,它们必须都是奇数,因此我们的数字2n+1=(2i+1)(2j+1)。如果我们把它乘以,我们得到2n+1=4ij+2i+2j+1,我们可以把它简化为2n=4ij+2i+2j,也可以简化为n=2ij+i+j。所以我们不需要n,如果我们可以把它写成2ij+i+j。这对于任何数字i和j都是正确的,但是去掉那些有iOh的数字也没关系。谢谢你的帮助。我只是没有正确理解算法(关于j是从I到n的所有数字)。在维基文章中,这对我来说并不明显@我添加了更多的解释和许多其他方法。应该更快。:)从经验上看,n中的线性与二次。很抱歉再次这样插话,但我想尝试一下,事实上,
减去[1..n]$foldi union[[I+j+2*I*j | j]
*Main> sSund 30
[7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61]
sSundDelete :: Integer -> [Integer]            
sSundDelete n = [i+j+2*i*j|i<-[1..n], j<-[i..n]]
sSund :: Integer -> [Integer]
sSund n = let del = sSundDelete n in
     2:[2*x+1 | x <- [1..n], not (x `elem` del)]
> sSund 30
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61]
> sSundDelete 10
[4,7,10,13,16,19,22,25,28,31,12,17,22,27,32,37,42,47,52,24,31,38,45,52,59,66,73,40,49,58,67,76,85,94,60,71,82,93,104,115,84,97,110,123,136,112,127,142,157,144,161,178,180,199,220]
sSundDelete n = [i+j+2*i*j|i<-[1..n], j<-[i..n],i+j+2*i*j<=n]
sSundDelete n = filter (<= n) [i+j+2*i*j|i<-[1..n], j<-[i..n]]
sSundDelete n = filter (<= n) [i+j+2*i*j|i<-[1..floor (sqrt (fromIntegral n / 2))], j<-[i..n]]
sSundDelete n = [i+j+2*i*j|let n'=fromIntegral n,
                           i<-[1..floor (sqrt (n' / 2))],
                           let i' = fromIntegral i,
                           j<-[i..floor( (n'-i')/(2*i'+1))]]