Euler problem 21.2.1
.

primes :: [Integer]
primes = 2 : filter (null . tail . primeFactors) [3, 5 ..]
primeFactors :: Integer -> [Integer]
primeFactors n = factor n primes
where
factor n (p : ps)
| p * p > n = [n]
| n `mod` p == 0 = p : factor (n `div` p) (p : ps)
| otherwise = factor n ps
groupFactors :: [Integer] -> [[Integer]]
groupFactors = gf []
where
gf acc lst
| null lst = reverse acc
| null acc = gf [[p,1]] ps
--
| p == head (head acc) =
gf ([p, head (tail (head acc)) + 1]:tail acc) ps
--
| otherwise = gf ([p,1]:acc) ps
where
p = head lst
ps = tail lst
generateDivisors :: Integral b => [[b]] -> [b]
generateDivisors xs = go xs 1
where
go [] acc = [acc]
go (pe:ps) acc = concat [go ps (acc*p^e) | e <- [0..n]]
where
p = head pe
n = pe !! 1
sumProperDivisors :: Integer -> Integer
sumProperDivisors n
= -n + sum (generateDivisors
(groupFactors (primeFactors n)))
amicableNumbers :: Integer -> [Integer]
amicableNumbers limit
= [a | a <- [1..(limit-1)],
let b = sumProperDivisors a,
a == sumProperDivisors b,
a /= b]

λ> :set +s
λ> sum (amicableNumbers 10000)
31626
(0.35 secs, 511,950,576 bytes)
λ> sum (amicableNumbers 100000)
852810
(4.73 secs, 6,902,354,168 bytes)
λ> sum (amicableNumbers 1000000)
27220963
(66.07 secs, 93,880,279,320 bytes)
λ>

— Me@2024-08-11 10:40:06 AM
.
.
2024.08.12 Monday (c) All rights reserved by ACHK
You must be logged in to post a comment.