Algorithm 确定给定的数字是否为haskell中的素数

Algorithm 确定给定的数字是否为haskell中的素数,algorithm,haskell,primes,primality-test,Algorithm,Haskell,Primes,Primality Test,因此,我设计了以下函数,用于查看给定的数字是否为Haskell中的素数(假设第一个素数为2): isPrime k=length[x | x这可能不是直接相关的,但在函数式语言中寻找素数的话题上,我发现Melissa E.O'Neill非常有趣。这是haskell.org中的最佳资源 在这里,github项目忽略了素数问题,并专注于更有效的长度xs==n方法的窄点: hasLength :: Integral count => [a] -> count -> Bool _

因此,我设计了以下函数,用于查看给定的数字是否为Haskell中的素数(假设第一个素数为2):


isPrime k=length[x | x这可能不是直接相关的,但在函数式语言中寻找素数的话题上,我发现Melissa E.O'Neill非常有趣。

这是haskell.org中的最佳资源


在这里,github项目忽略了素数问题,并专注于更有效的
长度xs==n
方法的窄点:

hasLength :: Integral count => [a] -> count -> Bool
_        `hasLength` n | n < 0 = False
[]       `hasLength` n         = n == 0
(_ : xs) `hasLength` n         = xs `hasLength` (pred n)

isPrime k = [ x | x <- [2..k], k `mod` x == 0)] `hasLength` 1
hasLength::Integral count=>a]->count->Bool
_`hasLength`n | n<0=False
[]`hasLength`n=n==0
(:xs)`hasLength`n=xs`hasLength`(pred n)

iPrime k=[x | x对代码的快速更改将“短路”评估,并依赖于Haskell列表的惰性,即:

isPrime k = if k > 1 then null [ x | x <- [2..k - 1], k `mod` x == 0] else False
当然,如果您希望进行高性能素性测试,最好使用库。

我喜欢这种方法:

首先生成函数,得到n的所有因子:

factors n = [x | x <- [1..n], mod n x == 0]

这可能是愚蠢和低效的(我是一个完全的Haskell新手),但函数isMyNumberPrime(在ghci中)似乎会告诉您一个数字是否为素数

factors n = [x | x <- [2..(n`div` 2)], mod n x == 0]
factormap n = fmap factors $ factors n
isMyNumberPrime n = case factormap n of [] -> True; _ -> False
因子n=[x | x真;\ux->假

可能重复的@Can your edit破坏了这篇文章。请不要这样做。@JamesKPolk感谢您拒绝了这篇文章上的一个毫无意义的编辑。:@WillNess我重新检查了我的编辑。但我不知道它与原始答案有何偏差。原始作者的所有信息都被保留。正如我的编辑说明所述,这是错误的st是一个小的格式编辑,修复了一些文字和样式。@WillNess这对你来说可能是荒谬的,但它不适合我,当然也不适合其他人,因为它也得到了另外两个人的批准。一直以来,我都在SE上编辑帖子,使它们更具可读性和可接近性;它们也得到了批准。我所做的这些更改似乎很重要虽然对你来说不重要,但它们确实很重要。学习是至关重要的,信息应该尽可能地呈现。@Can“再一次”(?这是我所知道的第一次交流。)你打破了两件事:1.你将
isqrt
改为
sqrt
,这不适用于整数类型,因此代码会导致错误。2.你将“releases”改为“release”,这打破了句子的含义(有点微妙,但仍然真实)。
factors n = [x | x <- [1..n], mod n x == 0]
prime n = factors n == [1,n]
factors n = [x | x <- [2..(n`div` 2)], mod n x == 0]
factormap n = fmap factors $ factors n
isMyNumberPrime n = case factormap n of [] -> True; _ -> False