The sieve of Sundaram: Difference between revisions

→‎{{header|Haskell}}: Dropped use of Data.Set
(→‎{{header|Haskell}}: Added a draft version in Haskell)
(→‎{{header|Haskell}}: Dropped use of Data.Set)
Line 284:
<lang haskell>import Data.List (intercalate, transpose)
import Data.List.Split (chunksOf)
import qualified Data.Set as S
import Text.Printf (printf)
 
Line 290 ⟶ 289:
 
sundaram :: Integral a => a -> [a]
sundaram n = succ . (2 *) <$> gaps [1 ..] excluded
[ succ (2 * x)
| x <- [1 .. m],
x `S.notMember` excluded
]
where
m = div (pred n) 2
excluded =
S.fromList[ 2 * i * j + i + j
[| 2let *fm i= *fromIntegral j + i + jm,
|i let<- fm[1 =.. floor (sqrt (fm fromIntegral/ m2))],
let fi i= <-fromIntegral [1 .. floor (sqrt (fm / 2))]i,
j <- let[i .. floor ((fm - fi) =/ fromIntegralsucc i,(2 * fi))]
]
j <- [i .. floor ((fm - fi) / succ (2 * fi))]
]
 
nSundaramPrimes ::
Line 310 ⟶ 304:
nSundaramPrimes n =
sundaram $ floor $ (2.4 * n * log n) / 2
 
 
 
Line 319 ⟶ 312:
(putStrLn . table " " . chunksOf 10) $
show <$> nSundaramPrimes 100
 
 
------------------------- GENERIC ------------------------
 
gaps _ [] = []
gaps (x : xs) yys@(y : ys)
| x >= y = gaps xs ys
| otherwise = x : gaps xs yys
 
table :: String -> [[String]] -> String
9,655

edits