Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;;off https://stackoverflow.com/questions/3852764/sieve-of-eratosthenes-in-haskell/64417225#64417225
- ;;by https://stackoverflow.com/users/304423/evg
- ;;https://www.youtube.com/watch?v=kCWSVYbmIfg&feature=youtu.be
- ;;edit by https://stackoverflow.com/users/849891/will-ness
- import qualified Data.Set as Set (fromList, difference)
- kr n lim = (*n) <$> [2..lim `div` n]
- = [ n*x | x <- [2..div lim n]]
- = takeWhile (<= lim) [ n*x | x <- [2..]]
- = takeWhile (<= lim) [ n*2, n*3 ..]
- = takeWhile (<= lim) [ n+n, n+n+n ..]
- = [n+n, n+n+n .. lim]
- g lim = difference (fromList [2..lim]) (fromList $ concat $ (`kr` lim) <$> [2..lim])
- = difference (fromList [2..lim])
- (fromList $ concat $ [kr n lim | n <- [2..lim]])
- = difference (fromList [2..lim])
- (fromList $ concat $ [[n+n, n+n+n .. lim] | n <- [2..lim]])
- = difference (fromList [2..lim])
- (fromList $ concat $ [[n+n, n+n+n .. lim] | n <- [2..lim`div`2]])
- = difference (fromList [2..lim])
- (fromList $ concat $ takeWhile (not . null) $
- [[n+n, n+n+n .. lim] | n <- [2..]])
- = difference (fromList [2..lim])
- (fromList $ concat $ takeWhile (not . null) $
- [[n*n, n*n+n .. lim] | n <- [2..]])
- = foldl (\ a b -> difference a $ fromList b)
- (fromList [2..lim])
- (takeWhile (not . null) [[n*n, n*n+n .. lim] | n <- [2..]])
- = foldl (\ a b@(m:_) -> if not (Set.member m a) then a
- else difference a $ fromList b)
- (fromList [2..lim])
- (takeWhile (not . null) [[n*n, n*n+n .. lim] | n <- [2..]])
- = foldl (\ a b@(m:_) -> if not (Set.member m a) then a
- else difference a $ fromList b)
- (fromList $ 2:[3,5..lim])
- (takeWhile (not . null) [[n*n, n*n+2*n .. lim] | n <- [3,5..]])
- g lim = difference (fromList [2..lim])
- (fromList [ m | n <- [2..lim`div`2], m <- [n+n, n+n+n .. lim]])
- = difference (fromList [2..lim])
- (fromList [ m | n <- [2..isqrt lim], m <- [n*n, n*n+n .. lim]])
- = difference (fromList $ 2 : [3,5..lim])
- (fromList [ m | n <- [3,5..isqrt lim], m <- [n*n, n*n+2*n .. lim]])
- g lim | lim < 2 = []
- | otherwise =
- difference (fromList $ 2 : [3,5..lim])
- (fromList [ m | n <- drop 1 $ g (isqrt lim),
- m <- [n*n, n*n+2*n .. lim]])
Add Comment
Please, Sign In to add comment