我在做項目Euler中的question 266,經過一番搜索之後,發現this method很快找到了數字的因素。你所做的是找到一個數字的主要因素的所有排列:這些是它的因素。在Haskell中實現因式分解法
我已經有一個模塊,找了好幾個的主要動力因素,如:
Main> primePowerFactors 196
[(2,2),(7,2)]
這基本上表明:2^2 * 7^2 == 196
。在這裏,我想找到這些權力的所有排列,給予196正是如此的因素:
- (2^0)(7^0)= 1
- (2^1)(7^0)= 2
- (2^2)(7^0)= 4
- (2^0)(7^1)= 7
- (2^1)(7^1)= 14
- (2^2)(7^1)= 28
- (2^0)(7^2)= 49
- (2^1)(7^2)= 98
我想出了以下內容:
factors n = [a|a<-map facs (primePowerFactors n), y <- [0..(snd $ last $ primePowerFactors n)]]
where
facs (x,y) = (x,y)
rSq n = toInteger $ round $ sqrt (fromInteger n)
psr n = last $ dropWhile (<= rSq n) $ factors n
p = foldl' (*) 1 $ takeWhile (< 190) primes
answer = (psr p) `mod` (10^16)
但我的問題是,factors
不能正常工作。我希望它通過每個主要因素的指數的所有可能值進行置換,然後找到產品給出該因子。如何修改以返回n的因子?
當你想要一個非常大的數字的因素時,重要的是數字的因素是按順序生成的,否則使用排序將需要它在存儲器中存儲每一個單因子,然後給我我的號碼。既然我們知道p有2^42個因子,我們想要的因子應該在排序後的因子列表中位於索引2^42-1。 – 2009-12-07 08:47:21
實際上你不需要根據規範進行排序。你需要找到低於某個閾值的最大值。這只是「最大的」。過濾器(/ =閾值)',這與優化的常量開銷是線性的(應該是無論如何)。 – barkmadley 2009-12-07 13:12:33
抱歉'最大。過濾器(<=閾值)' – barkmadley 2009-12-07 13:20:51