2016-11-27 56 views
0

編寫一個函數isPrime,確定整數是否是素數(均勻地 只能由它自己和一個整除)。作爲參考,這裏列出的質數小於100: [2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61 ,67,71,73,79,83,89,97] 什麼是第1000到第1020個素數? (在2開始)找到素數從2開始Haskell

isPrime :: [Integer] 
isPrime = sieve [2..1020] 
    where 
    sieve (p:xs) 
    | p*p <= 1020 = p : sieve [x|x <- xs, x `mod` p > 0] 
    | otherwise = (p:xs) 

我嘗試這樣的代碼,但它通過1020 我要顯示1000到1020以2

回答

1

開始代替生成素數高達1020打印素數2,以發射從第1000到第1020個素數,你可以生成第一個1020素數並且只發射最後的21個素數。

使用a naive unbounded sieve,我們可以寫出如下

minus :: Ord a => [a] -> [a] -> [a] 
minus (x:xs) (y:ys) = case (compare x y) of 
      LT -> x : minus xs (y:ys) 
      EQ ->  minus xs  ys 
      GT ->  minus (x:xs) ys 
minus xs  _  = xs 

primes :: [Integer] 
primes = eratos [2..] 
    where 
    eratos []  = [] 
    eratos (p:xs) = p : eratos (xs `minus` [p, p+p..]) 

primesFromTo from to = drop (from-1) $ take to primes 

然後找primesFromTo 1000 1020

*Main> primesFromTo 1000 1020 
[7919,7927,7933,7937,7949,7951,7963,7993,8009,8011,8017,8039,8053,8059,8069,8081,8087,8089,8093,8101,8111] 

順便說一句,命名(isPrimes)是有點可疑的素數的名單.. 。