我在做项目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