2014-09-26 46 views
1

我正在執行Sieve of Sundaram不包括Sundaram篩號碼

的第一步是獲得整數的,使得列表:

I,J是自然數,1 < = I < = j的

I + J + 2 * I *∫ < = n

這是我的功能。它應該生成所有(i, j)的元組列表,這些元組與上面的 限制匹配。

numsToRemove :: Integer -> [(Integer, Integer)] 
numsToRemove n = [ (i, j) | i <- [1..n], j <- [1..n], i <= j, i >= 1, j >= 1, 
          i * j + 2*i*j <= n] 

但我在回答中遇到了非質數問題。排除我的其他工作,我認爲我在生成整數列表時犯了一個錯誤。

請讓我知道我做錯了什麼。

回答

2

您的功能檢查i * j + 2*i*j <= n,但您的定義要求i + j + 2*i*j <= n。有一個*應該是一個+

+0

感謝您抓住我的錯誤!然而,當運行'numsToRemove 100',然後執行'(toList。foldr(\(x,y)acc - > insert x $ insert y acc)empty)'時,我得到'[1..33]'作爲結果... – 2014-09-26 01:11:28

+0

你爲什麼認爲這是錯的?它是我期望從你的問題中給出的限制。 – hugomg 2014-09-26 01:29:29

+0

好吧,一旦我得到'[1..33]'的結果,那麼如果我排除所有這些數字肯定是不對的,不是嗎? – 2014-09-26 01:30:55