我在 Project Euler 做第266 题,经过一番搜索,找到了这种快速查找数字因数的方法。你要做的是找到一个数的质因数的所有排列:这些就是它的因数。
我已经有一个模块来查找数字的主要功率因数,例如:
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的因子?