Haskell 基于列表理解的素因子分解

Haskell 基于列表理解的素因子分解,haskell,prime-factoring,Haskell,Prime Factoring,我想只使用列表理解方法和/或Haskell中的(函数组合运算符)来查找给定数字的所有素数因子。我特别希望避免递归解决方案 例如,pfactors 120必须产生[2,2,2,3,5]输出 我试过: pfactors n = [p | p <- [2..n], n `mod` p == 0, [d | d <- [1..p], p `mod` d == 0] == [1,p]] pfactors n=[p | p以下是我的做法: pfactors :: Integer -> [

我想只使用列表理解方法和/或Haskell中的
(函数组合运算符)来查找给定数字的所有素数因子。我特别希望避免递归解决方案

例如,
pfactors 120
必须产生
[2,2,2,3,5]
输出

我试过:

pfactors n = [p | p <- [2..n], n `mod` p == 0, [d | d <- [1..p], p `mod` d == 0] == [1,p]]
pfactors n=[p | p以下是我的做法:

pfactors :: Integer -> [Integer]
pfactors n = [ p
             | p <- [2..n]                                  -- Possible factors
             , [d | d <- [1..p], p `mod` d == 0] == [1,p]   -- Are prime 
             , _ <- [ p | i <- [1..n], n `mod` p^i == 0] ]  -- Divisible powers

依赖项:
Data.List(unfover)
Data.Maybe(listToMaybe)

因子n=[p | p,但当我调用pfactors 120时,结果是[2,3,5],不是所有的素因子。它已经被放入。你得到的是
n
的唯一素因子列表,但正如你的例子清楚地显示的那样,有些因子不止一次出现,即使你多次枚举值,你也不知道你要做多少次才能得到所有的多个因子。我不明白为什么会这样问题被否决了…好吧,我站在更正的立场上,但你们不应该只保留每个
p
的最高幂吗?太好了@asQuirrel。这是我的答案。非常感谢!@didierc,我不这么认为。我在这里做的是保留所有划分
n
p
的幂(根据定义,这些将是最小的幂)。@didierc,我仍然没有跟上你,如果你谈论的是p的值,它首先被检查为素性,如果你谈论的是最后一部分(我补充的),然后这些值被丢弃,我们真正感兴趣的是幂的数量。非常好的
listToMaybe
trick!。虽然你的公式是无效的;它应该是
factors n=unfolder g(2,n),其中g(d,n)=listToMaybe[(x,(x,div nx))|n>1,x
pfactors' :: Int -> [Int]
pfactors' = unfoldr firstFactor
  where
    firstFactor n =
        listToMaybe [(f, n `div` f)
                    | f <- [2..n]
                    , n `mod` f == 0]