Haskell Efficently Sieve
  • 板块灌水区
  • 楼主JohnsonLee
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/1/16 18:11
  • 上次更新2023/10/28 12:13:00
查看原帖
Haskell Efficently Sieve
445894
JohnsonLee楼主2022/1/16 18:11
{-# LANGUAGE MonoLocalBinds #-}
module Main where
import Data.Time
import Data.Bits
import Control.Monad (forM_, when)
import Control.Monad.ST
import Data.Array.ST
import Data.Array.Unboxed
import Data.Array.Base

primeSieve :: Int -> UArray Int Bool
primeSieve top = runSTUArray $ do
    a <- newArray (0,top) True
    unsafeWrite a 0 False
    unsafeWrite a 1 False
    let r = ceiling . sqrt $ fromIntegral top
        mark step idx
            | top < idx = return ()
            | otherwise = do
                unsafeWrite a idx False
                mark step (idx+step)
        sift p
            | r < p     = return a
            | otherwise = do
                prim <- unsafeRead a p
                when prim $ mark (2*p) (p*p)
                sift (p+2)
    mark 2 4
    sift 3

primesTo :: Int -> [Int]
primesTo top = [p | (p,True) <- assocs $ primeSieve top]

main :: IO ()
main = do
  t1 <- getCurrentTime
  print . last $ primesTo 2000000
  t2 <- getCurrentTime
  print (diffUTCTime t2 t1)
2022/1/16 18:11
加载中...