Guest User

SoE with Data.Set

a guest
Oct 20th, 2020
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;;off https://stackoverflow.com/questions/3852764/sieve-of-eratosthenes-in-haskell/64417225#64417225
  2. ;;by https://stackoverflow.com/users/304423/evg
  3. ;;https://www.youtube.com/watch?v=kCWSVYbmIfg&feature=youtu.be
  4.  
  5. ;;edit by https://stackoverflow.com/users/849891/will-ness
  6.  
  7.     import qualified Data.Set as Set (fromList, difference)
  8.  
  9.     kr n lim = (*n) <$> [2..lim `div` n]
  10.              = [ n*x | x <- [2..div lim n]]
  11.              = takeWhile (<= lim) [ n*x | x <- [2..]]
  12.              = takeWhile (<= lim) [ n*2, n*3 ..]
  13.              = takeWhile (<= lim) [ n+n, n+n+n ..]
  14.              = [n+n, n+n+n .. lim]
  15.  
  16.     g lim = difference (fromList [2..lim]) (fromList $ concat $ (`kr` lim) <$> [2..lim])
  17.           = difference (fromList [2..lim])
  18.                 (fromList $ concat $ [kr n lim | n <- [2..lim]])
  19.           = difference (fromList [2..lim])
  20.                 (fromList $ concat $ [[n+n, n+n+n .. lim] | n <- [2..lim]])
  21.           = difference (fromList [2..lim])
  22.                 (fromList $ concat $ [[n+n, n+n+n .. lim] | n <- [2..lim`div`2]])
  23.           = difference (fromList [2..lim])
  24.                 (fromList $ concat $ takeWhile (not . null) $
  25.                                      [[n+n, n+n+n .. lim] | n <- [2..]])
  26.           = difference (fromList [2..lim])
  27.                 (fromList $ concat $ takeWhile (not . null) $
  28.                                      [[n*n, n*n+n .. lim] | n <- [2..]])
  29.  
  30.           = foldl (\ a b -> difference a $ fromList b)
  31.                   (fromList [2..lim])
  32.                   (takeWhile (not . null) [[n*n, n*n+n .. lim] | n <- [2..]])
  33.  
  34.           = foldl (\ a b@(m:_) -> if not (Set.member m a) then a
  35.                                   else difference a $ fromList b)
  36.                   (fromList [2..lim])
  37.                   (takeWhile (not . null) [[n*n, n*n+n .. lim] | n <- [2..]])
  38.  
  39.           = foldl (\ a b@(m:_) -> if not (Set.member m a) then a
  40.                                   else difference a $ fromList b)
  41.                   (fromList $ 2:[3,5..lim])
  42.                   (takeWhile (not . null) [[n*n, n*n+2*n .. lim] | n <- [3,5..]])
  43.  
  44.     g lim = difference (fromList [2..lim])
  45.                        (fromList [ m | n <- [2..lim`div`2], m <- [n+n, n+n+n .. lim]])
  46.           = difference (fromList [2..lim])
  47.                        (fromList [ m | n <- [2..isqrt lim], m <- [n*n, n*n+n .. lim]])
  48.           = difference (fromList $ 2 : [3,5..lim])
  49.                        (fromList [ m | n <- [3,5..isqrt lim], m <- [n*n, n*n+2*n .. lim]])
  50.  
  51.     g lim | lim < 2 = []
  52.           | otherwise =
  53.             difference (fromList $ 2 : [3,5..lim])
  54.                        (fromList [ m | n <- drop 1 $ g (isqrt lim),
  55.                                        m <- [n*n, n*n+2*n .. lim]])
  56.  
Add Comment
Please, Sign In to add comment