编写一个称为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
,而不是生成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
)对于素数清单有点值得怀疑...