从2 Haskell开始查找Primes号码



编写一个称为isPrime的函数,该函数确定整数是否为质量数(均匀仅本身和一个)。作为参考,以下是小于100的素数清单:[2,3,5,7,11,13,17,19,23,29,31,37,41,41,43,47,47,53,59,59,61,67,71,73,79,79,83,8977这是给出的第1000至1020个质数是多少?(从2开始)

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)

我尝试了此代码,但它打印了Primes 2至1020。我想从2

开始显示1000至1020

,而不是生成1020年的素数,要发射第1000至1020次素数,您可以生成第一个1020个素数并仅发射其中的最后21个。

>

使用幼稚的无界筛子,我们可以编写以下

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)对于素数清单有点值得怀疑...

最新更新