2014-09-26 2 views
1

Sieve of Sundaram을 구현 중입니다.Sundaram의 체에 대한 번호 제외

난, j는 자연수, 1 < =있는 난 < = 난 +

J J + 2 * i가 J를 *

첫 번째 단계는 정수의되도록리스트를 얻기위한 것이다 < = 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]'이 결과 ... –

+0

왜 그게 잘못 됐니? 당신이 당신의 질문에 준 제한에서 기대할 수있는 것. – hugomg

+0

글쎄, 결과가'[1..33]'이되면, 그 수를 모두 제외해도 틀린 것이 아닌가? –

관련 문제