project euler problem 23

面倒だったので 力技で行ったら40分かかった。
どうやって高速化しようか…

import Data.List

main = print $ (sum [1..m]) - ( sum $ map head $ group $ sort [x+y|x<-abundantNumbers,y<-abundantNumbers\
,x+y<=m])

abundantNumbers::[Int]
abundantNumbers = [x|x<-[2..m],isAbundant x]

isAbundant::Int->Bool
isAbundant n = n < sum [x|x<-[1..n-1],mod n x==0]

m = 28122


arrayで過剰数のものだけマーキングした。

import Data.Array

main = print $ (sum [1..m]) - (sum c)

a = listArray (1,m) [n < sum [x|x<-[1..n-1],mod n x==0]|n<-[1..m]]
b = map fst $ filter snd $ assocs a
c = filter  d [1..m]
d x = any (\y->(x>y)&&(a!(x-y))) b
m = 28122

assocsの分だけ遅くなっているんじゃないだろうか 現在10秒台
dの判定ロジックを逆にしたいんだがうまく行かない sum [1..m] で遅くなっているとおもって (m*(m+1) `div` 2) に変えてみたが全然関係なかった。