ладно, вот три окончательных варианта второй задачи:
main :: IO ()
main = do
n <- readLn :: IO Integer
putStrLn $ if perfect n then "Да" else "Нет"
where
perfect x = x == sum (1 : [ i + d
| i <- [2..x']
, let (d, m) = x `divMod` i
, m == 0
])
where
x' = truncate $ sqrt $ fromInteger x
import Control.Parallel
main :: IO ()
main = do
n <- readLn :: IO Integer
putStrLn $ if perfect n then "Да" else "Нет"
where
perfect x = sum2 `par` sum3 `pseq` x == 1 + sum2 + sum3
where
sum2 = bs 2
sum3 = bs 3
bs b = sum [ i + d
| i <- [b, b + 2 .. sqx]
, let (d, m) = x `divMod` i
, m == 0
]
sqx = truncate $ sqrt $ fromInteger x
import Control.Concurrent
main :: IO ()
main = do
n <- readLn :: IO Integer
p <- perfect n
putStrLn $ if p then "Да" else "Нет"
where
perfect x = do
sum2c <- newChan
sum3c <- newChan
forkOS $ calcSum 2 sum2c
forkOS $ calcSum 3 sum3c
sum2 <- readChan sum2c
sum3 <- readChan sum3c
return $ x == 1 + sum2 + sum3
where
calcSum b c = do
writeChan c $! sum [ i + d
| i <- [b, b + 2 .. sqx]
, let (d, m) = x `divMod` i
, m == 0
]
sqx = truncate $ sqrt $ fromInteger x
Время выполнения на числе 1374386913280000, соответственно:
6.2 сек
5.2 сек
4.8 сек
К сожалению, время уменьшилось не в два раза на моём двухядернике ((
UPD. Поправил первое решение