【问题标题】:Prime factorization using list comprehension使用列表推导的素数分解
【发布时间】:2014-07-23 02:08:55
【问题描述】:

我想在 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 120 时,结果是[2,3,5],并不是所有的素因数。

【问题讨论】:

  • 因素 n = [p | p mod p == 0, [d | d mod d == 0] == [1,p]]
  • 但是当我调用 pfactors 120 时,结果是 [2,3,5],不是所有的素数。
  • 已经放好了。
  • 你得到的是n独特的主要因素的列表,但正如你的例子清楚地表明,有些因素发生不止一次 ,即使您确实多次枚举值,您也不知道必须执行多少次才能获得所有多个因素..
  • 我不明白为什么这个问题被否决了......

标签: haskell prime-factoring


【解决方案1】:

我会这样做:

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

它本质上是您拥有的解决方案,但不同之处在于它最后有一个额外的列表理解,其中包含与p 因素一样多的元素到n

免责声明我真的不会在现实中这样做。

编辑我觉得上面写的很脏,所以作为参考,这更接近我要写的东西:

pfactors' :: Int -> [Int]
pfactors' = unfoldr firstFactor
  where
    firstFactor n =
        listToMaybe [(f, n `div` f)
                    | f <- [2..n]
                    , n `mod` f == 0]

依赖关系: Data.List (unfoldr), Data.Maybe (listToMaybe)

【讨论】:

  • 好的,我的立场是正确的,但您不应该过滤以仅保留每个 p 的最高权力吗?
  • 伟大的@asQuirrel。这就是我的回答。非常感谢!
  • @didierc,我不这么认为。我在这里所做的是保留所有除以np 的权力(根据定义,这些将是最小的权力)。
  • @didierc,我还没有关注你,如果你在谈论 p 的值,它首先检查素数,如果你在谈论最后一部分(我添加的) ,然后这些值被丢弃,我们真正感兴趣的只是幂的数量。
  • 非常好的listToMaybe 技巧!.. 虽然你的公式效率低下;它应该是factors n = unfoldr g (2,n) where g (d, n) = listToMaybe [(x, (x, div n x)) | n &gt; 1, x &lt;- [d..isqrt n]++[n], rem n x == 0]。更多here。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
相关资源
最近更新 更多