私はプロジェクトオイラーで質問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の因数だけを返すように変更するにはどうすればよいですか?