【发布时间】:2011-11-10 06:51:27
【问题描述】:
我正在处理Project Euler,很多问题都涉及类似的功能,例如计算素数列表。我知道使用 Integer 的计算比 Int 慢,所以我想编写函数来处理两者,这取决于我正在使用的数字的大小。
module Primes
(
isPrime
,prime
,allPrimes
)
where
import Data.List
isPrime :: Int -> Bool
isPrime n
| n == 0 = False
| n == 1 = False
| n < 0 = isPrime (-n)
| n < 4 = True
| n `mod` 2 == 0 = False
| n `mod` 3 == 0 = False
| any ( (==0) . mod n ) [5..h] = False
| otherwise = True
where
h = ( ceiling . sqrt . fromIntegral ) n
allPrimes :: [Int]
allPrimes = [ x | x<- [2..], isPrime x ]
prime :: Int -> Int
prime n = allPrimes !! (n-1)
我知道这段代码通常不是最理想的。我只是对如何使整数类型更通用感兴趣。
【问题讨论】:
-
我在hpaste.org/50988(如果您有兴趣的话)上发布了对
isPrime的简短代码审查(重点是保留此处介绍的确切算法)。